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"
2011-07-06 18:40:21 +04:00
# include "util_tdb.h"
2013-10-08 15:33:49 +04:00
# include "ctdbd_conn.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 ;
2012-01-06 20:19:54 +04:00
const char * sockname ;
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 ;
}
2014-01-29 00:31:17 +04:00
if ( tdb_flags & TDB_CLEAR_IF_FIRST ) {
const char * base ;
bool try_readonly = false ;
base = strrchr_m ( name , ' / ' ) ;
if ( base ! = NULL ) {
base + = 1 ;
} else {
base = name ;
}
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 ) {
const char * base ;
bool try_mutex = false ;
base = strrchr_m ( name , ' / ' ) ;
if ( base ! = NULL ) {
base + = 1 ;
} else {
base = name ;
}
try_mutex = lp_parm_bool ( - 1 , " dbwrap_tdb_mutexes " , " * " , try_mutex ) ;
try_mutex = lp_parm_bool ( - 1 , " dbwrap_tdb_mutexes " , base , try_mutex ) ;
if ( try_mutex & & tdb_runtime_check_for_robust_mutexes ( ) ) {
tdb_flags | = TDB_MUTEX_LOCKING ;
}
}
2012-01-06 20:19:54 +04:00
sockname = lp_ctdbd_socket ( ) ;
2011-07-06 18:40:21 +04:00
if ( lp_clustering ( ) ) {
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 ) {
partname + + ;
} else {
partname = name ;
}
/* allow ctdb for individual databases to be disabled */
if ( lp_parm_bool ( - 1 , " ctdb " , partname , True ) ) {
result = db_open_ctdb ( mem_ctx , partname , 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 ) {
DEBUG ( 0 , ( " failed to attach to ctdb %s \n " ,
partname ) ) ;
if ( errno = = 0 ) {
errno = EIO ;
}
return NULL ;
}
}
}
if ( result = = NULL ) {
2012-06-27 17:24:39 +04:00
struct loadparm_context * lp_ctx = loadparm_init_s3 ( mem_ctx , loadparm_s3_helpers ( ) ) ;
2012-06-22 09:37:43 +04:00
result = dbwrap_local_open ( mem_ctx , lp_ctx , name , hash_size ,
tdb_flags , open_flags , mode ,
2014-01-27 19:38:25 +04:00
lock_order , dbwrap_flags ) ;
2012-04-16 07:37:39 +04:00
talloc_unlink ( mem_ctx , lp_ctx ) ;
2012-01-08 22:04:39 +04:00
}
2011-07-06 18:40:21 +04:00
return result ;
}