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, 19 Mar 2009 17:03:55 +0000 (18:03 +0100)
Signed-off-by: Michael Adam <obnox@samba.org>
source/include/dbwrap.h
source/lib/dbwrap.c

index 46833fabdcec619c132b0f2508c11fb105dd58db..3381d2d6666b5c4e3e1aa2543ce935107bb7dbf0 100644 (file)
@@ -45,6 +45,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 73c2761a1b3d069cf482a31757e9c150fe1f00a0..055f5549b60a82adc1f1a164113f34d8ccb3a3a5 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;
 }