mdb_attr_slot( struct mdb_info *mdb, AttributeDescription *ad, int *ins )
{
unsigned base = 0, cursor = 0;
- unsigned n = mdb->bi_nattrs;
+ unsigned n = mdb->mi_nattrs;
int val = 0;
while ( 0 < n ) {
AttributeDescription *desc )
{
int i = mdb_attr_slot( mdb, desc, NULL );
- return i < 0 ? NULL : mdb->bi_attrs[i];
+ return i < 0 ? NULL : mdb->mi_attrs[i];
}
int
}
if( indexes == NULL ) {
- mask = mdb->bi_defaultmask;
+ mask = mdb->mi_defaultmask;
} else {
mask = 0;
#endif
if( strcasecmp( attrs[i], "default" ) == 0 ) {
- mdb->bi_defaultmask |= mask;
+ mdb->mi_defaultmask |= mask;
continue;
}
#endif
a->ai_desc = ad;
- if ( mdb->bi_flags & MDB_IS_OPEN ) {
+ if ( mdb->mi_flags & MDB_IS_OPEN ) {
a->ai_indexmask = 0;
a->ai_newmask = mask;
} else {
#endif
rc = ainfo_insert( mdb, a );
if( rc ) {
- if ( mdb->bi_flags & MDB_IS_OPEN ) {
+ if ( mdb->mi_flags & MDB_IS_OPEN ) {
AttrInfo *b = mdb_attr_mask( mdb, ad );
/* If there is already an index defined for this attribute
* it must be replaced. Otherwise we end up with multiple
{
int i;
- if ( mdb->bi_defaultmask ) {
- aidef.ai_indexmask = mdb->bi_defaultmask;
+ if ( mdb->mi_defaultmask ) {
+ aidef.ai_indexmask = mdb->mi_defaultmask;
mdb_attr_index_unparser( &aidef, bva );
}
- for ( i=0; i<mdb->bi_nattrs; i++ )
- mdb_attr_index_unparser( mdb->bi_attrs[i], bva );
+ for ( i=0; i<mdb->mi_nattrs; i++ )
+ mdb_attr_index_unparser( mdb->mi_attrs[i], bva );
}
void
{
int i;
- for ( i=0; i<mdb->bi_nattrs; i++ )
- mdb_attr_info_free( mdb->bi_attrs[i] );
+ for ( i=0; i<mdb->mi_nattrs; i++ )
+ mdb_attr_info_free( mdb->mi_attrs[i] );
- free( mdb->bi_attrs );
+ free( mdb->mi_attrs );
}
void mdb_attr_index_free( struct mdb_info *mdb, AttributeDescription *ad )
i = mdb_attr_slot( mdb, ad, NULL );
if ( i >= 0 ) {
- mdb_attr_info_free( mdb->bi_attrs[i] );
- mdb->bi_nattrs--;
- for (; i<mdb->bi_nattrs; i++)
- mdb->bi_attrs[i] = mdb->bi_attrs[i+1];
+ mdb_attr_info_free( mdb->mi_attrs[i] );
+ mdb->mi_nattrs--;
+ for (; i<mdb->mi_nattrs; i++)
+ mdb->mi_attrs[i] = mdb->mi_attrs[i+1];
}
}
{
int i;
- for ( i=0; i<mdb->bi_nattrs; i++ ) {
- if ( mdb->bi_attrs[i]->ai_indexmask & MDB_INDEX_DELETING ) {
+ for ( i=0; i<mdb->mi_nattrs; i++ ) {
+ if ( mdb->mi_attrs[i]->ai_indexmask & MDB_INDEX_DELETING ) {
int j;
- mdb_attr_info_free( mdb->bi_attrs[i] );
- mdb->bi_nattrs--;
- for (j=i; j<mdb->bi_nattrs; j++)
- mdb->bi_attrs[j] = mdb->bi_attrs[j+1];
+ mdb_attr_info_free( mdb->mi_attrs[i] );
+ mdb->mi_nattrs--;
+ for (j=i; j<mdb->mi_nattrs; j++)
+ mdb->mi_attrs[j] = mdb->mi_attrs[j+1];
i--;
}
}
#define MDB_INDICES 128
+/* Default to 10MB max */
+#define DEFAULT_MAPSIZE (10*1048576)
+
struct mdb_db_info {
struct berval mdi_name;
MDB_dbi mdi_dbi;
"DESC 'Attribute index parameters' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString )", NULL, NULL },
- { "maxsize", "size", 2, 2, 0, ARG_INT|ARG_MAGIC|MDB_MODE,
+ { "maxsize", "size", 2, 2, 0, ARG_INT|ARG_MAGIC|MDB_MAXSIZE,
mdb_cf_gen, "( OLcfgDbAt:12.1 NAME 'olcDbMaxSize' "
"DESC 'Maximum size of DB in bytes' "
"SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
eid = e->e_id;
-#if 0 /* Do we want to reclaim deleted IDs? */
- ldap_pvt_thread_mutex_lock( &mdb->bi_lastid_mutex );
- if ( e->e_id == mdb->bi_lastid ) {
- mdb_last_id( op->o_bd, ltid );
- }
- ldap_pvt_thread_mutex_unlock( &mdb->bi_lastid_mutex );
-#endif
-
if( op->o_noop ) {
if ( ( rs->sr_err = TXN_ABORT( ltid ) ) != 0 ) {
rs->sr_text = "txn_abort (no-op) failed";
return rc;
}
+int
+mdb_id2name(
+ Operation *op,
+ MDB_txn *txn,
+ ID id,
+ struct berval *name,
+ struct berval *nname )
+{
+ return 0;
+}
+
#if 0
/* mdb_dn2idl:
* We can't just use mdb_idl_fetch_key because
mdb->mi_search_stack_depth = DEFAULT_SEARCH_STACK_DEPTH;
mdb->mi_search_stack = NULL;
+ mdb->mi_mapsize = DEFAULT_MAPSIZE;
+
ldap_pvt_thread_mutex_init( &mdb->mi_database_mutex );
be->be_private = mdb;
goto fail;
}
- if ( mdb->mi_mapsize ) {
- rc = mdb_env_set_mapsize( mdb->mi_dbenv, mdb->mi_mapsize );
- if( rc != 0 ) {
- Debug( LDAP_DEBUG_ANY,
- LDAP_XSTRING(mdb_db_open) ": database \"%s\": "
- "mdb_env_set_mapsize failed: %s (%d).\n",
- be->be_suffix[0].bv_val, mdb_strerror(rc), rc );
- goto fail;
- }
+ rc = mdb_env_set_mapsize( mdb->mi_dbenv, mdb->mi_mapsize );
+ if( rc != 0 ) {
+ Debug( LDAP_DEBUG_ANY,
+ LDAP_XSTRING(mdb_db_open) ": database \"%s\": "
+ "mdb_env_set_mapsize failed: %s (%d).\n",
+ be->be_suffix[0].bv_val, mdb_strerror(rc), rc );
+ goto fail;
}
rc = mdb_env_set_maxdbs( mdb->mi_dbenv, MDB_INDICES );
mdb->mi_flags &= ~MDB_IS_OPEN;
+#if 0
if( mdb->mi_dbenv ) {
mdb_reader_flush( mdb->mi_dbenv );
}
+#endif
- 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_txn_abort( txn );
+ if ( mdb->mi_dbenv ) {
+ rc = mdb_txn_begin( mdb->mi_dbenv, 1, &txn );
- free( mdb->mi_databases );
- mdb->mi_databases = NULL;
+ 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_txn_abort( txn );
- /* close db environment */
- if( mdb->mi_dbenv ) {
/* force a sync */
rc = mdb_env_sync( mdb->mi_dbenv, 1 );
if( rc != 0 ) {
mdb->mi_dbenv = NULL;
}
+ free( mdb->mi_databases );
+ mdb->mi_databases = NULL;
+
return 0;
}
bi->bi_db_close = mdb_db_close;
bi->bi_db_destroy = mdb_db_destroy;
+#if 0
bi->bi_op_add = mdb_add;
bi->bi_op_bind = mdb_bind;
bi->bi_op_compare = mdb_compare;
bi->bi_chk_referrals = mdb_referrals;
bi->bi_operational = mdb_operational;
+
bi->bi_has_subordinates = mdb_hasSubordinates;
+#endif
bi->bi_entry_release_rw = mdb_entry_release;
bi->bi_entry_get_rw = mdb_entry_get;
bi->bi_tool_entry_next = mdb_tool_entry_next;
bi->bi_tool_entry_get = mdb_tool_entry_get;
bi->bi_tool_entry_put = mdb_tool_entry_put;
+#if 0
bi->bi_tool_entry_reindex = mdb_tool_entry_reindex;
bi->bi_tool_sync = 0;
bi->bi_tool_dn2id_get = mdb_tool_dn2id_get;
+#endif
bi->bi_tool_entry_modify = mdb_tool_entry_modify;
bi->bi_connection_init = 0;
static ObjectClass *oc_olmMDBDatabase;
-static AttributeDescription *ad_olmMDBEntryCache,
- *ad_olmMDBDNCache, *ad_olmMDBIDLCache,
- *ad_olmDbDirectory;
+static AttributeDescription *ad_olmDbDirectory;
#ifdef MDB_MONITOR_IDX
static int
char *desc;
AttributeDescription **ad;
} s_at[] = {
- { "( olmMDBAttributes:1 "
- "NAME ( 'olmMDBEntryCache' ) "
- "DESC 'Number of items in Entry Cache' "
- "SUP monitorCounter "
- "NO-USER-MODIFICATION "
- "USAGE dSAOperation )",
- &ad_olmMDBEntryCache },
-
- { "( olmMDBAttributes:2 "
- "NAME ( 'olmMDBDNCache' ) "
- "DESC 'Number of items in DN Cache' "
- "SUP monitorCounter "
- "NO-USER-MODIFICATION "
- "USAGE dSAOperation )",
- &ad_olmMDBDNCache },
-
- { "( olmMDBAttributes:3 "
- "NAME ( 'olmMDBIDLCache' ) "
- "DESC 'Number of items in IDL Cache' "
- "SUP monitorCounter "
- "NO-USER-MODIFICATION "
- "USAGE dSAOperation )",
- &ad_olmMDBIDLCache },
-
{ "( olmMDBAttributes:4 "
"NAME ( 'olmDbDirectory' ) "
"DESC 'Path name of the directory "
} s_oc[] = {
/* augments an existing object, so it must be AUXILIARY
* FIXME: derive from some ABSTRACT "monitoredEntity"? */
- { "( olmMDBObjectClasses:1 "
+ { "( olmMDBObjectClasses:2 "
"NAME ( 'olmMDBDatabase' ) "
"SUP top AUXILIARY "
"MAY ( "
- "olmMDBEntryCache "
- "$ olmMDBDNCache "
- "$ olmMDBIDLCache "
- "$ olmDbDirectory "
+ "olmDbDirectory "
#ifdef MDB_MONITOR_IDX
"$ olmMDBNotIndexed "
#endif /* MDB_MONITOR_IDX */
char buf[ BUFSIZ ];
struct berval bv;
- assert( ad_olmMDBEntryCache != NULL );
-
- a = attr_find( e->e_attrs, ad_olmMDBEntryCache );
- assert( a != NULL );
- bv.bv_val = buf;
- bv.bv_len = snprintf( buf, sizeof( buf ), "%lu", mdb->bi_cache.c_cursize );
- ber_bvreplace( &a->a_vals[ 0 ], &bv );
-
- a = attr_find( e->e_attrs, ad_olmMDBDNCache );
- assert( a != NULL );
- bv.bv_len = snprintf( buf, sizeof( buf ), "%lu", mdb->bi_cache.c_eiused );
- ber_bvreplace( &a->a_vals[ 0 ], &bv );
-
- a = attr_find( e->e_attrs, ad_olmMDBIDLCache );
- assert( a != NULL );
- bv.bv_len = snprintf( buf, sizeof( buf ), "%lu", mdb->bi_idl_cache_size );
- ber_bvreplace( &a->a_vals[ 0 ], &bv );
-
#ifdef MDB_MONITOR_IDX
mdb_monitor_idx_entry_add( mdb, e );
#endif /* MDB_MONITOR_IDX */
return SLAP_CB_CONTINUE;
}
-#define mdb_monitor_initialize MDB_SYMBOL(monitor_initialize)
-
/*
* call from within mdb_initialize()
*/
/* register schema here */
- argv[ 0 ] = "back-mdb/back-hdb monitor";
+ argv[ 0 ] = "back-mdb monitor";
c.argv = argv;
c.argc = 3;
c.fname = argv[0];
}
#ifdef MDB_MONITOR_IDX
- mdb->bi_idx = NULL;
- ldap_pvt_thread_mutex_init( &mdb->bi_idx_mutex );
+ mdb->mi_idx = NULL;
+ ldap_pvt_thread_mutex_init( &mdb->mi_idx_mutex );
#endif /* MDB_MONITOR_IDX */
return 0;
}
/* alloc as many as required (plus 1 for objectClass) */
- a = attrs_alloc( 1 + 4 );
+ a = attrs_alloc( 1 + 1 );
if ( a == NULL ) {
rc = 1;
goto cleanup;
attr_valadd( a, &oc_olmMDBDatabase->soc_cname, NULL, 1 );
next = a->a_next;
- {
- struct berval bv = BER_BVC( "0" );
-
- next->a_desc = ad_olmMDBEntryCache;
- attr_valadd( next, &bv, NULL, 1 );
- next = next->a_next;
-
- next->a_desc = ad_olmMDBDNCache;
- attr_valadd( next, &bv, NULL, 1 );
- next = next->a_next;
-
- next->a_desc = ad_olmMDBIDLCache;
- attr_valadd( next, &bv, NULL, 1 );
- next = next->a_next;
- }
-
{
struct berval bv, nbv;
ber_len_t pathlen = 0, len = 0;
char path[ MAXPATHLEN ] = { '\0' };
- char *fname = mdb->bi_dbenv_home,
+ char *fname = mdb->mi_dbenv_home,
*ptr;
len = strlen( fname );
cb->mc_private = (void *)mdb;
/* make sure the database is registered; then add monitor attributes */
- rc = mbe->register_database( be, &mdb->bi_monitor.bdm_ndn );
+ rc = mbe->register_database( be, &mdb->mi_monitor.mdm_ndn );
if ( rc == 0 ) {
- rc = mbe->register_entry_attrs( &mdb->bi_monitor.bdm_ndn, a, cb,
+ rc = mbe->register_entry_attrs( &mdb->mi_monitor.mdm_ndn, a, cb,
&dummy, 0, &dummy );
}
}
/* store for cleanup */
- mdb->bi_monitor.bdm_cb = (void *)cb;
+ mdb->mi_monitor.mdm_cb = (void *)cb;
/* we don't need to keep track of the attributes, because
* mdb_monitor_free() takes care of everything */
{
struct mdb_info *mdb = (struct mdb_info *) be->be_private;
- if ( !BER_BVISNULL( &mdb->bi_monitor.bdm_ndn ) ) {
+ if ( !BER_BVISNULL( &mdb->mi_monitor.mdm_ndn ) ) {
BackendInfo *mi = backend_info( "monitor" );
monitor_extra_t *mbe;
if ( mi && &mi->bi_extra ) {
mbe = mi->bi_extra;
- mbe->unregister_entry_callback( &mdb->bi_monitor.bdm_ndn,
- (monitor_callback_t *)mdb->bi_monitor.bdm_cb,
+ mbe->unregister_entry_callback( &mdb->mi_monitor.mdm_ndn,
+ (monitor_callback_t *)mdb->mi_monitor.mdm_cb,
NULL, 0, NULL );
}
- memset( &mdb->bi_monitor, 0, sizeof( mdb->bi_monitor ) );
+ memset( &mdb->mi_monitor, 0, sizeof( mdb->mi_monitor ) );
}
return 0;
struct mdb_info *mdb = (struct mdb_info *) be->be_private;
/* TODO: free tree */
- ldap_pvt_thread_mutex_destroy( &mdb->bi_idx_mutex );
- avl_free( mdb->bi_idx, ch_free );
+ ldap_pvt_thread_mutex_destroy( &mdb->mi_idx_mutex );
+ avl_free( mdb->mi_idx, ch_free );
#endif /* MDB_MONITOR_IDX */
return 0;
return -1;
}
- ldap_pvt_thread_mutex_lock( &mdb->bi_idx_mutex );
+ ldap_pvt_thread_mutex_lock( &mdb->mi_idx_mutex );
- idx = (monitor_idx_t *)avl_find( mdb->bi_idx,
+ idx = (monitor_idx_t *)avl_find( mdb->mi_idx,
(caddr_t)&idx_dummy, monitor_idx_cmp );
if ( idx == NULL ) {
idx = (monitor_idx_t *)ch_calloc( sizeof( monitor_idx_t ), 1 );
idx->idx_ad = desc;
idx->idx_count[ key ] = 1;
- switch ( avl_insert( &mdb->bi_idx, (caddr_t)idx,
+ switch ( avl_insert( &mdb->mi_idx, (caddr_t)idx,
monitor_idx_cmp, monitor_idx_dup ) )
{
case 0:
idx->idx_count[ key ]++;
}
- ldap_pvt_thread_mutex_unlock( &mdb->bi_idx_mutex );
+ ldap_pvt_thread_mutex_unlock( &mdb->mi_idx_mutex );
return rc;
}
a = attr_find( e->e_attrs, ad_olmMDBNotIndexed );
- ldap_pvt_thread_mutex_lock( &mdb->bi_idx_mutex );
+ ldap_pvt_thread_mutex_lock( &mdb->mi_idx_mutex );
- avl_apply( mdb->bi_idx, mdb_monitor_idx_apply,
+ avl_apply( mdb->mi_idx, mdb_monitor_idx_apply,
&vals, -1, AVL_INORDER );
- ldap_pvt_thread_mutex_unlock( &mdb->bi_idx_mutex );
+ ldap_pvt_thread_mutex_unlock( &mdb->mi_idx_mutex );
if ( vals != NULL ) {
if ( a != NULL ) {
#include "back-mdb.h"
-int mdb_next_id( BackendDB *be, ID *out )
-{
- struct mdb_info *mdb = (struct mdb_info *) be->be_private;
-
- ldap_pvt_thread_mutex_lock( &mdb->bi_lastid_mutex );
- *out = ++mdb->bi_lastid;
- ldap_pvt_thread_mutex_unlock( &mdb->bi_lastid_mutex );
-
- return 0;
-}
-
-int mdb_last_id( BackendDB *be, DB_TXN *tid )
+int mdb_next_id( BackendDB *be, MDB_txn *tid, ID *out )
{
struct mdb_info *mdb = (struct mdb_info *) be->be_private;
int rc;
ID id = 0;
- unsigned char idbuf[sizeof(ID)];
- DBT key, data;
- DBC *cursor;
-
- DBTzero( &key );
- key.flags = DB_DBT_USERMEM;
- key.data = (char *) idbuf;
- key.ulen = sizeof( idbuf );
-
- DBTzero( &data );
- data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL;
+ MDB_val key;
+ MDB_cursor *cursor;
/* Get a read cursor */
- rc = mdb->bi_id2entry->bdi_db->cursor( mdb->bi_id2entry->bdi_db,
- tid, &cursor, 0 );
+ rc = mdb_cursor_open( tid, mdb->mi_id2entry->mdi_dbi, &cursor );
if (rc == 0) {
- rc = cursor->c_get(cursor, &key, &data, DB_LAST);
- cursor->c_close(cursor);
+ rc = mdb_cursor_get(cursor, &key, NULL, MDB_LAST);
+ mdb_cursor_close(cursor);
}
switch(rc) {
- case DB_NOTFOUND:
+ case MDB_NOTFOUND:
rc = 0;
+ *out = 1;
break;
case 0:
- MDB_DISK2ID( idbuf, &id );
+ memcpy( key.mv_data, &id, sizeof( id ));
+ *out = ++id;
break;
default:
Debug( LDAP_DEBUG_ANY,
- "=> mdb_last_id: get failed: %s (%d)\n",
- db_strerror(rc), rc, 0 );
+ "=> mdb_next_id: get failed: %s (%d)\n",
+ mdb_strerror(rc), rc, 0 );
goto done;
}
- mdb->bi_lastid = id;
-
done:
return rc;
}
ID eid,
ID *idp );
+int mdb_id2name(
+ Operation *op,
+ MDB_txn *txn,
+ ID eid,
+ struct berval *name,
+ struct berval *nname);
+
MDB_cmp_func mdb_dup_compare;
/*
return e;
}
-#if 0
static int mdb_tool_next_id(
Operation *op,
MDB_txn *tid,
struct berval dn = e->e_name;
struct berval ndn = e->e_nname;
struct berval pdn, npdn;
- EntryInfo *ei = NULL, eidummy;
+ ID id, pid;
int rc;
if (ndn.bv_len == 0) {
return 0;
}
- rc = mdb_cache_find_ndn( op, tid, &ndn, &ei );
- if ( ei ) mdb_cache_entryinfo_unlock( ei );
- if ( rc == DB_NOTFOUND ) {
+ rc = mdb_dn2id( op, tid, &ndn, &id );
+ if ( rc == MDB_NOTFOUND ) {
if ( !be_issuffix( op->o_bd, &ndn ) ) {
ID eid = e->e_id;
dnParent( &dn, &pdn );
* entry gets added under the new parent ID.
*/
if ( eid != e->e_id ) {
- eidummy.bei_id = e->e_id;
- ei = &eidummy;
+ pid = e->e_id;
}
}
- rc = mdb_next_id( op->o_bd, &e->e_id );
+ rc = mdb_next_id( op->o_bd, tid, &e->e_id );
if ( rc ) {
snprintf( text->bv_val, text->bv_len,
"next_id failed: %s (%d)",
- db_strerror(rc), rc );
+ mdb_strerror(rc), rc );
Debug( LDAP_DEBUG_ANY,
"=> mdb_tool_next_id: %s\n", text->bv_val, 0, 0 );
return rc;
}
- rc = mdb_dn2id_add( op, tid, ei, e );
+ rc = mdb_dn2id_add( op, tid, pid, e );
if ( rc ) {
snprintf( text->bv_val, text->bv_len,
"dn2id_add failed: %s (%d)",
- db_strerror(rc), rc );
+ mdb_strerror(rc), rc );
Debug( LDAP_DEBUG_ANY,
"=> mdb_tool_next_id: %s\n", text->bv_val, 0, 0 );
} else if ( hole ) {
} else if ( !hole ) {
unsigned i, j;
- e->e_id = ei->bei_id;
+ e->e_id = id;
for ( i=0; i<nholes; i++) {
if ( holes[i].id == e->e_id ) {
return rc;
}
+#if 0
static int
mdb_tool_index_add(
Operation *op,
op.o_tmpmemctx = NULL;
op.o_tmpmfuncs = &ch_mfuncs;
-#if 0
/* add dn2id indices */
- rc = mdb_tool_next_id( &op, tid, e, text, 0 );
+ rc = mdb_tool_next_id( &op, txn, e, text, 0 );
if( rc != 0 ) {
goto done;
}
-#endif
#if 0
if ( !mdb->bi_linear_index )
if( rc == 0 ) {
if ( !( slapMode & SLAP_TOOL_QUICK )) {
rc = mdb_txn_commit( txn );
+ txn = NULL;
if( rc != 0 ) {
snprintf( text->bv_val, text->bv_len,
"txn_commit failed: %s (%d)",