From: Howard Chu Date: Fri, 19 Aug 2011 00:17:43 +0000 (-0700) Subject: More for slap tools X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c42651541579501cc320345b87f1f014eff7d7c1;p=thirdparty%2Fopenldap.git More for slap tools --- diff --git a/servers/slapd/back-mdb/attr.c b/servers/slapd/back-mdb/attr.c index 86cdd598eb..2fd40aea84 100644 --- a/servers/slapd/back-mdb/attr.c +++ b/servers/slapd/back-mdb/attr.c @@ -33,7 +33,7 @@ int 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 ) { @@ -84,7 +84,7 @@ mdb_attr_mask( 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 @@ -124,7 +124,7 @@ mdb_attr_index_config( } if( indexes == NULL ) { - mask = mdb->bi_defaultmask; + mask = mdb->mi_defaultmask; } else { mask = 0; @@ -172,7 +172,7 @@ mdb_attr_index_config( #endif if( strcasecmp( attrs[i], "default" ) == 0 ) { - mdb->bi_defaultmask |= mask; + mdb->mi_defaultmask |= mask; continue; } @@ -281,7 +281,7 @@ mdb_attr_index_config( #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 { @@ -317,7 +317,7 @@ mdb_attr_index_config( #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 @@ -383,12 +383,12 @@ mdb_attr_index_unparse( struct mdb_info *mdb, BerVarray *bva ) { 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; ibi_nattrs; i++ ) - mdb_attr_index_unparser( mdb->bi_attrs[i], bva ); + for ( i=0; imi_nattrs; i++ ) + mdb_attr_index_unparser( mdb->mi_attrs[i], bva ); } void @@ -405,10 +405,10 @@ mdb_attr_index_destroy( struct mdb_info *mdb ) { int i; - for ( i=0; ibi_nattrs; i++ ) - mdb_attr_info_free( mdb->bi_attrs[i] ); + for ( i=0; imi_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 ) @@ -417,10 +417,10 @@ 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 (; ibi_nattrs; i++) - mdb->bi_attrs[i] = mdb->bi_attrs[i+1]; + mdb_attr_info_free( mdb->mi_attrs[i] ); + mdb->mi_nattrs--; + for (; imi_nattrs; i++) + mdb->mi_attrs[i] = mdb->mi_attrs[i+1]; } } @@ -428,13 +428,13 @@ void mdb_attr_flush( struct mdb_info *mdb ) { int i; - for ( i=0; ibi_nattrs; i++ ) { - if ( mdb->bi_attrs[i]->ai_indexmask & MDB_INDEX_DELETING ) { + for ( i=0; imi_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; jbi_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; jmi_nattrs; j++) + mdb->mi_attrs[j] = mdb->mi_attrs[j+1]; i--; } } diff --git a/servers/slapd/back-mdb/back-mdb.h b/servers/slapd/back-mdb/back-mdb.h index b32c8b9e3d..abe0eefb27 100644 --- a/servers/slapd/back-mdb/back-mdb.h +++ b/servers/slapd/back-mdb/back-mdb.h @@ -40,6 +40,9 @@ LDAP_BEGIN_DECL #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; diff --git a/servers/slapd/back-mdb/config.c b/servers/slapd/back-mdb/config.c index d23c3388c5..d40fba973f 100644 --- a/servers/slapd/back-mdb/config.c +++ b/servers/slapd/back-mdb/config.c @@ -59,7 +59,7 @@ static ConfigTable mdbcfg[] = { "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 }, diff --git a/servers/slapd/back-mdb/delete.c b/servers/slapd/back-mdb/delete.c index 99a9fd4a13..d0981b3626 100644 --- a/servers/slapd/back-mdb/delete.c +++ b/servers/slapd/back-mdb/delete.c @@ -503,14 +503,6 @@ retry: /* transaction retry */ 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"; diff --git a/servers/slapd/back-mdb/dn2id.c b/servers/slapd/back-mdb/dn2id.c index 3031113379..6f53ec3edd 100644 --- a/servers/slapd/back-mdb/dn2id.c +++ b/servers/slapd/back-mdb/dn2id.c @@ -428,6 +428,17 @@ mdb_dn2id_children( 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 diff --git a/servers/slapd/back-mdb/init.c b/servers/slapd/back-mdb/init.c index dcda605025..f3dbe6751b 100644 --- a/servers/slapd/back-mdb/init.c +++ b/servers/slapd/back-mdb/init.c @@ -55,6 +55,8 @@ mdb_db_init( BackendDB *be, ConfigReply *cr ) 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; @@ -119,15 +121,13 @@ mdb_db_open( BackendDB *be, ConfigReply *cr ) 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 ); @@ -257,27 +257,25 @@ mdb_db_close( BackendDB *be, ConfigReply *cr ) 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 ) { @@ -291,6 +289,9 @@ mdb_db_close( BackendDB *be, ConfigReply *cr ) mdb->mi_dbenv = NULL; } + free( mdb->mi_databases ); + mdb->mi_databases = NULL; + return 0; } @@ -399,6 +400,7 @@ mdb_back_initialize( 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; @@ -413,7 +415,9 @@ mdb_back_initialize( 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; @@ -427,9 +431,11 @@ mdb_back_initialize( 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; diff --git a/servers/slapd/back-mdb/monitor.c b/servers/slapd/back-mdb/monitor.c index f629b2134e..a922d294cf 100644 --- a/servers/slapd/back-mdb/monitor.c +++ b/servers/slapd/back-mdb/monitor.c @@ -31,9 +31,7 @@ static ObjectClass *oc_olmMDBDatabase; -static AttributeDescription *ad_olmMDBEntryCache, - *ad_olmMDBDNCache, *ad_olmMDBIDLCache, - *ad_olmDbDirectory; +static AttributeDescription *ad_olmDbDirectory; #ifdef MDB_MONITOR_IDX static int @@ -71,30 +69,6 @@ static struct { 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 " @@ -123,14 +97,11 @@ static struct { } 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 */ @@ -153,24 +124,6 @@ mdb_monitor_update( 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 */ @@ -231,8 +184,6 @@ mdb_monitor_free( return SLAP_CB_CONTINUE; } -#define mdb_monitor_initialize MDB_SYMBOL(monitor_initialize) - /* * call from within mdb_initialize() */ @@ -258,7 +209,7 @@ mdb_monitor_initialize( void ) /* 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]; @@ -320,8 +271,8 @@ mdb_monitor_db_init( BackendDB *be ) } #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; @@ -367,7 +318,7 @@ mdb_monitor_db_open( BackendDB *be ) } /* 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; @@ -377,27 +328,11 @@ mdb_monitor_db_open( BackendDB *be ) 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 ); @@ -453,9 +388,9 @@ mdb_monitor_db_open( BackendDB *be ) 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 ); } @@ -473,7 +408,7 @@ cleanup:; } /* 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 */ @@ -492,18 +427,18 @@ mdb_monitor_db_close( BackendDB *be ) { 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; @@ -519,8 +454,8 @@ mdb_monitor_db_destroy( BackendDB *be ) 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; @@ -607,16 +542,16 @@ mdb_monitor_idx_add( 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: @@ -631,7 +566,7 @@ mdb_monitor_idx_add( idx->idx_count[ key ]++; } - ldap_pvt_thread_mutex_unlock( &mdb->bi_idx_mutex ); + ldap_pvt_thread_mutex_unlock( &mdb->mi_idx_mutex ); return rc; } @@ -694,12 +629,12 @@ mdb_monitor_idx_entry_add( 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 ) { diff --git a/servers/slapd/back-mdb/nextid.c b/servers/slapd/back-mdb/nextid.c index 9e95819edc..b62ad15c03 100644 --- a/servers/slapd/back-mdb/nextid.c +++ b/servers/slapd/back-mdb/nextid.c @@ -21,60 +21,39 @@ #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; } diff --git a/servers/slapd/back-mdb/proto-mdb.h b/servers/slapd/back-mdb/proto-mdb.h index 28b80467cc..6b62482f2d 100644 --- a/servers/slapd/back-mdb/proto-mdb.h +++ b/servers/slapd/back-mdb/proto-mdb.h @@ -107,6 +107,13 @@ int mdb_dn2id_parent( 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; /* diff --git a/servers/slapd/back-mdb/tools.c b/servers/slapd/back-mdb/tools.c index 6fbd223c86..4b9e6e73a9 100644 --- a/servers/slapd/back-mdb/tools.c +++ b/servers/slapd/back-mdb/tools.c @@ -335,7 +335,6 @@ mdb_tool_entry_get( BackendDB *be, ID id ) return e; } -#if 0 static int mdb_tool_next_id( Operation *op, MDB_txn *tid, @@ -346,7 +345,7 @@ static int mdb_tool_next_id( 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) { @@ -354,9 +353,8 @@ static int mdb_tool_next_id( 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 ); @@ -374,24 +372,23 @@ static int mdb_tool_next_id( * 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 ) { @@ -410,7 +407,7 @@ static int mdb_tool_next_id( } else if ( !hole ) { unsigned i, j; - e->e_id = ei->bei_id; + e->e_id = id; for ( i=0; ie_id ) { @@ -427,6 +424,7 @@ static int mdb_tool_next_id( return rc; } +#if 0 static int mdb_tool_index_add( Operation *op, @@ -529,13 +527,11 @@ ID mdb_tool_entry_put( 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 ) @@ -569,6 +565,7 @@ done: 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)",