]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb2/startup.c
Change 'unsigned long len' to ber_len_t in get_filter()
[openldap] / servers / slapd / back-bdb2 / startup.c
index c27f6ad54ded39d858c6d1484c0d339edb79ca04..3857ab681248236b7910ffe883fc312bf4a51e18 100644 (file)
@@ -1,4 +1,4 @@
-/* startup.c - startup bdb2 backend */
+/* startup.c - startup/shutdown bdb2 backend */
 
 #include "portable.h"
 
@@ -6,8 +6,16 @@
 
 #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"
 
@@ -17,173 +25,208 @@ static void remove_old_locks( char *home );
 
 
 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 );
 }
 
 
@@ -194,7 +237,7 @@ remove_old_locks( char *home )
        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;