]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
control to delete all records in a database
authorRonnie Sahlberg <sahlberg@ronnie>
Sun, 29 Apr 2007 08:48:46 +0000 (18:48 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Sun, 29 Apr 2007 08:48:46 +0000 (18:48 +1000)
(This used to be ctdb commit 6664e00fc02e1c60cc1a35ecd15f4893a34f23d1)

ctdb/common/ctdb_client.c
ctdb/common/ctdb_control.c
ctdb/include/ctdb.h
ctdb/include/ctdb_private.h
ctdb/tools/ctdb_control.c

index b6a3963a497bce7cf36bd4605d2c1434ca4f1bea..990c3d4dddc0b571bac2b29b4cf82cbd0a8b705d 100644 (file)
@@ -984,6 +984,31 @@ int ctdb_setdmaster(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *me
        return 0;
 }
 
+/*
+  delete all records from a tdb
+ */
+int ctdb_cleardb(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, uint32_t dbid)
+{
+       int ret;
+       TDB_DATA indata, outdata;
+       int32_t res;
+
+       indata.dsize = sizeof(uint32_t);
+       indata.dptr = (unsigned char *)talloc_array(mem_ctx, uint32_t, 1);
+
+       ((uint32_t *)(&indata.dptr[0]))[0] = dbid;
+
+       ret = ctdb_control(ctdb, destnode, 0, 
+                          CTDB_CONTROL_CLEAR_DB, indata, 
+                          mem_ctx, &outdata, &res);
+       if (ret != 0 || res != 0) {
+               DEBUG(0,(__location__ " ctdb_control for cleardb failed\n"));
+               return -1;
+       }
+
+       return 0;
+}
+
 /*
   ping a node
  */
index 903722a1846edce0f33c2a13d142fc8d7b20d704..eab6cf5af4493cfaf2f78b1e58ce4116dd51648d 100644 (file)
@@ -43,6 +43,19 @@ struct ctdb_control_state {
  } while (0)
 
 
+static int traverse_cleardb(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *p)
+{
+       int ret;
+
+
+       ret = tdb_delete(tdb, key);
+       if (ret) {
+               DEBUG(0,(__location__ "failed to delete tdb record\n"));
+               return ret;
+       }
+       return 0;
+}
+
 static int traverse_setdmaster(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *p)
 {
        uint32_t *dmaster = (uint32_t *)p;
@@ -237,7 +250,6 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
        case CTDB_CONTROL_GET_KEYS: {
                uint32_t dbid;
                struct ctdb_db_context *ctdb_db;
-               struct tdb_wrap *db;
                struct getkeys_params params;
 
                dbid = *((uint32_t *)(&indata.dptr[0]));
@@ -251,17 +263,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
                outdata->dptr = (unsigned char *)talloc_array(outdata, uint32_t, 1);
                *((uint32_t *)(&outdata->dptr[0]))=0;
 
-               db = tdb_wrap_open(NULL, ctdb_db->db_path, 0, TDB_DEFAULT, O_RDONLY, 0);
-               if (db == NULL) {
-                       DEBUG(0,(__location__ " failed to open db\n"));
-                       return -1;
-               }
-
                params.ctdb_db = ctdb_db;
                params.outdata = outdata;
-               tdb_traverse(db->tdb, traverse_getkeys, &params);
+               tdb_traverse_read(ctdb_db->ltdb->tdb, traverse_getkeys, &params);
 
-               talloc_free(db);
 
                return 0;
        }
@@ -269,7 +274,6 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
        case CTDB_CONTROL_SET_DMASTER: {
                uint32_t dbid, dmaster;
                struct ctdb_db_context *ctdb_db;
-               struct tdb_wrap *db;
 
                dbid = ((uint32_t *)(&indata.dptr[0]))[0];
                ctdb_db = find_ctdb_db(ctdb, dbid);
@@ -283,15 +287,26 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
                outdata->dsize = 0;
                outdata->dptr = NULL;
 
-               db = tdb_wrap_open(NULL, ctdb_db->db_path, 0, TDB_DEFAULT, O_RDONLY, 0);
-               if (db == NULL) {
-                       DEBUG(0,(__location__ " failed to open db\n"));
+               tdb_traverse(ctdb_db->ltdb->tdb, traverse_setdmaster, &dmaster);
+
+               return 0;
+       }
+
+       case CTDB_CONTROL_CLEAR_DB: {
+               uint32_t dbid;
+               struct ctdb_db_context *ctdb_db;
+
+               dbid = ((uint32_t *)(&indata.dptr[0]))[0];
+               ctdb_db = find_ctdb_db(ctdb, dbid);
+               if (!ctdb_db) {
+                       DEBUG(0,(__location__ " Unknown db 0x%08x\n",dbid));
                        return -1;
                }
 
-               tdb_traverse(db->tdb, traverse_setdmaster, &dmaster);
+               outdata->dsize = 0;
+               outdata->dptr = NULL;
 
-               talloc_free(db);
+               tdb_traverse(ctdb_db->ltdb->tdb, traverse_cleardb, NULL);
 
                return 0;
        }
index ef38582f3cd5c39fe614841c52fba938c90a43b4..bf8643f22dd027824e0aff33dadb1a73b6caf4ed 100644 (file)
@@ -266,4 +266,9 @@ int ctdb_set_debuglevel(struct ctdb_context *ctdb, uint32_t destnode, uint32_t l
  */
 int ctdb_setdmaster(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, uint32_t dbid, uint32_t dmaster);
 
+/*
+  delete all records from a tdb
+ */
+int ctdb_cleardb(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, uint32_t dbid);
+
 #endif
index f1d414efb67b983b051a54af1b20362a96df92cf..5207bea9709eda43ef43500b73753e10da43cea8 100644 (file)
@@ -256,7 +256,8 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS,
                    CTDB_CONTROL_GET_DBMAP,
                    CTDB_CONTROL_GET_NODEMAP,
                    CTDB_CONTROL_GET_KEYS,
-                   CTDB_CONTROL_SET_DMASTER};
+                   CTDB_CONTROL_SET_DMASTER,
+                   CTDB_CONTROL_CLEAR_DB};
 
 enum call_state {CTDB_CALL_WAIT, CTDB_CALL_DONE, CTDB_CALL_ERROR};
 
index c5f28eb87ca453a720ddf959250477f0c15d4f0d..f96fad8af1efbb6467a676b4a153c08af21b075f 100644 (file)
@@ -44,6 +44,7 @@ static void usage(void)
        printf("  getnodemap <vnn>                   lists nodes known to a ctdb daemon\n");
        printf("  getkeys <vnn> <dbid>               lists all keys in a remote tdb\n");
        printf("  setdmaster <vnn> <dbid> <dmaster>  sets new dmaster for all records in the database\n");
+       printf("  cleardb <vnn> <dbid>               deletes all records in a db\n");
        exit(1);
 }
 
@@ -305,7 +306,7 @@ static int control_setdmaster(struct ctdb_context *ctdb, int argc, const char **
        uint32_t vnn, dbid, dmaster;
        int ret;
 
-       if (argc < 2) {
+       if (argc < 3) {
                usage();
        }
 
@@ -321,6 +322,29 @@ static int control_setdmaster(struct ctdb_context *ctdb, int argc, const char **
        return 0;
 }
 
+/*
+  clears a database
+ */
+static int control_cleardb(struct ctdb_context *ctdb, int argc, const char **argv)
+{
+       uint32_t vnn, dbid;
+       int ret;
+
+       if (argc < 2) {
+               usage();
+       }
+
+       vnn     = strtoul(argv[0], NULL, 0);
+       dbid    = strtoul(argv[1], NULL, 0);
+
+       ret = ctdb_cleardb(ctdb, vnn, ctdb, dbid);
+       if (ret != 0) {
+               printf("Unable to clear db for node %u db:0x%08x\n", vnn, dbid);
+               return ret;
+       }
+       return 0;
+}
+
 /*
   ping all node
  */
@@ -451,6 +475,8 @@ int main(int argc, const char *argv[])
                ret = control_setvnnmap(ctdb, extra_argc-1, extra_argv+1);
        } else if (strcmp(control, "setdmaster") == 0) {
                ret = control_setdmaster(ctdb, extra_argc-1, extra_argv+1);
+       } else if (strcmp(control, "cleardb") == 0) {
+               ret = control_cleardb(ctdb, extra_argc-1, extra_argv+1);
        } else if (strcmp(control, "ping") == 0) {
                ret = control_ping(ctdb, extra_argc-1, extra_argv+1);
        } else if (strcmp(control, "debug") == 0) {