s3:dbwrap: use the transaction wrapper in dbwrap_trans_store().
authorMichael Adam <obnox@samba.org>
Tue, 21 Jul 2009 10:35:48 +0000 (12:35 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 21 Jul 2009 10:40:34 +0000 (12:40 +0200)
Now dbwrap_util.c contains only one call to each of
transaction_start, transaction_commit and transaction_cancel.

Michael

source3/lib/dbwrap_util.c

index 32a1dd48e6faa148adf6290952e8908d5f09e715..c3ab93c4df5e557e39bcaf139d3afef159a50212 100644 (file)
@@ -179,50 +179,47 @@ int32 dbwrap_change_int32_atomic(struct db_context *db, const char *keystr,
        return 0;
 }
 
-NTSTATUS dbwrap_trans_store(struct db_context *db, TDB_DATA key, TDB_DATA dbuf,
-                           int flag)
+struct dbwrap_store_context {
+       TDB_DATA *key;
+       TDB_DATA *dbuf;
+       int flag;
+};
+
+static NTSTATUS dbwrap_store_action(struct db_context *db, void *private_data)
 {
-       int res;
        struct db_record *rec = NULL;
        NTSTATUS status;
+       struct dbwrap_store_context *store_ctx;
 
-       res = db->transaction_start(db);
-       if (res != 0) {
-               DEBUG(5, ("transaction_start failed\n"));
-               return NT_STATUS_INTERNAL_DB_CORRUPTION;
-       }
+       store_ctx = (struct dbwrap_store_context *)private_data;
 
-       rec = db->fetch_locked(db, talloc_tos(), key);
+       rec = db->fetch_locked(db, talloc_tos(), *(store_ctx->key));
        if (rec == NULL) {
                DEBUG(5, ("fetch_locked failed\n"));
-               status = NT_STATUS_NO_MEMORY;
-               goto cancel;
+               return NT_STATUS_NO_MEMORY;
        }
 
-       status = rec->store(rec, dbuf, flag);
+       status = rec->store(rec, *(store_ctx->dbuf), store_ctx->flag);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5, ("store returned %s\n", nt_errstr(status)));
-               goto cancel;
        }
 
        TALLOC_FREE(rec);
+       return status;
+}
 
-       res = db->transaction_commit(db);
-       if (res != 0) {
-               DEBUG(5, ("tdb_transaction_commit failed\n"));
-               status = NT_STATUS_INTERNAL_DB_CORRUPTION;
-               TALLOC_FREE(rec);
-               return status;
-       }
+NTSTATUS dbwrap_trans_store(struct db_context *db, TDB_DATA key, TDB_DATA dbuf,
+                           int flag)
+{
+       NTSTATUS status;
+       struct dbwrap_store_context store_ctx;
 
-       return NT_STATUS_OK;
+       store_ctx.key = &key;
+       store_ctx.dbuf = &dbuf;
+       store_ctx.flag = flag;
 
- cancel:
-       TALLOC_FREE(rec);
+       status = dbwrap_trans_do(db, dbwrap_store_action, &store_ctx);
 
-       if (db->transaction_cancel(db) != 0) {
-               smb_panic("Cancelling transaction failed");
-       }
        return status;
 }