[SCM] Samba Shared Repository - branch v3-2-stable updated - release-3-2-0pre2-83-g304cc4f

Karolin Seeger kseeger at samba.org
Tue Mar 18 09:50:40 GMT 2008


The branch, v3-2-stable has been updated
       via  304cc4f599857aa5f20247d33a47131bba6605bd (commit)
       via  56115563e46c89e70d7f71a27da952c4e94f0dc7 (commit)
       via  a7cda1a164bd83c6b8180758fe73dd5ac76918e4 (commit)
      from  734f1fb431eaf5bd8836e5625db5c06a6aad4d06 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-stable


- Log -----------------------------------------------------------------
commit 304cc4f599857aa5f20247d33a47131bba6605bd
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Mar 10 13:27:27 2008 +0100

    Add dbwrap_trans_store and dbwrap_trans_delete
    (cherry picked from commit e66e502bee65fe44944d325ebeeaa3bf56169eb8)

commit 56115563e46c89e70d7f71a27da952c4e94f0dc7
Author: Volker Lendecke <vl at samba.org>
Date:   Mon Mar 10 10:17:05 2008 +0100

    Add transactions to the dbwrap API
    
    Only filled in for tdb so far, for rbt it's pointless, and ctdb itself needs to
    be extended
    (cherry picked from commit 0a55e018dd68af06d84332d54148bbfb0b510b22)

commit a7cda1a164bd83c6b8180758fe73dd5ac76918e4
Author: Volker Lendecke <vl at samba.org>
Date:   Sun Mar 9 11:15:10 2008 +0100

    add dbwrap_change_int32_atomic
    (cherry picked from commit 4ee21a98bc3d1c41a6d8868e98118c58372b2d1a)

-----------------------------------------------------------------------

Summary of changes:
 source/include/dbwrap.h  |    3 +
 source/lib/dbwrap_ctdb.c |   10 ++++
 source/lib/dbwrap_rbt.c  |   11 +++++
 source/lib/dbwrap_tdb.c  |   24 ++++++++++
 source/lib/dbwrap_util.c |  107 ++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 155 insertions(+), 0 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/dbwrap.h b/source/include/dbwrap.h
index 4eb174f..5c82475 100644
--- a/source/include/dbwrap.h
+++ b/source/include/dbwrap.h
@@ -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;
 };
diff --git a/source/lib/dbwrap_ctdb.c b/source/lib/dbwrap_ctdb.c
index f497f87..a66ea7c 100644
--- a/source/lib/dbwrap_ctdb.c
+++ b/source/lib/dbwrap_ctdb.c
@@ -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));
diff --git a/source/lib/dbwrap_rbt.c b/source/lib/dbwrap_rbt.c
index 633b695..46459c8 100644
--- a/source/lib/dbwrap_rbt.c
+++ b/source/lib/dbwrap_rbt.c
@@ -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;
 }
diff --git a/source/lib/dbwrap_tdb.c b/source/lib/dbwrap_tdb.c
index da55049..7bdadd3 100644
--- a/source/lib/dbwrap_tdb.c
+++ b/source/lib/dbwrap_tdb.c
@@ -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:
diff --git a/source/lib/dbwrap_util.c b/source/lib/dbwrap_util.c
index 002d572..0bafbe6 100644
--- a/source/lib/dbwrap_util.c
+++ b/source/lib/dbwrap_util.c
@@ -88,3 +88,110 @@ uint32_t dbwrap_change_uint32_atomic(struct db_context *db, const char *keystr,
 	return 0;
 }
 
+int32 dbwrap_change_int32_atomic(struct db_context *db, const char *keystr,
+				 int32 *oldval, int32 change_val)
+{
+	struct db_record *rec;
+	int32 val = -1;
+	TDB_DATA data;
+
+	if (!(rec = db->fetch_locked(db, NULL,
+				     string_term_tdb_data(keystr)))) {
+		return -1;
+	}
+
+	if ((rec->value.dptr != NULL)
+	    && (rec->value.dsize == sizeof(val))) {
+		val = IVAL(rec->value.dptr, 0);
+	}
+
+	val += change_val;
+
+	data.dsize = sizeof(val);
+	data.dptr = (uint8 *)&val;
+
+	rec->store(rec, data, TDB_REPLACE);
+
+	TALLOC_FREE(rec);
+
+	return 0;
+}
+
+int dbwrap_trans_store(struct db_context *db, TDB_DATA key, TDB_DATA dbuf,
+		       int flag)
+{
+	int res;
+	struct db_record *rec;
+	NTSTATUS status;
+
+	res = db->transaction_start(db);
+	if (res != 0) {
+		DEBUG(5, ("transaction_start failed\n"));
+	}
+
+	rec = db->fetch_locked(db, talloc_tos(), key);
+	if (rec == NULL) {
+		DEBUG(5, ("fetch_locked failed\n"));
+		goto cancel;
+	}
+
+	status = rec->store(rec, dbuf, flag);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(5, ("store returned %s\n", nt_errstr(status)));
+		goto cancel;
+	}
+
+	TALLOC_FREE(rec);
+
+	res = db->transaction_commit(db);
+	if (res != 0) {
+		DEBUG(5, ("tdb_transaction_commit failed\n"));
+	}
+
+	return res;
+
+ cancel:
+	if (db->transaction_cancel(db) != 0) {
+		smb_panic("Cancelling transaction failed");
+	}
+	return -1;
+}
+
+int dbwrap_trans_delete(struct db_context *db, TDB_DATA key)
+{
+	int res;
+	struct db_record *rec;
+	NTSTATUS status;
+
+	res = db->transaction_start(db);
+	if (res != 0) {
+		DEBUG(5, ("transaction_start failed\n"));
+	}
+
+	rec = db->fetch_locked(db, talloc_tos(), key);
+	if (rec == NULL) {
+		DEBUG(5, ("fetch_locked failed\n"));
+		goto cancel;
+	}
+
+	status = rec->delete_rec(rec);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(5, ("delete_rec returned %s\n", nt_errstr(status)));
+		goto cancel;
+	}
+
+	TALLOC_FREE(rec);
+
+	res = db->transaction_commit(db);
+	if (res != 0) {
+		DEBUG(5, ("tdb_transaction_commit failed\n"));
+	}
+
+	return res;
+
+ cancel:
+	if (db->transaction_cancel(db) != 0) {
+		smb_panic("Cancelling transaction failed");
+	}
+	return -1;
+}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list