From caef82b1fe6ae7732abcd04a3696756274c935ea Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 23 Oct 2019 11:34:47 +0200 Subject: dbwrap: Pass "value" to dbwrap_do_locked() callback I want to reduce dbwrap_record_get_value(). It makes the caller believe it can make a copy of the TDB_DATA returned and that the value remains constant. It's not, as you can always do a dbwrap_record_store(). This patch removes one requirement for getting the value out of a db_record via dbwrap_record_get_value(). You can still make a copy, but from an API perspective to me it's more obvious that "value" as a parameter to the callback has a limited lifetime. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- lib/dbwrap/dbwrap.c | 13 ++++++++++--- lib/dbwrap/dbwrap.h | 1 + lib/dbwrap/dbwrap_private.h | 1 + lib/dbwrap/dbwrap_tdb.c | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) (limited to 'lib/dbwrap') diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c index 3d8d2ae78d7..cc58397eb6e 100644 --- a/lib/dbwrap/dbwrap.c +++ b/lib/dbwrap/dbwrap.c @@ -307,7 +307,10 @@ struct dbwrap_store_state { NTSTATUS status; }; -static void dbwrap_store_fn(struct db_record *rec, void *private_data) +static void dbwrap_store_fn( + struct db_record *rec, + TDB_DATA value, + void *private_data) { struct dbwrap_store_state *state = private_data; state->status = dbwrap_record_store(rec, state->data, state->flags); @@ -331,7 +334,10 @@ struct dbwrap_delete_state { NTSTATUS status; }; -static void dbwrap_delete_fn(struct db_record *rec, void *private_data) +static void dbwrap_delete_fn( + struct db_record *rec, + TDB_DATA value, + void *private_data) { struct dbwrap_delete_state *state = private_data; state->status = dbwrap_record_delete(rec); @@ -514,6 +520,7 @@ NTSTATUS dbwrap_parse_record_recv(struct tevent_req *req) NTSTATUS dbwrap_do_locked(struct db_context *db, TDB_DATA key, void (*fn)(struct db_record *rec, + TDB_DATA value, void *private_data), void *private_data) { @@ -542,7 +549,7 @@ NTSTATUS dbwrap_do_locked(struct db_context *db, TDB_DATA key, return NT_STATUS_NO_MEMORY; } - fn(rec, private_data); + fn(rec, rec->value, private_data); TALLOC_FREE(rec); diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h index 591eac5c63a..b5a7fb315c7 100644 --- a/lib/dbwrap/dbwrap.h +++ b/lib/dbwrap/dbwrap.h @@ -81,6 +81,7 @@ struct db_context *dbwrap_record_get_db(struct db_record *rec); NTSTATUS dbwrap_do_locked(struct db_context *db, TDB_DATA key, void (*fn)(struct db_record *rec, + TDB_DATA value, void *private_data), void *private_data); diff --git a/lib/dbwrap/dbwrap_private.h b/lib/dbwrap/dbwrap_private.h index b548168b9a9..a493b261dcb 100644 --- a/lib/dbwrap/dbwrap_private.h +++ b/lib/dbwrap/dbwrap_private.h @@ -70,6 +70,7 @@ struct db_context { NTSTATUS (*parse_record_recv)(struct tevent_req *req); NTSTATUS (*do_locked)(struct db_context *db, TDB_DATA key, void (*fn)(struct db_record *rec, + TDB_DATA value, void *private_data), void *private_data); int (*exists)(struct db_context *db,TDB_DATA key); diff --git a/lib/dbwrap/dbwrap_tdb.c b/lib/dbwrap/dbwrap_tdb.c index ed20f885278..b7bba40705a 100644 --- a/lib/dbwrap/dbwrap_tdb.c +++ b/lib/dbwrap/dbwrap_tdb.c @@ -184,6 +184,7 @@ static struct db_record *db_tdb_try_fetch_locked( static NTSTATUS db_tdb_do_locked(struct db_context *db, TDB_DATA key, void (*fn)(struct db_record *rec, + TDB_DATA value, void *private_data), void *private_data) { @@ -218,7 +219,7 @@ static NTSTATUS db_tdb_do_locked(struct db_context *db, TDB_DATA key, .private_data = ctx }; - fn(&rec, private_data); + fn(&rec, rec.value, private_data); tdb_chainunlock(ctx->wtdb->tdb, key); -- cgit v1.2.1