From: Martin Mares Date: Thu, 13 Jul 2000 21:34:49 +0000 (+0000) Subject: Added a utility for rebuilding of databases. X-Git-Tag: holmes-import~1631 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=ae89a0691fedd92c72adc2188c4993d38b499de8;p=libucw.git Added a utility for rebuilding of databases. --- diff --git a/lib/db-rebuild.c b/lib/db-rebuild.c new file mode 100644 index 00000000..a0ad1585 --- /dev/null +++ b/lib/db-rebuild.c @@ -0,0 +1,72 @@ +/* + * SDBM Database Recovery Utility + * + * (c) 2000 Martin Mares + */ + +#include +#include +#include +#include +#include +#include + +#include "db.c" + +int +main(int argc, char **argv) +{ + struct sdbm *src, *dest; + struct sdbm_options op; + int e, c=0; + + if (argc != 3) + die("Usage: db-rebuild "); + + bzero(&op, sizeof(op)); + op.name = argv[1]; + op.cache_size = 16; + op.flags = 0; + src = sdbm_open(&op); + if (!src) + die("Source open failed"); + + op.name = argv[2]; + e = unlink(op.name); + if (e < 0 && errno != ENOENT) + die("unlink: %m"); + op.cache_size = 1024; + op.flags = SDBM_CREAT | SDBM_WRITE | SDBM_FAST; + op.page_order = src->root->page_order; + op.key_size = src->root->key_size; + op.val_size = src->root->val_size; + dest = sdbm_open(&op); + if (!dest) + die("Destination open failed"); + + puts("Rebuilding database..."); + sdbm_rewind(src); + for(;;) + { + byte key[4096], val[4096]; + int klen = sizeof(key); + int vlen = sizeof(val); + e = sdbm_get_next(src, key, &klen, val, &vlen); + if (!e) + break; + if (e < 0) + printf("sdbm_get_next: error %d\n", e); + if (!(c++ % 1024)) + { + printf("%d\r", c); + fflush(stdout); + } + if (sdbm_store(dest, key, klen, val, vlen) == 0) + printf("sdbm_store: duplicate key\n"); + } + + sdbm_close(src); + sdbm_close(dest); + printf("Copied %d keys\n", c); + return 0; +}