diff options
author | Volker Lendecke <vl@samba.org> | 2016-11-09 08:45:59 +0100 |
---|---|---|
committer | Ralph Boehme <slow@samba.org> | 2017-07-25 17:43:16 +0200 |
commit | cb2a28eb9a16a3bfe8d0373692acc4199f04baee (patch) | |
tree | c7f6e3881cda63ec5d36f156313389fed9e59e3f /lib/dbwrap | |
parent | 45f5a55ae6bf2fdc09cbbc83c127628a1b55b6ef (diff) | |
download | samba-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.c | 36 | ||||
-rw-r--r-- | lib/dbwrap/dbwrap.h | 5 | ||||
-rw-r--r-- | lib/dbwrap/dbwrap_private.h | 4 |
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); |