]> git.sur5r.net Git - openldap/commitdiff
More for slap tools
authorHoward Chu <hyc@openldap.org>
Fri, 19 Aug 2011 00:17:43 +0000 (17:17 -0700)
committerHoward Chu <hyc@openldap.org>
Fri, 19 Aug 2011 00:17:43 +0000 (17:17 -0700)
servers/slapd/back-mdb/attr.c
servers/slapd/back-mdb/back-mdb.h
servers/slapd/back-mdb/config.c
servers/slapd/back-mdb/delete.c
servers/slapd/back-mdb/dn2id.c
servers/slapd/back-mdb/init.c
servers/slapd/back-mdb/monitor.c
servers/slapd/back-mdb/nextid.c
servers/slapd/back-mdb/proto-mdb.h
servers/slapd/back-mdb/tools.c

index 86cdd598ebe2fd40ba3164ac00cc61722d345b40..2fd40aea84b31fe56b92c6c068983f9f39354a99 100644 (file)
@@ -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; 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
@@ -405,10 +405,10 @@ mdb_attr_index_destroy( struct mdb_info *mdb )
 {
        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 )
@@ -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 (; 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];
        }
 }
 
@@ -428,13 +428,13 @@ void mdb_attr_flush( struct mdb_info *mdb )
 {
        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--;
                }
        }
index b32c8b9e3d87d14ff33f5dd125337c0bd488d7b4..abe0eefb27e6834d65aa0018bc311a589f8c1763 100644 (file)
@@ -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;
index d23c3388c51499dcee37f29d0e33494b4c2707df..d40fba973f51f27e229eb08cc1225b4bd6dfbb0d 100644 (file)
@@ -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 },
index 99a9fd4a132874c83723dabbd1a60850f426d636..d0981b3626bc55003910e964992f381710cfd8b9 100644 (file)
@@ -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";
index 3031113379cb1eee03537d99eb274e50fa3eeb69..6f53ec3edd892515cc0ca2ebbff1413f4f443fd7 100644 (file)
@@ -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
index dcda6050258d3f0ce2cca5b2c142c5a08302e331..f3dbe6751b6f8efa6f8e1d97e4f22b8fbac49e32 100644 (file)
@@ -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;
index f629b2134e04e99d02a07dc3dfe00a1c8b305c83..a922d294cf7afe63fafb015f593fd2b258d737d3 100644 (file)
@@ -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 ) {
index 9e95819edcdda480e6208209f942e587d7632a5a..b62ad15c03f8e0423fd33079bf89da2aac50cd41 100644 (file)
 
 #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;
 }
index 28b80467cce2bff0aaa55f7b9a67082f1ece8c03..6b62482f2d8aa8c2d0af2fcc009725e30522d053 100644 (file)
@@ -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;
 
 /*
index 6fbd223c8622830a17e11030987caa7cadcea579..4b9e6e73a9df456a90b1bdcd45a06a96b649190c 100644 (file)
@@ -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; i<nholes; i++) {
                        if ( holes[i].id == e->e_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)",