adding command for moving a record from one tdb to another
authorGerald Carter <jerry@samba.org>
Wed, 16 Jul 2003 16:51:51 +0000 (16:51 +0000)
committerGerald Carter <jerry@samba.org>
Wed, 16 Jul 2003 16:51:51 +0000 (16:51 +0000)
source/tdb/tdbtool.c

index 7369fe8d80bf21d4ad6ae4bdcf3fc1190549c88e..92009dcef48cbd435dfa2e28d4c629ad946486b8 100644 (file)
@@ -118,6 +118,7 @@ static void help(void)
 "  erase                : erase the database\n"
 "  dump                 : dump the database as strings\n"
 "  insert    key  data  : insert a record\n"
+"  move      key  file  : move a record to a destination tdb\n"
 "  store     key  data  : store a record (replace)\n"
 "  show      key        : show a record by key\n"
 "  delete    key        : delete a record by key\n"
@@ -291,6 +292,57 @@ static void delete_tdb(void)
        }
 }
 
+static void move_rec(void)
+{
+       char *k = get_token(1);
+       char *file = get_token(0);      
+       TDB_DATA key, dbuf;
+       TDB_CONTEXT *dst_tdb;
+
+       if (!k) {
+               help();
+               return;
+       }
+       
+       if ( !file ) {
+               terror("need destination tdb name");
+               return;
+       }
+
+       key.dptr = k;
+       key.dsize = strlen(k)+1;
+
+       dbuf = tdb_fetch(tdb, key);
+       if (!dbuf.dptr) {
+               /* maybe it is non-NULL terminated key? */
+               key.dsize = strlen(k); 
+               dbuf = tdb_fetch(tdb, key);
+               
+               if ( !dbuf.dptr ) {
+                       terror("fetch failed");
+                       return;
+               }
+       }
+       
+       print_rec(tdb, key, dbuf, NULL);
+       
+       dst_tdb = tdb_open(file, 0, 0, O_RDWR, 0600);
+       if ( !dst_tdb ) {
+               terror("unable to open destination tdb");
+               return;
+       }
+       
+       if ( tdb_store( dst_tdb, key, dbuf, TDB_REPLACE ) == -1 ) {
+               terror("failed to move record");
+       }
+       else
+               printf("record moved\n");
+       
+       tdb_close( dst_tdb );
+       
+       return;
+}
+
 #if 0
 static int print_conn_key(TDB_DATA key)
 {
@@ -465,6 +517,9 @@ int main(int argc, char *argv[])
         } else if (strcmp(tok,"dump") == 0) {
             bIterate = 0;
             tdb_traverse(tdb, print_rec, NULL);
+        } else if (strcmp(tok,"move") == 0) {
+            bIterate = 0;
+            move_rec();
         } else if (strcmp(tok,"list") == 0) {
             tdb_dump_all(tdb);
         } else if (strcmp(tok, "free") == 0) {