s3-dbwrap: Rewrite dbwrap_fetch in terms of dbwrap_parse_record
authorVolker Lendecke <vl@samba.org>
Thu, 8 Dec 2011 15:43:40 +0000 (16:43 +0100)
committerMichael Adam <obnox@samba.org>
Thu, 15 Dec 2011 15:00:46 +0000 (16:00 +0100)
Signed-off-by: Michael Adam <obnox@samba.org>
source3/lib/dbwrap/dbwrap.c

index 0635d76b2cba189327c1690c305a27b3d0b9b9a4..4df2474ea17b0f45104d2b09ed2615b889a213db 100644 (file)
@@ -135,16 +135,43 @@ struct db_record *dbwrap_fetch_locked(struct db_context *db,
        return db->fetch_locked(db, mem_ctx, key);
 }
 
+struct dbwrap_fetch_state {
+       TALLOC_CTX *mem_ctx;
+       TDB_DATA data;
+};
+
+static void dbwrap_fetch_parser(TDB_DATA key, TDB_DATA data,
+                               void *private_data)
+{
+       struct dbwrap_fetch_state *state =
+               (struct dbwrap_fetch_state *)private_data;
+
+       state->data.dsize = data.dsize;
+       state->data.dptr = (uint8_t *)talloc_memdup(state->mem_ctx, data.dptr,
+                                                   data.dsize);
+}
+
 NTSTATUS dbwrap_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
                      TDB_DATA key, TDB_DATA *value)
 {
+       struct dbwrap_fetch_state state;
+       NTSTATUS status;
+
        if (value == NULL) {
                return NT_STATUS_INVALID_PARAMETER;
        }
-       if (db->fetch == NULL) {
-               return dbwrap_fallback_fetch(db, mem_ctx, key, value);
+
+       state.mem_ctx = mem_ctx;
+
+       status = dbwrap_parse_record(db, key, dbwrap_fetch_parser, &state);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       if ((state.data.dsize != 0) && (state.data.dptr == NULL)) {
+               return NT_STATUS_NO_MEMORY;
        }
-       return db->fetch(db, mem_ctx, key, value);
+       *value = state.data;
+       return NT_STATUS_OK;
 }
 
 bool dbwrap_exists(struct db_context *db, TDB_DATA key)