Added a simple tdb integrity check to tdbtool. The command "check" runs traverse...
authorHolger Hetterich <hhetter@novell.com>
Sat, 1 Nov 2008 23:12:32 +0000 (00:12 +0100)
committerKarolin Seeger <kseeger@samba.org>
Tue, 16 Dec 2008 12:58:48 +0000 (13:58 +0100)
lib/tdb/tools/tdbtool.c

index d104ccd7c44994e9d0f8ba138cbf4584343983dc..1ecad62a3deeb2dc3ad780fd1ef8cfebb822fda7 100644 (file)
@@ -57,6 +57,7 @@ enum commands {
        CMD_FIRST,
        CMD_NEXT,
        CMD_SYSTEM,
+       CMD_CHECK,
        CMD_QUIT,
        CMD_HELP
 };
@@ -87,6 +88,7 @@ COMMAND_TABLE cmd_table[] = {
        {"1",           CMD_FIRST},
        {"next",        CMD_NEXT},
        {"n",           CMD_NEXT},
+       {"check",       CMD_CHECK},
        {"quit",        CMD_QUIT},
        {"q",           CMD_QUIT},
        {"!",           CMD_SYSTEM},
@@ -179,7 +181,8 @@ static void help(void)
 "  delete    key        : delete a record by key\n"
 "  list                 : print the database hash table and freelist\n"
 "  free                 : print the database freelist\n"
-"  ! command            : execute system command\n"             
+"  check                : check the integrity of an opened database\n"
+"  ! command            : execute system command\n"
 "  1 | first            : print the first record\n"
 "  n | next             : print the next record\n"
 "  q | quit             : terminate\n"
@@ -452,6 +455,27 @@ static void next_record(TDB_CONTEXT *the_tdb, TDB_DATA *pkey)
                print_rec(the_tdb, *pkey, dbuf, NULL);
 }
 
+static int test_fn(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
+{
+       return 0;
+}
+
+static void check_db(TDB_CONTEXT *the_tdb)
+{
+       int tdbcount=-1;
+       if (the_tdb) {
+               tdbcount = tdb_traverse(the_tdb, test_fn, NULL);
+       } else {
+               printf("Error: No database opened!\n");
+       }
+
+       if (tdbcount<0) {
+               printf("Integrity check for the opened database failed.\n");
+       } else {
+               printf("Database integrity is OK and has %d records.\n", tdbcount);
+       }
+}
+
 static int do_command(void)
 {
        COMMAND_TABLE *ctp = cmd_table;
@@ -552,6 +576,9 @@ static int do_command(void)
               if (bIterate)
                  next_record(tdb, &iterate_kbuf);
                return 0;
+           case CMD_CHECK:
+               check_db(tdb);
+               return 0;
            case CMD_HELP:
                help();
                return 0;