diff options
author | Volker Lendecke <vl@samba.org> | 2008-03-10 13:27:27 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2008-03-10 21:08:44 +0100 |
commit | fe0e5d292df820d3c34cdcdfe0880941df9c1621 (patch) | |
tree | b64400fc660c3d93359eb403779a4b9fdd1eb0cf /source3 | |
parent | 541b8dec4e21e0a88ccc0d85bc01433b66eb3588 (diff) | |
download | samba-fe0e5d292df820d3c34cdcdfe0880941df9c1621.tar.gz samba-fe0e5d292df820d3c34cdcdfe0880941df9c1621.tar.bz2 samba-fe0e5d292df820d3c34cdcdfe0880941df9c1621.zip |
Add dbwrap_trans_store and dbwrap_trans_delete
(This used to be commit e66e502bee65fe44944d325ebeeaa3bf56169eb8)
Diffstat (limited to 'source3')
-rw-r--r-- | source3/lib/dbwrap_util.c | 79 |
1 files changed, 79 insertions, 0 deletions
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; +} |