ctdb: add an option --print-emptyrecords to enable printing of empty records in dumpi...
authorMichael Adam <obnox@samba.org>
Mon, 28 Nov 2011 16:11:16 +0000 (17:11 +0100)
committerMichael Adam <obnox@samba.org>
Tue, 29 Nov 2011 09:30:24 +0000 (10:30 +0100)
this option is used with the commands catdb, cattdb and dumpdbbackup.

(This used to be ctdb commit 6ec68a2e667f66d2b194fe48cb75229a2777842e)

ctdb/client/ctdb_client.c
ctdb/include/ctdb_client.h
ctdb/tools/ctdb.c

index 0fb6a4407cd6198dfc704ee0f0426646a541ae3a..72c938da9ff3e45ba94aa5c3b9f511575f09728e 100644 (file)
@@ -2125,7 +2125,8 @@ int ctdb_traverse(struct ctdb_db_context *ctdb_db, ctdb_traverse_func fn, void *
 int ctdb_dumpdb_record(struct ctdb_context *ctdb, TDB_DATA key, TDB_DATA data, void *p)
 {
        int i;
-       FILE *f = (FILE *)p;
+       struct ctdb_dump_db_context *c = (struct ctdb_dump_db_context *)p;
+       FILE *f = c->f;
        struct ctdb_ltdb_header *h = (struct ctdb_ltdb_header *)data.dptr;
 
        fprintf(f, "key(%u) = \"", (unsigned)key.dsize);
@@ -2168,9 +2169,11 @@ int ctdb_dumpdb_record(struct ctdb_context *ctdb, TDB_DATA key, TDB_DATA data, v
 /*
   convenience function to list all keys to stdout
  */
-int ctdb_dump_db(struct ctdb_db_context *ctdb_db, FILE *f)
+int ctdb_dump_db(struct ctdb_db_context *ctdb_db,
+                struct ctdb_dump_db_context *ctx)
 {
-       return ctdb_traverse(ctdb_db, ctdb_dumpdb_record, f);
+       return ctdb_traverse_ext(ctdb_db, ctdb_dumpdb_record,
+                                ctx->printemptyrecords, ctx);
 }
 
 /*
index 01219f341b6a8ba76e6e0106d3a6a3681bb738c2..a6342c1ce31018a2c8d544f135cb9cc8b9212af1 100644 (file)
@@ -373,8 +373,14 @@ int ctdb_set_logfile(struct ctdb_context *ctdb, const char *logfile, bool use_sy
 typedef int (*ctdb_traverse_func)(struct ctdb_context *, TDB_DATA, TDB_DATA, void *);
 int ctdb_traverse(struct ctdb_db_context *ctdb_db, ctdb_traverse_func fn, void *private_data);
 
+struct ctdb_dump_db_context {
+       FILE *f;
+       bool printemptyrecords;
+};
+
 int ctdb_dumpdb_record(struct ctdb_context *ctdb, TDB_DATA key, TDB_DATA data, void *p);
-int ctdb_dump_db(struct ctdb_db_context *ctdb_db, FILE *f);
+int ctdb_dump_db(struct ctdb_db_context *ctdb_db,
+                struct ctdb_dump_db_context *ctx);
 
 /*
   get the pid of a ctdb daemon
index c286389bdcfad5818cdb0a14a4c2e961965412bf..905ecd739dc542a5238414c468e31bba070e7c1b 100644 (file)
@@ -46,6 +46,7 @@ static struct {
        int machinereadable;
        int verbose;
        int maxruntime;
+       int printemptyrecords;
 } options;
 
 #define TIMELIMIT() timeval_current_ofs(options.timelimit, 0)
@@ -2974,6 +2975,7 @@ static int control_catdb(struct ctdb_context *ctdb, int argc, const char **argv)
        struct ctdb_db_context *ctdb_db;
        int ret;
        bool persistent;
+       struct ctdb_dump_db_context c;
 
        if (argc < 1) {
                usage();
@@ -2994,8 +2996,12 @@ static int control_catdb(struct ctdb_context *ctdb, int argc, const char **argv)
                return -1;
        }
 
+       ZERO_STRUCT(c);
+       c.f = stdout;
+       c.printemptyrecords = (bool)options.printemptyrecords;
+
        /* traverse and dump the cluster tdb */
-       ret = ctdb_dump_db(ctdb_db, stdout);
+       ret = ctdb_dump_db(ctdb_db, &c);
        if (ret == -1) {
                DEBUG(DEBUG_ERR, ("Unable to dump database\n"));
                DEBUG(DEBUG_ERR, ("Maybe try 'ctdb getdbstatus %s'"
@@ -3017,10 +3023,15 @@ struct cattdb_data {
 static int cattdb_traverse(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *private_data)
 {
        struct cattdb_data *d = private_data;
+       struct ctdb_dump_db_context c;
 
        d->count++;
-       
-       return ctdb_dumpdb_record(d->ctdb, key, data, stdout);
+
+       ZERO_STRUCT(c);
+       c.f = stdout;
+       c.printemptyrecords = (bool)options.printemptyrecords;
+
+       return ctdb_dumpdb_record(d->ctdb, key, data, &c);
 }
 
 /*
@@ -4545,6 +4556,7 @@ static int control_dumpdbbackup(struct ctdb_context *ctdb, int argc, const char
        char tbuf[100];
        struct ctdb_rec_data *rec = NULL;
        struct ctdb_marshall_buffer *m;
+       struct ctdb_dump_db_context c;
 
        if (argc != 1) {
                DEBUG(DEBUG_ERR,("Invalid arguments\n"));
@@ -4582,6 +4594,10 @@ static int control_dumpdbbackup(struct ctdb_context *ctdb, int argc, const char
        printf("Backup of database name:'%s' dbid:0x%x08x from @ %s\n",
                dbhdr.name, m->db_id, tbuf);
 
+       ZERO_STRUCT(c);
+       c.f = stdout;
+       c.printemptyrecords = (bool)options.printemptyrecords;
+
        for (i=0; i < m->count; i++) {
                uint32_t reqid = 0;
                TDB_DATA key, data;
@@ -4590,7 +4606,7 @@ static int control_dumpdbbackup(struct ctdb_context *ctdb, int argc, const char
                rec = ctdb_marshall_loop_next(m, rec, &reqid,
                                              NULL, &key, &data);
 
-               ctdb_dumpdb_record(ctdb, key, data, stdout);
+               ctdb_dumpdb_record(ctdb, key, data, &c);
        }
 
        printf("Dumped %d records\n", i);
@@ -5146,6 +5162,7 @@ int main(int argc, const char *argv[])
                { "machinereadable", 'Y', POPT_ARG_NONE, &options.machinereadable, 0, "enable machinereadable output", NULL },
                { "verbose",    'v', POPT_ARG_NONE, &options.verbose, 0, "enable verbose output", NULL },
                { "maxruntime", 'T', POPT_ARG_INT, &options.maxruntime, 0, "die if runtime exceeds this limit (in seconds)", "integer" },
+               { "print-emptyrecords", 0, POPT_ARG_NONE, &options.printemptyrecords, 0, "print the empty records when dumping databases (catdb, cattdb, dumpdbbackup)", NULL },
                POPT_TABLEEND
        };
        int opt;