From: Rusty Russell Date: Fri, 22 Jun 2012 05:37:44 +0000 (+0930) Subject: dbwrap: dbwrap_transaction_start_nonblock(). X-Git-Tag: samba-4.0.0beta3~246 X-Git-Url: http://git.samba.org/?p=ddiss%2Fsamba.git;a=commitdiff_plain;h=41f799d877961d095401a628307e0c690dfbc124 dbwrap: dbwrap_transaction_start_nonblock(). Implemented for ntdb and tdb; falls back to the blocking variant for others. Signed-off-by: Rusty Russell --- diff --git a/lib/dbwrap/dbwrap.c b/lib/dbwrap/dbwrap.c index 835bd599efc..afb069221e6 100644 --- a/lib/dbwrap/dbwrap.c +++ b/lib/dbwrap/dbwrap.c @@ -425,6 +425,16 @@ int dbwrap_transaction_start(struct db_context *db) return db->transaction_start(db); } +NTSTATUS dbwrap_transaction_start_nonblock(struct db_context *db) +{ + if (db->transaction_start_nonblock) { + return db->transaction_start_nonblock(db); + } else { + return dbwrap_transaction_start(db) == 0 ? NT_STATUS_OK + : NT_STATUS_UNSUCCESSFUL; + } +} + int dbwrap_transaction_commit(struct db_context *db) { return db->transaction_commit(db); diff --git a/lib/dbwrap/dbwrap.h b/lib/dbwrap/dbwrap.h index 0b19396b984..366e657680f 100644 --- a/lib/dbwrap/dbwrap.h +++ b/lib/dbwrap/dbwrap.h @@ -77,6 +77,7 @@ int dbwrap_wipe(struct db_context *db); int dbwrap_check(struct db_context *db); int dbwrap_get_seqnum(struct db_context *db); int dbwrap_transaction_start(struct db_context *db); +NTSTATUS dbwrap_transaction_start_nonblock(struct db_context *db); int dbwrap_transaction_commit(struct db_context *db); int dbwrap_transaction_cancel(struct db_context *db); void dbwrap_db_id(struct db_context *db, const uint8_t **id, size_t *idlen); diff --git a/lib/dbwrap/dbwrap_private.h b/lib/dbwrap/dbwrap_private.h index dfd365dab2d..b0090e39ada 100644 --- a/lib/dbwrap/dbwrap_private.h +++ b/lib/dbwrap/dbwrap_private.h @@ -52,6 +52,7 @@ struct db_context { void *private_data); int (*get_seqnum)(struct db_context *db); int (*transaction_start)(struct db_context *db); + NTSTATUS (*transaction_start_nonblock)(struct db_context *db); int (*transaction_commit)(struct db_context *db); int (*transaction_cancel)(struct db_context *db); NTSTATUS (*parse_record)(struct db_context *db, TDB_DATA key, diff --git a/lib/dbwrap/dbwrap_tdb.c b/lib/dbwrap/dbwrap_tdb.c index 99ea62a3a1d..883c7f3c9c9 100644 --- a/lib/dbwrap/dbwrap_tdb.c +++ b/lib/dbwrap/dbwrap_tdb.c @@ -374,6 +374,19 @@ static int db_tdb_transaction_start(struct db_context *db) return tdb_transaction_start(db_ctx->wtdb->tdb) ? -1 : 0; } +static NTSTATUS db_tdb_transaction_start_nonblock(struct db_context *db) +{ + struct db_tdb_ctx *db_ctx = + talloc_get_type_abort(db->private_data, struct db_tdb_ctx); + int ret; + + ret = tdb_transaction_start_nonblock(db_ctx->wtdb->tdb); + if (ret != 0) { + return map_nt_error_from_tdb(tdb_error(db_ctx->wtdb->tdb)); + } + return NT_STATUS_OK; +} + static int db_tdb_transaction_commit(struct db_context *db) { struct db_tdb_ctx *db_ctx = @@ -452,6 +465,7 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx, result->get_seqnum = db_tdb_get_seqnum; result->persistent = ((tdb_flags & TDB_CLEAR_IF_FIRST) == 0); result->transaction_start = db_tdb_transaction_start; + result->transaction_start_nonblock = db_tdb_transaction_start_nonblock; result->transaction_commit = db_tdb_transaction_commit; result->transaction_cancel = db_tdb_transaction_cancel; result->exists = db_tdb_exists;