summaryrefslogtreecommitdiff
path: root/source3/lib/dbwrap
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib/dbwrap')
-rw-r--r--source3/lib/dbwrap/dbwrap.c29
-rw-r--r--source3/lib/dbwrap/dbwrap.h2
2 files changed, 31 insertions, 0 deletions
diff --git a/source3/lib/dbwrap/dbwrap.c b/source3/lib/dbwrap/dbwrap.c
index c2d28b3a0e..9ec7a3e59a 100644
--- a/source3/lib/dbwrap/dbwrap.c
+++ b/source3/lib/dbwrap/dbwrap.c
@@ -44,6 +44,24 @@ int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx,
}
/*
+ * 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)
{
diff --git a/source3/lib/dbwrap/dbwrap.h b/source3/lib/dbwrap/dbwrap.h
index 2ba96b2482..9ff47c4285 100644
--- a/source3/lib/dbwrap/dbwrap.h
+++ b/source3/lib/dbwrap/dbwrap.h
@@ -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,