summaryrefslogtreecommitdiff
path: root/lib/dbwrap
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2016-11-09 08:45:59 +0100
committerRalph Boehme <slow@samba.org>2017-07-25 17:43:16 +0200
commitcb2a28eb9a16a3bfe8d0373692acc4199f04baee (patch)
treec7f6e3881cda63ec5d36f156313389fed9e59e3f /lib/dbwrap
parent45f5a55ae6bf2fdc09cbbc83c127628a1b55b6ef (diff)
downloadsamba-cb2a28eb9a16a3bfe8d0373692acc4199f04baee.tar.gz
dbwrap: Add dbwrap_do_locked
With a proper implementation this enables modifications without having to allocate a record. In really performance sensitive code paths this matters. Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Ralph Boehme <slow@samba.org>
Diffstat (limited to 'lib/dbwrap')
-rw-r--r--lib/dbwrap/dbwrap.c36
-rw-r--r--lib/dbwrap/dbwrap.h5
-rw-r--r--lib/dbwrap/dbwrap_private.h4
3 files changed, 45 insertions, 0 deletions
diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c
index 260a977f927..22437f62083 100644
--- a/lib/dbwrap/dbwrap.c
+++ b/lib/dbwrap/dbwrap.c
@@ -498,6 +498,42 @@ NTSTATUS dbwrap_parse_record_recv(struct tevent_req *req)
return tevent_req_simple_recv_ntstatus(req);
}
+NTSTATUS dbwrap_do_locked(struct db_context *db, TDB_DATA key,
+ void (*fn)(struct db_record *rec,
+ void *private_data),
+ void *private_data)
+{
+ struct db_record *rec;
+
+ if (db->do_locked != NULL) {
+ struct db_context **lockptr;
+ NTSTATUS status;
+
+ if (db->lock_order != DBWRAP_LOCK_ORDER_NONE) {
+ dbwrap_lock_order_lock(db, &lockptr);
+ }
+
+ status = db->do_locked(db, key, fn, private_data);
+
+ if (db->lock_order != DBWRAP_LOCK_ORDER_NONE) {
+ dbwrap_lock_order_unlock(db, lockptr);
+ }
+
+ return status;
+ }
+
+ rec = dbwrap_fetch_locked(db, db, key);
+ if (rec == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ fn(rec, private_data);
+
+ TALLOC_FREE(rec);
+
+ return NT_STATUS_OK;
+}
+
int dbwrap_wipe(struct db_context *db)
{
if (db->wipe == NULL) {
diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h
index 04e179e75e6..1161bf0a493 100644
--- a/lib/dbwrap/dbwrap.h
+++ b/lib/dbwrap/dbwrap.h
@@ -83,6 +83,11 @@ struct db_record *dbwrap_try_fetch_locked(struct db_context *db,
TDB_DATA key);
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,
+ void *private_data),
+ void *private_data);
+
NTSTATUS dbwrap_delete(struct db_context *db, TDB_DATA key);
NTSTATUS dbwrap_store(struct db_context *db, TDB_DATA key,
TDB_DATA data, int flags);
diff --git a/lib/dbwrap/dbwrap_private.h b/lib/dbwrap/dbwrap_private.h
index 2858afd8539..e757215d389 100644
--- a/lib/dbwrap/dbwrap_private.h
+++ b/lib/dbwrap/dbwrap_private.h
@@ -68,6 +68,10 @@ struct db_context {
void *private_data,
enum dbwrap_req_state *req_state);
NTSTATUS (*parse_record_recv)(struct tevent_req *req);
+ NTSTATUS (*do_locked)(struct db_context *db, TDB_DATA key,
+ void (*fn)(struct db_record *rec,
+ void *private_data),
+ void *private_data);
int (*exists)(struct db_context *db,TDB_DATA key);
int (*wipe)(struct db_context *db);
int (*check)(struct db_context *db);