mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
8c152396b9
form Mikhail Sahalaev <M.Sahalayev@pgr.salford.ac.uk>. Further work needed: add testxxx-matchedvalues rework ldapsearch(1) portion of patch to generalize use of options --- Copyright 2001, Mikhail Sahalaev, All rights reserved. This software is not subject to any license of University Of Salford. Redistribution and use in source and binary forms are permitted without restriction or fee of any kind as long as this notice is preserved.
242 lines
5.2 KiB
C
242 lines
5.2 KiB
C
/* init.c - initialize ldbm backend */
|
|
/* $OpenLDAP$ */
|
|
/*
|
|
* Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
|
|
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
|
|
*/
|
|
|
|
#include "portable.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <ac/string.h>
|
|
#include <ac/socket.h>
|
|
|
|
#include "slap.h"
|
|
#include "back-ldbm.h"
|
|
|
|
#ifdef SLAPD_LDBM_DYNAMIC
|
|
|
|
int back_ldbm_LTX_init_module(int argc, char *argv[]) {
|
|
BackendInfo bi;
|
|
|
|
memset( &bi, '\0', sizeof(bi) );
|
|
bi.bi_type = "ldbm";
|
|
bi.bi_init = ldbm_back_initialize;
|
|
|
|
backend_add(&bi);
|
|
return 0;
|
|
}
|
|
|
|
#endif /* SLAPD_LDBM_DYNAMIC */
|
|
|
|
int
|
|
ldbm_back_initialize(
|
|
BackendInfo *bi
|
|
)
|
|
{
|
|
static char *controls[] = {
|
|
LDAP_CONTROL_MANAGEDSAIT,
|
|
LDAP_CONTROL_VALUESRETURNFILTER,
|
|
NULL
|
|
};
|
|
|
|
bi->bi_controls = controls;
|
|
|
|
bi->bi_open = ldbm_back_open;
|
|
bi->bi_config = NULL;
|
|
bi->bi_close = ldbm_back_close;
|
|
bi->bi_destroy = ldbm_back_destroy;
|
|
|
|
bi->bi_db_init = ldbm_back_db_init;
|
|
bi->bi_db_config = ldbm_back_db_config;
|
|
bi->bi_db_open = ldbm_back_db_open;
|
|
bi->bi_db_close = ldbm_back_db_close;
|
|
bi->bi_db_destroy = ldbm_back_db_destroy;
|
|
|
|
bi->bi_op_bind = ldbm_back_bind;
|
|
bi->bi_op_unbind = 0;
|
|
bi->bi_op_search = ldbm_back_search;
|
|
bi->bi_op_compare = ldbm_back_compare;
|
|
bi->bi_op_modify = ldbm_back_modify;
|
|
bi->bi_op_modrdn = ldbm_back_modrdn;
|
|
bi->bi_op_add = ldbm_back_add;
|
|
bi->bi_op_delete = ldbm_back_delete;
|
|
bi->bi_op_abandon = 0;
|
|
|
|
bi->bi_extended = ldbm_back_extended;
|
|
|
|
bi->bi_entry_release_rw = ldbm_back_entry_release_rw;
|
|
bi->bi_acl_group = ldbm_back_group;
|
|
bi->bi_acl_attribute = ldbm_back_attribute;
|
|
bi->bi_chk_referrals = ldbm_back_referrals;
|
|
bi->bi_operational = ldbm_back_operational;
|
|
|
|
/*
|
|
* hooks for slap tools
|
|
*/
|
|
bi->bi_tool_entry_open = ldbm_tool_entry_open;
|
|
bi->bi_tool_entry_close = ldbm_tool_entry_close;
|
|
bi->bi_tool_entry_first = ldbm_tool_entry_first;
|
|
bi->bi_tool_entry_next = ldbm_tool_entry_next;
|
|
bi->bi_tool_entry_get = ldbm_tool_entry_get;
|
|
bi->bi_tool_entry_put = ldbm_tool_entry_put;
|
|
bi->bi_tool_entry_reindex = ldbm_tool_entry_reindex;
|
|
bi->bi_tool_sync = ldbm_tool_sync;
|
|
|
|
bi->bi_connection_init = 0;
|
|
bi->bi_connection_destroy = 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
ldbm_back_destroy(
|
|
BackendInfo *bi
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
ldbm_back_open(
|
|
BackendInfo *bi
|
|
)
|
|
{
|
|
int rc;
|
|
|
|
/* initialize the underlying database system */
|
|
rc = ldbm_initialize( NULL );
|
|
return rc;
|
|
}
|
|
|
|
int
|
|
ldbm_back_close(
|
|
BackendInfo *bi
|
|
)
|
|
{
|
|
/* terminate the underlying database system */
|
|
ldbm_shutdown();
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
ldbm_back_db_init(
|
|
Backend *be
|
|
)
|
|
{
|
|
struct ldbminfo *li;
|
|
|
|
/* indicate system schema supported */
|
|
be->be_flags |= SLAP_BFLAG_ALIASES|SLAP_BFLAG_REFERRALS;
|
|
|
|
/* 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;
|
|
|
|
/* default cache size */
|
|
li->li_cache.c_maxsize = DEFAULT_CACHE_SIZE;
|
|
|
|
/* default database cache size */
|
|
li->li_dbcachesize = DEFAULT_DBCACHE_SIZE;
|
|
|
|
/* default db mode is with locking */
|
|
li->li_dblocking = 1;
|
|
|
|
/* default db mode is with write synchronization */
|
|
li->li_dbwritesync = 1;
|
|
|
|
/* default file creation mode */
|
|
li->li_mode = SLAPD_DEFAULT_DB_MODE;
|
|
|
|
/* default database directory */
|
|
li->li_directory = ch_strdup( SLAPD_DEFAULT_DB_DIR );
|
|
|
|
/* DB_ENV environment pointer for DB3 */
|
|
li->li_dbenv = 0;
|
|
|
|
/* envdirok is turned on by ldbm_initialize_env if DB3 */
|
|
li->li_envdirok = 0;
|
|
|
|
/* syncfreq is 0 if disabled, or # seconds */
|
|
li->li_dbsyncfreq = 0;
|
|
|
|
/* wait up to dbsyncwaitn times if server is busy */
|
|
li->li_dbsyncwaitn = 12;
|
|
|
|
/* delay interval */
|
|
li->li_dbsyncwaitinterval = 5;
|
|
|
|
/* flag to notify ldbm_cache_sync_daemon to shut down */
|
|
li->li_dbshutdown = 0;
|
|
|
|
/* initialize various mutex locks & condition variables */
|
|
ldap_pvt_thread_rdwr_init( &li->li_giant_rwlock );
|
|
ldap_pvt_thread_mutex_init( &li->li_cache.c_mutex );
|
|
ldap_pvt_thread_mutex_init( &li->li_dbcache_mutex );
|
|
ldap_pvt_thread_cond_init( &li->li_dbcache_cv );
|
|
|
|
be->be_private = li;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
ldbm_back_db_open(
|
|
BackendDB *be
|
|
)
|
|
{
|
|
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
|
|
li->li_dbenv = ldbm_initialize_env( li->li_directory,
|
|
li->li_dbcachesize, &li->li_envdirok );
|
|
|
|
/* sync thread */
|
|
if ( li->li_dbsyncfreq > 0 )
|
|
{
|
|
int rc;
|
|
rc = ldap_pvt_thread_create( &li->li_dbsynctid,
|
|
0, ldbm_cache_sync_daemon, (void*)be );
|
|
|
|
if ( rc != 0 )
|
|
{
|
|
#ifdef NEW_LOGGING
|
|
LDAP_LOG (( "init", LDAP_LEVEL_ERR, "ldbm_back_db_open: sync "
|
|
"ldap_pvt_thread_create failed (%d)\n", rc ));
|
|
#else
|
|
Debug( LDAP_DEBUG_ANY,
|
|
"sync ldap_pvt_thread_create failed (%d)\n", rc, 0, 0 );
|
|
#endif
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
ldbm_back_db_destroy(
|
|
BackendDB *be
|
|
)
|
|
{
|
|
/* should free/destroy every in be_private */
|
|
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
|
|
|
|
if (li->li_dbenv)
|
|
ldbm_shutdown_env(li->li_dbenv);
|
|
|
|
free( li->li_directory );
|
|
attr_index_destroy( li->li_attrs );
|
|
|
|
ldap_pvt_thread_rdwr_destroy( &li->li_giant_rwlock );
|
|
ldap_pvt_thread_mutex_destroy( &li->li_cache.c_mutex );
|
|
ldap_pvt_thread_mutex_destroy( &li->li_dbcache_mutex );
|
|
ldap_pvt_thread_cond_destroy( &li->li_dbcache_cv );
|
|
|
|
free( be->be_private );
|
|
be->be_private = NULL;
|
|
|
|
return 0;
|
|
}
|