-/* startup.c - startup bdb2 backend */
+/* startup.c - startup/shutdown bdb2 backend */
#include "portable.h"
#include <ac/string.h>
#include <ac/socket.h>
+#include <ac/unistd.h>
-#include "ldapconfig.h"
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+#ifdef HAVE_DIRECT_H
+#include <direct.h>
+#endif
+
+#include "ldap_defaults.h"
#include "slap.h"
#include "back-bdb2.h"
static void
-bdb2i_db_errcall( char *prefix, char *message )
+bdb2i_db_errcall( const char *prefix, char *message )
{
- Debug( LDAP_DEBUG_ANY, "dbd2_db_errcall(): %s %s", prefix, message, 0 );
+ Debug( LDAP_DEBUG_ANY, "bdb2_db_errcall(): %s %s", prefix, message, 0 );
}
-void
+/* startup/shutdown per backend type */
+
+static int
bdb2i_back_startup_internal(
- Backend *be
+ BackendInfo *bi
)
{
- struct ldbminfo *li = (struct ldbminfo *) be->be_private;
- DB_ENV *dbEnv = &li->li_db_env;
- int envFlags = DB_CREATE | DB_THREAD | DB_INIT_LOCK | DB_INIT_MPOOL;
- int err = 0;
- char *home;
- char datadir[MAXPATHLEN];
- char *config[2] = { datadir, NULL };
+ struct ldbtype *lty = (struct ldbtype *) bi->bi_private;
+ int envFlags;
+ int err = 0;
+ char *home;
- /* if the data directory is not an absolute path, have it relative
- to the current working directory (which should not be configured !) */
- if ( *li->li_directory != *DEFAULT_DIRSEP ) {
+ /* set the flags for a full-feldged transaction schema */
+ envFlags = ( DB_CREATE | DB_THREAD | DB_INIT_TXN | DB_INIT_LOG |
+ DB_INIT_LOCK | DB_INIT_MPOOL );
+
+ /* make sure, dbhome is an absolute path */
+ if ( *lty->lty_dbhome != *LDAP_DIRSEP ) {
char cwd[MAXPATHLEN];
(void) getcwd( cwd, MAXPATHLEN );
- sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_directory );
- free( li->li_directory );
- li->li_directory = strdup( cwd );
-
- }
-
- /* set the DB home directory to the configured one, or the data dir */
- if ( li->li_dbhome ) {
-
- if ( *li->li_dbhome != *DEFAULT_DIRSEP ) {
- char cwd[MAXPATHLEN];
-
- (void) getcwd( cwd, MAXPATHLEN );
- sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_dbhome );
- free( li->li_dbhome );
- li->li_dbhome = strdup( cwd );
-
- }
- home = li->li_dbhome;
-
- } else {
-
- home = li->li_directory;
+ sprintf( cwd, "%s" LDAP_DIRSEP "%s",
+ cwd, lty->lty_dbhome );
+ free( lty->lty_dbhome );
+ lty->lty_dbhome = ch_strdup( cwd );
}
-
- /* set the DATA_DIR */
- sprintf( datadir, "DB_DATA_DIR %s", li->li_directory );
+ home = lty->lty_dbhome;
/* general initialization of the environment */
- memset( dbEnv, 0, sizeof( DB_ENV ));
- dbEnv->db_errcall = bdb2i_db_errcall;
- dbEnv->db_errpfx = "==>";
+ memset( &bdb2i_dbEnv, 0, sizeof( DB_ENV ));
+ bdb2i_dbEnv.db_errcall = bdb2i_db_errcall;
+ bdb2i_dbEnv.db_errpfx = "==>";
/* initialize the lock subsystem */
- dbEnv->lk_max = 0;
+ bdb2i_dbEnv.lk_max = 0;
/* remove old locking tables */
remove_old_locks( home );
/* initialize the mpool subsystem */
- dbEnv->mp_size = (size_t) li->li_dbcachesize;
+ bdb2i_dbEnv.mp_size = lty->lty_mpsize;
/* now do the db_appinit */
- if ( ( err = db_appinit( home, config, dbEnv, envFlags )) ) {
+ if ( ( err = db_appinit( home, NULL, &bdb2i_dbEnv, envFlags )) ) {
char error[BUFSIZ];
if ( err < 0 ) sprintf( error, "%ld\n", (long) err );
else sprintf( error, "%s\n", strerror( err ));
- fprintf( stderr,
+ Debug( LDAP_DEBUG_ANY,
"bdb2i_back_startup(): FATAL error in db_appinit() : %s\n",
- error );
- exit( 1 );
+ error, 0, 0 );
+ return( 1 );
}
- bdb2i_with_dbenv = 1;
-
- /* if there are more index files, add them to the DB file list */
- bdb2i_check_additional_attr_index( li );
-
- /* now open all DB files */
- bdb2i_txn_open_files( li );
-
+ return 0;
}
-static void
+static int
bdb2i_back_shutdown_internal(
- Backend *be
+ BackendInfo *bi
)
{
- struct ldbminfo *li = (struct ldbminfo *) be->be_private;
- DB_ENV *dbEnv = &li->li_db_env;
+ struct ldbtype *lty = (struct ldbtype *) bi->bi_private;
int err;
- /* close all DB files */
- bdb2i_txn_close_files( &li->li_txn_head );
-
/* remove old locking tables */
- dbEnv->db_errpfx = "bdb2i_back_shutdown(): lock_unlink:";
- if ( ( err = lock_unlink( NULL, 1, dbEnv )) != 0 )
+ bdb2i_dbEnv.db_errpfx = "bdb2i_back_shutdown(): lock_unlink:";
+ if ( ( err = lock_unlink( NULL, 1, &bdb2i_dbEnv )) != 0 )
Debug( LDAP_DEBUG_ANY, "bdb2i_back_shutdown(): lock_unlink: %s\n",
strerror( err ), 0, 0);
/* remove old memory pool */
- dbEnv->db_errpfx = "bdb2i_back_shutdown(): memp_unlink:";
- if ( ( err = memp_unlink( NULL, 1, dbEnv )) != 0 )
+ bdb2i_dbEnv.db_errpfx = "bdb2i_back_shutdown(): memp_unlink:";
+ if ( ( err = memp_unlink( NULL, 1, &bdb2i_dbEnv )) != 0 )
Debug( LDAP_DEBUG_ANY, "bdb2i_back_shutdown(): memp_unlink: %s\n",
strerror( err ), 0, 0);
- (void) db_appexit( &li->li_db_env );
+ (void) db_appexit( &bdb2i_dbEnv );
+ return( 0 );
}
-void
-bdb2_back_startup(
- Backend *be
+int
+bdb2i_back_startup(
+ BackendInfo *bi
)
{
- struct timeval time1, time2;
- char *elapsed_time;
+ struct timeval time1;
+ int ret;
- gettimeofday( &time1, NULL );
+ bdb2i_start_timing( bi, &time1 );
- bdb2i_back_startup_internal( be );
+ ret = bdb2i_back_startup_internal( bi );
+ bdb2i_stop_timing( bi, time1, "BE-START", NULL, NULL );
- if ( bdb2i_do_timing ) {
+ return( ret );
+}
+
+
+int
+bdb2i_back_shutdown(
+ BackendInfo *bi
+)
+{
+ struct timeval time1;
+ int ret;
+
+ bdb2i_start_timing( bi, &time1 );
- gettimeofday( &time2, NULL);
- elapsed_time = bdb2i_elapsed( time1, time2 );
- Debug( LDAP_DEBUG_ANY, "START elapsed=%s\n",
- elapsed_time, 0, 0 );
- free( elapsed_time );
+ ret = bdb2i_back_shutdown_internal( bi );
+ bdb2i_stop_timing( bi, time1, "BE-SHUTDOWN", NULL, NULL );
+
+ return( ret );
+}
+
+
+/* startup/shutdown per backend database */
+
+static int
+bdb2i_back_db_startup_internal(
+ BackendDB *be
+)
+{
+ struct ldbminfo *li = (struct ldbminfo *) be->be_private;
+
+ /* if the data directory is not an absolute path, have it relative
+ to the current working directory (which should not be configured !) */
+ if ( *li->li_directory != *LDAP_DIRSEP ) {
+ char cwd[MAXPATHLEN];
+
+ (void) getcwd( cwd, MAXPATHLEN );
+ sprintf( cwd, "%s" LDAP_DIRSEP "%s",
+ cwd, li->li_directory );
+
+ free( li->li_directory );
+ li->li_directory = ch_strdup( cwd );
}
+
+ /* if there are more index files, add them to the DB file list */
+ if ( bdb2i_check_additional_attr_index( li ) != 0 )
+ return 1;
+
+ /* now open all DB files */
+ if ( bdb2i_txn_open_files( be ) != 0 )
+ return 1;
+
+ return 0;
}
-void
-bdb2_back_shutdown(
- Backend *be
+static int
+bdb2i_back_db_shutdown_internal(
+ BackendDB *be
)
{
- struct timeval time1, time2;
- char *elapsed_time;
+ return 0;
+}
- gettimeofday( &time1, NULL );
- bdb2i_back_shutdown_internal( be );
+int
+bdb2_back_db_startup(
+ BackendDB *be
+)
+{
+ struct timeval time1;
+ int ret;
- if ( bdb2i_do_timing ) {
+ bdb2i_start_timing( be->bd_info, &time1 );
- gettimeofday( &time2, NULL);
- elapsed_time = bdb2i_elapsed( time1, time2 );
- Debug( LDAP_DEBUG_ANY, "SHUTDOWN elapsed=%s\n",
- elapsed_time, 0, 0 );
- free( elapsed_time );
+ ret = bdb2i_back_db_startup_internal( be );
+ bdb2i_stop_timing( be->bd_info, time1, "DB-START", NULL, NULL );
- }
+ return( ret );
+}
+
+
+int
+bdb2_back_db_shutdown(
+ BackendDB *be
+)
+{
+ struct timeval time1;
+ int ret;
+
+ bdb2i_start_timing( be->bd_info, &time1 );
+
+ ret = bdb2i_back_db_shutdown_internal( be );
+ bdb2i_stop_timing( be->bd_info, time1, "DB-SHUTDOWN", NULL, NULL );
+
+ return( ret );
}
int err;
memset( &dbEnv, 0, sizeof( DB_ENV ));
- dbEnv.db_errcall = stderr;
+ dbEnv.db_errcall = bdb2i_db_errcall;
dbEnv.db_errpfx = "remove_old_locks(): db_appinit:";
dbEnv.lk_max = 0;