From: Volker Lendecke Date: Mon, 10 Mar 2008 12:27:27 +0000 (+0100) Subject: Add dbwrap_trans_store and dbwrap_trans_delete X-Git-Tag: samba-3.3.0pre1~3344 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e66e502bee65fe44944d325ebeeaa3bf56169eb8;p=thirdparty%2Fsamba.git Add dbwrap_trans_store and dbwrap_trans_delete --- diff --git a/source/lib/dbwrap_util.c b/source/lib/dbwrap_util.c index ba1f6ae96e0..0bafbe6858b 100644 --- a/source/lib/dbwrap_util.c +++ b/source/lib/dbwrap_util.c @@ -116,3 +116,82 @@ int32 dbwrap_change_int32_atomic(struct db_context *db, const char *keystr, 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; +}