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"
2011-07-06 18:40:21 +04:00
# include "util_tdb.h"
# ifdef CLUSTER_SUPPORT
# include "ctdb_private.h"
# endif
2011-07-06 18:49:34 +04:00
bool db_is_local ( const char * name )
{
# ifdef CLUSTER_SUPPORT
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 ;
}
}
# endif
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 ;
# ifdef CLUSTER_SUPPORT
2012-01-06 20:19:54 +04:00
const char * sockname ;
# endif
2012-03-18 17:47:37 +04:00
switch ( lock_order ) {
case DBWRAP_LOCK_ORDER_1 :
case DBWRAP_LOCK_ORDER_2 :
case DBWRAP_LOCK_ORDER_3 :
break ;
default :
2012-01-06 20:19:54 +04:00
/*
2012-03-18 17:47:37 +04:00
* Only allow the 3 levels ctdb gives us .
2012-01-06 20:19:54 +04:00
*/
errno = EINVAL ;
return NULL ;
}
# ifdef CLUSTER_SUPPORT
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 ,
lock_order ) ;
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 ;
}
}
}
# endif
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 ,
lock_order ) ;
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 ;
}