mirror of
https://github.com/samba-team/samba.git
synced 2025-02-23 09:57:40 +03:00
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>
This commit is contained in:
parent
45f5a55ae6
commit
cb2a28eb9a
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user