dbwrap: dbwrap_transaction_start_nonblock().
authorRusty Russell <rusty@rustcorp.com.au>
Fri, 22 Jun 2012 05:37:44 +0000 (15:07 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Fri, 22 Jun 2012 05:35:17 +0000 (07:35 +0200)
Implemented for ntdb and tdb; falls back to the blocking variant
for others.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
lib/dbwrap/dbwrap.c
lib/dbwrap/dbwrap.h
lib/dbwrap/dbwrap_private.h
lib/dbwrap/dbwrap_tdb.c

index 835bd599efcd2e12724ad06cebf281ebd5589bcf..afb069221e689da354c48b3ae800248a9ae717cb 100644 (file)
@@ -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);
index 0b19396b984d13bf6dc44d53f66e516a8aed0d84..366e657680f271ede91ad9de1f69ed60f60f87f0 100644 (file)
@@ -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);
index dfd365dab2d10e20ac00ee1eb4d1ed83779a313e..b0090e39ada27bc7e5d9d651878b1a1002a5d46e 100644 (file)
@@ -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,
index 99ea62a3a1dc6b58b49311ad431b8a50f6fd9859..883c7f3c9c9df449f89c8da49954b0bd90a5108a 100644 (file)
@@ -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;