s3:dbwrap: add function dbwrap_exists()
authorGregor Beck <gbeck@sernet.de>
Mon, 4 Jul 2011 08:15:44 +0000 (10:15 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 11 Oct 2011 13:33:16 +0000 (15:33 +0200)
Signed-off-by: Michael Adam <obnox@samba.org>
source3/include/dbwrap.h
source3/lib/dbwrap.c

index d657ee7f30822c465fe63dbe70cc1f617049fc2f..e3f2228f5033c270d4f6a41846f7cbbb1f480caf 100644 (file)
@@ -52,6 +52,7 @@ struct db_context {
                            int (*parser)(TDB_DATA key, TDB_DATA data,
                                          void *private_data),
                            void *private_data);
+       int (*exists)(struct db_context *db,TDB_DATA key);
        void *private_data;
        bool persistent;
 };
@@ -91,6 +92,7 @@ NTSTATUS dbwrap_store(struct db_context *db, TDB_DATA key,
                      TDB_DATA data, int flags);
 TDB_DATA dbwrap_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
                      TDB_DATA key);
+bool dbwrap_exists(struct db_context *db, TDB_DATA key);
 NTSTATUS dbwrap_delete_bystring(struct db_context *db, const char *key);
 NTSTATUS dbwrap_store_bystring(struct db_context *db, const char *key,
                               TDB_DATA data, int flags);
index 9b3197f402e5e344a28255c1cf0d7e43bd0d0395..e1b3f26f4b92c3b3fe8266a692b2b63ac3ff247b 100644 (file)
@@ -44,6 +44,24 @@ static int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
        return 0;
 }
 
+/*
+ * Fall back using fetch if no genuine exists operation is provided
+ */
+
+static int dbwrap_fallback_exists(struct db_context *db, TDB_DATA key)
+{
+       TDB_DATA val;
+       if ( db->fetch(db, talloc_tos(), key, &val) != 0 ) {
+               return 0;
+       }
+       if (val.dptr == NULL ) {
+               return 0;
+       } else {
+               TALLOC_FREE(val.dptr);
+               return 1;
+       }
+}
+
 /*
  * Fall back using fetch if no genuine parse operation is provided
  */
@@ -200,6 +218,17 @@ TDB_DATA dbwrap_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
        return result;
 }
 
+bool dbwrap_exists(struct db_context *db, TDB_DATA key)
+{
+       int result;
+       if (db->exists != NULL) {
+               result = db->exists(db, key);
+       } else {
+               result = dbwrap_fallback_exists(db,key);
+       }
+       return (result == 1);
+}
+
 NTSTATUS dbwrap_delete_bystring(struct db_context *db, const char *key)
 {
        return dbwrap_delete(db, string_term_tdb_data(key));