diff options
-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); |