void run() { NamespaceDetails* nsd = nsdetails( _ns ); // _id_ is at 0, so nIndexes == 1 IndexCatalog::IndexBuildBlock* a = halfAddIndex("a"); IndexCatalog::IndexBuildBlock* b = halfAddIndex("b"); IndexCatalog::IndexBuildBlock* c = halfAddIndex("c"); IndexCatalog::IndexBuildBlock* d = halfAddIndex("d"); int offset = nsd->findIndexByName( "b_1", true ); ASSERT_EQUALS(2, offset); delete b; ASSERT_EQUALS(2, nsd->findIndexByName( "c_1", true ) ); ASSERT_EQUALS(3, nsd->findIndexByName( "d_1", true ) ); offset = nsd->findIndexByName( "d_1", true ); delete d; ASSERT_EQUALS(2, nsd->findIndexByName( "c_1", true ) ); ASSERT( nsd->findIndexByName( "d_1", true ) < 0 ); offset = nsd->findIndexByName( "a_1", true ); delete a; ASSERT_EQUALS(1, nsd->findIndexByName( "c_1", true )); delete c; }
Status Database::renameCollection( const StringData& fromNS, const StringData& toNS, bool stayTemp ) { // move data namespace Status s = _renameSingleNamespace( fromNS, toNS, stayTemp ); if ( !s.isOK() ) return s; NamespaceDetails* details = _namespaceIndex.details( toNS ); verify( details ); // move index namespaces string indexName = _name + ".system.indexes"; BSONObj oldIndexSpec; while( Helpers::findOne( indexName, BSON( "ns" << fromNS ), oldIndexSpec ) ) { oldIndexSpec = oldIndexSpec.getOwned(); BSONObj newIndexSpec; { BSONObjBuilder b; BSONObjIterator i( oldIndexSpec ); while( i.more() ) { BSONElement e = i.next(); if ( strcmp( e.fieldName(), "ns" ) != 0 ) b.append( e ); else b << "ns" << toNS; } newIndexSpec = b.obj(); } DiskLoc newIndexSpecLoc = theDataFileMgr.insert( indexName.c_str(), newIndexSpec.objdata(), newIndexSpec.objsize(), false, true, false ); int indexI = details->findIndexByName( oldIndexSpec.getStringField( "name" ) ); IndexDetails &indexDetails = details->idx(indexI); string oldIndexNs = indexDetails.indexNamespace(); indexDetails.info = newIndexSpecLoc; string newIndexNs = indexDetails.indexNamespace(); Status s = _renameSingleNamespace( oldIndexNs, newIndexNs, false ); if ( !s.isOK() ) return s; deleteObjects( indexName.c_str(), oldIndexSpec, true, false, true ); } Top::global.collectionDropped( fromNS.toString() ); return Status::OK(); }