]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
add dbwrap_change_int32_atomic
authorVolker Lendecke <vl@samba.org>
Sun, 9 Mar 2008 10:15:10 +0000 (11:15 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 10 Mar 2008 20:08:44 +0000 (21:08 +0100)
source/lib/dbwrap_util.c

index 002d572019393857c7fe8c70d11da16645f8e3af..ba1f6ae96e01e24effa70d25370340467fc88fda 100644 (file)
@@ -88,3 +88,31 @@ uint32_t dbwrap_change_uint32_atomic(struct db_context *db, const char *keystr,
        return 0;
 }
 
+int32 dbwrap_change_int32_atomic(struct db_context *db, const char *keystr,
+                                int32 *oldval, int32 change_val)
+{
+       struct db_record *rec;
+       int32 val = -1;
+       TDB_DATA data;
+
+       if (!(rec = db->fetch_locked(db, NULL,
+                                    string_term_tdb_data(keystr)))) {
+               return -1;
+       }
+
+       if ((rec->value.dptr != NULL)
+           && (rec->value.dsize == sizeof(val))) {
+               val = IVAL(rec->value.dptr, 0);
+       }
+
+       val += change_val;
+
+       data.dsize = sizeof(val);
+       data.dptr = (uint8 *)&val;
+
+       rec->store(rec, data, TDB_REPLACE);
+
+       TALLOC_FREE(rec);
+
+       return 0;
+}