]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib:dbwrap: Add dbwrap_merge_dbs()
authorPavel Filipenský <pfilipensky@samba.org>
Tue, 28 Mar 2023 09:15:15 +0000 (11:15 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Tue, 13 Jun 2023 12:15:32 +0000 (12:15 +0000)
Signed-off-by: Pavel Filipenský <pfilipensky@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
lib/dbwrap/dbwrap.c
lib/dbwrap/dbwrap.h

index 9bdbd67dce1882723229549ac71e20ffb58ed386..ee4cdc54f924e4e18ba1cc4c8b80fe958c786208 100644 (file)
@@ -120,6 +120,35 @@ NTSTATUS dbwrap_record_delete(struct db_record *rec)
        return NT_STATUS_OK;
 }
 
+struct dbwrap_merge_dbs_state {
+       struct db_context *to;
+       int flags;
+};
+
+/* Copy a single record to the db_context passed in private_data */
+static int dbwrap_merge_dbs_copy_record(struct db_record *rec,
+                                           void *private_data)
+{
+       struct dbwrap_merge_dbs_state *state = private_data;
+
+       TDB_DATA data = dbwrap_record_get_value(rec);
+       TDB_DATA key = dbwrap_record_get_key(rec);
+       NTSTATUS status = dbwrap_store(state->to, key, data, state->flags);
+
+       return NT_STATUS_IS_OK(status) ? 0 : 1;
+}
+
+NTSTATUS
+dbwrap_merge_dbs(struct db_context *to, struct db_context *from, int flags)
+{
+       struct dbwrap_merge_dbs_state state = {.to = to, .flags = flags};
+
+       return dbwrap_traverse(from,
+                              dbwrap_merge_dbs_copy_record,
+                              &state,
+                              NULL);
+}
+
 const char *locked_dbs[DBWRAP_LOCK_ORDER_MAX];
 
 static void debug_lock_order(int level)
index 1415cfad2ae2f17b50f899637bd02d1dbd42272d..abc5161be050f13cbce47c6a633ece685385edf8 100644 (file)
@@ -71,6 +71,19 @@ NTSTATUS dbwrap_record_store(struct db_record *rec, TDB_DATA data, int flags);
 NTSTATUS dbwrap_record_storev(struct db_record *rec,
                              const TDB_DATA *dbufs, int num_dbufs, int flags);
 NTSTATUS dbwrap_record_delete(struct db_record *rec);
+
+/**
+ * @brief Adds TDB records from one db_context to another
+ *
+ * @param to   Destination db_context
+ * @param from Source db_context
+ * @param flags        (TDB_INSERT or TDB_REPLACE)
+ *
+ * @return NT_STATUS_OK on success or NT_STATUS_INTERNAL_DB_CORRUPTION
+ */
+NTSTATUS
+dbwrap_merge_dbs(struct db_context *to, struct db_context *from, int flags);
+
 struct db_record *dbwrap_fetch_locked(struct db_context *db,
                                      TALLOC_CTX *mem_ctx,
                                      TDB_DATA key);