v3-4-ctdb: Add connections_forall_read()
authorVolker Lendecke <vl@samba.org>
Wed, 24 Mar 2010 09:28:44 +0000 (10:28 +0100)
committerVolker Lendecke <vl@samba.org>
Wed, 24 Mar 2010 15:00:59 +0000 (16:00 +0100)
source3/include/proto.h
source3/lib/conn_tdb.c

index 8a8b2728e24998af6bae7d360a4df8efc80ecdbd..c5f88cb3a82de3ad0e5c9bc07c04978e57c7ee35 100644 (file)
@@ -435,6 +435,10 @@ int connections_forall(int (*fn)(struct db_record *rec,
                                 const struct connections_data *data,
                                 void *private_data),
                       void *private_data);
+int connections_forall_read(int (*fn)(const struct connections_key *key,
+                                     const struct connections_data *data,
+                                     void *private_data),
+                           void *private_data);
 bool connections_init(bool rw);
 
 /* The following definitions come from lib/dbwrap_util.c  */
index 22d85c873d3399c1791c5af15df9a216ea97eb16..6732529c0c50a1041a3ca05763cf47744db3693f 100644 (file)
@@ -120,6 +120,48 @@ int connections_forall(int (*fn)(struct db_record *rec,
        return connections_traverse(conn_traverse_fn, (void *)&state);
 }
 
+struct connections_forall_read_state {
+       int (*fn)(const struct connections_key *key,
+                 const struct connections_data *data,
+                 void *private_data);
+       void *private_data;
+};
+
+static int connections_forall_read_fn(struct db_record *rec,
+                                     void *private_data)
+{
+       struct connections_forall_read_state *state =
+               (struct connections_forall_read_state *)private_data;
+
+       if ((rec->key.dsize != sizeof(struct connections_key))
+           || (rec->value.dsize != sizeof(struct connections_data))) {
+               return 0;
+       }
+
+       return state->fn((const struct connections_key *)rec->key.dptr,
+                        (const struct connections_data *)rec->value.dptr,
+                        state->private_data);
+}
+
+int connections_forall_read(int (*fn)(const struct connections_key *key,
+                                     const struct connections_data *data,
+                                     void *private_data),
+                           void *private_data)
+{
+        struct db_context *ctx = connections_db_ctx(False);
+       struct connections_forall_read_state state;
+
+       if (ctx == NULL) {
+               return -1;
+       }
+
+       state.fn = fn;
+       state.private_data = private_data;
+       return ctx->traverse_read(ctx, connections_forall_read_fn,
+                                 &state);
+}
+
+
 bool connections_init(bool rw)
 {
        return (connections_db_ctx(rw) != NULL);