]> git.sur5r.net Git - openldap/blob - servers/slapd/back-bdb2/startup.c
Introduction of a new Berkeley DB version 2 (!) specific backend.
[openldap] / servers / slapd / back-bdb2 / startup.c
1 /* startup.c - startup bdb2 backend */
2
3 #include "portable.h"
4
5 #include <stdio.h>
6
7 #include <ac/string.h>
8 #include <ac/socket.h>
9
10 #include "ldapconfig.h"
11 #include "slap.h"
12 #include "back-bdb2.h"
13
14 #include "db.h"
15
16 static void remove_old_locks( char *home );
17
18
19 static void
20 bdb2i_db_errcall( char *prefix, char *message )
21 {
22         Debug( LDAP_DEBUG_ANY, "dbd2_db_errcall(): %s %s", prefix, message, 0 );
23 }
24
25
26 void
27 bdb2i_back_startup_internal(
28     Backend     *be
29 )
30 {
31         struct ldbminfo  *li = (struct ldbminfo *) be->be_private;
32         DB_ENV           *dbEnv = &li->li_db_env;
33         int    envFlags = DB_CREATE | DB_THREAD | DB_INIT_LOCK | DB_INIT_MPOOL;
34         int    err      = 0;
35         char   *home;
36         char   datadir[MAXPATHLEN];
37         char   *config[2] = { datadir, NULL };
38
39         /*  if the data directory is not an absolute path, have it relative
40         to the current working directory (which should not be configured !)  */
41         if ( *li->li_directory != *DEFAULT_DIRSEP ) {
42                 char   cwd[MAXPATHLEN];
43
44                 (void) getcwd( cwd, MAXPATHLEN );
45                 sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_directory );
46                 free( li->li_directory );
47                 li->li_directory = strdup( cwd );
48
49         }
50
51         /*  set the DB home directory to the configured one, or the data dir  */
52         if ( li->li_dbhome ) {
53
54                 if ( *li->li_dbhome != *DEFAULT_DIRSEP ) {
55                         char   cwd[MAXPATHLEN];
56
57                         (void) getcwd( cwd, MAXPATHLEN );
58                         sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_dbhome );
59                         free( li->li_dbhome );
60                         li->li_dbhome = strdup( cwd );
61
62                 }
63                 home = li->li_dbhome;
64
65         } else {
66
67                 home = li->li_directory;
68
69         }
70
71         /*  set the DATA_DIR  */
72         sprintf( datadir, "DB_DATA_DIR %s", li->li_directory );
73
74         /*  general initialization of the environment  */
75         memset( dbEnv, 0, sizeof( DB_ENV ));
76         dbEnv->db_errcall = bdb2i_db_errcall;
77         dbEnv->db_errpfx  = "==>";
78
79         /*  initialize the lock subsystem  */
80         dbEnv->lk_max     = 0;
81
82         /*  remove old locking tables  */
83         remove_old_locks( home );
84
85         /*  initialize the mpool subsystem  */
86         dbEnv->mp_size   = (size_t) li->li_dbcachesize;
87
88         /*  now do the db_appinit  */
89         if ( ( err = db_appinit( home, config, dbEnv, envFlags )) ) {
90                 char  error[BUFSIZ];
91
92                 if ( err < 0 ) sprintf( error, "%ld\n", (long) err );
93                 else           sprintf( error, "%s\n", strerror( err ));
94
95                 fprintf( stderr,
96                                 "bdb2i_back_startup(): FATAL error in db_appinit() : %s\n",
97                                 error );
98                 exit( 1 );
99
100         }
101
102         bdb2i_with_dbenv = 1;
103
104         /*  if there are more index files, add them to the DB file list  */
105         bdb2i_check_additional_attr_index( li );
106
107         /*  now open all DB files  */
108         bdb2i_txn_open_files( li );
109
110 }
111
112
113 static void
114 bdb2i_back_shutdown_internal(
115     Backend     *be
116 )
117 {
118         struct ldbminfo  *li = (struct ldbminfo *) be->be_private;
119         DB_ENV           *dbEnv = &li->li_db_env;
120         int              err;
121
122         /*  close all DB files  */
123         bdb2i_txn_close_files( &li->li_txn_head );
124
125         /*  remove old locking tables  */
126         dbEnv->db_errpfx  = "bdb2i_back_shutdown(): lock_unlink:";
127         if ( ( err = lock_unlink( NULL, 1, dbEnv )) != 0 )
128                 Debug( LDAP_DEBUG_ANY, "bdb2i_back_shutdown(): lock_unlink: %s\n",
129                                         strerror( err ), 0, 0);
130
131         /*  remove old memory pool  */
132         dbEnv->db_errpfx  = "bdb2i_back_shutdown(): memp_unlink:";
133         if ( ( err = memp_unlink( NULL, 1, dbEnv )) != 0 )
134                 Debug( LDAP_DEBUG_ANY, "bdb2i_back_shutdown(): memp_unlink: %s\n",
135                                         strerror( err ), 0, 0);
136
137         (void) db_appexit( &li->li_db_env );
138
139 }
140
141
142 void
143 bdb2_back_startup(
144     Backend     *be
145 )
146 {
147         struct timeval  time1, time2;
148         char   *elapsed_time;
149
150         gettimeofday( &time1, NULL );
151
152         bdb2i_back_startup_internal( be );
153
154         if ( bdb2i_do_timing ) {
155
156                 gettimeofday( &time2, NULL);
157                 elapsed_time = bdb2i_elapsed( time1, time2 );
158                 Debug( LDAP_DEBUG_ANY, "START elapsed=%s\n",
159                                 elapsed_time, 0, 0 );
160                 free( elapsed_time );
161
162         }
163 }
164
165
166 void
167 bdb2_back_shutdown(
168     Backend     *be
169 )
170 {
171         struct timeval  time1, time2;
172         char   *elapsed_time;
173
174         gettimeofday( &time1, NULL );
175
176         bdb2i_back_shutdown_internal( be );
177
178         if ( bdb2i_do_timing ) {
179
180                 gettimeofday( &time2, NULL);
181                 elapsed_time = bdb2i_elapsed( time1, time2 );
182                 Debug( LDAP_DEBUG_ANY, "SHUTDOWN elapsed=%s\n",
183                                 elapsed_time, 0, 0 );
184                 free( elapsed_time );
185
186         }
187 }
188
189
190 static void
191 remove_old_locks( char *home )
192 {
193         DB_ENV  dbEnv;
194         int     err;
195
196         memset( &dbEnv, 0, sizeof( DB_ENV ));
197         dbEnv.db_errcall = stderr;
198         dbEnv.db_errpfx  = "remove_old_locks(): db_appinit:";
199         dbEnv.lk_max     = 0;
200
201         if ( ( err = db_appinit( home, NULL, &dbEnv, 0 )) != 0 )
202                 Debug( LDAP_DEBUG_ANY, "remove_old_locks(): db_appinit: %s\n",
203                                         strerror( err ), 0, 0);
204
205         dbEnv.db_errpfx  = "remove_old_locks(): lock_unlink:";
206         if ( ( err = lock_unlink( NULL, 1, &dbEnv )) != 0 )
207                 Debug( LDAP_DEBUG_ANY, "remove_old_locks(): lock_unlink: %s\n",
208                                         strerror( err ), 0, 0);
209
210         dbEnv.db_errpfx  = "remove_old_locks(): db_appexit:";
211         if ( ( err = db_appexit( &dbEnv )) != 0 )
212                 Debug( LDAP_DEBUG_ANY, "remove_old_locks(): db_appexit: %s\n",
213                                         strerror( err ), 0, 0);
214
215 }
216
217