From: Pavel Filipenský Date: Tue, 28 Mar 2023 09:15:15 +0000 (+0200) Subject: lib:dbwrap: Add dbwrap_merge_dbs() X-Git-Tag: talloc-2.4.1~456 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d8f7d244f408f2b51b4640aaa3e9fcaf36b83a11;p=thirdparty%2Fsamba.git lib:dbwrap: Add dbwrap_merge_dbs() Signed-off-by: Pavel Filipenský Reviewed-by: Andreas Schneider --- diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c index 9bdbd67dce1..ee4cdc54f92 100644 --- a/lib/dbwrap/dbwrap.c +++ b/lib/dbwrap/dbwrap.c @@ -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) diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h index 1415cfad2ae..abc5161be05 100644 --- a/lib/dbwrap/dbwrap.h +++ b/lib/dbwrap/dbwrap.h @@ -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);