2011-12-05 13:49:48 +04:00
/*
2011-07-06 18:40:21 +04:00
Unix SMB / CIFS implementation .
Database interface wrapper
Copyright ( C ) Volker Lendecke 2005 - 2007
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 3 of the License , or
( at your option ) any later version .
2011-12-05 13:49:48 +04:00
2011-07-06 18:40:21 +04:00
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2011-12-05 13:49:48 +04:00
2011-07-06 18:40:21 +04:00
You should have received a copy of the GNU General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
2011-07-07 19:42:08 +04:00
# include "dbwrap/dbwrap.h"
2011-07-06 18:40:21 +04:00
# include "dbwrap/dbwrap_private.h"
# include "dbwrap/dbwrap_open.h"
2011-08-16 17:58:27 +04:00
# include "dbwrap/dbwrap_tdb.h"
2011-08-16 17:51:58 +04:00
# include "dbwrap/dbwrap_ctdb.h"
2012-04-16 07:37:39 +04:00
# include "lib/param/param.h"
2015-10-01 13:28:21 +03:00
# include "lib/cluster_support.h"
2017-06-16 14:00:59 +03:00
# include "lib/messages_ctdb.h"
2011-07-06 18:40:21 +04:00
# include "util_tdb.h"
2013-10-08 15:33:49 +04:00
# include "ctdbd_conn.h"
2016-04-11 17:20:32 +03:00
# include "messages.h"
2011-07-06 18:40:21 +04:00
2011-07-06 18:49:34 +04:00
bool db_is_local ( const char * name )
{
const char * sockname = lp_ctdbd_socket ( ) ;
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 ;
}
}
2014-01-21 17:34:48 +04:00
2011-07-06 18:49:34 +04:00
return true ;
}
2011-07-06 18:40:21 +04:00
/**
* open a database
*/
struct db_context * db_open ( TALLOC_CTX * mem_ctx ,
const char * name ,
int hash_size , int tdb_flags ,
2012-01-06 20:19:54 +04:00
int open_flags , mode_t mode ,
2014-01-27 17:49:12 +04:00
enum dbwrap_lock_order lock_order ,
uint64_t dbwrap_flags )
2011-07-06 18:40:21 +04:00
{
struct db_context * result = NULL ;
2018-07-10 14:35:30 +03:00
const char * base ;
2017-11-18 14:13:15 +03:00
struct loadparm_context * lp_ctx = NULL ;
2012-01-06 20:19:54 +04:00
2014-01-28 14:58:05 +04:00
if ( ! DBWRAP_LOCK_ORDER_VALID ( lock_order ) ) {
2012-01-06 20:19:54 +04:00
errno = EINVAL ;
return NULL ;
}
2018-07-10 14:35:30 +03:00
base = strrchr_m ( name , ' / ' ) ;
if ( base ! = NULL ) {
base + + ;
} else {
base = name ;
}
2014-01-29 00:31:17 +04:00
if ( tdb_flags & TDB_CLEAR_IF_FIRST ) {
bool try_readonly = false ;
if ( dbwrap_flags & DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS ) {
try_readonly = true ;
}
try_readonly = lp_parm_bool ( - 1 , " dbwrap_optimize_readonly " , " * " , try_readonly ) ;
try_readonly = lp_parm_bool ( - 1 , " dbwrap_optimize_readonly " , base , try_readonly ) ;
if ( try_readonly ) {
dbwrap_flags | = DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS ;
} else {
dbwrap_flags & = ~ DBWRAP_FLAG_OPTIMIZE_READONLY_ACCESS ;
}
}
2013-03-19 15:02:22 +04:00
if ( tdb_flags & TDB_CLEAR_IF_FIRST ) {
2017-07-09 17:23:20 +03:00
bool try_mutex = true ;
2016-01-16 12:19:23 +03:00
bool require_mutex = false ;
2013-03-19 15:02:22 +04:00
try_mutex = lp_parm_bool ( - 1 , " dbwrap_tdb_mutexes " , " * " , try_mutex ) ;
try_mutex = lp_parm_bool ( - 1 , " dbwrap_tdb_mutexes " , base , try_mutex ) ;
2018-04-11 09:01:38 +03:00
if ( ! lp_use_mmap ( ) ) {
/*
* Mutexes require mmap . " use mmap = no " can
* be a debugging tool , so let it override the
* mutex parameters
*/
try_mutex = false ;
}
2013-03-19 15:02:22 +04:00
if ( try_mutex & & tdb_runtime_check_for_robust_mutexes ( ) ) {
tdb_flags | = TDB_MUTEX_LOCKING ;
}
2016-01-16 12:19:23 +03:00
require_mutex = lp_parm_bool ( - 1 , " dbwrap_tdb_require_mutexes " ,
" * " , require_mutex ) ;
require_mutex = lp_parm_bool ( - 1 , " dbwrap_tdb_require_mutexes " ,
base , require_mutex ) ;
if ( require_mutex ) {
tdb_flags | = TDB_MUTEX_LOCKING ;
}
2013-03-19 15:02:22 +04:00
}
2011-07-06 18:40:21 +04:00
if ( lp_clustering ( ) ) {
2017-11-18 10:56:09 +03:00
const char * sockname ;
sockname = lp_ctdbd_socket ( ) ;
2011-07-06 18:40:21 +04:00
if ( ! socket_exist ( sockname ) ) {
DEBUG ( 1 , ( " ctdb socket does not exist - is ctdb not "
" running? \n " ) ) ;
return NULL ;
}
/* allow ctdb for individual databases to be disabled */
2018-07-10 14:35:30 +03:00
if ( lp_parm_bool ( - 1 , " ctdb " , base , true ) ) {
2016-04-24 18:37:07 +03:00
struct messaging_context * msg_ctx ;
2016-04-11 17:20:32 +03:00
struct ctdbd_connection * conn ;
2017-06-16 14:00:59 +03:00
conn = messaging_ctdb_connection ( ) ;
2016-04-11 17:20:32 +03:00
if ( conn = = NULL ) {
DBG_WARNING ( " No ctdb connection \n " ) ;
errno = EIO ;
return NULL ;
}
2018-08-21 21:09:16 +03:00
msg_ctx = global_messaging_context ( ) ;
2016-04-24 18:37:07 +03:00
2018-07-10 14:35:30 +03:00
result = db_open_ctdb ( mem_ctx , msg_ctx , base ,
2016-04-11 17:20:32 +03:00
hash_size ,
2012-01-16 15:50:44 +04:00
tdb_flags , open_flags , mode ,
2014-01-28 15:53:24 +04:00
lock_order , dbwrap_flags ) ;
2011-07-06 18:40:21 +04:00
if ( result = = NULL ) {
2018-07-10 14:35:30 +03:00
DBG_ERR ( " failed to attach to ctdb %s \n " , base ) ;
2011-07-06 18:40:21 +04:00
if ( errno = = 0 ) {
errno = EIO ;
}
return NULL ;
}
2017-11-18 14:13:15 +03:00
return result ;
2011-07-06 18:40:21 +04:00
}
}
2017-11-18 14:13:15 +03:00
lp_ctx = loadparm_init_s3 ( mem_ctx , loadparm_s3_helpers ( ) ) ;
2018-04-17 17:31:28 +03:00
2017-11-18 14:13:15 +03:00
if ( hash_size = = 0 ) {
hash_size = lpcfg_tdb_hash_size ( lp_ctx , name ) ;
2012-01-08 22:04:39 +04:00
}
2017-11-18 14:13:15 +03:00
tdb_flags = lpcfg_tdb_flags ( lp_ctx , tdb_flags ) ;
result = dbwrap_local_open ( mem_ctx ,
name ,
hash_size ,
tdb_flags ,
open_flags ,
mode ,
lock_order ,
dbwrap_flags ) ;
talloc_unlink ( mem_ctx , lp_ctx ) ;
2011-07-06 18:40:21 +04:00
return result ;
}