uint32 store and fectch functions, a signed int is not enough sometimes
authorSimo Sorce <idra@samba.org>
Sun, 7 Apr 2002 22:04:39 +0000 (22:04 +0000)
committerSimo Sorce <idra@samba.org>
Sun, 7 Apr 2002 22:04:39 +0000 (22:04 +0000)
(This used to be commit f07b2b3d5295202e0c8e530c43fae6d458b2cf2a)

source3/tdb/tdbutil.c

index 793b44d89dd9d9bee5ad2efedf3292807f74da89..f7cebb58d5577f04c111892a33850be5b0d1d8a6 100644 (file)
@@ -111,6 +111,68 @@ int tdb_store_int32(TDB_CONTEXT *tdb, char *keystr, int32 v)
        return tdb_store_int32_byblob(tdb, keystr, strlen(keystr) + 1, v);
 }
 
+/****************************************************************************
+ Fetch a uint32 value by a arbitrary blob key, return -1 if not found.
+ Output is uint32 in native byte order.
+****************************************************************************/
+
+BOOL tdb_fetch_uint32_byblob(TDB_CONTEXT *tdb, char *keyval, size_t len, uint32 *value)
+{
+       TDB_DATA key, data;
+
+       key.dptr = keyval;
+       key.dsize = len;
+       data = tdb_fetch(tdb, key);
+       if (!data.dptr || data.dsize != sizeof(uint32))
+               return False;
+       
+       *value = IVAL(data.dptr,0);
+       SAFE_FREE(data.dptr);
+       return True;
+}
+
+/****************************************************************************
+ Fetch a uint32 value by string key, return -1 if not found.
+ Output is uint32 in native byte order.
+****************************************************************************/
+
+BOOL tdb_fetch_uint32(TDB_CONTEXT *tdb, char *keystr, uint32 *value)
+{
+       return tdb_fetch_uint32_byblob(tdb, keystr, strlen(keystr) + 1, value);
+}
+
+/****************************************************************************
+ Store a uint32 value by an arbitary blob key, return 0 on success, -1 on failure.
+ Input is uint32 in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+
+BOOL tdb_store_uint32_byblob(TDB_CONTEXT *tdb, char *keystr, size_t len, uint32 value)
+{
+       TDB_DATA key, data;
+       uint32 v_store;
+       BOOL ret = True;
+
+       key.dptr = keystr;
+       key.dsize = len;
+       SIVAL(&v_store, 0, value);
+       data.dptr = (void *)&v_store;
+       data.dsize = sizeof(uint32);
+
+       if (tdb_store(tdb, key, data, TDB_REPLACE) == -1)
+               ret = False;
+
+       return ret;
+}
+
+/****************************************************************************
+ Store a uint32 value by string key, return 0 on success, -1 on failure.
+ Input is uint32 in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+
+BOOL tdb_store_uint32(TDB_CONTEXT *tdb, char *keystr, uint32 value)
+{
+       return tdb_store_uint32_byblob(tdb, keystr, strlen(keystr) + 1, value);
+}
 /****************************************************************************
  Store a buffer by a null terminated string key.  Return 0 on success, -1
  on failure.
@@ -178,6 +240,40 @@ int32 tdb_change_int32_atomic(TDB_CONTEXT *tdb, char *keystr, int32 *oldval, int
        return ret;
 }
 
+/****************************************************************************
+ Atomic unsigned integer change. Returns old value. To create, set initial value in *oldval. 
+****************************************************************************/
+
+BOOL tdb_change_uint32_atomic(TDB_CONTEXT *tdb, char *keystr, uint32 *oldval, uint32 change_val)
+{
+       uint32 val;
+       BOOL ret = False;
+
+       if (tdb_lock_bystring(tdb, keystr) == -1)
+               return False;
+
+       if (!tdb_fetch_uint32(tdb, keystr, &val)) {
+               if (tdb_error(tdb) != TDB_ERR_NOEXIST)
+                       goto err_out;
+
+               val = *oldval;
+
+       } else {
+               *oldval = val;
+               val += change_val;
+       }
+               
+       if (!tdb_store_uint32(tdb, keystr, val))
+               goto err_out;
+
+       ret = True;
+
+  err_out:
+
+       tdb_unlock_bystring(tdb, keystr);
+       return ret;
+}
+
 /****************************************************************************
  Useful pair of routines for packing/unpacking data consisting of
  integers and strings.