s3-dbwrap: Rewrite dbwrap_fallback_parse_record based on dbwrap_fetch_locked
[kai/samba.git] / source3 / lib / dbwrap / dbwrap.c
index f6f96befedd0c2f39f5c1fe05395295142621bea..0635d76b2cba189327c1690c305a27b3d0b9b9a4 100644 (file)
@@ -51,32 +51,39 @@ static NTSTATUS dbwrap_fallback_fetch(struct db_context *db,
 
 static int dbwrap_fallback_exists(struct db_context *db, TDB_DATA key)
 {
-       int res = dbwrap_parse_record(db, key, NULL, NULL);
-       return  ( res == -1) ? 0 : 1;
+       NTSTATUS status = dbwrap_parse_record(db, key, NULL, NULL);
+       return NT_STATUS_IS_OK(status) ? 1 : 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)
+static NTSTATUS dbwrap_fallback_parse_record(struct db_context *db, TDB_DATA key,
+                                            void (*parser)(TDB_DATA key,
+                                                           TDB_DATA data,
+                                                           void *private_data),
+                                            void *private_data)
 {
+       struct db_record *rec;
        TDB_DATA data;
-       int res;
-       NTSTATUS status;
 
-       status = dbwrap_fetch(db, talloc_tos(), key, &data);
-       if (!NT_STATUS_IS_OK(status)) {
-               return -1;
+       rec = dbwrap_fetch_locked(db, talloc_tos(), key);
+       if (rec == NULL) {
+               return NT_STATUS_NOT_FOUND;
+       }
+       data = dbwrap_record_get_value(rec);
+
+       data.dptr = talloc_memdup(talloc_tos(), data.dptr, data.dsize);
+       TALLOC_FREE(rec);
+       if (data.dptr == NULL) {
+               return NT_STATUS_NO_MEMORY;
        }
 
-       res = parser(key, data, private_data);
+       parser(key, data, private_data);
+
        TALLOC_FREE(data.dptr);
-       return res;
+       return NT_STATUS_OK;
 }
 
 
@@ -87,12 +94,12 @@ static int delete_record(struct db_record *rec, void *data)
 }
 
 /*
- * Fallback wipe ipmlementation using traverse and delete if no genuine
+ * Fallback wipe implementation using traverse and delete if no genuine
  * wipe operation is provided
  */
 static int dbwrap_fallback_wipe(struct db_context *db)
 {
-       NTSTATUS status = dbwrap_trans_traverse(db, &delete_record, NULL);
+       NTSTATUS status = dbwrap_trans_traverse(db, delete_record, NULL);
        return NT_STATUS_IS_OK(status) ? 0 : -1;
 }
 
@@ -217,15 +224,15 @@ NTSTATUS dbwrap_traverse_read(struct db_context *db,
        return NT_STATUS_OK;
 }
 
-static int dbwrap_null_parser(TDB_DATA key, TDB_DATA val, void* data)
+static void dbwrap_null_parser(TDB_DATA key, TDB_DATA val, void* data)
 {
-       return 0;
+       return;
 }
 
-int dbwrap_parse_record(struct db_context *db, TDB_DATA key,
-                       int (*parser)(TDB_DATA key, TDB_DATA data,
-                                     void *private_data),
-                       void *private_data)
+NTSTATUS dbwrap_parse_record(struct db_context *db, TDB_DATA key,
+                            void (*parser)(TDB_DATA key, TDB_DATA data,
+                                           void *private_data),
+                            void *private_data)
 {
        if (parser == NULL) {
                parser = dbwrap_null_parser;