]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
lib:util: Add APIs for fetch/store int64/uint64 values to/from tdb
authorVinit Agnihotri <vagnihot@redhat.com>
Wed, 24 Sep 2025 07:14:07 +0000 (12:44 +0530)
committerAnoop C S <anoopcs@samba.org>
Wed, 12 Nov 2025 15:01:32 +0000 (15:01 +0000)
Signed-off-by: Vinit Agnihotri <vagnihot@redhat.com>
Reviewed-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Anoop C S <anoopcs@samba.org>
lib/util/util_tdb.c
lib/util/util_tdb.h

index d8672c35b9abf5e9bfc302a04190a02e2777af24..33de5c31b81540fdb2153e7e5e4f7ec72a43738b 100644 (file)
@@ -255,6 +255,103 @@ bool tdb_store_uint32(struct tdb_context *tdb, const char *keystr, uint32_t valu
 {
        return tdb_store_uint32_byblob(tdb, string_term_tdb_data(keystr), value);
 }
+
+/****************************************************************************
+ Fetch a int64_t value by a arbitrary blob key, return -1 if not found.
+****************************************************************************/
+
+static int fetch_int64_parser(TDB_DATA key, TDB_DATA data, void *private_data)
+{
+       if (data.dsize == sizeof(int64_t)) {
+               *((int64_t *)private_data) = PULL_LE_I64(data.dptr, 0);
+               return 0;
+       }
+       return -1;
+}
+
+/****************************************************************************
+ Fetch a int64_t value by string key, return -1 if not found.
+****************************************************************************/
+
+int tdb_fetch_int64(struct tdb_context *tdb, const char *keystr, int64_t *value)
+{
+       return tdb_parse_record(tdb, string_term_tdb_data(keystr), fetch_int64_parser, value);
+}
+
+/****************************************************************************
+ Store a int64_t value by an arbitrary blob key, return 0 on success, -ve on failure.
+ Input is int64_t in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+
+static int tdb_store_int64_byblob(struct tdb_context *tdb, TDB_DATA key,
+                                 int64_t v)
+{
+       int64_t v_store;
+       TDB_DATA data = { .dptr = (unsigned char *)&v_store, .dsize = sizeof(v_store), };
+
+       PUSH_LE_I64(&v_store, 0, v);
+       return tdb_store(tdb, key, data, TDB_REPLACE);
+}
+
+/****************************************************************************
+ Store a int64_t value by string key, return 0 on success, -ve on failure.
+ Input is int64_t in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+
+int tdb_store_int64(struct tdb_context *tdb, const char *keystr, int64_t v)
+{
+       return tdb_store_int64_byblob(tdb, string_term_tdb_data(keystr), v);
+}
+
+/****************************************************************************
+ Fetch a uint64_t value by a arbitrary blob key, return -1 in case of error.
+ Output is uint64_t in native byte order.
+****************************************************************************/
+
+static int fetch_uint64_parser(TDB_DATA key, TDB_DATA data, void *private_data)
+{
+       if (data.dsize != sizeof(uint64_t)) {
+               return -1;
+       }
+       *((uint64_t *)private_data) = PULL_LE_U64(data.dptr, 0);
+       return 0;
+}
+
+/****************************************************************************
+ Fetch a uint64_t value by string key, return -1 if not found.
+ Output is uint64_t in native byte order.
+****************************************************************************/
+
+int tdb_fetch_uint64(struct tdb_context *tdb, const char *keystr, uint64_t *value)
+{
+       return tdb_parse_record(tdb, string_term_tdb_data(keystr), fetch_uint64_parser, value);
+}
+
+/****************************************************************************
+ Store a uint64_t value by an arbitrary blob key, return 0 on success, -1 on failure.
+ Input is uint64_t in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+
+static int tdb_store_uint64_byblob(struct tdb_context *tdb, TDB_DATA key,
+                                   uint64_t value)
+{
+       uint64_t v_store;
+       TDB_DATA data = { .dptr = (unsigned char *)&v_store, .dsize = sizeof(v_store), };
+
+       PUSH_LE_U64(&v_store, 0, value);
+       return tdb_store(tdb, key, data, TDB_REPLACE);
+}
+
+/****************************************************************************
+ Store a uint64_t value by string key, return 0 on success, -1 on failure.
+ Input is uint64_t in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+
+int tdb_store_uint64(struct tdb_context *tdb, const char *keystr, uint64_t value)
+{
+       return tdb_store_uint64_byblob(tdb, string_term_tdb_data(keystr), value);
+}
+
 /****************************************************************************
  Store a buffer by a null terminated string key.  Return 0 on success, -ve
  on failure.
index 010521d96068575be5473486de3d1968032cb25c..69926a12d10186f366e0b79f740e7f1c2ca1c641 100644 (file)
@@ -80,6 +80,30 @@ bool tdb_fetch_uint32(struct tdb_context *tdb, const char *keystr, uint32_t *val
 ****************************************************************************/
 bool tdb_store_uint32(struct tdb_context *tdb, const char *keystr, uint32_t value);
 
+/****************************************************************************
+ Fetch a int64_t value by string key, return -1 if not found.
+ Output is int64_t in native byte order.
+****************************************************************************/
+int tdb_fetch_int64(struct tdb_context *tdb, const char *keystr, int64_t *);
+
+/****************************************************************************
+ Store a int64_t value by string key, return 0 on success, -1 on failure.
+ Input is int64_t in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+int tdb_store_int64(struct tdb_context *tdb, const char *keystr, int64_t v);
+
+/****************************************************************************
+ Fetch a uint64_t value by string key, return -1 if not found.
+ Output is uint64_t in native byte order.
+****************************************************************************/
+int tdb_fetch_uint64(struct tdb_context *tdb, const char *keystr, uint64_t *value);
+
+/****************************************************************************
+ Store a uint64_t value by string key, return 0 on success, -1 on failure.
+ Input is uint64_t in native byte order. Output in tdb is in little-endian.
+****************************************************************************/
+int tdb_store_uint64(struct tdb_context *tdb, const char *keystr, uint64_t value);
+
 /****************************************************************************
  Store a buffer by a null terminated string key.  Return 0 on success, -ve
  on failure.