mirror of
https://github.com/samba-team/samba.git
synced 2025-03-01 04:58:35 +03:00
s3:dbwrap: export logic of dbwrap_change_int32_atomic into an action function
to prepare for adding a transaction wrapper to dbwrap_change_int32_atomic() Michael
This commit is contained in:
parent
a86e163c1b
commit
fac81b3750
@ -190,30 +190,40 @@ NTSTATUS dbwrap_trans_change_uint32_atomic(struct db_context *db,
|
||||
* return old value in *oldval.
|
||||
* store *oldval + change_val to db.
|
||||
*/
|
||||
NTSTATUS dbwrap_change_int32_atomic(struct db_context *db, const char *keystr,
|
||||
int32_t *oldval, int32_t change_val)
|
||||
|
||||
struct dbwrap_change_int32_atomic_context {
|
||||
const char *keystr;
|
||||
int32_t *oldval;
|
||||
int32_t change_val;
|
||||
};
|
||||
|
||||
static NTSTATUS dbwrap_change_int32_atomic_action(struct db_context *db,
|
||||
void *private_data)
|
||||
{
|
||||
struct db_record *rec;
|
||||
int32_t val = -1;
|
||||
TDB_DATA data;
|
||||
NTSTATUS ret;
|
||||
struct dbwrap_change_int32_atomic_context *state;
|
||||
|
||||
rec = db->fetch_locked(db, NULL, string_term_tdb_data(keystr));
|
||||
state = (struct dbwrap_change_int32_atomic_context *)private_data;
|
||||
|
||||
rec = db->fetch_locked(db, NULL, string_term_tdb_data(state->keystr));
|
||||
if (!rec) {
|
||||
return NT_STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
if (rec->value.dptr == NULL) {
|
||||
val = *oldval;
|
||||
val = *(state->oldval);
|
||||
} else if (rec->value.dsize == sizeof(val)) {
|
||||
val = IVAL(rec->value.dptr, 0);
|
||||
*oldval = val;
|
||||
*(state->oldval) = val;
|
||||
} else {
|
||||
ret = NT_STATUS_UNSUCCESSFUL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
val += change_val;
|
||||
val += state->change_val;
|
||||
|
||||
data.dsize = sizeof(val);
|
||||
data.dptr = (uint8 *)&val;
|
||||
@ -225,6 +235,21 @@ done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
NTSTATUS dbwrap_change_int32_atomic(struct db_context *db, const char *keystr,
|
||||
int32_t *oldval, int32_t change_val)
|
||||
{
|
||||
NTSTATUS ret;
|
||||
struct dbwrap_change_int32_atomic_context state;
|
||||
|
||||
state.keystr = keystr;
|
||||
state.oldval = oldval;
|
||||
state.change_val = change_val;
|
||||
|
||||
ret = dbwrap_change_int32_atomic_action(db, &state);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct dbwrap_store_context {
|
||||
TDB_DATA *key;
|
||||
TDB_DATA *dbuf;
|
||||
|
Loading…
x
Reference in New Issue
Block a user