ITS#4961 read context glue entry if it exists

This commit is contained in:
Howard Chu 2007-07-21 00:05:16 +00:00
parent 2b67f4face
commit a56a8540fd

View File

@ -83,14 +83,6 @@ bdb_db_init( BackendDB *be )
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;
@ -112,13 +104,14 @@ bdb_db_open( BackendDB *be )
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;
}
@ -453,6 +446,22 @@ shm_retry:
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, &slap_empty_bv );
ber_dupbv( &e->e_nname, &slap_empty_bv );
}
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 ) {
@ -461,8 +470,6 @@ shm_retry:
bdb->bi_flags |= BDB_IS_OPEN;
entry_prealloc( bdb->bi_cache.c_maxsize );
attr_prealloc( bdb->bi_cache.c_maxsize * 20 );
return 0;
fail:
@ -481,6 +488,15 @@ bdb_db_close( BackendDB *be )
/* 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 );
@ -582,16 +598,6 @@ bdb_db_destroy( BackendDB *be )
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;