Implement db_rbt_traverse
[ira/wip.git] / source3 / lib / dbwrap_rbt.c
index cf4faa25b97254bd978dc8183fdd0e28fa635caa..e9b0e4616f64d1b3a2282e7fa7d256569971d427 100644 (file)
@@ -335,16 +335,45 @@ static int db_rbt_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+static int db_rbt_traverse_internal(struct rb_node *n,
+                                   int (*f)(struct db_record *db,
+                                            void *private_data),
+                                   void *private_data)
+{
+       struct db_rbt_node *r;
+       struct db_record rec;
+       int ret;
+
+       if (n == NULL) {
+               return 0;
+       }
+
+       ret = db_rbt_traverse_internal(n->rb_left, f, private_data);
+       if (ret != 0) {
+               return ret;
+       }
+
+       r = db_rbt2node(n);
+       ZERO_STRUCT(rec);
+       db_rbt_parse_node(r, &rec.key, &rec.value);
+
+       ret = f(&rec, private_data);
+       if (ret != 0) {
+               return ret;
+       }
+
+       return db_rbt_traverse_internal(n->rb_right, f, private_data);
+}
 
 static int db_rbt_traverse(struct db_context *db,
                           int (*f)(struct db_record *db,
                                    void *private_data),
                           void *private_data)
 {
-       /*
-        * Nobody uses this so far, and unused code is broken code :-)
-        */
-       return -1;
+       struct db_rbt_ctx *ctx = talloc_get_type_abort(
+               db->private_data, struct db_rbt_ctx);
+
+       return db_rbt_traverse_internal(ctx->tree.rb_node, f, private_data);
 }
 
 static int db_rbt_get_seqnum(struct db_context *db)