From: Gregor Beck Date: Mon, 4 Jul 2011 08:15:44 +0000 (+0200) Subject: s3:dbwrap: add function dbwrap_exists() X-Git-Tag: 3.6.0-ctdb-27~48 X-Git-Url: http://git.samba.org/?p=obnox%2Fsamba-ctdb.git;a=commitdiff_plain;h=14531d1bea6a1b1149f91b789ee9a7906b594aaf s3:dbwrap: add function dbwrap_exists() Signed-off-by: Michael Adam --- diff --git a/source3/include/dbwrap.h b/source3/include/dbwrap.h index d657ee7f30..e3f2228f50 100644 --- a/source3/include/dbwrap.h +++ b/source3/include/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; }; @@ -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); diff --git a/source3/lib/dbwrap.c b/source3/lib/dbwrap.c index 9b3197f402..e1b3f26f4b 100644 --- a/source3/lib/dbwrap.c +++ b/source3/lib/dbwrap.c @@ -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));