diff options
Diffstat (limited to 'source/lib/dbwrap.c')
-rw-r--r-- | source/lib/dbwrap.c | 86 |
1 files changed, 73 insertions, 13 deletions
diff --git a/source/lib/dbwrap.c b/source/lib/dbwrap.c index 73c2761a1b..7fe1631bff 100644 --- a/source/lib/dbwrap.c +++ b/source/lib/dbwrap.c @@ -43,7 +43,7 @@ static int dbwrap_fallback_fetch(struct db_context *db, TALLOC_CTX *mem_ctx, } /** - * open a database + * If you need transaction support use db_open_trans() */ struct db_context *db_open(TALLOC_CTX *mem_ctx, const char *name, @@ -60,15 +60,8 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx, sockname = CTDB_PATH; } - if (lp_clustering()) { + if (lp_clustering() && socket_exist(sockname)) { const char *partname; - - if (!socket_exist(sockname)) { - DEBUG(1, ("ctdb socket does not exist - is ctdb not " - "running?\n")); - return NULL; - } - /* ctdb only wants the file part of the name */ partname = strrchr(name, '/'); if (partname) { @@ -83,10 +76,8 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx, if (result == NULL) { DEBUG(0,("failed to attach to ctdb %s\n", partname)); - if (errno == 0) { - errno = EIO; - } - return NULL; + smb_panic("failed to attach to a ctdb " + "database"); } } } @@ -105,6 +96,75 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx, return result; } +/** + * If you use this you can only modify with a transaction + */ +struct db_context *db_open_trans(TALLOC_CTX *mem_ctx, + const char *name, + int hash_size, int tdb_flags, + int open_flags, mode_t mode) +{ + bool use_tdb2 = lp_parm_bool(-1, "dbwrap", "use_tdb2", false); +#ifdef CLUSTER_SUPPORT + const char *sockname = lp_ctdbd_socket(); +#endif + + if (tdb_flags & TDB_CLEAR_IF_FIRST) { + DEBUG(0,("db_open_trans: called with TDB_CLEAR_IF_FIRST: %s\n", + name)); + smb_panic("db_open_trans: called with TDB_CLEAR_IF_FIRST"); + } + +#ifdef CLUSTER_SUPPORT + 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)) { + struct db_context *result = NULL; + result = db_open_ctdb(mem_ctx, partname, hash_size, + tdb_flags, open_flags, mode); + if (result == NULL) { + DEBUG(0,("failed to attach to ctdb %s\n", + partname)); + smb_panic("failed to attach to a ctdb " + "database"); + } + return result; + } + } +#endif + + if (use_tdb2) { + const char *partname; + /* tdb2 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, "tdb2", partname, true)) { + return db_open_tdb2(mem_ctx, partname, hash_size, + tdb_flags, open_flags, mode); + } + } + + return db_open_tdb(mem_ctx, name, hash_size, + tdb_flags, open_flags, mode); +} + NTSTATUS dbwrap_delete_bystring(struct db_context *db, const char *key) { struct db_record *rec; |