Add dbwrap_trans_store and dbwrap_trans_delete
authorVolker Lendecke <vl@samba.org>
Mon, 10 Mar 2008 12:27:27 +0000 (13:27 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 10 Mar 2008 20:08:44 +0000 (21:08 +0100)
source/lib/dbwrap_util.c

index ba1f6ae96e01e24effa70d25370340467fc88fda..0bafbe6858b61d5757c9d8ffe33c3f08787bba9d 100644 (file)
@@ -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;
+}