SRCS = init.c tools.c config.c \
add.c bind.c compare.c delete.c modify.c modrdn.c search.c \
extended.c referral.c operational.c \
- attr.c index.c key.c dbcache.c filterindex.c \
+ attr.c index.c key.c filterindex.c \
dn2entry.c dn2id.c error.c id2entry.c idl.c \
nextid.c monitor.c
OBJS = init.lo tools.lo config.lo \
add.lo bind.lo compare.lo delete.lo modify.lo modrdn.lo search.lo \
extended.lo referral.lo operational.lo \
- attr.lo index.lo key.lo dbcache.lo filterindex.lo \
+ attr.lo index.lo key.lo filterindex.lo \
dn2entry.lo dn2id.lo error.lo id2entry.lo idl.lo \
nextid.lo monitor.lo mdb.lo midl.lo
return i < 0 ? NULL : mdb->mi_attrs[i];
}
+/* Open all un-opened index DB handles */
+int
+mdb_attr_dbs_open(
+ BackendDB *be, MDB_txn *tx0, ConfigReply *cr )
+{
+ struct mdb_info *mdb = (struct mdb_info *) be->be_private;
+ MDB_txn *txn;
+ int i, flags;
+ int rc;
+
+ txn = tx0;
+ if ( txn == NULL ) {
+ rc = mdb_txn_begin( mdb->mi_dbenv, 0, &txn );
+ if ( rc ) {
+ snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": "
+ "txn_begin failed: %s (%d).",
+ be->be_suffix[0].bv_val, mdb_strerror(rc), rc );
+ Debug( LDAP_DEBUG_ANY,
+ LDAP_XSTRING(mdb_attr_dbs) ": %s\n",
+ cr->msg, 0, 0 );
+ return rc;
+ }
+ }
+
+ flags = MDB_DUPSORT|MDB_DUPFIXED|MDB_INTEGERDUP;
+ if ( !(slapMode & SLAP_TOOL_READONLY) )
+ flags |= MDB_CREATE;
+
+ for ( i=0; i<mdb->mi_nattrs; i++ ) {
+ if ( mdb->mi_attrs[i]->ai_dbi ) /* already open */
+ continue;
+ rc = mdb_open( txn, mdb->mi_attrs[i]->ai_desc->ad_type->sat_cname.bv_val,
+ flags, &mdb->mi_attrs[i]->ai_dbi );
+ if ( rc ) {
+ snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": "
+ "mdb_open(%s) failed: %s (%d).",
+ be->be_suffix[0].bv_val,
+ mdb->mi_attrs[i]->ai_desc->ad_type->sat_cname.bv_val,
+ mdb_strerror(rc), rc );
+ Debug( LDAP_DEBUG_ANY,
+ LDAP_XSTRING(mdb_attr_dbs) ": %s\n",
+ cr->msg, 0, 0 );
+ break;
+ }
+ }
+
+ /* Only commit if this is our txn */
+ if ( tx0 == NULL ) {
+ if ( !rc ) {
+ rc = mdb_txn_commit( txn );
+ if ( rc ) {
+ snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": "
+ "txn_commit failed: %s (%d).",
+ be->be_suffix[0].bv_val, mdb_strerror(rc), rc );
+ Debug( LDAP_DEBUG_ANY,
+ LDAP_XSTRING(mdb_attr_dbs) ": %s\n",
+ cr->msg, 0, 0 );
+ }
+ } else {
+ mdb_txn_abort( txn );
+ }
+ }
+
+ return rc;
+}
+
+void
+mdb_attr_dbs_close(
+ struct mdb_info *mdb,
+ MDB_txn *txn
+)
+{
+ int i;
+ for ( i=0; i<mdb->mi_nattrs; i++ )
+ if ( mdb->mi_attrs[i]->ai_dbi )
+ mdb_close( txn, mdb->mi_attrs[i]->ai_dbi );
+}
+
int
mdb_attr_index_config(
struct mdb_info *mdb,
/* Default to 10MB max */
#define DEFAULT_MAPSIZE (10*1048576)
-struct mdb_db_info {
- struct berval mdi_name;
- MDB_dbi mdi_dbi;
-};
-
#ifdef LDAP_DEVEL
#define MDB_MONITOR_IDX
#endif /* LDAP_DEVEL */
size_t mi_mapsize;
- int mi_ndatabases;
- int mi_db_opflags; /* db-specific flags */
- struct mdb_db_info **mi_databases;
- ldap_pvt_thread_mutex_t mi_database_mutex;
-
slap_mask_t mi_defaultmask;
struct mdb_attrinfo **mi_attrs;
int mi_nattrs;
int mi_flags;
#define MDB_IS_OPEN 0x01
+#define MDB_OPEN_INDEX 0x02
#define MDB_DEL_INDEX 0x08
#define MDB_RE_OPEN 0x10
+
+ MDB_dbi mi_dbis[MDB_NDB];
};
-#define mi_id2entry mi_databases[MDB_ID2ENTRY]
-#define mi_dn2id mi_databases[MDB_DN2ID]
-#define mi_ad2id mi_databases[MDB_AD2ID]
+#define mi_id2entry mi_dbis[MDB_ID2ENTRY]
+#define mi_dn2id mi_dbis[MDB_DN2ID]
+#define mi_ad2id mi_dbis[MDB_AD2ID]
struct mdb_op_info {
OpExtra moi_oe;
ComponentReference* ai_cr; /*component indexing*/
#endif
int ai_idx; /* position in AI array */
+ MDB_dbi ai_dbi;
} AttrInfo;
/* These flags must not clash with SLAP_INDEX flags or ops in slap.h! */
{
struct re_s *rtask = arg;
struct mdb_info *mdb = rtask->arg;
-
+
mdb_env_sync( mdb->mi_dbenv, 0 );
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
DBTzero( &key );
DBTzero( &data );
-
+
id = 1;
key.data = &nid;
key.size = key.ulen = sizeof(ID);
break;
rc = TXN_BEGIN( mdb->bi_dbenv, NULL, &txn, mdb->bi_db_opflags );
- if ( rc )
+ if ( rc )
break;
if ( getnext ) {
getnext = 0;
mdb_attr_flush( mdb );
mdb->mi_flags ^= MDB_DEL_INDEX;
}
-
+
if ( mdb->mi_flags & MDB_RE_OPEN ) {
mdb->mi_flags ^= MDB_RE_OPEN;
rc = c->be->bd_info->bi_db_close( c->be, &c->reply );
rc = LDAP_OTHER;
}
}
+
+ if ( mdb->mi_flags & MDB_OPEN_INDEX ) {
+ rc = mdb_attr_dbs_open( c->be, NULL, &c->reply );
+ if ( rc )
+ rc = LDAP_OTHER;
+ }
return rc;
}
if ( mdb->mi_dbenv_flags & MDB_NOSYNC )
c->value_int = 1;
break;
-
+
case MDB_INDEX:
mdb_attr_index_unparse( mdb, &c->rvalue_vals );
if ( !c->rvalue_vals ) rc = 1;
c->argc - 1, &c->argv[1], &c->reply);
if( rc != LDAP_SUCCESS ) return 1;
+ c->cleanup = mdb_cf_cleanup;
+ mdb->mi_flags |= MDB_OPEN_INDEX;
if (( mdb->mi_flags & MDB_IS_OPEN ) && !mdb->mi_index_task ) {
/* Start the task as soon as we finish here. Set a long
* interval (10 hours) so that it only gets scheduled once.
+++ /dev/null
-/* dbcache.c - manage cache of open databases */
-/* $OpenLDAP$ */
-/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
- *
- * Copyright 2000-2011 The OpenLDAP Foundation.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted only as authorized by the OpenLDAP
- * Public License.
- *
- * A copy of this license is available in the file LICENSE in the
- * top-level directory of the distribution or, alternatively, at
- * <http://www.OpenLDAP.org/license.html>.
- */
-
-#include "portable.h"
-
-#include <stdio.h>
-
-#include <ac/errno.h>
-#include <ac/socket.h>
-#include <ac/string.h>
-#include <ac/time.h>
-#include <sys/stat.h>
-
-#include "slap.h"
-#include "back-mdb.h"
-
-int
-mdb_db_cache(
- Backend *be,
- struct berval *name,
- MDB_dbi *dbout )
-{
- int i, flags;
- int rc;
- struct mdb_info *mdb = (struct mdb_info *) be->be_private;
- struct mdb_db_info *db;
- char *file;
-
- *dbout = 0;
-
- for( i=MDB_NDB; i < mdb->mi_ndatabases; i++ ) {
- if( !ber_bvcmp( &mdb->mi_databases[i]->mdi_name, name) ) {
- *dbout = mdb->mi_databases[i]->mdi_dbi;
- return 0;
- }
- }
-
- ldap_pvt_thread_mutex_lock( &mdb->mi_database_mutex );
-
- /* check again! may have been added by another thread */
- for( i=MDB_NDB; i < mdb->mi_ndatabases; i++ ) {
- if( !ber_bvcmp( &mdb->mi_databases[i]->mdi_name, name) ) {
- *dbout = mdb->mi_databases[i]->mdi_dbi;
- ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex );
- return 0;
- }
- }
-
- if( i >= MDB_INDICES ) {
- ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex );
- return -1;
- }
-
- db = (struct mdb_db_info *) ch_calloc(1, sizeof(struct mdb_db_info));
-
- ber_dupbv( &db->mdi_name, name );
-
- rc = db_create( &db->mdi_dbi, mdb->mi_dbenv, 0 );
- if( rc != 0 ) {
- Debug( LDAP_DEBUG_ANY,
- "mdb_db_cache: db_create(%s) failed: %s (%d)\n",
- mdb->mi_dbenv_home, mdb_strerror(rc), rc );
- ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex );
- ch_free( db );
- return rc;
- }
-
- file = ch_malloc( db->mdi_name.bv_len + sizeof(MDB_SUFFIX) );
- strcpy( file, db->mdi_name.bv_val );
- strcpy( file+db->mdi_name.bv_len, MDB_SUFFIX );
-
-#ifdef HAVE_EBCDIC
- __atoe( file );
-#endif
- flags = DB_CREATE | DB_THREAD;
-#ifdef DB_AUTO_COMMIT
- if ( !( slapMode & SLAP_TOOL_QUICK ))
- flags |= DB_AUTO_COMMIT;
-#endif
- /* Cannot Truncate when Transactions are in use */
- if ( (slapMode & (SLAP_TOOL_QUICK|SLAP_TRUNCATE_MODE)) ==
- (SLAP_TOOL_QUICK|SLAP_TRUNCATE_MODE))
- flags |= DB_TRUNCATE;
-
- rc = DB_OPEN( db->mdi_dbi,
- file, NULL /* name */,
- MDB_INDEXTYPE, mdb->mi_db_opflags | flags, mdb->mi_dbenv_mode );
-
- ch_free( file );
-
- if( rc != 0 ) {
- Debug( LDAP_DEBUG_ANY,
- "mdb_db_cache: db_open(%s) failed: %s (%d)\n",
- name->bv_val, mdb_strerror(rc), rc );
- ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex );
- return rc;
- }
-
- mdb->mi_databases[i] = db;
- mdb->mi_ndatabases = i+1;
-
- *dbout = db->mdi_dbi;
-
- ldap_pvt_thread_mutex_unlock( &mdb->mi_database_mutex );
- return 0;
-}
Entry *e )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
- MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_dn2id;
MDB_val key, data;
ID nid;
int rc, rlen, nrlen;
Entry *e )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
- MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_dn2id;
MDB_val key, data;
diskNode *d;
int rc, nrlen;
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
MDB_cursor *cursor;
- MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_dn2id;
MDB_val key, data;
int rc = 0, nrlen;
diskNode *d;
return rc;
}
+/* return IDs from root to parent of DN */
+int
+mdb_dn2sups(
+ Operation *op,
+ MDB_txn *txn,
+ struct berval *in,
+ ID *ids )
+{
+ struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
+ MDB_cursor *cursor;
+ MDB_dbi dbi = mdb->mi_dn2id;
+ MDB_val key, data;
+ int rc = 0, nrlen;
+ diskNode *d;
+ char *ptr;
+ ID pid, nid;
+ struct berval tmp;
+
+ Debug( LDAP_DEBUG_TRACE, "=> mdb_dn2sups(\"%s\")\n", in->bv_val, 0, 0 );
+
+ if ( !in->bv_len ) {
+ goto done;
+ }
+
+ tmp = *in;
+
+ nrlen = tmp.bv_len - op->o_bd->be_nsuffix[0].bv_len;
+ tmp.bv_val += nrlen;
+ tmp.bv_len = op->o_bd->be_nsuffix[0].bv_len;
+ nid = 0;
+ key.mv_size = sizeof(ID);
+
+ rc = mdb_cursor_open( txn, dbi, &cursor );
+ if ( rc ) return rc;
+
+ for (;;) {
+ key.mv_data = &pid;
+ pid = nid;
+
+ data.mv_size = sizeof(diskNode) + tmp.bv_len;
+ d = op->o_tmpalloc( data.mv_size, op->o_tmpmemctx );
+ d->nrdnlen[1] = tmp.bv_len & 0xff;
+ d->nrdnlen[0] = (tmp.bv_len >> 8) | 0x80;
+ ptr = lutil_strncopy( d->nrdn, tmp.bv_val, tmp.bv_len );
+ *ptr = '\0';
+ data.mv_data = d;
+ rc = mdb_cursor_get( cursor, &key, &data, MDB_GET_BOTH );
+ op->o_tmpfree( d, op->o_tmpmemctx );
+ if ( rc ) {
+ mdb_cursor_close( cursor );
+ break;
+ }
+ ptr = (char *) data.mv_data + data.mv_size - sizeof(ID);
+ memcpy( &nid, ptr, sizeof(ID));
+
+ if ( pid )
+ mdb_idl_insert( ids, pid );
+
+ if ( tmp.bv_val > in->bv_val ) {
+ for (ptr = tmp.bv_val - 2; ptr > in->bv_val &&
+ !DN_SEPARATOR(*ptr); ptr--) /* empty */;
+ if ( ptr >= in->bv_val ) {
+ if (DN_SEPARATOR(*ptr)) ptr++;
+ tmp.bv_len = tmp.bv_val - ptr - 1;
+ tmp.bv_val = ptr;
+ }
+ } else {
+ break;
+ }
+ }
+
+done:
+ if( rc != 0 ) {
+ Debug( LDAP_DEBUG_TRACE, "<= mdb_dn2sups: get failed: %s (%d)\n",
+ mdb_strerror( rc ), rc, 0 );
+ }
+
+ return rc;
+}
+
#if 0
int
mdb_dn2id_parent(
Entry *e )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
- MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_dn2id;
MDB_val key, data;
MDB_cursor *cursor;
int rc;
struct berval *nname )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
- MDB_dbi dbi = mdb->mi_dn2id->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_dn2id;
MDB_val key, data;
MDB_cursor *cursor;
int rc, len, nlen;
MDB_IDL_ZERO( ids );
if ( mra->ma_rule == slap_schema.si_mr_distinguishedNameMatch ) {
+base:
rc = mdb_dn2id( op, rtxn, &mra->ma_value, &id, NULL );
if ( rc == MDB_SUCCESS ) {
mdb_idl_insert( ids, id );
op->o_bd->be_nsuffix )) {
int scope;
if ( mra->ma_rule == slap_schema.si_mr_dnSuperiorMatch ) {
- struct berval pdn;
- dnParent( &mra->ma_value, &pdn );
- rc = mdb_dn2id( op, rtxn, &pdn, &id, NULL );
- if ( rc == MDB_SUCCESS ) {
- while ( ei && ei->bei_id ) {
- mdb_idl_insert( ids, ei->bei_id );
- ei = ei->bei_parent;
- }
- }
+ mdb_dn2sups( op, rtxn, &mra->ma_value, ids );
return 0;
}
if ( mra->ma_rule == slap_schema.si_mr_dnSubtreeMatch )
else if ( mra->ma_rule == slap_schema.si_mr_dnSubordinateMatch )
scope = LDAP_SCOPE_SUBORDINATE;
else
- scope = LDAP_SCOPE_BASE;
+ goto base; /* scope = LDAP_SCOPE_BASE; */
+#if 0
if ( scope > LDAP_SCOPE_BASE ) {
ei = NULL;
rc = mdb_cache_find_ndn( op, rtxn, &mra->ma_value, &ei );
}
return 0;
}
+#endif
}
}
ID *ids,
ID *tmp )
{
- struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
MDB_dbi dbi;
int i;
int rc;
int flag )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
- MDB_dbi dbi = mdb->mi_id2entry->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_id2entry;
MDB_val key, data;
struct berval bv;
int rc;
Entry **e )
{
struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
- MDB_dbi dbi = mdb->mi_id2entry->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_id2entry;
MDB_val key, data;
EntryHeader eh;
int rc = 0;
Entry *e )
{
struct mdb_info *mdb = (struct mdb_info *) be->be_private;
- MDB_dbi dbi = mdb->mi_id2entry->mdi_dbi;
+ MDB_dbi dbi = mdb->mi_id2entry;
MDB_val key;
int rc;
struct berval *prefixp )
{
AttrInfo *ai;
- int rc;
slap_mask_t mask, type = 0;
- MDB_dbi dbi;
ai = mdb_index_mask( be, desc, prefixp );
}
mask = ai->ai_indexmask;
- rc = mdb_db_cache( be, prefixp, &dbi );
-
- if( rc != LDAP_SUCCESS ) {
- return rc;
- }
-
switch( ftype ) {
case LDAP_FILTER_PRESENT:
type = SLAP_INDEX_PRESENT;
return LDAP_INAPPROPRIATE_MATCHING;
done:
- *dbip = dbi;
+ *dbip = ai->ai_dbi;
*maskp = mask;
return LDAP_SUCCESS;
}
static int indexer(
Operation *op,
MDB_txn *txn,
+ MDB_dbi dbi,
AttributeDescription *ad,
struct berval *atname,
BerVarray vals,
slap_mask_t mask )
{
int rc, i;
- MDB_dbi dbi;
struct berval *keys;
assert( mask != 0 );
- rc = mdb_db_cache( op->o_bd, atname, &dbi );
-
- if ( rc != LDAP_SUCCESS ) {
- Debug( LDAP_DEBUG_ANY,
- "mdb_index_read: Could not open DB %s\n",
- atname->bv_val, 0, 0 );
- return LDAP_OTHER;
- }
-
if( IS_SLAP_INDEX( mask, SLAP_INDEX_PRESENT ) ) {
rc = mdb_key_change( op->o_bd, txn, dbi, &presence_key, id, opid );
if( rc ) {
if ( ai->ai_cr ) {
ComponentReference *cr;
for( cr = ai->ai_cr ; cr ; cr = cr->cr_next ) {
- rc = indexer( op, txn, cr->cr_ad, &type->sat_cname,
+ rc = indexer( op, txn, ai->ai_dbi, cr->cr_ad, &type->sat_cname,
cr->cr_nvals, id, ixop,
cr->cr_indexmask );
}
*/
mask = ai->ai_newmask ? ai->ai_newmask : ai->ai_indexmask;
if( mask ) {
- rc = indexer( op, txn, ad, &type->sat_cname,
+ rc = indexer( op, txn, ai->ai_dbi, ad, &type->sat_cname,
vals, id, ixop, mask );
if( rc ) return rc;
else
mask = ai->ai_newmask ? ai->ai_newmask : ai->ai_indexmask;
if ( mask ) {
- rc = indexer( op, txn, desc, &desc->ad_cname,
+ rc = indexer( op, txn, ai->ai_dbi, desc, &desc->ad_cname,
vals, id, ixop, mask );
if( rc ) {
if ( !ir->ai ) continue;
while (( al = ir->attrs )) {
ir->attrs = al->next;
- rc = indexer( op, NULL, ir->ai->ai_desc,
+ rc = indexer( op, NULL, ir->ai->ai_dbi, ir->ai->ai_desc,
&ir->ai->ai_desc->ad_type->sat_cname,
al->attr->a_nvals, id, SLAP_INDEX_ADD_OP,
ir->ai->ai_indexmask );
mdb->mi_mapsize = DEFAULT_MAPSIZE;
- ldap_pvt_thread_mutex_init( &mdb->mi_database_mutex );
-
be->be_private = mdb;
be->be_cf_ocs = be->bd_info->bi_cf_ocs;
{
int rc, i;
struct mdb_info *mdb = (struct mdb_info *) be->be_private;
- struct stat stat1, stat2;
+ struct stat stat1;
u_int32_t flags;
- char path[MAXPATHLEN];
char *dbhome;
- Entry *e = NULL;
MDB_txn *txn;
if ( be->be_suffix == NULL ) {
goto fail;
}
- mdb->mi_databases = (struct mdb_db_info **) ch_malloc(
- MDB_INDICES * sizeof(struct mdb_db_info *) );
-
rc = mdb_txn_begin( mdb->mi_dbenv, 0, &txn );
if ( rc ) {
Debug( LDAP_DEBUG_ANY,
/* open (and create) main databases */
for( i = 0; mdmi_databases[i].bv_val; i++ ) {
- struct mdb_db_info *db;
-
- db = (struct mdb_db_info *) ch_calloc(1, sizeof(struct mdb_db_info));
-
flags = MDB_INTEGERKEY;
if( i == MDB_ID2ENTRY ) {
if ( !(slapMode & (SLAP_TOOL_READMAIN|SLAP_TOOL_READONLY) ))
rc = mdb_open( txn,
mdmi_databases[i].bv_val,
flags,
- &db->mdi_dbi );
+ &mdb->mi_dbis[i] );
if ( rc != 0 ) {
snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": "
}
if ( i == MDB_DN2ID )
- mdb_set_dupsort( txn, db->mdi_dbi, mdb_dup_compare );
+ mdb_set_dupsort( txn, mdb->mi_dbis[i], mdb_dup_compare );
- db->mdi_name = mdmi_databases[i];
- mdb->mi_databases[i] = db;
+ }
+
+ rc = mdb_attr_dbs_open( be, txn, cr );
+ if ( rc ) {
+ mdb_txn_abort( txn );
+ goto fail;
}
rc = mdb_txn_commit(txn);
goto fail;
}
- mdb->mi_databases[i] = NULL;
- mdb->mi_ndatabases = i;
-
/* monitor setup */
rc = mdb_monitor_db_open( be );
if ( rc != 0 ) {
{
int rc;
struct mdb_info *mdb = (struct mdb_info *) be->be_private;
- struct mdb_db_info *db;
MDB_txn *txn;
/* monitor handling */
#endif
if ( mdb->mi_dbenv ) {
- if ( mdb->mi_ndatabases ) {
+ if ( mdb->mi_dbis[0] ) {
+ int i;
rc = mdb_txn_begin( mdb->mi_dbenv, 1, &txn );
- while( mdb->mi_databases && mdb->mi_ndatabases-- ) {
- db = mdb->mi_databases[mdb->mi_ndatabases];
- mdb_close( txn, db->mdi_dbi );
- /* Lower numbered names are not strdup'd */
- if( mdb->mi_ndatabases >= MDB_NDB )
- free( db->mdi_name.bv_val );
- free( db );
- }
+ mdb_attr_dbs_close( mdb, txn );
+ for ( i=0; i<MDB_NDB; i++ )
+ mdb_close( txn, mdb->mi_dbis[i] );
+
mdb_txn_abort( txn );
/* force a sync */
mdb->mi_dbenv = NULL;
}
- free( mdb->mi_databases );
- mdb->mi_databases = NULL;
-
return 0;
}
mdb_attr_index_destroy( mdb );
- ldap_pvt_thread_mutex_destroy( &mdb->mi_database_mutex );
-
ch_free( mdb );
be->be_private = NULL;
MDB_cursor *cursor;
/* Get a read cursor */
- rc = mdb_cursor_open( tid, mdb->mi_id2entry->mdi_dbi, &cursor );
+ rc = mdb_cursor_open( tid, mdb->mi_id2entry, &cursor );
if (rc == 0) {
rc = mdb_cursor_get(cursor, &key, NULL, MDB_LAST);
int mdb_attr_slot( struct mdb_info *mdb,
AttributeDescription *desc, int *insert );
+int mdb_attr_dbs_open( BackendDB *be, MDB_txn *txn, struct config_reply_s *cr );
+void mdb_attr_dbs_close( struct mdb_info *mdb, MDB_txn *txn );
+
int mdb_attr_index_config LDAP_P(( struct mdb_info *mdb,
const char *fname, int lineno,
int argc, char **argv, struct config_reply_s *cr ));
int mdb_back_init_cf( BackendInfo *bi );
-/*
- * dbcache.c
- */
-
-int
-mdb_db_cache(
- Backend *be,
- struct berval *name,
- MDB_dbi *dbi );
-
/*
* dn2entry.c
*/
MDB_txn *tid,
Entry *e );
+int mdb_dn2sups (
+ Operation *op,
+ MDB_txn *tid,
+ struct berval *dn,
+ ID *sups
+ );
+
int mdb_dn2idl(
Operation *op,
MDB_txn *txn,
static MDB_val key, data;
static EntryHeader eh;
static ID previd = NOID;
-static char ehbuf[16];
typedef struct dn_id {
ID id;
static unsigned nhmax = HOLE_SIZE;
static unsigned nholes;
-static int index_nattrs;
-
static struct berval *tool_base;
static int tool_scope;
static Filter *tool_filter;
static Entry *tool_next_entry;
+#if 0
static ID mdb_tool_ix_id;
static Operation *mdb_tool_ix_op;
static int *mdb_tool_index_threads, mdb_tool_index_tcount;
static ldap_pvt_thread_mutex_t mdb_tool_index_mutex;
static ldap_pvt_thread_cond_t mdb_tool_index_cond_main;
static ldap_pvt_thread_cond_t mdb_tool_index_cond_work;
+static void * mdb_tool_index_task( void *ctx, void *ptr );
+#endif
static int mdb_writes, mdb_writes_per_commit;
-static void * mdb_tool_index_task( void *ctx, void *ptr );
-
static int
mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep );
int mdb_tool_entry_open(
BackendDB *be, int mode )
{
- struct mdb_info *mdb = (struct mdb_info *) be->be_private;
-
/* In Quick mode, commit once per 1000 entries */
mdb_writes = 0;
if ( slapMode & SLAP_TOOL_QUICK )
rc = mdb_txn_begin( mdb->mi_dbenv, 1, &txn );
if ( rc )
return NOID;
- rc = mdb_cursor_open( txn, mdb->mi_id2entry->mdi_dbi, &cursor );
+ rc = mdb_cursor_open( txn, mdb->mi_id2entry, &cursor );
if ( rc ) {
mdb_txn_abort( txn );
return NOID;
mdb_tool_entry_get_int( BackendDB *be, ID id, Entry **ep )
{
Entry *e = NULL;
- char *dptr;
- int rc, eoff;
struct berval dn = BER_BVNULL, ndn = BER_BVNULL;
+ int rc;
assert( be != NULL );
assert( slapMode & SLAP_TOOL_MODE );
}
if ( slapMode & SLAP_TOOL_READONLY ) {
- struct mdb_info *mdb = (struct mdb_info *) be->be_private;
Operation op = {0};
Opheader ohdr = {0};