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 12:17:55 +0000 (14:17 +0200)
Signed-off-by: Michael Adam <obnox@samba.org>
source3/lib/dbwrap/dbwrap.c
source3/lib/dbwrap/dbwrap.h

index c2d28b3..9ec7a3e 100644 (file)
@@ -43,6 +43,24 @@ 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
  */
@@ -79,6 +97,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_store(struct db_context *db, TDB_DATA key,
                      TDB_DATA data, int flags)
 {
index 2ba96b2..9ff47c4 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;
 };
@@ -63,6 +64,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_traverse(struct db_context *db,
                         int (*f)(struct db_record*, void*),
                         void *private_data,