Add transactions to the dbwrap API
authorVolker Lendecke <vl@samba.org>
Mon, 10 Mar 2008 09:17:05 +0000 (10:17 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 10 Mar 2008 20:08:44 +0000 (21:08 +0100)
Only filled in for tdb so far, for rbt it's pointless, and ctdb itself needs to
be extended
(This used to be commit 0a55e018dd68af06d84332d54148bbfb0b510b22)

source3/include/dbwrap.h
source3/lib/dbwrap_ctdb.c
source3/lib/dbwrap_rbt.c
source3/lib/dbwrap_tdb.c

index 4eb174fef1c15e58e2f1690c2513567e1a640758..5c824750d10e87ccbc168b31bdf1df9b6bb2aec8 100644 (file)
@@ -42,6 +42,9 @@ struct db_context {
                                      void *private_data),
                             void *private_data);
        int (*get_seqnum)(struct db_context *db);
+       int (*transaction_start)(struct db_context *db);
+       int (*transaction_commit)(struct db_context *db);
+       int (*transaction_cancel)(struct db_context *db);
        void *private_data;
        bool persistent;
 };
index f497f871d2030e3483a0ce5be9b8945c2936808a..a66ea7ceb590e2b1d8dbcaabc44782ec7e78c150 100644 (file)
@@ -441,6 +441,13 @@ static int db_ctdb_get_seqnum(struct db_context *db)
        return tdb_get_seqnum(ctx->wtdb->tdb);
 }
 
+static int db_ctdb_trans_dummy(struct db_context *db)
+{
+       /*
+        * Not implemented yet, just return ok
+        */
+       return 0;
+}
 
 struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                                const char *name,
@@ -495,6 +502,9 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
        result->traverse = db_ctdb_traverse;
        result->traverse_read = db_ctdb_traverse_read;
        result->get_seqnum = db_ctdb_get_seqnum;
+       result->transaction_start = db_ctdb_trans_dummy;
+       result->transaction_commit = db_ctdb_trans_dummy;
+       result->transaction_cancel = db_ctdb_trans_dummy;
 
        DEBUG(3,("db_open_ctdb: opened database '%s' with dbid 0x%x\n",
                 name, db_ctdb->db_id));
index 633b695b52f4916b6c606b199c88f5125ba8870d..46459c86dafed7a1d16f6dc5eb9fdadda7057f41 100644 (file)
@@ -351,6 +351,14 @@ static int db_rbt_get_seqnum(struct db_context *db)
        return 0;
 }
 
+static int db_rbt_trans_dummy(struct db_context *db)
+{
+       /*
+        * Transactions are pretty pointless in-memory, just return success.
+        */
+       return 0;
+}
+
 struct db_context *db_open_rbt(TALLOC_CTX *mem_ctx)
 {
        struct db_context *result;
@@ -373,6 +381,9 @@ struct db_context *db_open_rbt(TALLOC_CTX *mem_ctx)
        result->traverse = db_rbt_traverse;
        result->traverse_read = db_rbt_traverse;
        result->get_seqnum = db_rbt_get_seqnum;
+       result->transaction_start = db_rbt_trans_dummy;
+       result->transaction_commit = db_rbt_trans_dummy;
+       result->transaction_cancel = db_rbt_trans_dummy;
 
        return result;
 }
index da55049e52f9e09e7f0ae58e293dd74544d99b37..7bdadd37709526d1b18b0ab96a70a7218b436c89 100644 (file)
@@ -291,6 +291,27 @@ static int db_tdb_get_seqnum(struct db_context *db)
        return tdb_get_seqnum(db_ctx->wtdb->tdb);
 }
 
+static int db_tdb_transaction_start(struct db_context *db)
+{
+       struct db_tdb_ctx *db_ctx =
+               talloc_get_type_abort(db->private_data, struct db_tdb_ctx);
+       return tdb_transaction_start(db_ctx->wtdb->tdb);
+}
+
+static int db_tdb_transaction_commit(struct db_context *db)
+{
+       struct db_tdb_ctx *db_ctx =
+               talloc_get_type_abort(db->private_data, struct db_tdb_ctx);
+       return tdb_transaction_commit(db_ctx->wtdb->tdb);
+}
+
+static int db_tdb_transaction_cancel(struct db_context *db)
+{
+       struct db_tdb_ctx *db_ctx =
+               talloc_get_type_abort(db->private_data, struct db_tdb_ctx);
+       return tdb_transaction_cancel(db_ctx->wtdb->tdb);
+}
+
 struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
                               const char *name,
                               int hash_size, int tdb_flags,
@@ -324,6 +345,9 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
        result->traverse_read = db_tdb_traverse_read;
        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_commit = db_tdb_transaction_commit;
+       result->transaction_cancel = db_tdb_transaction_cancel;
        return result;
 
  fail: