#include "slap.h"
#include "back-bdb2.h"
+#ifdef SLAPD_BDB2_DYNAMIC
+#include <gmodule.h>
+
+G_MODULE_EXPORT void init_module(int argc, char *argv[]) {
+ BackendInfo bi;
+
+ bi.bi_type = "bdb2";
+ bi.bi_init = bdb2_back_initialize;
+
+ backend_add(&bi);
+}
+
+#endif /* SLAPD_BDB2_DYNAMIC */
+
+static int
+bdb2i_back_init_private(
+ BackendInfo *bi
+)
+{
+ struct ldbtype *bt;
+
+ /* allocate backend-type-specific stuff */
+ bt = (struct ldbtype *) ch_calloc( 1, sizeof(struct ldbtype) );
+
+ bt->lty_dbhome = DEFAULT_DB_HOME;
+ bt->lty_mpsize = DEFAULT_DBCACHE_SIZE;
+
+ if ( slapMode == SLAP_TIMEDSERVER_MODE )
+ bt->lty_betiming = 1;
+
+ bi->bi_private = bt;
+
+ return 0;
+}
+
int
bdb2_back_initialize(
BackendInfo *bi
)
{
+ int ret;
+
bi->bi_open = bdb2_back_open;
- bi->bi_config = NULL;
+ bi->bi_config = bdb2_back_config;
bi->bi_close = bdb2_back_close;
bi->bi_destroy = bdb2_back_destroy;
bi->bi_op_delete = bdb2_back_delete;
bi->bi_op_abandon = bdb2_back_abandon;
+ bi->bi_entry_release_rw = bdb2_back_entry_release_rw;
bi->bi_acl_group = bdb2_back_group;
- return 0;
+ bi->bi_connection_init = 0;
+ bi->bi_connection_destroy = 0;
+
+ ret = bdb2i_back_init_private( bi );
+
+ Debug( LDAP_DEBUG_TRACE, "bdb2_back_initialize: done (%d).\n", ret, 0, 0 );
+
+ return( ret );
}
int
BackendInfo *bi
)
{
+ static int initialized = 0;
int rc;
+ if ( initialized++ ) {
+
+ Debug( LDAP_DEBUG_TRACE,
+ "bdb2_back_open: backend already initialized.\n", 0, 0, 0 );
+ return 0;
+
+ }
+
/* initialize the underlying database system */
- rc = bdb2_initialize();
+ rc = bdb2i_back_startup( bi );
return rc;
}
BackendInfo *bi
)
{
+ int rc;
+
/* close the underlying database system */
- bdb2_shutdown();
+ rc = bdb2i_back_shutdown( bi );
- return 0;
+ return rc;
}
/* BDB2 changed */
static int
bdb2i_back_db_init_internal(
- Backend *be
+ BackendDB *be
)
{
struct ldbminfo *li;
char *argv[ 4 ];
- int i;
- /* allocate backend-specific stuff */
+ /* allocate backend-database-specific stuff */
li = (struct ldbminfo *) ch_calloc( 1, sizeof(struct ldbminfo) );
/* arrange to read nextid later (on first request for it) */
li->li_nextid = NOID;
-#if SLAPD_NEXTID_CHUNCK > 1
- li->li_nextid_wrote = NOID
+#if SLAPD_NEXTID_CHUNK > 1
+ li->li_nextid_wrote = NOID;
#endif
/* default cache size */
li->li_directory = DEFAULT_DB_DIRECTORY;
/* always index dn, id2children, objectclass (used in some searches) */
+ if ( !at_find( "dn" ) ) {
+ argv[ 0 ] = "dn";
+ argv[ 1 ] = "dn";
+ argv[ 2 ] = NULL;
+ attr_syntax_config( "ldbm dn initialization", 0, 2, argv );
+ }
argv[ 0 ] = "dn";
- argv[ 1 ] = "dn";
+ argv[ 1 ] = "eq,sub";
argv[ 2 ] = NULL;
- attr_syntax_config( "ldbm dn initialization", 0, 2, argv );
- argv[ 0 ] = "dn";
- argv[ 1 ] = "sub";
- argv[ 2 ] = "eq";
- argv[ 3 ] = NULL;
- bdb2i_attr_index_config( li, "ldbm dn initialization", 0, 3, argv, 1 );
+ bdb2i_attr_index_config( li, "ldbm dn initialization", 0, 2, argv, 1 );
argv[ 0 ] = "id2children";
argv[ 1 ] = "eq";
argv[ 2 ] = NULL;
bdb2i_attr_index_config( li, "ldbm id2children initialization", 0, 2, argv,
1 );
argv[ 0 ] = "objectclass";
- argv[ 1 ] = ch_strdup( "pres,eq" );
+ argv[ 1 ] = "pres,eq";
argv[ 2 ] = NULL;
bdb2i_attr_index_config( li, "ldbm objectclass initialization", 0, 2, argv,
1 );
free( argv[ 1 ] );
- /* initialize various mutex locks & condition variables */
- ldap_pvt_thread_mutex_init( &li->li_root_mutex );
- ldap_pvt_thread_mutex_init( &li->li_add_mutex );
+ /* initialize the cache mutex */
ldap_pvt_thread_mutex_init( &li->li_cache.c_mutex );
- ldap_pvt_thread_mutex_init( &li->li_nextid_mutex );
- ldap_pvt_thread_mutex_init( &li->li_dbcache_mutex );
- ldap_pvt_thread_cond_init( &li->li_dbcache_cv );
/* initialize the TP file head */
- bdb2i_txn_head_init( &li->li_txn_head );
+ if ( bdb2i_txn_head_init( &li->li_txn_head ) != 0 )
+ return 1;
be->be_private = li;
int
bdb2_back_db_init(
- Backend *be
+ BackendDB *be
)
{
- struct timeval time1, time2;
- char *elapsed_time;
- int ret;
+ struct timeval time1;
+ int ret;
- gettimeofday( &time1, NULL );
+ bdb2i_start_timing( be->bd_info, &time1 );
ret = bdb2i_back_db_init_internal( be );
-
- if ( bdb2i_do_timing ) {
-
- gettimeofday( &time2, NULL);
- elapsed_time = bdb2i_elapsed( time1, time2 );
- Debug( LDAP_DEBUG_ANY, "INIT elapsed=%s\n",
- elapsed_time, 0, 0 );
- free( elapsed_time );
-
- }
+ bdb2i_stop_timing( be->bd_info, time1, "DB-INIT", NULL, NULL );
return( ret );
}
BackendDB *be
)
{
- return 0;
+ int rc;
+
+ rc = bdb2_back_db_startup( be );
+
+ return( rc );
}
int