]> mj.ucw.cz Git - libucw.git/blob - lib/db-rebuild.c
CVS repository cleaned up a bit:
[libucw.git] / lib / db-rebuild.c
1 /*
2  *      SDBM Database Recovery Utility
3  *
4  *      (c) 2000 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
5  */
6
7 #include "lib/db.c"
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include <fcntl.h>
13 #include <unistd.h>
14 #include <errno.h>
15
16 int
17 main(int argc, char **argv)
18 {
19   struct sdbm *src, *dest;
20   struct sdbm_options op;
21   int e, c=0;
22
23   if (argc != 3)
24     die("Usage: db-rebuild <src> <dest>");
25
26   bzero(&op, sizeof(op));
27   op.name = argv[1];
28   op.cache_size = 16;
29   op.flags = 0;
30   src = sdbm_open(&op);
31   if (!src)
32     die("Source open failed");
33
34   op.name = argv[2];
35   e = unlink(op.name);
36   if (e < 0 && errno != ENOENT)
37     die("unlink: %m");
38   op.cache_size = 1024;
39   op.flags = SDBM_CREAT | SDBM_WRITE | SDBM_FAST;
40   op.page_order = src->root->page_order;
41   op.key_size = src->root->key_size;
42   op.val_size = src->root->val_size;
43   dest = sdbm_open(&op);
44   if (!dest)
45     die("Destination open failed");
46
47   puts("Rebuilding database...");
48   sdbm_rewind(src);
49   for(;;)
50     {
51       byte key[4096], val[4096];
52       int klen = sizeof(key);
53       int vlen = sizeof(val);
54       e = sdbm_get_next(src, key, &klen, val, &vlen);
55       if (!e)
56         break;
57       if (e < 0)
58         printf("sdbm_get_next: error %d\n", e);
59       if (!(c++ % 1024))
60         {
61           printf("%d\r", c);
62           fflush(stdout);
63         }
64       if (sdbm_store(dest, key, klen, val, vlen) == 0)
65         printf("sdbm_store: duplicate key\n");
66     }
67
68   sdbm_close(src);
69   sdbm_close(dest);
70   printf("Copied %d keys\n", c);
71   return 0;
72 }