From fe0e5d292df820d3c34cdcdfe0880941df9c1621 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 10 Mar 2008 13:27:27 +0100 Subject: Add dbwrap_trans_store and dbwrap_trans_delete (This used to be commit e66e502bee65fe44944d325ebeeaa3bf56169eb8) --- source3/lib/dbwrap_util.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'source3/lib/dbwrap_util.c') diff --git a/source3/lib/dbwrap_util.c b/source3/lib/dbwrap_util.c index ba1f6ae96e..0bafbe6858 100644 --- a/source3/lib/dbwrap_util.c +++ b/source3/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; +} -- cgit