static int db_tdb_record_destr(struct db_record* data) { struct db_tdb_ctx *ctx = talloc_get_type_abort(data->private_data, struct db_tdb_ctx); db_tdb_log_key("Unlocking", data->key); tdb_chainunlock(ctx->wtdb->tdb, data->key); return 0; }
static struct db_record *db_tdb_try_fetch_locked( struct db_context *db, TALLOC_CTX *mem_ctx, TDB_DATA key) { struct db_tdb_ctx *ctx = talloc_get_type_abort(db->private_data, struct db_tdb_ctx); db_tdb_log_key("Trying to lock", key); if (tdb_chainlock_nonblock(ctx->wtdb->tdb, key) != 0) { DEBUG(3, ("tdb_chainlock_nonblock failed\n")); return NULL; } return db_tdb_fetch_locked_internal(db, mem_ctx, key); }
static struct db_record *db_tdb_fetch_locked(struct db_context *db, TALLOC_CTX *mem_ctx, TDB_DATA key) { struct db_tdb_ctx *ctx = talloc_get_type_abort(db->private_data, struct db_tdb_ctx); struct tdb_fetch_locked_state state; db_tdb_log_key("Locking", key); if (tdb_chainlock(ctx->wtdb->tdb, key) != 0) { DEBUG(3, ("tdb_chainlock failed\n")); return NULL; } state.mem_ctx = mem_ctx; state.result = NULL; tdb_parse_record(ctx->wtdb->tdb, key, db_tdb_fetchlock_parse, &state); if (state.result == NULL) { db_tdb_fetchlock_parse(key, tdb_null, &state); } if (state.result == NULL) { tdb_chainunlock(ctx->wtdb->tdb, key); return NULL; } talloc_set_destructor(state.result, db_tdb_record_destr); state.result->private_data = talloc_reference(state.result, ctx); state.result->store = db_tdb_store; state.result->delete_rec = db_tdb_delete; DEBUG(10, ("Allocated locked data 0x%p\n", state.result)); return state.result; }