summaryrefslogtreecommitdiff
path: root/lib/dbwrap
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2019-10-23 11:34:47 +0200
committerJeremy Allison <jra@samba.org>2019-11-22 23:57:46 +0000
commitcaef82b1fe6ae7732abcd04a3696756274c935ea (patch)
treef60ef2e92f208cc461e41a294338a30f1c7e4724 /lib/dbwrap
parenta58633f64ea4e43dd3f860b4176ebae080a0a4f1 (diff)
downloadsamba-caef82b1fe6ae7732abcd04a3696756274c935ea.tar.gz
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 <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'lib/dbwrap')
-rw-r--r--lib/dbwrap/dbwrap.c13
-rw-r--r--lib/dbwrap/dbwrap.h1
-rw-r--r--lib/dbwrap/dbwrap_private.h1
-rw-r--r--lib/dbwrap/dbwrap_tdb.c3
4 files changed, 14 insertions, 4 deletions
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);