diff options
-rw-r--r-- | source3/utils/dbwrap_tool.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/source3/utils/dbwrap_tool.c b/source3/utils/dbwrap_tool.c index 5172112a4c..c25620f64f 100644 --- a/source3/utils/dbwrap_tool.c +++ b/source3/utils/dbwrap_tool.c @@ -23,7 +23,7 @@ extern bool AllowDebugChange; -typedef enum { OP_FETCH, OP_STORE, OP_DELETE } dbwrap_op; +typedef enum { OP_FETCH, OP_STORE, OP_DELETE, OP_ERASE } dbwrap_op; typedef enum { TYPE_INT32, TYPE_UINT32 } dbwrap_type; @@ -111,6 +111,32 @@ static int dbwrap_tool_delete(struct db_context *db, return 0; } +static int delete_fn(struct db_record *rec, void *priv) +{ + rec->delete_rec(rec); + return 0; +} + +/** + * dbwrap_tool_erase: erase the whole data base + * the keyname argument is not used. + */ +static int dbwrap_tool_erase(struct db_context *db, + const char *keyname, + void *data) +{ + int ret; + + ret = db->traverse(db, delete_fn, NULL); + + if (ret < 0) { + d_fprintf(stderr, "ERROR erasing the database\n"); + return -1; + } + + return 0; +} + struct dbwrap_op_dispatch_table { dbwrap_op op; dbwrap_type type; @@ -126,6 +152,7 @@ struct dbwrap_op_dispatch_table dispatch_table[] = { { OP_STORE, TYPE_UINT32, dbwrap_tool_store_uint32 }, { OP_DELETE, TYPE_INT32, dbwrap_tool_delete }, { OP_DELETE, TYPE_UINT32, dbwrap_tool_delete }, + { OP_ERASE, TYPE_INT32, dbwrap_tool_erase }, { 0, 0, NULL }, }; @@ -140,7 +167,7 @@ int main(int argc, const char **argv) const char *dbname; const char *opname; dbwrap_op op; - const char *keyname; + const char *keyname = ""; const char *keytype = "int32"; dbwrap_type type; const char *valuestr = "0"; @@ -156,10 +183,10 @@ int main(int argc, const char **argv) AllowDebugChange = false; lp_load(get_dyn_CONFIGFILE(), true, false, false, true); - if ((argc != 4) && (argc != 5) && (argc != 6)) { + if ((argc < 3) || (argc > 6)) { d_fprintf(stderr, - "USAGE: %s <database> <op> <key> [<type> [<value>]]\n" - " ops: fetch, store, delete\n" + "USAGE: %s <database> <op> [<key> [<type> [<value>]]]\n" + " ops: fetch, store, delete, erase\n" " types: int32, uint32\n", argv[0]); goto done; @@ -167,7 +194,6 @@ int main(int argc, const char **argv) dbname = argv[1]; opname = argv[2]; - keyname = argv[3]; if (strcmp(opname, "store") == 0) { if (argc != 6) { @@ -177,6 +203,7 @@ int main(int argc, const char **argv) } valuestr = argv[5]; keytype = argv[4]; + keyname = argv[3]; op = OP_STORE; } else if (strcmp(opname, "fetch") == 0) { if (argc != 5) { @@ -186,13 +213,22 @@ int main(int argc, const char **argv) } op = OP_FETCH; keytype = argv[4]; + keyname = argv[3]; } else if (strcmp(opname, "delete") == 0) { if (argc != 4) { d_fprintf(stderr, "ERROR: operation 'delete' does " "not allow type nor value argument\n"); goto done; } + keyname = argv[3]; op = OP_DELETE; + } else if (strcmp(opname, "erase") == 0) { + if (argc != 3) { + d_fprintf(stderr, "ERROR: operation 'erase' does " + "not take a key argument\n"); + goto done; + } + op = OP_ERASE; } else { d_fprintf(stderr, "ERROR: invalid op '%s' specified\n" |