[SCM] CTDB repository - branch 1.0.114 updated - ctdb-1.0.114.3-3-g0dfc98e

Michael Adam obnox at samba.org
Sat Nov 26 15:51:39 MST 2011


The branch, 1.0.114 has been updated
       via  0dfc98ebacfd72a7fb9bf340260f00f5eed7355e (commit)
      from  d40c71a3922ec7223d1d203cb451a2d71b75164d (commit)

http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=1.0.114


- Log -----------------------------------------------------------------
commit 0dfc98ebacfd72a7fb9bf340260f00f5eed7355e
Author: Gregor Beck <gbeck at sernet.de>
Date:   Tue Sep 27 11:41:29 2011 +0200

    ltdbtool: ignore empty (deleted) records per default.
    
    Add option -e to get the old behaviour and process empty records too.
    
    Signed-off-by: Michael Adam <obnox at samba.org>
    (cherry picked from commit d9859540c2000864bc6c58be5afe19aa3b1064b2)

-----------------------------------------------------------------------

Summary of changes:
 tools/ltdbtool.c |   35 +++++++++++++++++++++++++----------
 1 files changed, 25 insertions(+), 10 deletions(-)


Changeset truncated at 500 lines:

diff --git a/tools/ltdbtool.c b/tools/ltdbtool.c
index 9cfdb8f..b1488bb 100644
--- a/tools/ltdbtool.c
+++ b/tools/ltdbtool.c
@@ -102,7 +102,7 @@ static int usage(const char* cmd)
 static int
 ltdb_traverse(TDB_CONTEXT *tdb, int (*fn)(TDB_CONTEXT*, TDB_DATA, TDB_DATA,
 					  struct ctdb_ltdb_header*, void *),
-	      void *state, int hsize);
+	      void *state, int hsize, bool skip_empty);
 
 struct write_record_ctx {
 	TDB_CONTEXT* tdb;
@@ -131,7 +131,8 @@ static void dump_header_nop(struct dump_record_ctx* c,
 			    struct ctdb_ltdb_header* h)
 {}
 
-static int dump_db(const char* iname, FILE* ofile, int hsize, bool dump_header)
+static int dump_db(const char* iname, FILE* ofile, int hsize, bool dump_header,
+		   bool empty)
 {
 	int ret = -1;
 	TDB_CONTEXT* idb = tdb_open(iname, 0, TDB_DEFAULT, O_RDONLY, 0);
@@ -144,13 +145,14 @@ static int dump_db(const char* iname, FILE* ofile, int hsize, bool dump_header)
 			.dump_header = dump_header ? &dump_header_full
 			                           : &dump_header_nop,
 		};
-		ret = ltdb_traverse(idb, &dump_record, &dump_ctx, hsize);
+		ret = ltdb_traverse(idb, &dump_record, &dump_ctx, hsize, !empty);
 		tdb_close(idb);
 	}
 	return ret;
 }
 
-static int conv_db(const char* iname, const char* oname, size_t isize, size_t osize)
+static int conv_db(const char* iname, const char* oname, size_t isize,
+		   size_t osize, bool keep_empty)
 {
 	int ret = -1;
 	TDB_CONTEXT* idb = tdb_open(iname, 0, TDB_DEFAULT, O_RDONLY, 0);
@@ -166,7 +168,7 @@ static int conv_db(const char* iname, const char* oname, size_t isize, size_t os
 				.hsize = osize,
 				.tdb_store_flags = TDB_REPLACE,
 			};
-			ret = ltdb_traverse(idb, &write_record, &ctx, isize);
+			ret = ltdb_traverse(idb, &write_record, &ctx, isize, !keep_empty);
 			tdb_close(odb);
 		}
 		tdb_close(idb);
@@ -205,10 +207,11 @@ int main(int argc, char* argv[])
 	size_t isize = sizeof(struct ctdb_ltdb_header);
 	size_t osize = sizeof(struct ctdb_ltdb_header);
 	bool print_header = false;
+	bool keep_empty = false;
 	int opt;
 	const char *cmd, *idb, *odb;
 
-	while ((opt = getopt(argc, argv, "s:o:S:O:ph")) != -1) {
+	while ((opt = getopt(argc, argv, "s:o:S:O:ph:e")) != -1) {
 		switch (opt) {
 		case 's':
 		case 'S':
@@ -225,6 +228,8 @@ int main(int argc, char* argv[])
 		case 'p':
 			print_header = true;
 			break;
+		case 'e':
+			keep_empty = true;
 		case 'h':
 			return help(argv[0]);
 		default:
@@ -247,7 +252,7 @@ int main(int argc, char* argv[])
 			return usage(argv[0]);
 		}
 		idb = argv[optind+1];
-		ret = dump_db(idb, stdout, isize, print_header);
+		ret = dump_db(idb, stdout, isize, print_header, keep_empty);
 		return (ret >= 0) ? 0 : ret;
 	}
 	else if (strcmp(cmd, "convert") == 0) {
@@ -257,7 +262,7 @@ int main(int argc, char* argv[])
 		}
 		idb = argv[optind+1];
 		odb = argv[optind+2];
-		ret = conv_db(idb, odb, isize, osize);
+		ret = conv_db(idb, odb, isize, osize, keep_empty);
 		return (ret >= 0) ? 0 : ret;
 	}
 
@@ -268,6 +273,8 @@ struct ltdb_traverse_ctx {
 	int (*fn)(TDB_CONTEXT*,TDB_DATA,TDB_DATA,struct ctdb_ltdb_header*,void *);
 	void* state;
 	size_t hsize;
+	bool skip_empty;
+	unsigned nempty;
 };
 
 static int
@@ -287,6 +294,10 @@ ltdb_traverse_fn(TDB_CONTEXT* tdb, TDB_DATA key, TDB_DATA val,
 		fputc('\n', stderr);
 		return -1;
 	}
+	if (val.dsize == hsize && ctx->skip_empty) {
+		ctx->nempty++;
+		return 0;
+	}
 
 	memcpy(&hdr, val.dptr, hsize);
 
@@ -300,14 +311,18 @@ ltdb_traverse_fn(TDB_CONTEXT* tdb, TDB_DATA key, TDB_DATA val,
 
 int ltdb_traverse(TDB_CONTEXT *tdb,
 		  int (*fn)(TDB_CONTEXT *,TDB_DATA,TDB_DATA,struct ctdb_ltdb_header*,void *),
-		  void *state, int hsize)
+		  void *state, int hsize, bool skip_empty)
 {
 	struct ltdb_traverse_ctx ctx = {
 		.fn = fn,
 		.state = state,
 		.hsize = hsize < 0 ? sizeof(struct ctdb_ltdb_header) : hsize,
+		.skip_empty = skip_empty,
+		.nempty = 0,
 	};
-	return tdb_traverse(tdb, &ltdb_traverse_fn, &ctx);
+	int ret = tdb_traverse(tdb, &ltdb_traverse_fn, &ctx);
+
+	return (ret < 0) ? ret : (ret - ctx.nempty);
 }
 
 int write_record(TDB_CONTEXT* tdb, TDB_DATA key, TDB_DATA val,


-- 
CTDB repository


More information about the samba-cvs mailing list