Integration of the BDB2 backend into the new init/startup/shutdown schema.

Integration into ./configure ( --enable-bdb2 ).
Adaptation of the test-suite ( 'make' -> ldbm; 'make bdb2-local' -> bdb2 ).
Minor fixes in slapd/libldbm.
This commit is contained in:
Kurt Spanier 1999-02-08 11:42:14 +00:00
parent 50fc6b18d5
commit 42f6e78dd4
61 changed files with 1911 additions and 344 deletions

4
configure vendored
View File

@ -1562,7 +1562,7 @@ elif test $ol_enable_ldbm = no ; then
echo "configure: warning: LDBM disabled, ignoring --with_ldbm_type argument" 1>&2
fi
if test $ol_enable_ldbm = yes ; then
if test $ol_enable_bdb2 = yes ; then
{ echo "configure: error: BDB2 requires --enable-ldbm" 1>&2; exit 1; }
fi
@ -9600,6 +9600,7 @@ libraries/liblutil/Makefile:build/top.mk:libraries/liblutil/Makefile.in:build/li
servers/Makefile:build/top.mk:servers/Makefile.in:build/dir.mk \
servers/ldapd/Makefile:build/top.mk:servers/ldapd/Makefile.in:build/srv.mk \
servers/slapd/Makefile:build/top.mk:servers/slapd/Makefile.in:build/srv.mk \
servers/slapd/back-bdb2/Makefile:build/top.mk:servers/slapd/back-bdb2/Makefile.in:build/srv.mk \
servers/slapd/back-ldbm/Makefile:build/top.mk:servers/slapd/back-ldbm/Makefile.in:build/srv.mk \
servers/slapd/back-passwd/Makefile:build/top.mk:servers/slapd/back-passwd/Makefile.in:build/srv.mk \
servers/slapd/back-perl/Makefile:build/top.mk:servers/slapd/back-perl/Makefile.in:build/srv.mk \
@ -9762,6 +9763,7 @@ libraries/liblutil/Makefile:build/top.mk:libraries/liblutil/Makefile.in:build/li
servers/Makefile:build/top.mk:servers/Makefile.in:build/dir.mk \
servers/ldapd/Makefile:build/top.mk:servers/ldapd/Makefile.in:build/srv.mk \
servers/slapd/Makefile:build/top.mk:servers/slapd/Makefile.in:build/srv.mk \
servers/slapd/back-bdb2/Makefile:build/top.mk:servers/slapd/back-bdb2/Makefile.in:build/srv.mk \
servers/slapd/back-ldbm/Makefile:build/top.mk:servers/slapd/back-ldbm/Makefile.in:build/srv.mk \
servers/slapd/back-passwd/Makefile:build/top.mk:servers/slapd/back-passwd/Makefile.in:build/srv.mk \
servers/slapd/back-perl/Makefile:build/top.mk:servers/slapd/back-perl/Makefile.in:build/srv.mk \

View File

@ -204,6 +204,9 @@ LDAP_BEGIN_DECL
int ldbm_initialize( void );
int ldbm_shutdown( void );
#if HAVE_BERKELEY_DB2
extern DB_ENV ldbm_Env;
#endif
int ldbm_errno( LDBM ldbm );
LDBM ldbm_open( char *name, int rw, int mode, int dbcachesize );

View File

@ -92,7 +92,7 @@ ldbm_db_errcall( const char *prefix, char *message )
}
/* a dbEnv for BERKELEYv2 */
static DB_ENV ldbm_Env;
DB_ENV ldbm_Env;
/* Berkeley DB 2.x is reentrant */
#define LDBM_LOCK ((void)0)
@ -158,7 +158,8 @@ ldbm_open( char *name, int rw, int mode, int dbcachesize )
DB_INFO dbinfo;
memset( &dbinfo, 0, sizeof( dbinfo ));
dbinfo.db_cachesize = dbcachesize;
if ( ldbm_Env.mp_info == NULL )
dbinfo.db_cachesize = dbcachesize;
dbinfo.db_pagesize = DEFAULT_DB_PAGE_SIZE;
dbinfo.db_malloc = ldbm_malloc;

View File

