summaryrefslogtreecommitdiffstats
path: root/ctdb/client
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2010-12-22 12:45:06 +0100
committerMichael Adam <obnox@samba.org>2011-11-29 10:30:24 +0100
commit554d68df601208430517cac7621ddcf825ccb924 (patch)
tree4a5828b52535580f510d284358ff8e9f171faf57 /ctdb/client
parent1a31c843488e736da74482ee363913213e54a6ea (diff)
downloadsamba-554d68df601208430517cac7621ddcf825ccb924.tar.gz
samba-554d68df601208430517cac7621ddcf825ccb924.tar.xz
samba-554d68df601208430517cac7621ddcf825ccb924.zip
client: add version ctdb_traverse_ext() of ctdb_traverse() that can list empty records.
(This used to be ctdb commit 4ada4bfc4510886c5c7fcf49e09711b9d2dcb75d)
Diffstat (limited to 'ctdb/client')
-rw-r--r--ctdb/client/ctdb_client.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/ctdb/client/ctdb_client.c b/ctdb/client/ctdb_client.c
index 307c19ed553..0fb6a4407cd 100644
--- a/ctdb/client/ctdb_client.c
+++ b/ctdb/client/ctdb_client.c
@@ -2002,6 +2002,7 @@ struct traverse_state {
uint32_t count;
ctdb_traverse_func fn;
void *private_data;
+ bool listemptyrecords;
};
/*
@@ -2031,7 +2032,9 @@ static void traverse_handler(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA
return;
}
- if (data.dsize == sizeof(struct ctdb_ltdb_header)) {
+ if (!state->listemptyrecords &&
+ data.dsize == sizeof(struct ctdb_ltdb_header))
+ {
/* empty records are deleted records in ctdb */
return;
}
@@ -2043,12 +2046,17 @@ static void traverse_handler(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA
state->count++;
}
-
-/*
- start a cluster wide traverse, calling the supplied fn on each record
- return the number of records traversed, or -1 on error
+/**
+ * start a cluster wide traverse, calling the supplied fn on each record
+ * return the number of records traversed, or -1 on error
+ *
+ * Extendet variant with a flag to signal whether empty records should
+ * be listed.
*/
-int ctdb_traverse(struct ctdb_db_context *ctdb_db, ctdb_traverse_func fn, void *private_data)
+static int ctdb_traverse_ext(struct ctdb_db_context *ctdb_db,
+ ctdb_traverse_func fn,
+ bool withemptyrecords,
+ void *private_data)
{
TDB_DATA data;
struct ctdb_traverse_start t;
@@ -2061,6 +2069,7 @@ int ctdb_traverse(struct ctdb_db_context *ctdb_db, ctdb_traverse_func fn, void *
state.count = 0;
state.private_data = private_data;
state.fn = fn;
+ state.listemptyrecords = withemptyrecords;
ret = ctdb_client_set_message_handler(ctdb_db->ctdb, srvid, traverse_handler, &state);
if (ret != 0) {
@@ -2071,7 +2080,7 @@ int ctdb_traverse(struct ctdb_db_context *ctdb_db, ctdb_traverse_func fn, void *
t.db_id = ctdb_db->db_id;
t.srvid = srvid;
t.reqid = 0;
- t.withemptyrecords = false;
+ t.withemptyrecords = withemptyrecords;
data.dptr = (uint8_t *)&t;
data.dsize = sizeof(t);
@@ -2097,6 +2106,18 @@ int ctdb_traverse(struct ctdb_db_context *ctdb_db, ctdb_traverse_func fn, void *
return state.count;
}
+/**
+ * start a cluster wide traverse, calling the supplied fn on each record
+ * return the number of records traversed, or -1 on error
+ *
+ * Standard version which does not list the empty records:
+ * These are considered deleted.
+ */
+int ctdb_traverse(struct ctdb_db_context *ctdb_db, ctdb_traverse_func fn, void *private_data)
+{
+ return ctdb_traverse_ext(ctdb_db, fn, false, private_data);
+}
+
#define ISASCII(x) (isprint(x) && !strchr("\"\\", (x)))
/*
called on each key during a catdb