summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2009-07-15 14:00:42 +0200
committerMichael Adam <obnox@samba.org>2009-07-15 14:00:43 +0200
commit5b594c695884aebdfbb199549901fea954122929 (patch)
tree0a6c7bf31c34cdc00c0771ef4f1a4dcf65674545
parentf49129e59225f6ea84add8e845ffaeb03dc6c8da (diff)
downloadsamba-5b594c695884aebdfbb199549901fea954122929.tar.gz
samba-5b594c695884aebdfbb199549901fea954122929.tar.bz2
samba-5b594c695884aebdfbb199549901fea954122929.zip
s3:dbwrap: add a wrapper dbwrap_trans_do()
This function wraps the action() callback into a db transaction and the transaction is either committed or cancelled, depending on the return value of the action function. Michael
-rw-r--r--source3/include/proto.h3
-rw-r--r--source3/lib/dbwrap_util.c33
2 files changed, 36 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index df7815587c..74cedcec18 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -454,6 +454,9 @@ NTSTATUS dbwrap_trans_store_uint32(struct db_context *db, const char *keystr,
NTSTATUS dbwrap_trans_store_bystring(struct db_context *db, const char *key,
TDB_DATA data, int flags);
NTSTATUS dbwrap_trans_delete_bystring(struct db_context *db, const char *key);
+NTSTATUS dbwrap_trans_do(struct db_context *db,
+ NTSTATUS (*action)(struct db_context *, void *),
+ void *private_data);
/* The following definitions come from lib/debug.c */
diff --git a/source3/lib/dbwrap_util.c b/source3/lib/dbwrap_util.c
index 3be3a49e7d..67471b5c96 100644
--- a/source3/lib/dbwrap_util.c
+++ b/source3/lib/dbwrap_util.c
@@ -307,3 +307,36 @@ NTSTATUS dbwrap_trans_delete_bystring(struct db_context *db, const char *key)
{
return dbwrap_trans_delete(db, string_term_tdb_data(key));
}
+
+/**
+ * Wrap db action(s) into a transaction.
+ */
+NTSTATUS dbwrap_trans_do(struct db_context *db,
+ NTSTATUS (*action)(struct db_context *, void *),
+ void *private_data)
+{
+ int res;
+ NTSTATUS status;
+
+ res = db->transaction_start(db);
+ if (res != 0) {
+ DEBUG(5, ("transaction_start failed\n"));
+ return NT_STATUS_INTERNAL_DB_CORRUPTION;
+ }
+
+ status = action(db, private_data);
+ if (!NT_STATUS_IS_OK(status)) {
+ if (db->transaction_cancel(db) != 0) {
+ smb_panic("Cancelling transaction failed");
+ }
+ return status;
+ }
+
+ res = db->transaction_commit(db);
+ if (res == 0) {
+ return NT_STATUS_OK;
+ }
+
+ DEBUG(2, ("transaction_commit failed\n"));
+ return NT_STATUS_INTERNAL_DB_CORRUPTION;
+}