]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
dbwrap: Simplify dbwrap_change_int32_atomic_action()
authorVolker Lendecke <vl@samba.org>
Wed, 12 Jul 2023 23:19:43 +0000 (01:19 +0200)
committerJeremy Allison <jra@samba.org>
Mon, 14 Aug 2023 19:53:37 +0000 (19:53 +0000)
Use dbwrap_do_locked()

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
lib/dbwrap/dbwrap_util.c

index 8a3ebf55876c7e811402276b5ec18fac344f0ea9..312fb4187542a1eab22db7340ddcfa22ea24afd2 100644 (file)
@@ -257,49 +257,59 @@ struct dbwrap_change_int32_atomic_context {
        TDB_DATA key;
        int32_t *oldval;
        int32_t change_val;
+       NTSTATUS status;
 };
 
-static NTSTATUS dbwrap_change_int32_atomic_action(struct db_context *db,
-                                                 void *private_data)
+static void dbwrap_change_int32_atomic_action_fn(struct db_record *rec,
+                                                TDB_DATA value,
+                                                void *private_data)
 {
-       struct db_record *rec;
+       struct dbwrap_change_int32_atomic_context *state = private_data;
+       uint8_t v_store[4];
+       TDB_DATA data = {
+               .dptr = v_store,
+               .dsize = sizeof(v_store),
+       };
        int32_t val = -1;
-       int32_t v_store;
-       NTSTATUS ret;
-       struct dbwrap_change_int32_atomic_context *state;
-       TDB_DATA value;
-
-       state = (struct dbwrap_change_int32_atomic_context *)private_data;
-
-       rec = dbwrap_fetch_locked(db, talloc_tos(), state->key);
-       if (!rec) {
-               return NT_STATUS_UNSUCCESSFUL;
-       }
-
-       value = dbwrap_record_get_value(rec);
 
        if (value.dptr == NULL) {
                val = *(state->oldval);
        } else if (value.dsize == sizeof(val)) {
-               val = IVAL(value.dptr, 0);
+               val = PULL_LE_U32(value.dptr, 0);
                *(state->oldval) = val;
        } else {
-               ret = NT_STATUS_UNSUCCESSFUL;
-               goto done;
+               state->status = NT_STATUS_UNSUCCESSFUL;
+               return;
        }
 
        val += state->change_val;
+       PUSH_LE_U32(v_store, 0, val);
 
-       SIVAL(&v_store, 0, val);
+       state->status = dbwrap_record_store(rec, data, TDB_REPLACE);
+}
 
-       ret = dbwrap_record_store(rec,
-                                 make_tdb_data((const uint8_t *)&v_store,
-                                               sizeof(v_store)),
-                                 TDB_REPLACE);
+static NTSTATUS dbwrap_change_int32_atomic_action(struct db_context *db,
+                                                 void *private_data)
+{
+       struct dbwrap_change_int32_atomic_context *state = private_data;
+       NTSTATUS status;
 
-done:
-       TALLOC_FREE(rec);
-       return ret;
+       status = dbwrap_do_locked(db,
+                                 state->key,
+                                 dbwrap_change_int32_atomic_action_fn,
+                                 state);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_DEBUG("dbwrap_do_locked() failed: %s\n",
+                         nt_errstr(status));
+               return status;
+       }
+       if (!NT_STATUS_IS_OK(state->status)) {
+               DBG_DEBUG("dbwrap_change_int32_atomic_action_fn() "
+                         "failed: %s\n",
+                         nt_errstr(status));
+               return status;
+       }
+       return NT_STATUS_OK;
 }
 
 NTSTATUS dbwrap_change_int32_atomic(struct db_context *db,