Add dbwrap->parse_record
authorVolker Lendecke <vl@samba.org>
Sat, 21 Feb 2009 23:18:05 +0000 (00:18 +0100)
committerMichael Adam <obnox@samba.org>
Thu, 26 Feb 2009 10:05:22 +0000 (11:05 +0100)
Signed-off-by: Michael Adam <obnox@samba.org>
source3/include/dbwrap.h
source3/lib/dbwrap.c

index aad4ccd721e08715432f8330a21d67d4e8a78c7d..16f10cc1252d3a9ab2a4d2bb7b0a2cff1242ea77 100644 (file)
@@ -46,6 +46,10 @@ struct db_context {
        int (*transaction_start)(struct db_context *db);
        int (*transaction_commit)(struct db_context *db);
        int (*transaction_cancel)(struct db_context *db);
+       int (*parse_record)(struct db_context *db, TDB_DATA key,
+                           int (*parser)(TDB_DATA key, TDB_DATA data,
+                                         void *private_data),
+                           void *private_data);
        void *private_data;
        bool persistent;
 };
index a57b7c97a5dc4690c53027e76d73b875852d1c6f..5e7ce6099fc486004d737304f01e784639379675 100644 (file)
@@ -42,6 +42,29 @@ static int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+/*
+ * Fall back using fetch if no genuine parse operation is provided
+ */
+
+static int dbwrap_fallback_parse_record(struct db_context *db, TDB_DATA key,
+                                       int (*parser)(TDB_DATA key,
+                                                     TDB_DATA data,
+                                                     void *private_data),
+                                       void *private_data)
+{
+       TDB_DATA data;
+       int res;
+
+       res = db->fetch(db, talloc_tos(), key, &data);
+       if (res != 0) {
+               return res;
+       }
+
+       res = parser(key, data, private_data);
+       TALLOC_FREE(data.dptr);
+       return res;
+}
+
 /**
  * open a database
  */
@@ -101,6 +124,9 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
        if ((result != NULL) && (result->fetch == NULL)) {
                result->fetch = dbwrap_fallback_fetch;
        }
+       if ((result != NULL) && (result->parse_record == NULL)) {
+               result->parse_record = dbwrap_fallback_parse_record;
+       }
 
        return result;
 }