@ -15,7 +15,7 @@
/*ARGSUSED*/
static int
bdb2i_back_abandon_internal(
Backend *be,
BackendDB *be,
Connection *c,
Operation *o,
int msgid )
@ -26,7 +26,7 @@ bdb2i_back_abandon_internal(
int
bdb2_back_abandon(
Backend *be,
BackendDB *be,
Connection *c,
Operation *o,
int msgid )

View File

@ -13,7 +13,7 @@
static int
bdb2i_back_add_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
Entry *e
@ -242,14 +242,14 @@ return_results:;
int
bdb2_back_add(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
Entry *e
)
{
DB_LOCK lock;
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
struct timeval time1, time2;
char *elapsed_time;
@ -257,7 +257,7 @@ bdb2_back_add(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_w( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_w( get_dbenv( be ), &lock ) != 0 ) {
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( -1 );
@ -266,12 +266,12 @@ bdb2_back_add(
/* check, if a new default attribute index will be created,
in which case we have to open the index file BEFORE TP */
if ( bdb2i_with_dbenv )
if ( ( slapMode == SLAP_SERVER_MODE ) || ( slapMode == SLAP_TOOL_MODE ) )
bdb2i_check_default_attr_index_add( li, e );
ret = bdb2i_back_add_internal( be, conn, op, e );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {

View File

@ -23,7 +23,7 @@
* given an alias object, dereference it to its end point.
* Entry returned has reader lock or is NULL. Starting entry is not released.
*/
Entry *bdb2i_derefAlias_r ( Backend *be,
Entry *bdb2i_derefAlias_r ( BackendDB *be,
Connection *conn,
Operation *op,
Entry *e)
@ -161,7 +161,7 @@ Entry *bdb2i_derefAlias_r ( Backend *be,
* reconstructed dn is ou=MyOU,o=MyOrg,c=MyCountry
* release lock on o=MyOrg,c=MyCountry entry
*/
char *bdb2i_derefDN ( Backend *be,
char *bdb2i_derefDN ( BackendDB *be,
Connection *conn,
Operation *op,
char *dn

View File

@ -15,6 +15,7 @@ LDAP_BEGIN_DECL
#define DEFAULT_DBCACHE_SIZE (128 * DEFAULT_DB_PAGE_SIZE)
#define DEFAULT_DB_DIRECTORY "/usr/tmp"
#define DEFAULT_DB_HOME "/usr/tmp"
#define DEFAULT_MODE 0600
#define SUBLEN 3
@ -132,8 +133,7 @@ typedef struct _bdb2_txn_head {
/* a list of all DB files in use */
BDB2_TXN_FILES *dbFiles;
/* for performance reasons we have pointers to fixed descriptors */
BDB2_TXN_FILES *dbFileHandle[4];
/* we have five fixed files */
#define BDB2_DB_DN_FILE 0
#define BDB2_DB_DN2ID_FILE 1
#define BDB2_DB_ID2ENTRY_FILE 2
@ -149,6 +149,20 @@ typedef struct _bdb2_txn_head {
/* end of TP stuff */
/* the private description of a backend type */
struct ldbtype {
char *lty_dbhome;
size_t lty_mpsize;
/* XXX do we need a private DB_ENV for all DB2 backend types ? */
DB_ENV *lty_dbenv;
};
#define get_dbenv(be) ((struct ldbtype *) (be)->bd_info->bi_private)->lty_dbenv
/* the private description of a database */
struct ldbminfo {
ID li_nextid;
#if SLAPD_NEXTID_CHUNK > 1
@ -168,16 +182,12 @@ struct ldbminfo {
ldap_pvt_thread_mutex_t li_dbcache_mutex;
ldap_pvt_thread_cond_t li_dbcache_cv;
/* Berkeley DB2 Environment */
DB_ENV li_db_env;
char *li_dbhome;
/* a list of all files of the database */
BDB2_TXN_HEAD li_txn_head;
};
extern int bdb2i_with_dbenv;
#include "proto-back-bdb2.h"
LDAP_END_DECL

View File

@ -59,7 +59,7 @@ crypted_value_find(
static int
bdb2i_back_bind_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -217,7 +217,7 @@ return_results:;
int
bdb2_back_bind(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -235,7 +235,7 @@ bdb2_back_bind(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_r( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_r( get_dbenv( be ), &lock ) != 0 ) {
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( 1 );
@ -244,7 +244,7 @@ bdb2_back_bind(
ret = bdb2i_back_bind_internal( be, conn, op, dn, method, cred, edn );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {

View File

@ -84,7 +84,7 @@ cache_return_entry_rw( struct cache *cache, Entry *e, int rw )
/* set cache mutex */
ldap_pvt_thread_mutex_lock( &cache->c_mutex );
entry_rdwr_unlock(e, rw);;
entry_rdwr_unlock(e, rw);
if ( --e->e_refcnt == 0 && e->e_state == ENTRY_STATE_DELETED ) {
entry_free( e );
@ -213,9 +213,9 @@ bdb2i_cache_add_entry_lock(
== 0 && cache->c_cursize > cache->c_maxsize ) {
e = cache->c_lrutail;
/* XXX check for writer lock - should also check no readers pending */
/* check for active readers/writer lock */
#ifdef LDAP_DEBUG
assert(!ldap_pvt_thread_rdwr_active(&e->e_rdwr));
assert(!ldap_pvt_thread_rdwr_active( &e->e_rdwr ));
#endif
/* delete from cache and lru q */
@ -236,7 +236,7 @@ bdb2i_cache_add_entry_lock(
ID
bdb2i_cache_find_entry_dn2id(
Backend *be,
BackendDB *be,
struct cache *cache,
char *dn
)
@ -386,14 +386,14 @@ bdb2i_cache_delete_entry(
Debug( LDAP_DEBUG_TRACE, "====> cache_delete_entry:\n", 0, 0, 0 );
/* XXX check for writer lock - should also check no readers pending */
#ifdef LDAP_DEBUG
assert(ldap_pvt_thread_rdwr_writers(&e->e_rdwr));
#endif
/* set cache mutex */
ldap_pvt_thread_mutex_lock( &cache->c_mutex );
/* XXX check for writer lock - should also check no readers pending */
#ifdef LDAP_DEBUG
assert(ldap_pvt_thread_rdwr_writers( &e->e_rdwr ) == 1);
#endif
rc = cache_delete_entry_internal( cache, e );
/* free cache mutex */

View File

@ -1,4 +1,4 @@
/* close.c - close bdb2 backend */
/* close.c - close bdb2 backend database */
#include "portable.h"
@ -10,23 +10,24 @@
#include "back-bdb2.h"
static int
bdb2i_back_db_close_internal( Backend *be )
bdb2i_back_db_close_internal( BackendDB *be )
{
Debug( LDAP_DEBUG_TRACE, "bdb2 backend saving nextid\n", 0, 0, 0 );
if ( bdb2i_next_id_save( be ) < 0 ) {
Debug( LDAP_DEBUG_ANY, "bdb2 backend nextid save failed!\n", 0, 0, 0 );
}
Debug( LDAP_DEBUG_TRACE, "bdb2 backend syncing\n", 0, 0, 0 );
bdb2i_cache_flush_all( be );
Debug( LDAP_DEBUG_TRACE, "bdb2 backend done syncing\n", 0, 0, 0 );
/* close all DB files */
Debug( LDAP_DEBUG_TRACE, "bdb2 backend closing DB files\n", 0, 0, 0 );
bdb2i_txn_close_files( be );
Debug( LDAP_DEBUG_TRACE, "bdb2 backend done closing DB files\n", 0, 0, 0 );
return 0;
}
int
bdb2_back_db_close( Backend *be )
bdb2_back_db_close( BackendDB *be )
{
struct timeval time1, time2;
char *elapsed_time;

View File

@ -13,7 +13,7 @@
static int
bdb2i_back_compare_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -64,7 +64,7 @@ return_results:;
int
bdb2_back_compare(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -80,7 +80,7 @@ bdb2_back_compare(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_r( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_r( get_dbenv( be ), &lock ) != 0 ) {
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( 1 );
@ -89,7 +89,7 @@ bdb2_back_compare(
ret = bdb2i_back_compare_internal( be, conn, op, dn, ava );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {

View File

@ -10,9 +10,91 @@
#include "slap.h"
#include "back-bdb2.h"
static int
bdb2i_back_config_internal(
BackendInfo *bi,
char *fname,
int lineno,
int argc,
char **argv
)
{
struct ldbtype *lty = (struct ldbtype *) bi->bi_private;
if ( lty == NULL ) {
fprintf( stderr, "%s: line %d: ldbm backend type info is null!\n",
fname, lineno );
return( 1 );
}
/* directory where DB control files live */
if ( strcasecmp( argv[0], "home" ) == 0 ) {
if ( argc < 2 ) {
fprintf( stderr,
"%s: line %d: missing dir in \"home <dir>\" line\n",
fname, lineno );
return( 1 );
}
lty->lty_dbhome = ch_strdup( argv[1] );
/* size of the DB memory pool */
} else if ( strcasecmp( argv[0], "mpoolsize" ) == 0 ) {
if ( argc < 2 ) {
fprintf( stderr,
"%s: line %d: missing size in \"mpoolsize <size>\" line\n",
fname, lineno );
return( 1 );
}
lty->lty_mpsize = (size_t) atoi( argv[1] );
/* we should at least have the suggested 128k */
if ( lty->lty_mpsize < DEFAULT_DBCACHE_SIZE )
lty->lty_mpsize = DEFAULT_DBCACHE_SIZE;
/* anything else */
} else {
fprintf( stderr,
"%s: line %d: unknown directive \"%s\" in ldbm backend definition (ignored)\n",
fname, lineno, argv[0] );
}
return 0;
}
int
bdb2_back_config(
BackendInfo *bi,
char *fname,
int lineno,
int argc,
char **argv
)
{
struct timeval time1, time2;
char *elapsed_time;
int ret;
gettimeofday( &time1, NULL );
ret = bdb2i_back_config_internal( bi, fname, lineno, argc, argv );
if ( bdb2i_do_timing ) {
gettimeofday( &time2, NULL);
elapsed_time = bdb2i_elapsed( time1, time2 );
Debug( LDAP_DEBUG_TRACE, "BE-CONFIG elapsed=%s\n",
elapsed_time, 0, 0 );
free( elapsed_time );
}
return( ret );
}
static int
bdb2i_back_db_config_internal(
Backend *be,
BackendDB *be,
char *fname,
int lineno,
int argc,
@ -22,7 +104,7 @@ bdb2i_back_db_config_internal(
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
if ( li == NULL ) {
fprintf( stderr, "%s: line %d: ldbm backend info is null!\n",
fprintf( stderr, "%s: line %d: ldbm database info is null!\n",
fname, lineno );
return( 1 );
}
@ -38,7 +120,7 @@ bdb2i_back_db_config_internal(
li->li_directory = ch_strdup( argv[1] );
li->li_nextid_file =
ch_malloc( strlen(li->li_directory) + sizeof("/NEXTID") );
ch_malloc( strlen(li->li_directory) + sizeof("/NEXTID") + 1 );
strcpy(li->li_nextid_file, li->li_directory);
strcat(li->li_nextid_file, "/NEXTID");
@ -107,7 +189,7 @@ bdb2i_back_db_config_internal(
int
bdb2_back_db_config(
Backend *be,
BackendDB *be,
char *fname,
int lineno,
int argc,
@ -126,7 +208,7 @@ bdb2_back_db_config(
gettimeofday( &time2, NULL);
elapsed_time = bdb2i_elapsed( time1, time2 );
Debug( LDAP_DEBUG_ANY, "CONFIG elapsed=%s\n",
Debug( LDAP_DEBUG_ANY, "DB-CONFIG elapsed=%s\n",
elapsed_time, 0, 0 );
free( elapsed_time );

View File

@ -19,12 +19,9 @@
#include "slap.h"
#include "back-bdb2.h"
#define ldbm_open_env( buf, flags, mode, dbcachesize, env ) \
ldbm_open( (buf), (flags), (mode), (dbcachesize) )
struct dbcache *
bdb2i_cache_open(
Backend *be,
BackendDB *be,
char *name,
char *suffix,
int flags
@ -36,15 +33,19 @@ bdb2i_cache_open(
char buf[MAXPATHLEN];
LDBM db;
struct stat st;
int dbcachesize;
/* sprintf( buf, "%s%s%s%s", li->li_directory, DEFAULT_DIRSEP, name, suffix ); */
sprintf( buf, "%s%s", name, suffix );
/* if in slapd, all files are open, so return handle from file cache */
if ( bdb2i_with_dbenv )
if ( ( slapMode == SLAP_SERVER_MODE ) || ( slapMode == SLAP_TOOL_MODE ) ) {
/* use short name */
sprintf( buf, "%s%s", name, suffix );
return( bdb2i_get_db_file_cache( li, buf ));
}
/* use the absolute path */
sprintf( buf, "%s%s%s%s", li->li_directory, DEFAULT_DIRSEP, name, suffix );
Debug( LDAP_DEBUG_TRACE, "=> bdb2i_cache_open( \"%s\", %d, %o )\n", buf,
flags, li->li_mode );
@ -100,11 +101,8 @@ bdb2i_cache_open(
li->li_dbcache[i].dbc_name = NULL;
}
dbcachesize = li->li_dbcachesize;
if ( bdb2i_with_dbenv ) dbcachesize = 0;
if ( (li->li_dbcache[i].dbc_db = ldbm_open_env( buf, flags, li->li_mode,
dbcachesize, &li->li_db_env )) == NULL ) {
if ( (li->li_dbcache[i].dbc_db = ldbm_open( buf, flags, li->li_mode,
0 )) == NULL ) {
Debug( LDAP_DEBUG_TRACE,
"<= bdb2i_cache_open NULL \"%s\" errno %d reason \"%s\")\n",
@ -136,13 +134,14 @@ bdb2i_cache_open(
}
void
bdb2i_cache_close( Backend *be, struct dbcache *db )
bdb2i_cache_close( BackendDB *be, struct dbcache *db )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
/* if in slapd, all files stay open and we have only
readers or one writer */
if ( bdb2i_with_dbenv ) return;
if ( ( slapMode == SLAP_SERVER_MODE ) || ( slapMode == SLAP_TOOL_MODE ) )
return;
ldap_pvt_thread_mutex_lock( &li->li_dbcache_mutex );
if ( --db->dbc_refcnt == 0 ) {
@ -152,13 +151,14 @@ bdb2i_cache_close( Backend *be, struct dbcache *db )
}
void
bdb2i_cache_really_close( Backend *be, struct dbcache *db )
bdb2i_cache_really_close( BackendDB *be, struct dbcache *db )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
/* if in slapd, all files stay open and we have only
readers or one writer */
if ( bdb2i_with_dbenv ) return;
if ( ( slapMode == SLAP_SERVER_MODE ) || ( slapMode == SLAP_TOOL_MODE ) )
return;
ldap_pvt_thread_mutex_lock( &li->li_dbcache_mutex );
if ( --db->dbc_refcnt == 0 ) {
@ -171,13 +171,14 @@ bdb2i_cache_really_close( Backend *be, struct dbcache *db )
}
void
bdb2i_cache_flush_all( Backend *be )
bdb2i_cache_flush_all( BackendDB *be )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
int i;
/* if in slapd, syncing is done by TP */
if ( bdb2i_with_dbenv ) return;
if ( ( slapMode == SLAP_SERVER_MODE ) || ( slapMode == SLAP_TOOL_MODE ) )
return;
ldap_pvt_thread_mutex_lock( &li->li_dbcache_mutex );
for ( i = 0; i < MAXDBCACHE; i++ ) {

View File

@ -13,7 +13,7 @@
static int
bdb2i_back_delete_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn
@ -152,7 +152,7 @@ return_results:;
int
bdb2_back_delete(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn
@ -167,7 +167,7 @@ bdb2_back_delete(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_w( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_w( get_dbenv( be ), &lock ) != 0 ) {
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( -1 );
@ -176,7 +176,7 @@ bdb2_back_delete(
ret = bdb2i_back_delete_internal( be, conn, op, dn );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {

View File

@ -13,7 +13,7 @@
int
bdb2i_dn2id_add(
Backend *be,
BackendDB *be,
char *dn,
ID id
)
@ -57,7 +57,7 @@ bdb2i_dn2id_add(
ID
bdb2i_dn2id(
Backend *be,
BackendDB *be,
char *dn
)
{
@ -112,7 +112,7 @@ bdb2i_dn2id(
int
bdb2i_dn2id_delete(
Backend *be,
BackendDB *be,
char *dn
)
{
@ -155,7 +155,7 @@ bdb2i_dn2id_delete(
static Entry *
dn2entry(
Backend *be,
BackendDB *be,
char *dn,
char **matched,
int rw
@ -210,7 +210,7 @@ dn2entry(
Entry *
bdb2i_dn2entry_r(
Backend *be,
BackendDB *be,
char *dn,
char **matched
)
@ -220,7 +220,7 @@ bdb2i_dn2entry_r(
Entry *
bdb2i_dn2entry_w(
Backend *be,
BackendDB *be,
char *dn,
char **matched
)

View File

@ -8,6 +8,9 @@ extern int bdb2_back_open LDAP_P(( BackendInfo *bi ));
extern int bdb2_back_close LDAP_P(( BackendInfo *bi ));
extern int bdb2_back_destroy LDAP_P(( BackendInfo *bi ));
extern int bdb2_back_config LDAP_P(( BackendInfo *bt,
char *fname, int lineno, int argc, char **argv ));
extern int bdb2_back_db_init LDAP_P(( BackendDB *bd ));
extern int bdb2_back_db_open LDAP_P(( BackendDB *bd ));
extern int bdb2_back_db_close LDAP_P(( BackendDB *bd ));

View File

@ -10,12 +10,12 @@
#include "slap.h"
#include "back-bdb2.h"
static ID_BLOCK *ava_candidates( Backend *be, Ava *ava, int type );
static ID_BLOCK *presence_candidates( Backend *be, char *type );
static ID_BLOCK *approx_candidates( Backend *be, Ava *ava );
static ID_BLOCK *list_candidates( Backend *be, Filter *flist, int ftype );
static ID_BLOCK *substring_candidates( Backend *be, Filter *f );
static ID_BLOCK *substring_comp_candidates( Backend *be, char *type, char *val, int prepost );
static ID_BLOCK *ava_candidates( BackendDB *be, Ava *ava, int type );
static ID_BLOCK *presence_candidates( BackendDB *be, char *type );
static ID_BLOCK *approx_candidates( BackendDB *be, Ava *ava );
static ID_BLOCK *list_candidates( BackendDB *be, Filter *flist, int ftype );
static ID_BLOCK *substring_candidates( BackendDB *be, Filter *f );
static ID_BLOCK *substring_comp_candidates( BackendDB *be, char *type, char *val, int prepost );
/*
* test_filter - test a filter against a single entry.
@ -26,7 +26,7 @@ static ID_BLOCK *substring_comp_candidates( Backend *be, char *type, char *val,
ID_BLOCK *
bdb2i_filter_candidates(
Backend *be,
BackendDB *be,
Filter *f
)
{
@ -93,7 +93,7 @@ bdb2i_filter_candidates(
static ID_BLOCK *
ava_candidates(
Backend *be,
BackendDB *be,
Ava *ava,
int type
)
@ -124,7 +124,7 @@ ava_candidates(
static ID_BLOCK *
presence_candidates(
Backend *be,
BackendDB *be,
char *type
)
{
@ -141,7 +141,7 @@ presence_candidates(
static ID_BLOCK *
approx_candidates(
Backend *be,
BackendDB *be,
Ava *ava
)
{
@ -178,7 +178,7 @@ approx_candidates(
static ID_BLOCK *
list_candidates(
Backend *be,
BackendDB *be,
Filter *flist,
int ftype
)
@ -219,7 +219,7 @@ list_candidates(
static ID_BLOCK *
substring_candidates(
Backend *be,
BackendDB *be,
Filter *f
)
{
@ -286,7 +286,7 @@ substring_candidates(
static ID_BLOCK *
substring_comp_candidates(
Backend *be,
BackendDB *be,
char *type,
char *val,
int prepost

View File

@ -19,7 +19,7 @@
*/
static int
bdb2i_back_group_internal(
Backend *be,
BackendDB *be,
Entry *target,
char *gr_ndn,
char *op_ndn,
@ -126,7 +126,7 @@ bdb2i_back_group_internal(
int
bdb2_back_group(
Backend *be,
BackendDB *be,
Entry *target,
char *gr_ndn,
char *op_ndn,
@ -143,7 +143,7 @@ bdb2_back_group(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_r( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_r( get_dbenv( be ), &lock ) != 0 ) {
return( 1 );
@ -152,7 +152,7 @@ bdb2_back_group(
ret = bdb2i_back_group_internal( be, target, gr_ndn, op_ndn,
objectclassValue, groupattrName );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {

View File

@ -12,7 +12,7 @@
int
bdb2i_id2children_add(
Backend *be,
BackendDB *be,
Entry *p,
Entry *e
)
@ -56,7 +56,7 @@ bdb2i_id2children_add(
int
bdb2i_id2children_remove(
Backend *be,
BackendDB *be,
Entry *p,
Entry *e
)
@ -98,7 +98,7 @@ bdb2i_id2children_remove(
int
bdb2i_has_children(
Backend *be,
BackendDB *be,
Entry *p
)
{

View File

@ -10,7 +10,7 @@
#include "back-bdb2.h"
int
bdb2i_id2entry_add( Backend *be, Entry *e )
bdb2i_id2entry_add( BackendDB *be, Entry *e )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
struct dbcache *db;
@ -54,7 +54,7 @@ bdb2i_id2entry_add( Backend *be, Entry *e )
}
int
bdb2i_id2entry_delete( Backend *be, Entry *e )
bdb2i_id2entry_delete( BackendDB *be, Entry *e )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
struct dbcache *db;
@ -96,7 +96,7 @@ bdb2i_id2entry_delete( Backend *be, Entry *e )
/* XXX returns entry with reader/writer lock */
Entry *
bdb2i_id2entry( Backend *be, ID id, int rw )
bdb2i_id2entry( BackendDB *be, ID id, int rw )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
struct dbcache *db;
@ -161,13 +161,13 @@ bdb2i_id2entry( Backend *be, ID id, int rw )
}
Entry *
bdb2i_id2entry_r( Backend *be, ID id )
bdb2i_id2entry_r( BackendDB *be, ID id )
{
return( bdb2i_id2entry( be, id, 0 ) );
}
Entry *
bdb2i_id2entry_w( Backend *be, ID id )
bdb2i_id2entry_w( BackendDB *be, ID id )
{
return( bdb2i_id2entry( be, id, 1 ) );
}

View File

@ -30,7 +30,7 @@ bdb2i_idl_alloc( int nids )
/* Allocate an empty ALLIDS ID_BLOCK */
ID_BLOCK *
bdb2i_idl_allids( Backend *be )
bdb2i_idl_allids( BackendDB *be )
{
ID_BLOCK *idl;
@ -60,7 +60,7 @@ bdb2i_idl_free( ID_BLOCK *idl )
/* Fetch an single ID_BLOCK from the cache */
static ID_BLOCK *
idl_fetch_one(
Backend *be,
BackendDB *be,
struct dbcache *db,
Datum key
)
@ -96,7 +96,7 @@ idl_fetch_one(
*/
ID_BLOCK *
bdb2i_idl_fetch(
Backend *be,
BackendDB *be,
struct dbcache *db,
Datum key
)
@ -190,7 +190,7 @@ bdb2i_idl_fetch(
/* store a single block */
static int
idl_store(
Backend *be,
BackendDB *be,
struct dbcache *db,
Datum key,
ID_BLOCK *idl
@ -276,7 +276,7 @@ idl_split_block(
*/
static int
idl_change_first(
Backend *be,
BackendDB *be,
struct dbcache *db,
Datum hkey, /* header block key */
ID_BLOCK *h, /* header block */
@ -320,7 +320,7 @@ idl_change_first(
int
bdb2i_idl_insert_key(
Backend *be,
BackendDB *be,
struct dbcache *db,
Datum key,
ID id
@ -663,7 +663,7 @@ bdb2i_idl_insert( ID_BLOCK **idl, ID id, int maxids )
int
bdb2i_idl_delete_key (
Backend *be,
BackendDB *be,
struct dbcache *db,
Datum key,
ID id
@ -801,7 +801,7 @@ idl_min( ID_BLOCK *a, ID_BLOCK *b )
*/
ID_BLOCK *
bdb2i_idl_intersection(
Backend *be,
BackendDB *be,
ID_BLOCK *a,
ID_BLOCK *b
)
@ -853,7 +853,7 @@ bdb2i_idl_intersection(
*/
ID_BLOCK *
bdb2i_idl_union(
Backend *be,
BackendDB *be,
ID_BLOCK *a,
ID_BLOCK *b
)
@ -912,7 +912,7 @@ bdb2i_idl_union(
*/
ID_BLOCK *
bdb2i_idl_notin(
Backend *be,
BackendDB *be,
ID_BLOCK *a,
ID_BLOCK *b
)

View File

@ -10,12 +10,12 @@
#include "slap.h"
#include "back-bdb2.h"
static int add_value(Backend *be, struct dbcache *db, char *type, int indextype, char *val, ID id);
static int add_value(BackendDB *be, struct dbcache *db, char *type, int indextype, char *val, ID id);
static int index2prefix(int indextype);
int
bdb2i_index_add_entry(
Backend *be,
BackendDB *be,
Entry *e
)
{
@ -55,7 +55,7 @@ bdb2i_index_add_entry(
int
bdb2i_index_add_mods(
Backend *be,
BackendDB *be,
LDAPModList *ml,
ID id
)
@ -87,7 +87,7 @@ bdb2i_index_add_mods(
ID_BLOCK *
bdb2i_index_read(
Backend *be,
BackendDB *be,
char *type,
int indextype,
char *val
@ -158,7 +158,7 @@ bdb2i_index_read(
static int
add_value(
Backend *be,
BackendDB *be,
struct dbcache *db,
char *type,
int indextype,
@ -168,19 +168,17 @@ add_value(
{
int rc;
Datum key;
ID_BLOCK *idl;
char prefix;
char *realval, *tmpval, *s;
ID_BLOCK *idl = NULL;
char *tmpval = NULL;
char *realval = val;
char buf[BUFSIZ];
char prefix = index2prefix( indextype );
ldbm_datum_init( key );
prefix = index2prefix( indextype );
Debug( LDAP_DEBUG_TRACE, "=> add_value( \"%c%s\" )\n", prefix, val, 0 );
realval = val;
tmpval = NULL;
idl = NULL;
if ( prefix != UNKNOWN_PREFIX ) {
unsigned int len = strlen( val );
@ -203,7 +201,10 @@ add_value(
if ( tmpval != NULL ) {
free( tmpval );
}
bdb2i_idl_free( idl );
if( idl != NULL ) {
bdb2i_idl_free( idl );
}
ldap_pvt_thread_yield();
@ -213,7 +214,7 @@ add_value(
int
bdb2i_index_add_values(
Backend *be,
BackendDB *be,
char *type,
struct berval **vals,
ID id

View File

@ -11,13 +11,35 @@
#include "back-bdb2.h"
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;
bt->lty_dbenv = &ldbm_Env;
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;
@ -37,9 +59,15 @@ bdb2_back_initialize(
bi->bi_op_delete = bdb2_back_delete;
bi->bi_op_abandon = bdb2_back_abandon;
#ifdef SLAPD_ACLGROUPS
bi->bi_acl_group = bdb2_back_group;
#endif
return 0;
ret = bdb2i_back_init_private( bi );
Debug( LDAP_DEBUG_TRACE, "bdb2_back_initialize: done (%d).\n", ret, 0, 0 );
return( ret );
}
int
@ -55,10 +83,19 @@ bdb2_back_open(
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;
}
@ -68,23 +105,25 @@ bdb2_back_close(
BackendInfo *bi
)
{
/* close the underlying database system */
bdb2_shutdown();
int rc;
return 0;
/* close the underlying database system */
rc = bdb2i_back_shutdown( bi );
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) */
@ -139,7 +178,8 @@ bdb2i_back_db_init_internal(
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;
@ -149,7 +189,7 @@ bdb2i_back_db_init_internal(
int
bdb2_back_db_init(
Backend *be
BackendDB *be
)
{
struct timeval time1, time2;
@ -164,7 +204,7 @@ bdb2_back_db_init(
gettimeofday( &time2, NULL);
elapsed_time = bdb2i_elapsed( time1, time2 );
Debug( LDAP_DEBUG_ANY, "INIT elapsed=%s\n",
Debug( LDAP_DEBUG_ANY, "DB-INIT elapsed=%s\n",
elapsed_time, 0, 0 );
free( elapsed_time );
@ -179,7 +219,11 @@ bdb2_back_db_open(
BackendDB *be
)
{
return 0;
int rc;
rc = bdb2_back_db_startup( be );
return( rc );
}
int

View File

@ -19,7 +19,7 @@ extern char *ldap_srvtab;
extern Attribute *attr_find();
bdb2i_krbv4_ldap_auth(
Backend *be,
BackendDB *be,
struct berval *cred,
AUTH_DAT *ad
)

View File

@ -17,7 +17,7 @@ static int replace_values(Entry *e, LDAPMod *mod, char *dn);
static int
bdb2i_back_modify_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -117,7 +117,7 @@ error_return:;
int
bdb2_back_modify(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -133,7 +133,7 @@ bdb2_back_modify(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_w( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_w( get_dbenv( be ), &lock ) != 0 ) {
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( -1 );
@ -142,12 +142,12 @@ bdb2_back_modify(
/* check, if a new default attribute index will be created,
in which case we have to open the index file BEFORE TP */
if ( bdb2i_with_dbenv )
if ( ( slapMode == SLAP_SERVER_MODE ) || ( slapMode == SLAP_TOOL_MODE ) )
bdb2i_check_default_attr_index_mod( li, modlist );
ret = bdb2i_back_modify_internal( be, conn, op, dn, modlist );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {

View File

@ -13,7 +13,7 @@
static int
bdb2i_back_modrdn_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -192,7 +192,7 @@ return_results:
int
bdb2_back_modrdn(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn,
@ -209,7 +209,7 @@ bdb2_back_modrdn(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_w( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_w( get_dbenv( be ), &lock ) != 0 ) {
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( -1 );
@ -219,7 +219,7 @@ bdb2_back_modrdn(
ret = bdb2i_back_modrdn_internal( be, conn, op, dn,
newrdn, deleteoldrdn );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {

View File

@ -14,7 +14,7 @@
#include "back-bdb2.h"
static ID
next_id_read( Backend *be )
next_id_read( BackendDB *be )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
ID id;
@ -51,7 +51,7 @@ next_id_read( Backend *be )
}
static int
next_id_write( Backend *be, ID id )
next_id_write( BackendDB *be, ID id )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
char buf[20];
@ -83,7 +83,7 @@ next_id_write( Backend *be, ID id )
}
int
bdb2i_next_id_save( Backend *be )
bdb2i_next_id_save( BackendDB *be )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
ID id = next_id_get( be );
@ -97,7 +97,7 @@ bdb2i_next_id_save( Backend *be )
}
ID
bdb2i_next_id( Backend *be )
bdb2i_next_id( BackendDB *be )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
ID id;
@ -133,7 +133,7 @@ bdb2i_next_id( Backend *be )
}
void
bdb2i_next_id_return( Backend *be, ID id )
bdb2i_next_id_return( BackendDB *be, ID id )
{
#ifdef SLAPD_NEXTID_RETURN
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
@ -156,7 +156,7 @@ bdb2i_next_id_return( Backend *be, ID id )
}
ID
bdb2i_next_id_get( Backend *be )
bdb2i_next_id_get( BackendDB *be )
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
ID id;

View File

@ -12,8 +12,6 @@
#define PORTER_OBJ "bdb2_backend"
int bdb2i_with_dbenv = 0;
static int
bdb2i_enter_backend( DB_ENV *dbEnv, DB_LOCK *lock, int writer )
@ -23,7 +21,8 @@ bdb2i_enter_backend( DB_ENV *dbEnv, DB_LOCK *lock, int writer )
DBT lock_dbt;
int ret;
if ( !bdb2i_with_dbenv ) return( 0 );
if ( ( slapMode != SLAP_SERVER_MODE ) && ( slapMode != SLAP_TOOL_MODE ) )
return( 0 );
if ( ( ret = lock_id( dbEnv->lk_info, &locker )) != 0 ) {
@ -42,7 +41,7 @@ bdb2i_enter_backend( DB_ENV *dbEnv, DB_LOCK *lock, int writer )
lock_type, lock ))) {
case 0:
Debug( LDAP_DEBUG_ANY, "bdb2i_enter_backend() -- %s lock granted\n",
Debug( LDAP_DEBUG_TRACE, "bdb2i_enter_backend() -- %s lock granted\n",
writer ? "write" : "read", 0, 0 );
break;
@ -90,12 +89,13 @@ bdb2i_leave_backend( DB_ENV *dbEnv, DB_LOCK lock )
{
int ret;
if ( !bdb2i_with_dbenv ) return( 0 );
if ( ( slapMode != SLAP_SERVER_MODE ) && ( slapMode != SLAP_TOOL_MODE ) )
return( 0 );
switch( ( ret = lock_put( dbEnv->lk_info, lock ))) {
case 0:
Debug( LDAP_DEBUG_ANY, "bdb2i_leave_backend() -- lock released\n",
Debug( LDAP_DEBUG_TRACE, "bdb2i_leave_backend() -- lock released\n",
0, 0, 0 );
break;

View File

@ -11,12 +11,12 @@ LDAP_BEGIN_DECL
* alias.c
*/
Entry *bdb2i_derefAlias_r LDAP_P((
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
Entry *e ));
char *bdb2i_derefDN LDAP_P((
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *dn ));
@ -39,7 +39,7 @@ void bdb2i_cache_return_entry_r LDAP_P(( struct cache *cache, Entry *e ));
void bdb2i_cache_return_entry_w LDAP_P(( struct cache *cache, Entry *e ));
int bdb2i_cache_add_entry_lock LDAP_P(( struct cache *cache, Entry *e,
int state ));
ID bdb2i_cache_find_entry_dn2id LDAP_P(( Backend *be, struct cache *cache,
ID bdb2i_cache_find_entry_dn2id LDAP_P(( BackendDB *be, struct cache *cache,
char *dn ));
Entry * bdb2i_cache_find_entry_id LDAP_P(( struct cache *cache, ID id, int rw ));
int bdb2i_cache_delete_entry LDAP_P(( struct cache *cache, Entry *e ));
@ -48,11 +48,11 @@ int bdb2i_cache_delete_entry LDAP_P(( struct cache *cache, Entry *e ));
* dbcache.c
*/
struct dbcache * bdb2i_cache_open LDAP_P(( Backend *be, char *name, char *suffix,
struct dbcache * bdb2i_cache_open LDAP_P(( BackendDB *be, char *name, char *suffix,
int flags ));
void bdb2i_cache_close LDAP_P(( Backend *be, struct dbcache *db ));
void bdb2i_cache_really_close LDAP_P(( Backend *be, struct dbcache *db ));
void bdb2i_cache_flush_all LDAP_P(( Backend *be ));
void bdb2i_cache_close LDAP_P(( BackendDB *be, struct dbcache *db ));
void bdb2i_cache_really_close LDAP_P(( BackendDB *be, struct dbcache *db ));
void bdb2i_cache_flush_all LDAP_P(( BackendDB *be ));
Datum bdb2i_cache_fetch LDAP_P(( struct dbcache *db, Datum key ));
int bdb2i_cache_store LDAP_P(( struct dbcache *db, Datum key, Datum data, int flags ));
int bdb2i_cache_delete LDAP_P(( struct dbcache *db, Datum key ));
@ -61,50 +61,50 @@ int bdb2i_cache_delete LDAP_P(( struct dbcache *db, Datum key ));
* dn2id.c
*/
int bdb2i_dn2id_add LDAP_P(( Backend *be, char *dn, ID id ));
ID bdb2i_dn2id LDAP_P(( Backend *be, char *dn ));
int bdb2i_dn2id_delete LDAP_P(( Backend *be, char *dn ));
Entry * bdb2i_dn2entry_r LDAP_P(( Backend *be, char *dn, char **matched ));
Entry * bdb2i_dn2entry_w LDAP_P(( Backend *be, char *dn, char **matched ));
int bdb2i_dn2id_add LDAP_P(( BackendDB *be, char *dn, ID id ));
ID bdb2i_dn2id LDAP_P(( BackendDB *be, char *dn ));
int bdb2i_dn2id_delete LDAP_P(( BackendDB *be, char *dn ));
Entry * bdb2i_dn2entry_r LDAP_P(( BackendDB *be, char *dn, char **matched ));
Entry * bdb2i_dn2entry_w LDAP_P(( BackendDB *be, char *dn, char **matched ));
/*
* filterindex.c
*/
ID_BLOCK * bdb2i_filter_candidates LDAP_P(( Backend *be, Filter *f ));
ID_BLOCK * bdb2i_filter_candidates LDAP_P(( BackendDB *be, Filter *f ));
/*
* id2children.c
*/
int bdb2i_id2children_add LDAP_P(( Backend *be, Entry *p, Entry *e ));
int bdb2i_id2children_remove LDAP_P(( Backend *be, Entry *p, Entry *e ));
int bdb2i_has_children LDAP_P(( Backend *be, Entry *p ));
int bdb2i_id2children_add LDAP_P(( BackendDB *be, Entry *p, Entry *e ));
int bdb2i_id2children_remove LDAP_P(( BackendDB *be, Entry *p, Entry *e ));
int bdb2i_has_children LDAP_P(( BackendDB *be, Entry *p ));
/*
* id2entry.c
*/
int bdb2i_id2entry_add LDAP_P(( Backend *be, Entry *e ));
int bdb2i_id2entry_delete LDAP_P(( Backend *be, Entry *e ));
Entry * bdb2i_id2entry LDAP_P(( Backend *be, ID id, int rw ));
Entry * bdb2i_id2entry_r LDAP_P(( Backend *be, ID id ));
Entry * bdb2i_id2entry_w LDAP_P(( Backend *be, ID id ));
int bdb2i_id2entry_add LDAP_P(( BackendDB *be, Entry *e ));
int bdb2i_id2entry_delete LDAP_P(( BackendDB *be, Entry *e ));
Entry * bdb2i_id2entry LDAP_P(( BackendDB *be, ID id, int rw ));
Entry * bdb2i_id2entry_r LDAP_P(( BackendDB *be, ID id ));
Entry * bdb2i_id2entry_w LDAP_P(( BackendDB *be, ID id ));
/*
* idl.c
*/
ID_BLOCK * bdb2i_idl_alloc LDAP_P(( int nids ));
ID_BLOCK * bdb2i_idl_allids LDAP_P(( Backend *be ));
ID_BLOCK * bdb2i_idl_allids LDAP_P(( BackendDB *be ));
void bdb2i_idl_free LDAP_P(( ID_BLOCK *idl ));
ID_BLOCK * bdb2i_idl_fetch LDAP_P(( Backend *be, struct dbcache *db, Datum key ));
int bdb2i_idl_insert_key LDAP_P(( Backend *be, struct dbcache *db, Datum key, ID id ));
ID_BLOCK * bdb2i_idl_fetch LDAP_P(( BackendDB *be, struct dbcache *db, Datum key ));
int bdb2i_idl_insert_key LDAP_P(( BackendDB *be, struct dbcache *db, Datum key, ID id ));
int bdb2i_idl_insert LDAP_P(( ID_BLOCK **idl, ID id, int maxids ));
int bdb2i_idl_delete_key LDAP_P(( Backend *be, struct dbcache *db, Datum key, ID id ));
ID_BLOCK * bdb2i_idl_intersection LDAP_P(( Backend *be, ID_BLOCK *a, ID_BLOCK *b ));
ID_BLOCK * bdb2i_idl_union LDAP_P(( Backend *be, ID_BLOCK *a, ID_BLOCK *b ));
ID_BLOCK * bdb2i_idl_notin LDAP_P(( Backend *be, ID_BLOCK *a, ID_BLOCK *b ));
int bdb2i_idl_delete_key LDAP_P(( BackendDB *be, struct dbcache *db, Datum key, ID id ));
ID_BLOCK * bdb2i_idl_intersection LDAP_P(( BackendDB *be, ID_BLOCK *a, ID_BLOCK *b ));
ID_BLOCK * bdb2i_idl_union LDAP_P(( BackendDB *be, ID_BLOCK *a, ID_BLOCK *b ));
ID_BLOCK * bdb2i_idl_notin LDAP_P(( BackendDB *be, ID_BLOCK *a, ID_BLOCK *b ));
ID bdb2i_idl_firstid LDAP_P(( ID_BLOCK *idl ));
ID bdb2i_idl_nextid LDAP_P(( ID_BLOCK *idl, ID id ));
@ -112,27 +112,36 @@ ID bdb2i_idl_nextid LDAP_P(( ID_BLOCK *idl, ID id ));
* index.c
*/
int bdb2i_index_add_entry LDAP_P(( Backend *be, Entry *e ));
int bdb2i_index_add_mods LDAP_P(( Backend *be, LDAPModList *ml, ID id ));
ID_BLOCK * bdb2i_index_read LDAP_P(( Backend *be, char *type, int indextype, char *val ));
int bdb2i_index_add_values LDAP_P(( Backend *be, char *type, struct berval **vals, ID id ));
int bdb2i_index_add_entry LDAP_P(( BackendDB *be, Entry *e ));
int bdb2i_index_add_mods LDAP_P(( BackendDB *be, LDAPModList *ml, ID id ));
ID_BLOCK * bdb2i_index_read LDAP_P(( BackendDB *be, char *type, int indextype, char *val ));
int bdb2i_index_add_values LDAP_P(( BackendDB *be, char *type, struct berval **vals, ID id ));
/*
* kerberos.c
*/
#ifdef HAVE_KERBEROS
/* bdb2i_krbv4_ldap_auth LDAP_P(( Backend *be, struct berval *cred, AUTH_DAT *ad )); */
/* bdb2i_krbv4_ldap_auth LDAP_P(( BackendDB *be, struct berval *cred, AUTH_DAT *ad )); */
#endif
/*
* nextid.c
*/
ID bdb2i_next_id LDAP_P(( Backend *be ));
void bdb2i_next_id_return LDAP_P(( Backend *be, ID id ));
ID bdb2i_next_id_get LDAP_P(( Backend *be ));
int bdb2i_next_id_save LDAP_P(( Backend *be ));
ID bdb2i_next_id LDAP_P(( BackendDB *be ));
void bdb2i_next_id_return LDAP_P(( BackendDB *be, ID id ));
ID bdb2i_next_id_get LDAP_P(( BackendDB *be ));
int bdb2i_next_id_save LDAP_P(( BackendDB *be ));
/*
* startup.c
*/
int bdb2i_back_startup LDAP_P(( BackendInfo *bi ));
int bdb2i_back_shutdown LDAP_P(( BackendInfo *bi ));
int bdb2i_back_db_startup LDAP_P(( BackendDB *be ));
int bdb2i_back_db_shutdown LDAP_P(( BackendDB *be ));
/*
* timing.c
@ -153,17 +162,17 @@ int bdb2i_leave_backend LDAP_P(( DB_ENV *dbEnv, DB_LOCK lock ));
* txn.c
*/
void bdb2i_txn_head_init LDAP_P(( BDB2_TXN_HEAD *head ));
int bdb2i_txn_head_init LDAP_P(( BDB2_TXN_HEAD *head ));
void bdb2i_txn_attr_config LDAP_P((
struct ldbminfo *li,
char *attr,
int open ));
void bdb2i_txn_open_files LDAP_P(( struct ldbminfo *li ));
void bdb2i_txn_close_files LDAP_P(( BDB2_TXN_HEAD *head ));
int bdb2i_txn_open_files LDAP_P(( struct ldbminfo *li ));
void bdb2i_txn_close_files LDAP_P(( BackendDB *be ));
BDB2_TXN_FILES *bdb2i_get_db_file_cache LDAP_P((
struct ldbminfo *li,
char *name ));
void bdb2i_check_additional_attr_index LDAP_P(( struct ldbminfo *li ));
int bdb2i_check_additional_attr_index LDAP_P(( struct ldbminfo *li ));
void bdb2i_check_default_attr_index_add LDAP_P((
struct ldbminfo *li,
Entry *e ));

View File

@ -11,9 +11,9 @@
#include "back-bdb2.h"
#include "proto-back-bdb2.h"
static ID_BLOCK *base_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
static ID_BLOCK *onelevel_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
static ID_BLOCK *subtree_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, Entry *e, int *err, int lookupbase);
static ID_BLOCK *base_candidates(BackendDB *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
static ID_BLOCK *onelevel_candidates(BackendDB *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
static ID_BLOCK *subtree_candidates(BackendDB *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, Entry *e, int *err, int lookupbase);
#define GRABSIZE BUFSIZ
@ -28,7 +28,7 @@ static ID_BLOCK *subtree_candidates(Backend *be, Connection *conn, Operation *op
static int
bdb2i_back_search_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *base,
@ -316,7 +316,7 @@ bdb2i_back_search_internal(
int
bdb2_back_search(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *base,
@ -339,7 +339,7 @@ bdb2_back_search(
gettimeofday( &time1, NULL );
if ( bdb2i_enter_backend_r( &li->li_db_env, &lock ) != 0 ) {
if ( bdb2i_enter_backend_r( get_dbenv( be ), &lock ) != 0 ) {
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( -1 );
@ -349,7 +349,7 @@ bdb2_back_search(
ret = bdb2i_back_search_internal( be, conn, op, base, scope, deref,
slimit, tlimit, filter, filterstr, attrs, attrsonly );
(void) bdb2i_leave_backend( &li->li_db_env, lock );
(void) bdb2i_leave_backend( get_dbenv( be ), lock );
if ( bdb2i_do_timing ) {
@ -367,7 +367,7 @@ bdb2_back_search(
static ID_BLOCK *
base_candidates(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *base,
@ -408,7 +408,7 @@ base_candidates(
static ID_BLOCK *
onelevel_candidates(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *base,
@ -471,7 +471,7 @@ onelevel_candidates(
static ID_BLOCK *
subtree_candidates(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op,
char *base,

View File

@ -1,4 +1,4 @@
/* startup.c - startup bdb2 backend */
/* startup.c - startup/shutdown bdb2 backend */
#include "portable.h"
@ -23,53 +23,30 @@ bdb2i_db_errcall( char *prefix, char *message )
}
void
/* startup/shutdown per backend type */
static int
bdb2i_back_startup_internal(
Backend *be
BackendInfo *bi
)
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
DB_ENV *dbEnv = &li->li_db_env;
struct ldbtype *lty = (struct ldbtype *) bi->bi_private;
DB_ENV *dbEnv = lty->lty_dbenv;
int envFlags = DB_CREATE | DB_THREAD | DB_INIT_LOCK | DB_INIT_MPOOL;
int err = 0;
char *home;
char datadir[MAXPATHLEN];
char *config[2] = { datadir, NULL };
/* if the data directory is not an absolute path, have it relative
to the current working directory (which should not be configured !) */
if ( *li->li_directory != *DEFAULT_DIRSEP ) {
/* make sure, dbhome is an absolute path */
if ( *lty->lty_dbhome != *DEFAULT_DIRSEP ) {
char cwd[MAXPATHLEN];
(void) getcwd( cwd, MAXPATHLEN );
sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_directory );
free( li->li_directory );
li->li_directory = strdup( cwd );
sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, lty->lty_dbhome );
free( lty->lty_dbhome );
lty->lty_dbhome = strdup( cwd );
}
/* set the DB home directory to the configured one, or the data dir */
if ( li->li_dbhome ) {
if ( *li->li_dbhome != *DEFAULT_DIRSEP ) {
char cwd[MAXPATHLEN];
(void) getcwd( cwd, MAXPATHLEN );
sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_dbhome );
free( li->li_dbhome );
li->li_dbhome = strdup( cwd );
}
home = li->li_dbhome;
} else {
home = li->li_directory;
}
/* set the DATA_DIR */
sprintf( datadir, "DB_DATA_DIR %s", li->li_directory );
home = lty->lty_dbhome;
/* general initialization of the environment */
memset( dbEnv, 0, sizeof( DB_ENV ));
@ -83,45 +60,35 @@ bdb2i_back_startup_internal(
remove_old_locks( home );
/* initialize the mpool subsystem */
dbEnv->mp_size = (size_t) li->li_dbcachesize;
dbEnv->mp_size = lty->lty_mpsize;
/* now do the db_appinit */
if ( ( err = db_appinit( home, config, dbEnv, envFlags )) ) {
if ( ( err = db_appinit( home, NULL, dbEnv, envFlags )) ) {
char error[BUFSIZ];
if ( err < 0 ) sprintf( error, "%ld\n", (long) err );
else sprintf( error, "%s\n", strerror( err ));
fprintf( stderr,
Debug( LDAP_DEBUG_ANY,
"bdb2i_back_startup(): FATAL error in db_appinit() : %s\n",
error );
exit( 1 );
error, 0, 0 );
return( 1 );
}
bdb2i_with_dbenv = 1;
/* if there are more index files, add them to the DB file list */
bdb2i_check_additional_attr_index( li );
/* now open all DB files */
bdb2i_txn_open_files( li );
return 0;
}
static void
static int
bdb2i_back_shutdown_internal(
Backend *be
BackendInfo *bi
)
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
DB_ENV *dbEnv = &li->li_db_env;
struct ldbtype *lty = (struct ldbtype *) bi->bi_private;
DB_ENV *dbEnv = lty->lty_dbenv;
int err;
/* close all DB files */
bdb2i_txn_close_files( &li->li_txn_head );
/* remove old locking tables */
dbEnv->db_errpfx = "bdb2i_back_shutdown(): lock_unlink:";
if ( ( err = lock_unlink( NULL, 1, dbEnv )) != 0 )
@ -134,56 +101,159 @@ bdb2i_back_shutdown_internal(
Debug( LDAP_DEBUG_ANY, "bdb2i_back_shutdown(): memp_unlink: %s\n",
strerror( err ), 0, 0);
(void) db_appexit( &li->li_db_env );
(void) db_appexit( dbEnv );
return( 0 );
}
void
bdb2_back_startup(
Backend *be
int
bdb2i_back_startup(
BackendInfo *bi
)
{
struct timeval time1, time2;
char *elapsed_time;
int ret;
gettimeofday( &time1, NULL );
bdb2i_back_startup_internal( be );
ret = bdb2i_back_startup_internal( bi );
if ( bdb2i_do_timing ) {
gettimeofday( &time2, NULL);
elapsed_time = bdb2i_elapsed( time1, time2 );
Debug( LDAP_DEBUG_ANY, "START elapsed=%s\n",
Debug( LDAP_DEBUG_ANY, "BE-START elapsed=%s\n",
elapsed_time, 0, 0 );
free( elapsed_time );
}
return( ret );
}
void
bdb2_back_shutdown(
Backend *be
int
bdb2i_back_shutdown(
BackendInfo *bi
)
{
struct timeval time1, time2;
char *elapsed_time;
int ret;
gettimeofday( &time1, NULL );
bdb2i_back_shutdown_internal( be );
ret = bdb2i_back_shutdown_internal( bi );
if ( bdb2i_do_timing ) {
gettimeofday( &time2, NULL);
elapsed_time = bdb2i_elapsed( time1, time2 );
Debug( LDAP_DEBUG_ANY, "SHUTDOWN elapsed=%s\n",
Debug( LDAP_DEBUG_ANY, "BE-SHUTDOWN elapsed=%s\n",
elapsed_time, 0, 0 );
free( elapsed_time );
}
return( ret );
}
/* startup/shutdown per backend database */
static int
bdb2i_back_db_startup_internal(
BackendDB *be
)
{
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
/* if the data directory is not an absolute path, have it relative
to the current working directory (which should not be configured !) */
if ( *li->li_directory != *DEFAULT_DIRSEP ) {
char cwd[MAXPATHLEN];
(void) getcwd( cwd, MAXPATHLEN );
sprintf( cwd, "%s%s%s", cwd, DEFAULT_DIRSEP, li->li_directory );
free( li->li_directory );
li->li_directory = strdup( cwd );
}
/* if there are more index files, add them to the DB file list */
if ( bdb2i_check_additional_attr_index( li ) != 0 )
return 1;
/* now open all DB files */
if ( bdb2i_txn_open_files( li ) != 0 )
return 1;
return 0;
}
static int
bdb2i_back_db_shutdown_internal(
BackendDB *be
)
{
return 0;
}
int
bdb2_back_db_startup(
BackendDB *be
)
{
struct timeval time1, time2;
char *elapsed_time;
int ret;
gettimeofday( &time1, NULL );
ret = bdb2i_back_db_startup_internal( be );
if ( bdb2i_do_timing ) {
gettimeofday( &time2, NULL);
elapsed_time = bdb2i_elapsed( time1, time2 );
Debug( LDAP_DEBUG_ANY, "DB-START elapsed=%s\n",
elapsed_time, 0, 0 );
free( elapsed_time );
}
return( ret );
}
int
bdb2_back_db_shutdown(
BackendDB *be
)
{
struct timeval time1, time2;
char *elapsed_time;
int ret;
gettimeofday( &time1, NULL );
ret = bdb2i_back_db_shutdown_internal( be );
if ( bdb2i_do_timing ) {
gettimeofday( &time2, NULL);
elapsed_time = bdb2i_elapsed( time1, time2 );
Debug( LDAP_DEBUG_ANY, "DB-SHUTDOWN elapsed=%s\n",
elapsed_time, 0, 0 );
free( elapsed_time );
}
return( ret );
}

View File

@ -3,7 +3,7 @@
#include "txn.h"
void
int
bdb2i_txn_head_init( BDB2_TXN_HEAD *head )
{
int dbFile;
@ -16,13 +16,12 @@ bdb2i_txn_head_init( BDB2_TXN_HEAD *head )
char fileName[MAXPATHLEN];
*fileNodeH = head->dbFileHandle[dbFile] =
(BDB2_TXN_FILES *) ch_calloc( 1, sizeof( BDB2_TXN_FILES ));
*fileNodeH = (BDB2_TXN_FILES *) ch_calloc( 1, sizeof( BDB2_TXN_FILES ));
if ( *fileNodeH == NULL ) {
Debug( LDAP_DEBUG_ANY, "bdb2i_txn_head_init(): out of memory!\n",
0, 0, 0 );
exit( 1 );
return( 1 );
}
@ -33,6 +32,7 @@ bdb2i_txn_head_init( BDB2_TXN_HEAD *head )
}
return 0;
}
@ -43,9 +43,9 @@ bdb2i_init_db_file_cache( struct ldbminfo *li, BDB2_TXN_FILES *fileinfo )
struct stat st;
char buf[MAXPATHLEN];
pthread_mutex_lock( &currenttime_mutex );
ldap_pvt_thread_mutex_lock( &currenttime_mutex );
curtime = currenttime;
pthread_mutex_unlock( &currenttime_mutex );
ldap_pvt_thread_mutex_unlock( &currenttime_mutex );
fileinfo->dbc_refcnt = 1;
fileinfo->dbc_lastref = curtime;
@ -58,7 +58,8 @@ bdb2i_init_db_file_cache( struct ldbminfo *li, BDB2_TXN_FILES *fileinfo )
fileinfo->dbc_blksize = DEFAULT_BLOCKSIZE;
}
fileinfo->dbc_maxids = ( fileinfo->dbc_blksize / sizeof( ID )) - 2;
fileinfo->dbc_maxids = ( fileinfo->dbc_blksize / sizeof( ID )) -
ID_BLOCK_IDS_OFFSET;
fileinfo->dbc_maxindirect = ( SLAPD_LDBM_MIN_MAXIDS /
fileinfo->dbc_maxids ) + 1;
@ -122,9 +123,12 @@ bdb2i_txn_attr_config(
/* BUT NOT "objectclass", 'cause that's a default index ! */
if ( open && strcasecmp( fileName, "objectclass" )) {
/* re-use filename to get the complete path */
sprintf( fileName, "%s%s%s",
li->li_directory, DEFAULT_DIRSEP, p->dbc_name );
/* since we have an mpool, we should not define a cache size */
p->dbc_db = ldbm_open_env( p->dbc_name, LDBM_WRCREAT,
li->li_mode, 0, &li->li_db_env );
p->dbc_db = ldbm_open( fileName, LDBM_WRCREAT, li->li_mode, 0 );
/* if the files could not be opened, something is wrong;
complain */
@ -154,17 +158,20 @@ bdb2i_txn_attr_config(
}
void
int
bdb2i_txn_open_files( struct ldbminfo *li )
{
BDB2_TXN_HEAD *head = &li->li_txn_head;
BDB2_TXN_FILES *dbFile;
for ( dbFile = head->dbFiles; dbFile; dbFile = dbFile->next ) {
char fileName[MAXPATHLEN];
sprintf( fileName, "%s%s%s",
li->li_directory, DEFAULT_DIRSEP, dbFile->dbc_name );
/* since we have an mpool, we should not define a cache size */
dbFile->dbc_db = ldbm_open_env( dbFile->dbc_name, LDBM_WRCREAT,
li->li_mode, 0, &li->li_db_env );
dbFile->dbc_db = ldbm_open( fileName, LDBM_WRCREAT, li->li_mode, 0 );
/* if the files could not be opened, something is wrong; complain */
if ( dbFile->dbc_db == NULL ) {
@ -172,7 +179,7 @@ bdb2i_txn_open_files( struct ldbminfo *li )
Debug( LDAP_DEBUG_ANY,
"bdb2i_txn_open_files(): couldn't open file \"%s\" -- FATAL.\n",
dbFile->dbc_name, 0, 0 );
exit( 1 );
return( 1 );
}
@ -184,13 +191,16 @@ bdb2i_txn_open_files( struct ldbminfo *li )
}
return 0;
}
void
bdb2i_txn_close_files( BDB2_TXN_HEAD *head)
bdb2i_txn_close_files( BackendDB *be )
{
BDB2_TXN_FILES *dbFile;
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
BDB2_TXN_HEAD *head = &li->li_txn_head;
BDB2_TXN_FILES *dbFile;
for ( dbFile = head->dbFiles; dbFile; dbFile = dbFile->next ) {
@ -207,8 +217,12 @@ bdb2i_get_db_file_cache( struct ldbminfo *li, char *name )
BDB2_TXN_FILES *dbFile;
int dbFileNum;
Debug( LDAP_DEBUG_TRACE, "bdb2i_get_db_file_cache(): looking for file %s\n",
name, 0, 0 );
for ( dbFile = head->dbFiles; dbFile; dbFile = dbFile->next ) {
/* we've got it */
if ( !strcasecmp( dbFile->dbc_name, name )) return( dbFile );
}
@ -225,19 +239,18 @@ bdb2i_get_db_file_cache( struct ldbminfo *li, char *name )
/* check for new attribute indexes, that might have been created
during former runs of slapd */
/* this is called during startup of the slapd server */
void
int
bdb2i_check_additional_attr_index( struct ldbminfo *li )
{
DIR *datadir;
struct dirent *file;
if ( ( datadir = opendir( li->li_directory ) ) == NULL ) {
/* if ( ( datadir = opendir( "/tmp" ) ) == NULL ) { */
Debug( LDAP_DEBUG_ANY,
"bdb2i_check_additional_attr_index(): ERROR while opening datadir: %s\n",
strerror( errno ), 0, 0 );
exit( 1 );
return( 1 );
}
@ -266,6 +279,7 @@ bdb2i_check_additional_attr_index( struct ldbminfo *li )
closedir( datadir );
return 0;
}

View File

@ -10,7 +10,7 @@
static int
bdb2i_back_unbind_internal(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op
)
@ -21,7 +21,7 @@ bdb2i_back_unbind_internal(
int
bdb2_back_unbind(
Backend *be,
BackendDB *be,
Connection *conn,
Operation *op
)

View File

@ -22,7 +22,7 @@ ldbm_back_db_config(
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
if ( li == NULL ) {
fprintf( stderr, "%s: line %d: ldbm backend info is null!\n",
fprintf( stderr, "%s: line %d: ldbm database info is null!\n",
fname, lineno );
return( 1 );
}
@ -38,7 +38,7 @@ ldbm_back_db_config(
li->li_directory = ch_strdup( argv[1] );
li->li_nextid_file =
ch_malloc( strlen(li->li_directory) + sizeof("/NEXTID") );
ch_malloc( strlen(li->li_directory) + sizeof("/NEXTID") + 1 );
strcpy(li->li_nextid_file, li->li_directory);
strcat(li->li_nextid_file, "/NEXTID");

View File

@ -34,7 +34,7 @@ ldbm_cache_open(
LDBM db;
struct stat st;
sprintf( buf, "%s/%s%s", li->li_directory, name, suffix );
sprintf( buf, "%s%s%s%s", li->li_directory, DEFAULT_DIRSEP, name, suffix );
Debug( LDAP_DEBUG_TRACE, "=> ldbm_cache_open( \"%s\", %d, %o )\n", buf,
flags, li->li_mode );

View File

@ -179,9 +179,6 @@ add_value(
Debug( LDAP_DEBUG_TRACE, "=> add_value( \"%c%s\" )\n", prefix, val, 0 );
realval = val;
tmpval = NULL;
if ( prefix != UNKNOWN_PREFIX ) {
unsigned int len = strlen( val );

View File

@ -36,7 +36,9 @@ ldbm_back_initialize(
bi->bi_op_delete = ldbm_back_delete;
bi->bi_op_abandon = ldbm_back_abandon;
#ifdef SLAPD_ACLGROUPS
bi->bi_acl_group = ldbm_back_group;
#endif
return 0;
}
@ -82,7 +84,7 @@ ldbm_back_db_init(
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) */

View File

@ -15,6 +15,9 @@
#ifdef SLAPD_LDBM
#include "back-ldbm/external.h"
#endif
#ifdef SLAPD_BDB2
#include "back-bdb2/external.h"
#endif
#ifdef SLAPD_PASSWD
#include "back-passwd/external.h"
#endif
@ -29,6 +32,9 @@ static BackendInfo binfo[] = {
#ifdef SLAPD_LDBM
{"ldbm", ldbm_back_initialize},
#endif
#ifdef SLAPD_BDB2
{"bdb2", bdb2_back_initialize},
#endif
#ifdef SLAPD_PASSWD
{"passwd", passwd_back_initialize},
#endif
@ -49,7 +55,7 @@ BackendDB *backendDB = NULL;
int backend_init(void)
{
int rc = 0;
int rc = -1;
if((nBackendInfo != 0) || (backendInfo != NULL)) {
/* already initialized */
@ -93,7 +99,7 @@ int backend_init(void)
"backend_init: failed\n",
0, 0, 0 );
return rc ? rc : -1;
return rc;
}
int backend_startup(int n)
@ -115,13 +121,22 @@ int backend_startup(int n)
"backend_startup: starting database %d\n",
n, 0, 0 );
/* make sure, n does not exceed the number of backend databases */
if ( n >= nbackends ) {
Debug( LDAP_DEBUG_ANY,
"backend_startup: database number %d exceeding maximum (%d)\n",
n, nbackends, 0 );
return 1;
}
if ( backendDB[n].bd_info->bi_open ) {
rc = backendDB[n].bd_info->bi_open(
backendDB[n].bd_info );
}
if(rc != 0) {
Debug( LDAP_DEBUG_TRACE,
Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_open failed!\n",
0, 0, 0 );
return rc;
@ -133,7 +148,7 @@ int backend_startup(int n)
}
if(rc != 0) {
Debug( LDAP_DEBUG_TRACE,
Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_db_open failed!\n",
0, 0, 0 );
return rc;
@ -143,6 +158,7 @@ int backend_startup(int n)
}
/* open each backend type */
/*
for( i = 0; i < nBackendInfo; i++ ) {
if( backendInfo[i].bi_open ) {
rc = backendInfo[i].bi_open(
@ -150,22 +166,38 @@ int backend_startup(int n)
}
if(rc != 0) {
Debug( LDAP_DEBUG_TRACE,
Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_open %d failed!\n",
i, 0, 0 );
return rc;
}
}
*/
/* open each backend database */
for( i = 0; i < nBackendDB; i++ ) {
BackendInfo *bi;
/* open the backend type, if not done already */
bi = backendDB[i].bd_info;
if( bi->bi_open ) {
rc = bi->bi_open( bi );
}
if(rc != 0) {
Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_open %s failed!\n",
bi->bi_type, 0, 0 );
return rc;
}
if ( backendDB[i].bd_info->bi_db_open ) {
rc = backendDB[i].bd_info->bi_db_open(
&backendDB[i] );
}
if(rc != 0) {
Debug( LDAP_DEBUG_TRACE,
Debug( LDAP_DEBUG_ANY,
"backend_startup: bi_db_open %d failed!\n",
i, 0, 0 );
return rc;
@ -178,10 +210,20 @@ int backend_startup(int n)
int backend_shutdown(int n)
{
int i;
int rc = 0;
if(n >= 0) {
/* shutdown a specific backend database */
/* make sure, n does not exceed the number of backend databases */
if ( n >= nbackends ) {
Debug( LDAP_DEBUG_ANY,
"backend_startup: database number %d exceeding maximum (%d)\n",
n, nbackends, 0 );
return 1;
}
if ( backendDB[n].bd_info->bi_db_close ) {
backendDB[n].bd_info->bi_db_close(
&backendDB[n] );
@ -197,19 +239,35 @@ int backend_shutdown(int n)
/* close each backend database */
for( i = 0; i < nBackendDB; i++ ) {
BackendInfo *bi;
if ( backendDB[i].bd_info->bi_db_close ) {
backendDB[i].bd_info->bi_db_close(
&backendDB[i] );
}
/* close the backend type, if not done already */
bi = backendDB[i].bd_info;
if( bi->bi_close ) {
rc = bi->bi_close( bi );
}
if(rc != 0) {
Debug( LDAP_DEBUG_ANY,
"backend_close: bi_close %s failed!\n",
bi->bi_type, 0, 0 );
}
}
/* close each backend type */
/*
for( i = 0; i < nBackendInfo; i++ ) {
if( backendInfo[i].bi_close ) {
backendInfo[i].bi_close(
&backendInfo[i] );
}
}
*/
return 0;
}
@ -227,12 +285,14 @@ int backend_destroy(void)
}
/* destroy each backend type */
/*
for( i = 0; i < nBackendInfo; i++ ) {
if( backendInfo[i].bi_destroy ) {
backendInfo[i].bi_destroy(
&backendInfo[i] );
}
}
*/
return 0;
}

View File

@ -62,14 +62,14 @@ ldap_pvt_thread_mutex_t entry2str_mutex;
ldap_pvt_thread_mutex_t replog_mutex;
static char* slap_name;
int slapMode = 0;
int slapMode = SLAP_UNDEFINED_MODE;
int
slap_init( int mode, char *name )
{
int rc;
if( slapMode ) {
if( slapMode != SLAP_UNDEFINED_MODE ) {
Debug( LDAP_DEBUG_ANY,
"%s init: init called twice (old=%d, new=%d)\n",
name, slapMode, mode );
@ -78,7 +78,7 @@ slap_init( int mode, char *name )
slapMode = mode;
if(!slapMode) {
if( ( slapMode != SLAP_SERVER_MODE ) && ( slapMode != SLAP_TOOL_MODE ) ) {
Debug( LDAP_DEBUG_ANY,
"%s init: undefined mode (%d).\n",
name, mode, 0 );

View File

@ -304,9 +304,14 @@ main( int argc, char **argv )
}
shutdown:
slap_shutdown(-1);
/* remember an error during shutdown */
rc |= slap_shutdown(-1);
destroy:
slap_destroy();
/* remember an error during destroy */
rc |= slap_destroy();
Debug( LDAP_DEBUG_ANY, "slapd stopped.\n", 0, 0, 0 );
return rc;
}

View File

@ -289,7 +289,7 @@ struct backend_db {
char *be_update_ndn; /* allowed to make changes (in replicas) */
int be_lastmod; /* keep track of lastmodified{by,time} */
void *be_private; /* anything the backend needs */
void *be_private; /* anything the backend database needs */
};
struct backend_info {
@ -387,7 +387,7 @@ struct backend_info {
char *objectclassValue, char *groupattrName ));
#endif
void *bi_private; /* anything the backend needs */
void *bi_private; /* anything the backend type needs */
};
/*

View File

@ -14,6 +14,7 @@
#-----------------------------------------------------------------------------
HAVE_ISODE = @HAVE_ISODE@
BUILD_LDBM = @BUILD_LDBM@
BUILD_BDB2 = @BUILD_BDB2@
LDAP_INCDIR= ../../../include
LDAP_LIBDIR= ../../../libraries
@ -23,12 +24,18 @@ XXLIBS = $(LDAPD_LIBS) $(SLAPD_LIBS) \
$(PERL_LDFLAGS) $(LDBM_LIBS) $(KRB_LIBS) $(LUTIL_LIBS)
XXXLIBS = $(LTHREAD_LIBS)
PROGRAMS=ldif2index ldif2ldbm ldbmcat ldif2id2entry \
ldif2id2children centipede ldbmtest ldif
PROGRAMS=ldif2index ldif2ldbm ldbmcat ldif2id2entry ldif2id2children \
centipede ldbmtest ldif
PROGRAMS2=ldif2index-bdb2 ldif2ldbm-bdb2 \
ldif2id2entry-bdb2 ldif2id2children-bdb2
SRCS = centipede.c ldbmcat.c ldbmtest.c sizecount.c \
ldif.c ldif2id2children.c ldif2id2entry.c ldif2index.c ldif2ldbm.c
SRCS2 = ldif2id2children-bdb2.c ldif2id2entry-bdb2.c \
ldif2index-bdb2.c ldif2ldbm-bdb2.c
XSRCS = edb2-vers.c
EDB2LDIFSRCS = edb2ldif.c ldapsyntax.c
@ -40,7 +47,7 @@ OBJS2 = ../config.o ../ch_malloc.o ../backend.o ../charray.o \
../dn.o ../filter.o ../str2filter.o ../ava.o ../init.o \
../schemaparse.o
all-local: build-ldbm build-edb2ldif build-chlog2replog
all-local: build-ldbm build-bdb2 build-edb2ldif build-chlog2replog
build-ldbm: FORCE
@if [ "$(BUILD_LDBM)" = "yes" ]; then \
@ -49,8 +56,17 @@ build-ldbm: FORCE
echo "run configure with --with-ldbm to build LDBM tools"; \
fi
build-bdb2: FORCE
@if [ "$(BUILD_BDB2)" = "yes" ]; then \
$(MAKE) $(MFLAGS) bdb2-tools; \
else \
echo "run configure with --enable-bdb2 to build BDB2 tools"; \
fi
ldbm-tools: $(PROGRAMS)
bdb2-tools: $(PROGRAMS2)
build-edb2ldif: FORCE
@if [ "$(HAVE_ISODE)" = "yes" ]; then \
$(MAKE) $(MFLAGS) edb2ldif; \
@ -82,16 +98,31 @@ chlog2replog: chlog2replog.o ../lock.o ../ch_malloc.o $(SLAPD_LIBDEPEND)
ldif2index: ldif2index.o ../libbackends.a $(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2index.o $(OBJS2) ../libbackends.a $(LIBS)
ldif2index-bdb2: ldif2index-bdb2.o ../libbackends.a \
$(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2index-bdb2.o $(OBJS2) ../libbackends.a $(LIBS)
ldif2ldbm: ldif2ldbm.o ../libbackends.a $(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2ldbm.o $(OBJS2) ../libbackends.a $(LIBS)
ldif2ldbm-bdb2: ldif2ldbm-bdb2.o ../libbackends.a $(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2ldbm-bdb2.o $(OBJS2) ../libbackends.a $(LIBS)
ldif2id2entry: ldif2id2entry.o ../libbackends.a $(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2id2entry.o $(OBJS2) ../libbackends.a $(LIBS)
ldif2id2entry-bdb2: ldif2id2entry-bdb2.o ../libbackends.a \
$(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2id2entry-bdb2.o $(OBJS2) ../libbackends.a $(LIBS)
ldif2id2children: ldif2id2children.o ../libbackends.a \
$(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2id2children.o $(OBJS2) ../libbackends.a $(LIBS)
ldif2id2children-bdb2: ldif2id2children-bdb2.o ../libbackends.a \
$(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldif2id2children-bdb2.o $(OBJS2) ../libbackends.a $(LIBS)
ldbmcat: ldbmcat.o $(SLAPD_LIBDEPEND)
$(LTLINK) -o $@ ldbmcat.o $(LIBS)
@ -108,26 +139,31 @@ ldbmtest: ldbmtest.o ../libbackends.a $(OBJS2) $(SLAPD_LIBDEPEND)
$(LTLINK) -o ldbmtest ldbmtest.o $(OBJS2) ../libbackends.a $(LIBS)
clean-local: FORCE
$(RM) $(PROGRAMS) $(XPROGRAMS) $(XSRCS) edb2-vers.c \
$(RM) $(PROGRAMS) $(PROGRAMS2) $(XPROGRAMS) $(XSRCS) edb2-vers.c \
*.o core .libs/*
depend-local: FORCE
@DEPEND=no ; DEPEND_LDBM= ; DEPEND_ISODE= ; \
@DEPEND=no ; DEPEND_LDBM= ; DEPEND_BDB2= ; DEPEND_ISODE= ; \
if [ "$(BUILD_LDBM)" = "yes" ]; then \
DEPEND_LDBM="$(SRCS)"; \
DEPEND=yes ; \
fi; \
if [ "$(BUILD_BDB2)" = "yes" ]; then \
DEPEND_BDB2="$(SRCS2)"; \
DEPEND=yes ; \
fi; \
if [ "$(HAVE_ISODE)" = "yes" ]; then \
DEPEND_ISODE="$(ISODEINCLUDEFLAG) chlog2replog.c $(EDB2LDIFSRCS)"; \
DEPEND=yes ; \
fi; \
if [ "$$DEPEND" = "yes" ]; then \
$(MKDEP) $(DEFS) $(DEFINES) $$DEPEND_ISODE $$DEPEND_LDBM; \
$(MKDEP) $(DEFS) $(DEFINES) $$DEPEND_ISODE \
$$DEPEND_LDBM $$DEPEND_BDB2; \
else \
echo "slapd-tools: no dependencies to make"; \
fi
install-local: install-ldbm install-isode FORCE
install-local: install-ldbm install-bdb2 install-isode FORCE
install-ldbm: FORCE
@-$(MKDIR) $(sbindir)
@ -144,6 +180,17 @@ install-ldbm: FORCE
exit 0 ; \
fi
install-bdb2: FORCE
@-$(MKDIR) $(sbindir)
@if [ "$(BUILD_BDB2)" = "yes" ]; then \
$(LTINSTALL) $(INSTALLFLAGS) -m 755 ldif2ldbm-bdb2 $(sbindir) ; \
$(LTINSTALL) $(INSTALLFLAGS) -m 755 ldif2index-bdb2 $(sbindir) ; \
$(LTINSTALL) $(INSTALLFLAGS) -m 755 ldif2id2entry-bdb2 $(sbindir) ; \
$(LTINSTALL) $(INSTALLFLAGS) -m 755 ldif2id2children-bdb2 $(sbindir) ; \
else \
exit 0 ; \
fi
install-isode: FORCE
@-$(MKDIR) $(sbindir)
@if [ "$(HAVE_ISODE)" = "yes" ]; then \

View File

@ -0,0 +1,311 @@
#include "portable.h"
#include <stdio.h>
#include <stdlib.h>
#include <ac/ctype.h>
#include <ac/string.h>
#include <ac/socket.h>
#include <ac/unistd.h>
#include "ldapconfig.h"
#include "../slap.h"
#include "../back-bdb2/back-bdb2.h"
#include "ldif.h"
#define MAXARGS 100
static char *tailorfile;
static char *inputfile;
static void
usage( char *name )
{
fprintf( stderr, "usage: %s -i inputfile [-d debuglevel] [-f configfile] [-n databasenumber]\n", name );
exit( 1 );
}
int
main( int argc, char **argv )
{
int i, cargc, indb, stop, status;
char *cargv[MAXARGS];
char *defargv[MAXARGS];
char *linep, *buf;
char line[BUFSIZ];
int lineno, elineno;
int lmax, lcur;
int dbnum;
ID id;
struct dbcache *db, *db2;
Backend *be = NULL;
struct ldbminfo *li;
struct berval bv;
struct berval *vals[2];
Avlnode *avltypes = NULL;
tailorfile = SLAPD_DEFAULT_CONFIGFILE;
dbnum = -1;
while ( (i = getopt( argc, argv, "d:f:i:n:" )) != EOF ) {
switch ( i ) {
case 'd': /* turn on debugging */
ldap_debug = atoi( optarg );
break;
case 'f': /* specify a tailor file */
tailorfile = strdup( optarg );
break;
case 'i': /* input file */
inputfile = strdup( optarg );
break;
case 'n': /* which config file db to index */
dbnum = atoi( optarg ) - 1;
break;
default:
usage( argv[0] );
break;
}
}
if ( inputfile == NULL ) {
usage( argv[0] );
} else {
if ( freopen( inputfile, "r", stdin ) == NULL ) {
perror( inputfile );
exit( 1 );
}
}
/*
* initialize stuff and figure out which backend we're dealing with
*/
slap_init(SLAP_TOOL_MODE, "ldif2id2children");
read_config( tailorfile );
if ( dbnum == -1 ) {
for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
if ( strcasecmp( backends[dbnum].be_type, "bdb2" )
== 0 ) {
break;
}
}
if ( dbnum == nbackends ) {
fprintf( stderr, "No bdb2 database found in config file\n" );
exit( 1 );
}
} else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
fprintf( stderr, "Database number selected via -n is out of range\n" );
fprintf( stderr, "Must be in the range 1 to %d (number of databases in the config file)\n", nbackends );
exit( 1 );
} else if ( strcasecmp( backends[dbnum].be_type, "bdb2" ) != 0 ) {
fprintf( stderr, "Database number %d selected via -n is not an bdb2 database\n", dbnum );
exit( 1 );
}
slap_startup(dbnum);
be = &backends[dbnum];
/* disable write sync'ing */
li = (struct ldbminfo *) be->be_private;
li->li_dbcachewsync = 0;
/*
* first, make the dn2id index
*/
if ( (db = bdb2i_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_NEWDB ))
== NULL ) {
perror( "dn2id file" );
exit( 1 );
}
id = 0;
stop = 0;
lineno = 0;
buf = NULL;
lcur = lmax = 0;
vals[0] = &bv;
vals[1] = NULL;
while ( ! stop ) {
char *type, *val, *s;
int vlen;
Datum key, data;
ldbm_datum_init( key );
ldbm_datum_init( data );
if ( fgets( line, sizeof(line), stdin ) != NULL ) {
int len;
lineno++;
len = strlen( line );
while ( lcur + len + 1 > lmax ) {
lmax += BUFSIZ;
buf = (char *) ch_realloc( buf, lmax );
}
strcpy( buf + lcur, line );
lcur += len;
} else {
stop = 1;
}
if ( line[0] == '\n' || stop && buf && *buf ) {
if ( *buf != '\n' ) {
if (isdigit(*buf)) {
id = atol(buf);
} else {
id++;
}
s = buf;
elineno = 0;
while ( (linep = ldif_getline( &s )) != NULL ) {
elineno++;
if ( ldif_parse_line( linep, &type, &val,
&vlen ) != 0 ) {
Debug( LDAP_DEBUG_PARSE,
"bad line %d in entry ending at line %d ignored\n",
elineno, lineno, 0 );
continue;
}
if ( strcmp( type, "dn" ) == 0 )
break;
}
if ( linep == NULL ) {
fprintf( stderr, "entry %lu has no dn\n",
id );
} else {
key.dptr = dn_normalize_case( val );
key.dsize = strlen( val ) + 1;
data.dptr = (char *) &id;
data.dsize = sizeof(ID);
if ( ldbm_store( db->dbc_db, key, data,
LDBM_REPLACE ) != 0 ) {
perror( "dn2id ldbm_store..." );
exit( 1 );
}
}
}
*buf = '\0';
lcur = 0;
line[0] = '\0';
}
}
if ( buf )
free( buf );
/*
* next, make the id2children index
*/
if ( (db2 = bdb2i_cache_open( be, "id2children", LDBM_SUFFIX,
LDBM_NEWDB )) == NULL ) {
perror( "id2children file" );
exit( 1 );
}
rewind( stdin );
id = 0;
stop = 0;
buf = NULL;
lineno = 0;
lcur = lmax = 0;
vals[0] = &bv;
vals[1] = NULL;
while ( ! stop ) {
char *type, *val, *s, *dn;
int vlen;
ID pid;
char buf2[20];
Datum key, data;
ldbm_datum_init( key );
ldbm_datum_init( data );
if ( fgets( line, sizeof(line), stdin ) != NULL ) {
int len;
len = strlen( line );
while ( lcur + len + 1 > lmax ) {
lmax += BUFSIZ;
buf = (char *) ch_realloc( buf, lmax );
}
strcpy( buf + lcur, line );
lcur += len;
} else {
stop = 1;
}
if ( line[0] == '\n' || stop && buf && *buf ) {
if ( * buf != '\n' ) {
id++;
s = buf;
while ( (linep = ldif_getline( &s )) != NULL ) {
if ( ldif_parse_line( linep, &type, &val,
&vlen ) != 0 ) {
Debug( LDAP_DEBUG_PARSE,
"bad line %d ignored\n",
lineno, 0, 0 );
continue;
}
if ( strcmp( type, "dn" ) == 0 )
break;
}
if ( linep == NULL ) {
fprintf( stderr, "entry %lu has no dn\n",
id );
} else {
if ( (dn = dn_parent( be, val ))
== NULL ) {
pid = 0;
} else {
key.dptr =
dn_normalize_case( dn );
key.dsize = strlen( dn ) + 1;
data = ldbm_fetch( db->dbc_db,
key );
free( dn );
if ( data.dptr == NULL ) {
dn_normalize_case( val );
if ( ! be_issuffix( be,
val ) ) {
Debug( LDAP_DEBUG_PARSE, "no parent \"%s\" of \"%s\"\n", dn, val, 0 );
}
*buf = '\0';
lcur = 0;
line[0] = '\0';
continue;
}
(void) memcpy( (char *) &pid,
data.dptr, sizeof(ID) );
ldbm_datum_free( db->dbc_db, data);
}
sprintf( buf2, "%c%ld", EQ_PREFIX, pid );
key.dptr = buf2;
key.dsize = strlen( buf2 ) + 1;
if ( idl_insert_key( be, db2, key, id )
!= 0 ) {
perror( "idl_insert_key" );
exit( 1 );
}
}
}
*buf = '\0';
lcur = 0;
line[0] = '\0';
}
}
slap_shutdown(dbnum);
slap_destroy();
exit( 0 );
}

View File

@ -0,0 +1,206 @@
#include "portable.h"
#include <stdio.h>
#include <stdlib.h>
#include <ac/ctype.h>
#include <ac/string.h>
#include <ac/socket.h>
#include <ac/unistd.h>
#include "ldapconfig.h"
#include "../slap.h"
#include "../back-bdb2/back-bdb2.h"
#define MAXARGS 100
static char *tailorfile;
static char *inputfile;
static void
usage( char *name )
{
fprintf( stderr, "usage: %s -i inputfile [-d debuglevel] [-f configfile] [-n databasenumber]\n", name );
exit( 1 );
}
int
main( int argc, char **argv )
{
int i, cargc, indb, stop, status;
char *cargv[MAXARGS];
char *defargv[MAXARGS];
char *linep, *buf;
char line[BUFSIZ], idbuf[BUFSIZ];
int lmax, lcur;
int dbnum;
ID id;
struct dbcache *db;
Backend *be = NULL;
struct ldbminfo *li;
struct berval bv;
struct berval *vals[2];
Avlnode *avltypes = NULL;
FILE *fp;
tailorfile = SLAPD_DEFAULT_CONFIGFILE;
dbnum = -1;
while ( (i = getopt( argc, argv, "d:f:i:n:" )) != EOF ) {
switch ( i ) {
case 'd': /* turn on debugging */
ldap_debug = atoi( optarg );
break;
case 'f': /* specify a tailor file */
tailorfile = strdup( optarg );
break;
case 'i': /* input file */
inputfile = strdup( optarg );
break;
case 'n': /* which config file db to index */
dbnum = atoi( optarg ) - 1;
break;
default:
usage( argv[0] );
break;
}
}
if ( inputfile == NULL ) {
usage( argv[0] );
} else {
if ( freopen( inputfile, "r", stdin ) == NULL ) {
perror( inputfile );
exit( 1 );
}
}
/*
* initialize stuff and figure out which backend we're dealing with
*/
slap_init(SLAP_TOOL_MODE, "ldif2id2entry");
read_config( tailorfile );
if ( dbnum == -1 ) {
for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
if ( strcasecmp( backends[dbnum].be_type, "bdb2" )
== 0 ) {
break;
}
}
if ( dbnum == nbackends ) {
fprintf( stderr, "No bdb2 database found in config file\n" );
exit( 1 );
}
} else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
fprintf( stderr, "Database number selected via -n is out of range\n" );
fprintf( stderr, "Must be in the range 1 to %d (number of databases in the config file)\n", nbackends );
exit( 1 );
} else if ( strcasecmp( backends[dbnum].be_type, "bdb2" ) != 0 ) {
fprintf( stderr, "Database number %d selected via -n is not an bdb2 database\n", dbnum );
exit( 1 );
}
slap_startup(dbnum);
be = &backends[dbnum];
/* disable write sync'ing */
li = (struct ldbminfo *) be->be_private;
li->li_dbcachewsync = 0;
if ( (db = bdb2i_cache_open( be, "id2entry", LDBM_SUFFIX, LDBM_NEWDB ))
== NULL ) {
perror( "id2entry file" );
exit( 1 );
}
id = 0;
stop = 0;
buf = NULL;
lcur = lmax = 0;
vals[0] = &bv;
vals[1] = NULL;
while ( ! stop ) {
char *type, *val, *s;
int vlen;
Datum key, data;
ldbm_datum_init( key );
ldbm_datum_init( data );
if ( fgets( line, sizeof(line), stdin ) != NULL ) {
int len, idlen;
len = strlen( line );
if ( buf == NULL || *buf == '\0' ) {
if (!isdigit(line[0])) {
sprintf( idbuf, "%d\n", id + 1 );
idlen = strlen( idbuf );
} else {
id = atol(line) - 1;
idlen = 0;
}
} else {
idlen = 0;
}
while ( lcur + len + idlen + 1 > lmax ) {
lmax += BUFSIZ;
buf = (char *) ch_realloc( buf, lmax );
}
if ( idlen > 0 ) {
strcpy( buf + lcur, idbuf );
lcur += idlen;
}
strcpy( buf + lcur, line );
lcur += len;
} else {
stop = 1;
}
if ( line[0] == '\n' || stop && buf && *buf ) {
if ( *buf != '\n' ) {
int len;
id++;
key.dptr = (char *) &id;
key.dsize = sizeof(ID);
data.dptr = buf;
len = strlen(buf);
if (buf[len - 1] == '\n')
buf[--len] = '\0';
data.dsize = len + 1;
if ( ldbm_store( db->dbc_db, key, data,
LDBM_INSERT ) != 0 ) {
fputs("id2entry ldbm_store failed\n",
stderr);
exit( 1 );
}
}
*buf = '\0';
lcur = 0;
line[0] = '\0';
}
}
slap_shutdown(dbnum);
id++;
sprintf( line, "%s/NEXTID",
((struct ldbminfo *) be->be_private)->li_directory );
if ( (fp = fopen( line, "w" )) == NULL ) {
perror( line );
fprintf( stderr, "Could not write next id %ld\n", id );
} else {
fprintf( fp, "%ld\n", id );
fclose( fp );
}
slap_destroy();
exit( 0 );
}

View File

@ -0,0 +1,177 @@
#include "portable.h"
#include <stdio.h>
#include <stdlib.h>
#include <ac/ctype.h>
#include <ac/string.h>
#include <ac/socket.h>
#include <ac/unistd.h>
#include "../slap.h"
#include "../back-bdb2/back-bdb2.h"
#include "ldapconfig.h"
#include "ldif.h"
#define MAXARGS 100
static void
usage( char *name )
{
fprintf( stderr, "usage: %s -i inputfile [-d debuglevel] [-f configfile] [-n databasenumber] attr\n", name );
exit( 1 );
}
int
main( int argc, char **argv )
{
int i, cargc, indb, stop;
char *cargv[MAXARGS];
char *defargv[MAXARGS];
char *tailorfile, *inputfile;
char *linep, *buf, *attr;
char line[BUFSIZ];
int lineno, elineno;
int lmax, lcur, indexmask, syntaxmask;
int dbnum;
unsigned long id;
Backend *be = NULL;
struct ldbminfo *li;
struct berval bv;
struct berval *vals[2];
inputfile = NULL;
tailorfile = SLAPD_DEFAULT_CONFIGFILE;
dbnum = -1;
while ( (i = getopt( argc, argv, "d:f:i:n:" )) != EOF ) {
switch ( i ) {
case 'd': /* turn on debugging */
ldap_debug = atoi( optarg );
break;
case 'f': /* specify a tailor file */
tailorfile = strdup( optarg );
break;
case 'i': /* input file */
inputfile = strdup( optarg );
break;
case 'n': /* which config file db to index */
dbnum = atoi( optarg ) - 1;
break;
default:
usage( argv[0] );
break;
}
}
attr = attr_normalize( argv[argc - 1] );
if ( inputfile == NULL ) {
usage( argv[0] );
} else {
if ( freopen( inputfile, "r", stdin ) == NULL ) {
perror( inputfile );
exit( 1 );
}
}
slap_init(SLAP_TOOL_MODE, ch_strdup(argv[0]));
read_config( tailorfile );
if ( dbnum == -1 ) {
for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
if ( strcasecmp( backends[dbnum].be_type, "bdb2" )
== 0 ) {
break;
}
}
if ( dbnum == nbackends ) {
fprintf( stderr, "No bdb2 database found in config file\n" );
exit( 1 );
}
} else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
fprintf( stderr, "Database number selected via -n is out of range\n" );
fprintf( stderr, "Must be in the range 1 to %d (number of databases in the config file)\n", nbackends );
exit( 1 );
} else if ( strcasecmp( backends[dbnum].be_type, "bdb2" ) != 0 ) {
fprintf( stderr, "Database number %d selected via -n is not an bdb2 database\n", dbnum );
exit( 1 );
}
slap_startup(dbnum);
be = &backends[dbnum];
/* disable write sync'ing */
li = (struct ldbminfo *) be->be_private;
li->li_dbcachewsync = 0;
attr_masks( be->be_private, attr, &indexmask, &syntaxmask );
if ( indexmask == 0 ) {
exit( 0 );
}
id = 0;
stop = 0;
lineno = 0;
buf = NULL;
lcur = lmax = 0;
vals[0] = &bv;
vals[1] = NULL;
while ( ! stop ) {
char *type, *val, *s;
int vlen;
if ( fgets( line, sizeof(line), stdin ) != NULL ) {
int len;
lineno++;
len = strlen( line );
while ( lcur + len + 1 > lmax ) {
lmax += BUFSIZ;
buf = (char *) ch_realloc( buf, lmax );
}
strcpy( buf + lcur, line );
lcur += len;
} else {
stop = 1;
}
if ( line[0] == '\n' || stop && buf && *buf ) {
if ( *buf != '\n' ) {
if (isdigit(*buf)) {
id = atol(buf);
} else {
id++;
}
s = buf;
elineno = 0;
while ( (linep = ldif_getline( &s )) != NULL ) {
elineno++;
if ( ldif_parse_line( linep, &type, &val,
&vlen ) != 0 ) {
Debug( LDAP_DEBUG_PARSE,
"bad line %d in entry ending at line %d ignored\n",
elineno, elineno, 0 );
continue;
}
if ( strcasecmp( type, attr ) == 0 ) {
bv.bv_val = val;
bv.bv_len = vlen;
index_add_values( be, attr,
vals, id );
}
}
}
*buf = '\0';
lcur = 0;
}
}
slap_shutdown(dbnum);
slap_destroy();
exit( 0 );
}

View File

@ -0,0 +1,335 @@
#include "portable.h"
#include <stdio.h>
#include <ac/string.h>
#include <ac/ctype.h>
#include <ac/socket.h>
#include <ac/unistd.h>
#include <ac/wait.h>
#include <sys/param.h>
#include "ldapconfig.h"
#include "../slap.h"
#include "../back-bdb2/back-bdb2.h"
#include "ldif.h"
#define INDEXCMD "ldif2index-bdb2"
#define ID2ENTRYCMD "ldif2id2entry-bdb2"
#define ID2CHILDRENCMD "ldif2id2children-bdb2"
#define MAXARGS 100
static void fork_child( char *prog, char *args[] );
static void wait4kids( int nkidval );
static char *indexcmd;
static char *tailorfile;
static char *inputfile;
static int maxkids = 1;
static int nkids;
static void
usage( char *name )
{
fprintf( stderr, "usage: %s -i inputfile [-d debuglevel] [-f configfile] [-j #jobs] [-n databasenumber] [-s sbindir]\n", name );
exit( 1 );
}
int
main( int argc, char **argv )
{
int i, stop, status;
char *linep, *buf, *sbindir;
char *args[MAXARGS];
char buf2[20], buf3[20];
char line[BUFSIZ];
char cmd[MAXPATHLEN];
int lineno, elineno;
int lmax, lcur;
int dbnum;
ID id;
int rc;
Backend *be = NULL;
struct ldbminfo *li;
struct berval bv;
struct berval *vals[2];
Avlnode *avltypes = NULL;
sbindir = DEFAULT_SBINDIR;
tailorfile = SLAPD_DEFAULT_CONFIGFILE;
dbnum = -1;
while ( (i = getopt( argc, argv, "d:e:s:f:i:j:n:" )) != EOF ) {
switch ( i ) {
case 'd': /* turn on debugging */
ldap_debug = atoi( optarg );
break;
case 's': /* alternate sbindir (index cmd location) */
case 'e': /* accept -e for backwards compatibility */
sbindir = strdup( optarg );
break;
case 'f': /* specify a tailor file */
tailorfile = strdup( optarg );
break;
case 'i': /* input file */
inputfile = strdup( optarg );
break;
case 'j': /* number of parallel index procs */
maxkids = atoi( optarg );
break;
case 'n': /* which config file db to index */
dbnum = atoi( optarg ) - 1;
break;
default:
usage( argv[0] );
break;
}
}
if ( inputfile == NULL ) {
usage( argv[0] );
} else {
if ( freopen( inputfile, "r", stdin ) == NULL ) {
perror( inputfile );
exit( 1 );
}
}
/*
* initialize stuff and figure out which backend we're dealing with
*/
rc = slap_init(SLAP_TOOL_MODE, "ldif2ldbm");
if (rc != 0 ) {
fprintf( stderr, "ldif2ldbm: slap_init failed!\n");
exit(1);
}
read_config( tailorfile );
if ( dbnum == -1 ) {
for ( dbnum = 0; dbnum < nbackends; dbnum++ ) {
if ( strcasecmp( backends[dbnum].be_type, "bdb2" )
== 0 ) {
break;
}
}
if ( dbnum == nbackends ) {
fprintf( stderr, "No bdb2 database found in config file\n" );
exit( 1 );
}
} else if ( dbnum < 0 || dbnum > (nbackends-1) ) {
fprintf( stderr, "Database number selected via -n is out of range\n" );
fprintf( stderr, "Must be in the range 1 to %d (number of databases in the config file)\n", nbackends );
exit( 1 );
} else if ( strcasecmp( backends[dbnum].be_type, "bdb2" ) != 0 ) {
fprintf( stderr, "Database number %d selected via -n is not an bdb2 database\n", dbnum );
exit( 1 );
}
slap_startup(dbnum);
be = &backends[dbnum];
/* disable write sync'ing */
li = (struct ldbminfo *) be->be_private;
li->li_dbcachewsync = 0;
/*
* generate the id2entry index
*/
i = 0;
sprintf( cmd, "%s/%s", sbindir, ID2ENTRYCMD );
args[i++] = cmd;
args[i++] = "-i";
args[i++] = inputfile;
args[i++] = "-f";
args[i++] = tailorfile;
args[i++] = "-n";
sprintf( buf2, "%d", dbnum+1 );
args[i++] = buf2;
if ( ldap_debug ) {
sprintf( buf3, "%d", ldap_debug );
args[i++] = "-d";
args[i++] = buf3;
}
args[i++] = NULL;
fork_child( cmd, args );
/*
* generate the dn2id and id2children indexes
*/
i = 0;
sprintf( cmd, "%s/%s", sbindir, ID2CHILDRENCMD );
args[i++] = cmd;
args[i++] = "-i";
args[i++] = inputfile;
args[i++] = "-f";
args[i++] = tailorfile;
args[i++] = "-n";
sprintf( buf2, "%d", dbnum+1 );
args[i++] = buf2;
if ( ldap_debug ) {
sprintf( buf3, "%d", ldap_debug );
args[i++] = "-d";
args[i++] = buf3;
}
args[i++] = NULL;
fork_child( cmd, args );
/*
* generate the attribute indexes
*/
i = 0;
sprintf( cmd, "%s/%s", sbindir, INDEXCMD );
args[i++] = cmd;
args[i++] = "-i";
args[i++] = inputfile;
args[i++] = "-f";
args[i++] = tailorfile;
args[i++] = "-n";
sprintf( buf2, "%d", dbnum+1 );
args[i++] = buf2;
if ( ldap_debug ) {
sprintf( buf3, "%d", ldap_debug );
args[i++] = "-d";
args[i++] = buf3;
}
args[i++] = NULL; /* will hold the attribute name */
args[i++] = NULL;
id = 0;
stop = 0;
buf = NULL;
lineno = 0;
lcur = lmax = 0;
vals[0] = &bv;
vals[1] = NULL;
while ( ! stop ) {
char *type, *val, *s;
int vlen, indexmask, syntaxmask;
Datum key, data;
ldbm_datum_init( key );
ldbm_datum_init( data );
if ( fgets( line, sizeof(line), stdin ) != NULL ) {
int len;
lineno++;
len = strlen( line );
while ( lcur + len + 1 > lmax ) {
lmax += BUFSIZ;
buf = (char *) ch_realloc( buf, lmax );
}
strcpy( buf + lcur, line );
lcur += len;
} else {
stop = 1;
}
if ( line[0] == '\n' || stop && buf && *buf ) {
id++;
s = buf;
elineno = 0;
while ( (linep = ldif_getline( &s )) != NULL ) {
elineno++;
if ( ldif_parse_line( linep, &type, &val, &vlen )
!= 0 ) {
Debug( LDAP_DEBUG_PARSE,
"bad line %d in entry ending at line %d ignored\n",
elineno, lineno, 0 );
continue;
}
if ( !isascii( *type ) || isdigit( *type ) )
continue;
type = strdup( type );
if ( avl_insert( &avltypes, type, strcasecmp,
avl_dup_error ) != 0 ) {
free( type );
} else {
attr_masks( be->be_private, type,
&indexmask, &syntaxmask );
if ( indexmask ) {
args[i - 2] = type;
fork_child( cmd, args );
}
}
}
*buf = '\0';
lcur = 0;
}
}
slap_shutdown(dbnum);
wait4kids( -1 );
slap_destroy();
exit( 0 );
}
static void
fork_child( char *prog, char *args[] )
{
int status, pid;
wait4kids( maxkids );
switch ( pid = fork() ) {
case 0: /* child */
execvp( prog, args );
fprintf( stderr, "%s: ", prog );
perror( "execv" );
exit( -1 );
break;
case -1: /* trouble */
fprintf( stderr, "Could not fork to run %s\n", prog );
perror( "fork" );
break;
default: /* parent */
nkids++;
break;
}
}
static void
wait4kids( int nkidval )
{
int status;
unsigned char *p;
while ( nkids >= nkidval ) {
wait( &status );
p = (unsigned char *) &status;
if ( p[sizeof(int) - 1] == 0177 ) {
fprintf( stderr,
"stopping: child stopped with signal %d\n",
p[sizeof(int) - 2] );
} else if ( p[sizeof(int) - 1] != 0 ) {
fprintf( stderr,
"stopping: child terminated with signal %d\n",
p[sizeof(int) - 1] );
exit( p[sizeof(int) - 1] );
} else if ( p[sizeof(int) - 2] != 0 ) {
fprintf( stderr,
"stopping: child exited with status %d\n",
p[sizeof(int) - 2] );
exit( p[sizeof(int) - 2] );
} else {
nkids--;
}
}
}

View File

@ -2,12 +2,23 @@
## COPYING RESTRICTIONS APPLY, see COPYRIGHT file
##
## tests Makefile.in for OpenLDAP
BUILD_BDB2 = @BUILD_BDB2@
bdb2-local: FORCE
@if [ "$(BUILD_BDB2)" = "yes" ]; then \
@-$(LN_S) $(srcdir)/data .; \
echo "Initiating LDAP tests..."; \
$(MKDIR) test-db test-repl ; \
$(srcdir)/scripts/all $(srcdir) bdb2;\
else \
echo "run configure with --enable-bdb2"; \
fi
all-local: FORCE
@-$(LN_S) $(srcdir)/data .
@echo "Initiating LDAP tests..."; \
$(MKDIR) test-db test-repl ; \
$(srcdir)/scripts/all $(srcdir)
$(srcdir)/scripts/all $(srcdir) ldbm
clean-local: FORCE
$(RM) test-db/[!C]* test-repl/[!C]* *core

View File

@ -0,0 +1,41 @@
#
# master slapd config -- for testing
#
include ./data/slapd.at.conf
include ./data/slapd.oc.conf
schemacheck off
pidfile ./test-db/slapd.pid
argsfile ./test-db/slapd.args
#######################################################################
# ldbm database definitions
#######################################################################
backend bdb2
home ./test-db
database bdb2
suffix "o=University of Michigan, c=US"
directory ./test-db
rootdn "cn=Manager, o=University of Michigan, c=US"
rootpw secret
index cn,sn,uid pres,eq,approx
index default none
lastmod on
defaultaccess none
access to attr=objectclass
by * read
access to attr=userpassword
by self write
by * compare
access to dn=".*,ou=Alumni Association,ou=People,o=University of Michigan,c=US"
by dn=".*,o=University of Michigan,c=US"
read
by * none
access to attr=member
by dnattr=member selfwrite
by * read
access to filter="objectclass=rfc822mailgroup"
by dn="Bjorn Jensen,ou=Information Technology Division,ou=People,o=University of Michigan,c=US" write
by * read
access to * by * read

View File

@ -0,0 +1,25 @@
#
# master slapd config -- for testing
#
include ./data/slapd.at.conf
include ./data/slapd.oc.conf
schemacheck on
pidfile ./test-db/slapd.pid
argsfile ./test-db/slapd.args
#######################################################################
# ldbm database definitions
#######################################################################
backend bdb2
home ./test-db
database bdb2
cachesize 4
suffix "o=University of Michigan, c=US"
directory ./test-db
rootdn "cn=Manager, o=University of Michigan, c=US"
rootpw secret
index cn,sn,uid pres,eq,approx
index default none
lastmod on

View File

@ -0,0 +1,32 @@
#
# master slapd config -- for testing of replication
#
include ./data/slapd.at.conf
include ./data/slapd.oc.conf
schemacheck off
pidfile ./test-db/slapd.pid
argsfile ./test-db/slapd.args
#######################################################################
# ldbm database definitions
#######################################################################
backend bdb2
home ./test-db
database bdb2
suffix "o=University of Michigan, c=US"
directory ./test-db
rootdn "cn=Manager, o=University of Michigan, c=US"
rootpw secret
index cn,sn,uid pres,eq,approx
index default none
# index default pres,eq,approx
lastmod on
replogfile ./test-db/slapd.replog
replica host=localhost:9010
binddn="cn=Manager, o=University of Michigan, c=US"
bindmethod=simple
credentials=secret

View File

@ -0,0 +1,27 @@
#
# master slapd config -- for testing of replication
#
include ./data/slapd.at.conf
include ./data/slapd.oc.conf
schemacheck off
pidfile ./test-repl/slapd.pid
argsfile ./test-repl/slapd.args
#######################################################################
# ldbm database definitions
#######################################################################
backend bdb2
home ./test-db
database bdb2
suffix "o=University of Michigan, c=US"
directory ./test-repl
rootdn "cn=Manager, o=University of Michigan, c=US"
rootpw secret
updatedn "cn=Manager, o=University of Michigan, c=US"
index cn,sn,uid pres,eq,approx
index default none
# index default pres,eq,approx
lastmod on
dbcachenowsync

View File

@ -10,12 +10,20 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
echo ">>>>> Test Directory: $SRCDIR"
if [ $# -eq 1 ]; then
BDB2=$1; shift
if [ "$BDB2" == "ldbm" ]; then
echo ">>>>> LDBM mode"
else
echo ">>>>> BDB2 mode"
fi
fi
for CMD in $SRCDIR/scripts/test*; do
echo ">>>>> Starting `basename $CMD` ..."
$CMD $SRCDIR
$CMD $SRCDIR $BDB2
RC=$?
if [ $RC -eq 0 ]; then
echo ">>>>> $CMD completed OK."

View File

@ -1,6 +1,28 @@
if [ $# -eq 0 ]; then
SRCDIR="."
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
DATADIR=$SRCDIR/data
LDIF2LDBM=../servers/slapd/tools/ldif2ldbm
if [ $BDB2 == "bdb2" ]; then
LDIF2LDBM=../servers/slapd/tools/ldif2ldbm-bdb2
CONF=$DATADIR/slapd-bdb2-master.conf
ACLCONF=$DATADIR/slapd-bdb2-acl.conf
MASTERCONF=$DATADIR/slapd-bdb2-repl-master.conf
SLAVECONF=$DATADIR/slapd-bdb2-repl-slave.conf
else
LDIF2LDBM=../servers/slapd/tools/ldif2ldbm
CONF=$DATADIR/slapd-master.conf
ACLCONF=$DATADIR/slapd-acl.conf
MASTERCONF=$DATADIR/slapd-repl-master.conf
SLAVECONF=$DATADIR/slapd-repl-slave.conf
fi
SLAPD=../servers/slapd/slapd
SLURPD=../servers/slurpd/slurpd
LDAPSEARCH=../clients/tools/ldapsearch
@ -11,10 +33,6 @@ PORT=9009
SLAVEPORT=9010
DBDIR=./test-db
REPLDIR=./test-repl
CONF=$DATADIR/slapd-master.conf
ACLCONF=$DATADIR/slapd-acl.conf
MASTERCONF=$DATADIR/slapd-repl-master.conf
SLAVECONF=$DATADIR/slapd-repl-slave.conf
LDIF=$DATADIR/test.ldif
LDIFORDERED=$DATADIR/test-ordered.ldif
BASEDN="o=University of Michigan, c=US"

View File

@ -5,10 +5,13 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
echo "running defines.sh $SRCDIR"
echo "running defines.sh $SRCDIR $BDB2"
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
echo "Datadir is $DATADIR"

View File

@ -5,10 +5,13 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
echo "running defines.sh $SRCDIR"
echo "running defines.sh $SRCDIR $BDB2"
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
echo "Datadir is $DATADIR"

View File

@ -5,8 +5,11 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
echo "Cleaning up in $DBDIR..."

View File

@ -5,8 +5,11 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
echo "Cleaning up in $DBDIR..."

View File

@ -5,8 +5,11 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
echo "Cleaning up in $DBDIR..."

View File

@ -5,8 +5,11 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
echo "modrdn test not yet written"
exit 0

View File

@ -5,8 +5,11 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
echo "Cleaning up in $DBDIR..."

View File

@ -15,8 +15,11 @@ if [ $# -eq 0 ]; then
else
SRCDIR=$1; shift
fi
if [ $# -eq 1 ]; then
BDB2=$1; shift
fi
. $SRCDIR/scripts/defines.sh $SRCDIR
. $SRCDIR/scripts/defines.sh $SRCDIR $BDB2
if test ! -x $SLURPD ; then
echo ">>>>> $SLURPD is not executable or do not exist."