]> git.sur5r.net Git - openldap/blob - servers/slapd/back-bdb2/startup.c
6e526ab88d1754f570639fb8ff276373c4df4801
[openldap] / servers / slapd / back-bdb2 / startup.c
1 /* startup.c - startup/shutdown 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 /*  startup/shutdown per backend type  */
27
28 static int
29 bdb2i_back_startup_internal(
30     BackendInfo *bi
31 )
32 {
33         struct ldbtype  *lty = (struct ldbtype *) bi->bi_private;
34         DB_ENV           *dbEnv = lty->lty_dbenv;
35         int    envFlags = DB_CREATE | DB_THREAD | DB_INIT_LOCK | DB_INIT_MPOOL;
36         int    err      = 0;
37         char   *home;
38
39         /*  make sure, dbhome is an absolute path  */
40         if ( *lty->lty_dbhome != *DEFAULT_DIRSEP ) {
41                 char   cwd[MAXPATHLEN];
42
43                 (void) getcwd( cwd, MAXPATHLEN );
44                 sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, lty->lty_dbhome );
45                 free( lty->lty_dbhome );
46                 lty->lty_dbhome = strdup( cwd );
47
48         }
49         home = lty->lty_dbhome;
50
51         /*  general initialization of the environment  */
52         memset( dbEnv, 0, sizeof( DB_ENV ));
53         dbEnv->db_errcall = bdb2i_db_errcall;
54         dbEnv->db_errpfx  = "==>";
55
56         /*  initialize the lock subsystem  */
57         dbEnv->lk_max     = 0;
58
59         /*  remove old locking tables  */
60         remove_old_locks( home );
61
62         /*  initialize the mpool subsystem  */
63         dbEnv->mp_size   = lty->lty_mpsize;
64
65         /*  now do the db_appinit  */
66         if ( ( err = db_appinit( home, NULL, dbEnv, envFlags )) ) {
67                 char  error[BUFSIZ];
68
69                 if ( err < 0 ) sprintf( error, "%ld\n", (long) err );
70                 else           sprintf( error, "%s\n", strerror( err ));
71
72                 Debug( LDAP_DEBUG_ANY,
73                                 "bdb2i_back_startup(): FATAL error in db_appinit() : %s\n",
74                                 error, 0, 0 );
75                 return( 1 );
76
77         }
78
79         return 0;
80 }
81
82
83 static int
84 bdb2i_back_shutdown_internal(
85     BackendInfo *bi
86 )
87 {
88         struct ldbtype  *lty = (struct ldbtype *) bi->bi_private;
89         DB_ENV           *dbEnv = lty->lty_dbenv;
90         int              err;
91
92         /*  remove old locking tables  */
93         dbEnv->db_errpfx  = "bdb2i_back_shutdown(): lock_unlink:";
94         if ( ( err = lock_unlink( NULL, 1, dbEnv )) != 0 )
95                 Debug( LDAP_DEBUG_ANY, "bdb2i_back_shutdown(): lock_unlink: %s\n",
96                                         strerror( err ), 0, 0);
97
98         /*  remove old memory pool  */
99         dbEnv->db_errpfx  = "bdb2i_back_shutdown(): memp_unlink:";
100         if ( ( err = memp_unlink( NULL, 1, dbEnv )) != 0 )
101                 Debug( LDAP_DEBUG_ANY, "bdb2i_back_shutdown(): memp_unlink: %s\n",
102                                         strerror( err ), 0, 0);
103
104         (void) db_appexit( dbEnv );
105
106         return( 0 );
107 }
108
109
110 int
111 bdb2i_back_startup(
112     BackendInfo *bi
113 )
114 {
115         struct timeval  time1, time2;
116         char   *elapsed_time;
117         int    ret;
118
119         gettimeofday( &time1, NULL );
120
121         ret = bdb2i_back_startup_internal( bi );
122
123         if ( bdb2i_do_timing ) {
124
125                 gettimeofday( &time2, NULL);
126                 elapsed_time = bdb2i_elapsed( time1, time2 );
127                 Debug( LDAP_DEBUG_ANY, "BE-START elapsed=%s\n",
128                                 elapsed_time, 0, 0 );
129                 free( elapsed_time );
130
131         }
132
133         return( ret );
134 }
135
136
137 int
138 bdb2i_back_shutdown(
139     BackendInfo *bi
140 )
141 {
142         struct timeval  time1, time2;
143         char   *elapsed_time;
144         int    ret;
145
146         gettimeofday( &time1, NULL );
147
148         ret = bdb2i_back_shutdown_internal( bi );
149
150         if ( bdb2i_do_timing ) {
151
152                 gettimeofday( &time2, NULL);
153                 elapsed_time = bdb2i_elapsed( time1, time2 );
154                 Debug( LDAP_DEBUG_ANY, "BE-SHUTDOWN elapsed=%s\n",
155                                 elapsed_time, 0, 0 );
156                 free( elapsed_time );
157
158         }
159
160         return( ret );
161 }
162
163
164 /*  startup/shutdown per backend database  */
165
166 static int
167 bdb2i_back_db_startup_internal(
168     BackendDB   *be
169 )
170 {
171         struct ldbminfo  *li = (struct ldbminfo *) be->be_private;
172
173         /*  if the data directory is not an absolute path, have it relative
174         to the current working directory (which should not be configured !)  */
175         if ( *li->li_directory != *DEFAULT_DIRSEP ) {
176                 char   cwd[MAXPATHLEN];
177
178                 (void) getcwd( cwd, MAXPATHLEN );
179                 sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_directory );
180                 free( li->li_directory );
181                 li->li_directory = strdup( cwd );
182
183         }
184
185         /*  if there are more index files, add them to the DB file list  */
186         if ( bdb2i_check_additional_attr_index( li ) != 0 )
187                 return 1;
188
189         /*  now open all DB files  */
190         if ( bdb2i_txn_open_files( li ) != 0 )
191                 return 1;
192
193         return 0;
194 }
195
196
197 static int
198 bdb2i_back_db_shutdown_internal(
199     BackendDB   *be
200 )
201 {
202         return 0;
203 }
204
205
206 int
207 bdb2_back_db_startup(
208     BackendDB   *be
209 )
210 {
211         struct timeval  time1, time2;
212         char   *elapsed_time;
213         int    ret;
214
215         gettimeofday( &time1, NULL );
216
217         ret = bdb2i_back_db_startup_internal( be );
218
219         if ( bdb2i_do_timing ) {
220
221                 gettimeofday( &time2, NULL);
222                 elapsed_time = bdb2i_elapsed( time1, time2 );
223                 Debug( LDAP_DEBUG_ANY, "DB-START elapsed=%s\n",
224                                 elapsed_time, 0, 0 );
225                 free( elapsed_time );
226
227         }
228
229         return( ret );
230 }
231
232
233 int
234 bdb2_back_db_shutdown(
235     BackendDB   *be
236 )
237 {
238         struct timeval  time1, time2;
239         char   *elapsed_time;
240         int    ret;
241
242         gettimeofday( &time1, NULL );
243
244         ret = bdb2i_back_db_shutdown_internal( be );
245
246         if ( bdb2i_do_timing ) {
247
248                 gettimeofday( &time2, NULL);
249                 elapsed_time = bdb2i_elapsed( time1, time2 );
250                 Debug( LDAP_DEBUG_ANY, "DB-SHUTDOWN elapsed=%s\n",
251                                 elapsed_time, 0, 0 );
252                 free( elapsed_time );
253
254         }
255
256         return( ret );
257 }
258
259
260 static void
261 remove_old_locks( char *home )
262 {
263         DB_ENV  dbEnv;
264         int     err;
265
266         memset( &dbEnv, 0, sizeof( DB_ENV ));
267         dbEnv.db_errcall = stderr;
268         dbEnv.db_errpfx  = "remove_old_locks(): db_appinit:";
269         dbEnv.lk_max     = 0;
270
271         if ( ( err = db_appinit( home, NULL, &dbEnv, 0 )) != 0 )
272                 Debug( LDAP_DEBUG_ANY, "remove_old_locks(): db_appinit: %s\n",
273                                         strerror( err ), 0, 0);
274
275         dbEnv.db_errpfx  = "remove_old_locks(): lock_unlink:";
276         if ( ( err = lock_unlink( NULL, 1, &dbEnv )) != 0 )
277                 Debug( LDAP_DEBUG_ANY, "remove_old_locks(): lock_unlink: %s\n",
278                                         strerror( err ), 0, 0);
279
280         dbEnv.db_errpfx  = "remove_old_locks(): db_appexit:";
281         if ( ( err = db_appexit( &dbEnv )) != 0 )
282                 Debug( LDAP_DEBUG_ANY, "remove_old_locks(): db_appexit: %s\n",
283                                         strerror( err ), 0, 0);
284
285 }
286
287