r23220: Add traverse_read to dbwrap
authorVolker Lendecke <vlendec@samba.org>
Tue, 29 May 2007 18:04:38 +0000 (18:04 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:22:55 +0000 (12:22 -0500)
source/include/dbwrap.h
source/lib/dbwrap_file.c
source/lib/dbwrap_tdb.c
source/smbd/session.c

index 17d36b8f42c30f45d9992a3b5bba72456522542b..eae53e8ed480c4e27fdf37df5fc7f00b15866bc8 100644 (file)
@@ -38,6 +38,10 @@ struct db_context {
                        int (*f)(struct db_record *db,
                                 void *private_data),
                        void *private_data);
+       int (*traverse_read)(struct db_context *db,
+                            int (*f)(struct db_record *db,
+                                     void *private_data),
+                            void *private_data);
        int (*get_seqnum)(struct db_context *db);
        void *private_data;
 };
index 9e18c6b8fe64fa97d5d05d478969081e8af40cae..0ac7586e48bdc648b65babd9557a5db0b7306bcc 100644 (file)
@@ -367,6 +367,7 @@ struct db_context *db_open_file(TALLOC_CTX *mem_ctx,
        result->private_data = ctx;
        result->fetch_locked = db_file_fetch_locked;
        result->traverse = db_file_traverse;
+       result->traverse_read = db_file_traverse;
 
        ctx->locked_record = NULL;
        if (!(ctx->dirname = talloc_strdup(ctx, name))) {
index 2b09e3ccabbf11ce1ea5d9aa46dfea37e36622bd..028bad36e63f2f9156aae0c49f42bf9fd04c687e 100644 (file)
@@ -174,6 +174,46 @@ static int db_tdb_traverse(struct db_context *db,
        return tdb_traverse(db_ctx->tdb, db_tdb_traverse_func, &ctx);
 }
 
+static NTSTATUS db_tdb_store_deny(struct db_record *rec, TDB_DATA data, int flag)
+{
+       return NT_STATUS_MEDIA_WRITE_PROTECTED;
+}
+
+static NTSTATUS db_tdb_delete_deny(struct db_record *rec)
+{
+       return NT_STATUS_MEDIA_WRITE_PROTECTED;
+}
+
+static int db_tdb_traverse_read_func(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf,
+                               void *private_data)
+{
+       struct db_tdb_traverse_ctx *ctx =
+               (struct db_tdb_traverse_ctx *)private_data;
+       struct db_record rec;
+
+       rec.key = kbuf;
+       rec.value = dbuf;
+       rec.store = db_tdb_store_deny;
+       rec.delete_rec = db_tdb_delete_deny;
+       rec.private_data = ctx->db->private_data;
+
+       return ctx->f(&rec, ctx->private_data);
+}
+
+static int db_tdb_traverse_read(struct db_context *db,
+                          int (*f)(struct db_record *rec, void *private_data),
+                          void *private_data)
+{
+       struct db_tdb_ctx *db_ctx =
+               talloc_get_type_abort(db->private_data, struct db_tdb_ctx);
+       struct db_tdb_traverse_ctx ctx;
+
+       ctx.db = db;
+       ctx.f = f;
+       ctx.private_data = private_data;
+       return tdb_traverse_read(db_ctx->tdb, db_tdb_traverse_read_func, &ctx);
+}
+
 static int db_tdb_get_seqnum(struct db_context *db)
 
 {
@@ -222,6 +262,7 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
        talloc_set_destructor(db_tdb, db_tdb_ctx_destr);
        result->fetch_locked = db_tdb_fetch_locked;
        result->traverse = db_tdb_traverse;
+       result->traverse_read = db_tdb_traverse_read;
        result->get_seqnum = db_tdb_get_seqnum;
        return result;
 
index 837c37a49f7cc40430507fe199117e5090491ca1..d5973ef5c3cdd5729b5dfe6fb64cce14e33648bb 100644 (file)
@@ -275,7 +275,7 @@ static BOOL session_traverse(int (*fn)(struct db_record *db,
                return False;
        }
 
-       ctx->traverse(ctx, fn, private_data);
+       ctx->traverse_read(ctx, fn, private_data);
        return True;
 }