1
0
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:
Michael Adam 2009-07-29 15:12:39 +02:00
parent a86e163c1b
commit fac81b3750

View File

@ -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;