#include <lutil.h>
#include <ldap_rq.h>
#include "alock.h"
+#include "config.h"
static const struct bdbi_database {
char *file;
#define bdb_db_close BDB_SYMBOL(db_close)
static int
-bdb_db_init( BackendDB *be )
+bdb_db_init( BackendDB *be, ConfigReply *cr )
{
struct bdb_info *bdb;
int rc;
ldap_pvt_thread_rdwr_init( &bdb->bi_idl_tree_rwlock );
ldap_pvt_thread_mutex_init( &bdb->bi_idl_tree_lrulock );
- {
- Entry *e = entry_alloc();
- e->e_id = 0;
- e->e_private = &bdb->bi_cache.c_dntree;
- BER_BVSTR( &e->e_name, "" );
- BER_BVSTR( &e->e_nname, "" );
- bdb->bi_cache.c_dntree.bei_e = e;
- }
be->be_private = bdb;
be->be_cf_ocs = be->bd_info->bi_cf_ocs;
}
static int
-bdb_db_close( BackendDB *be );
+bdb_db_close( BackendDB *be, ConfigReply *cr );
static int
-bdb_db_open( BackendDB *be )
+bdb_db_open( BackendDB *be, ConfigReply *cr )
{
int rc, i;
struct bdb_info *bdb = (struct bdb_info *) be->be_private;
u_int32_t flags;
char path[MAXPATHLEN];
char *dbhome;
+ Entry *e = NULL;
int do_recover = 0, do_alock_recover = 0;
int alockt, quick = 0;
if ( be->be_suffix == NULL ) {
Debug( LDAP_DEBUG_ANY,
LDAP_XSTRING(bdb_db_open) ": need suffix\n",
- 0, 0, 0 );
+ 1, 0, 0 );
return -1;
}
#ifndef BDB_MULTIPLE_SUFFIXES
if ( be->be_suffix[1].bv_val ) {
- Debug( LDAP_DEBUG_ANY,
- LDAP_XSTRING(bdb_db_open) ": only one suffix allowed\n", 0, 0, 0 );
+ if (cr) {
+ snprintf(cr->msg, sizeof(cr->msg), "only one suffix allowed");
+ Debug( LDAP_DEBUG_ANY,
+ LDAP_XSTRING(bdb_db_open) ": %s\n", cr->msg, 0, 0 );
+ }
return -1;
}
#endif
Debug( LDAP_DEBUG_ANY,
LDAP_XSTRING(bdb_db_open) ": Cannot access database directory %s (%d)\n",
bdb->bi_dbenv_home, errno, 0 );
- return -1;
+ return -1;
}
/* Perform database use arbitration/recovery logic */
XLOCK_ID(bdb->bi_dbenv, &bdb->bi_cache.c_locker);
}
+ entry_prealloc( bdb->bi_cache.c_maxsize );
+ attr_prealloc( bdb->bi_cache.c_maxsize * 20 );
+
+ /* setup for empty-DN contexts */
+ if ( BER_BVISEMPTY( &be->be_nsuffix[0] )) {
+ rc = bdb_id2entry( be, NULL, 0, 0, &e );
+ }
+ if ( !e ) {
+ e = entry_alloc();
+ e->e_id = 0;
+ ber_dupbv( &e->e_name, (struct berval *)&slap_empty_bv );
+ ber_dupbv( &e->e_nname, (struct berval *)&slap_empty_bv );
+ }
+ e->e_ocflags = SLAP_OC_GLUE|SLAP_OC__END;
+ e->e_private = &bdb->bi_cache.c_dntree;
+ bdb->bi_cache.c_dntree.bei_e = e;
+
/* monitor setup */
rc = bdb_monitor_db_open( be );
if ( rc != 0 ) {
bdb->bi_flags |= BDB_IS_OPEN;
- entry_prealloc( bdb->bi_cache.c_maxsize );
- attr_prealloc( bdb->bi_cache.c_maxsize * 20 );
return 0;
fail:
- bdb_db_close( be );
+ bdb_db_close( be, NULL );
return rc;
}
static int
-bdb_db_close( BackendDB *be )
+bdb_db_close( BackendDB *be, ConfigReply *cr )
{
int rc;
struct bdb_info *bdb = (struct bdb_info *) be->be_private;
/* monitor handling */
(void)bdb_monitor_db_close( be );
+ {
+ Entry *e = bdb->bi_cache.c_dntree.bei_e;
+ if ( e ) {
+ bdb->bi_cache.c_dntree.bei_e = NULL;
+ e->e_private = NULL;
+ bdb_entry_return( e );
+ }
+ }
+
bdb->bi_flags &= ~BDB_IS_OPEN;
ber_bvarray_free( bdb->bi_db_config );
}
static int
-bdb_db_destroy( BackendDB *be )
+bdb_db_destroy( BackendDB *be, ConfigReply *cr )
{
struct bdb_info *bdb = (struct bdb_info *) be->be_private;
ldap_pvt_thread_rdwr_destroy( &bdb->bi_idl_tree_rwlock );
ldap_pvt_thread_mutex_destroy( &bdb->bi_idl_tree_lrulock );
- {
- Entry *e;
- e = bdb->bi_cache.c_dntree.bei_e;
- bdb->bi_cache.c_dntree.bei_e = NULL;
- e->e_private = NULL;
- BER_BVZERO( &e->e_name );
- BER_BVZERO( &e->e_nname );
- entry_free( e );
- }
-
ch_free( bdb );
be->be_private = NULL;