diff options
Diffstat (limited to 'source/lib/dbwrap.c')
-rw-r--r-- | source/lib/dbwrap.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/source/lib/dbwrap.c b/source/lib/dbwrap.c index 73c2761a1b..126b5c1f35 100644 --- a/source/lib/dbwrap.c +++ b/source/lib/dbwrap.c @@ -42,6 +42,56 @@ static int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx, return 0; } +/* + * Fall back using fetch if no genuine parse operation is provided + */ + +static int dbwrap_fallback_parse_record(struct db_context *db, TDB_DATA key, + int (*parser)(TDB_DATA key, + TDB_DATA data, + void *private_data), + void *private_data) +{ + TDB_DATA data; + int res; + + res = db->fetch(db, talloc_tos(), key, &data); + if (res != 0) { + return res; + } + + res = parser(key, data, private_data); + TALLOC_FREE(data.dptr); + return res; +} + +bool db_is_local(const char *name) +{ +#ifdef CLUSTER_SUPPORT + const char *sockname = lp_ctdbd_socket(); + + if(!sockname || !*sockname) { + sockname = CTDB_PATH; + } + + if (lp_clustering() && socket_exist(sockname)) { + const char *partname; + /* ctdb only wants the file part of the name */ + partname = strrchr(name, '/'); + if (partname) { + partname++; + } else { + partname = name; + } + /* allow ctdb for individual databases to be disabled */ + if (lp_parm_bool(-1, "ctdb", partname, True)) { + return false; + } + } +#endif + return true; +} + /** * open a database */ @@ -101,6 +151,9 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx, if ((result != NULL) && (result->fetch == NULL)) { result->fetch = dbwrap_fallback_fetch; } + if ((result != NULL) && (result->parse_record == NULL)) { + result->parse_record = dbwrap_fallback_parse_record; + } return result; } |