IndexScan* createIndexScanSimpleRange(BSONObj startKey, BSONObj endKey) { IndexCatalog* catalog = _coll->getIndexCatalog(); std::vector<IndexDescriptor*> indexes; catalog->findIndexesByKeyPattern(&_opCtx, BSON("x" << 1), false, &indexes); ASSERT_EQ(indexes.size(), 1U); // We are not testing indexing here so use maximal bounds IndexScanParams params(&_opCtx, *indexes[0]); params.bounds.isSimpleRange = true; params.bounds.startKey = startKey; params.bounds.endKey = endKey; params.bounds.boundInclusion = BoundInclusion::kIncludeBothStartAndEndKeys; params.direction = 1; // This child stage gets owned and freed by the caller. MatchExpression* filter = NULL; return new IndexScan(&_opCtx, params, &_ws, filter); }
IndexScan* createIndexScan(BSONObj startKey, BSONObj endKey, bool startInclusive, bool endInclusive, int direction = 1) { IndexCatalog* catalog = _coll->getIndexCatalog(); std::vector<IndexDescriptor*> indexes; catalog->findIndexesByKeyPattern(&_opCtx, BSON("x" << 1), false, &indexes); ASSERT_EQ(indexes.size(), 1U); IndexScanParams params(&_opCtx, *indexes[0]); params.direction = direction; OrderedIntervalList oil("x"); BSONObjBuilder bob; bob.appendAs(startKey.firstElement(), ""); bob.appendAs(endKey.firstElement(), ""); oil.intervals.push_back(Interval(bob.obj(), startInclusive, endInclusive)); params.bounds.fields.push_back(oil); MatchExpression* filter = NULL; return new IndexScan(&_opCtx, params, &_ws, filter); }
Status verifySystemIndexes(OperationContext* opCtx) { const NamespaceString& systemUsers = AuthorizationManager::usersCollectionNamespace; const NamespaceString& systemRoles = AuthorizationManager::rolesCollectionNamespace; AutoGetDb autoDb(opCtx, systemUsers.db(), MODE_X); if (!autoDb.getDb()) { return Status::OK(); } Collection* collection = autoDb.getDb()->getCollection(opCtx, systemUsers); if (collection) { IndexCatalog* indexCatalog = collection->getIndexCatalog(); invariant(indexCatalog); // Make sure the old unique index from v2.4 on system.users doesn't exist. std::vector<IndexDescriptor*> indexes; indexCatalog->findIndexesByKeyPattern(opCtx, v1SystemUsersKeyPattern, false, &indexes); if (!indexes.empty()) { fassert(ErrorCodes::AmbiguousIndexKeyPattern, indexes.size() == 1); return Status(ErrorCodes::AuthSchemaIncompatible, "Old 2.4 style user index identified. " "The authentication schema needs to be updated by " "running authSchemaUpgrade on a 2.6 server."); } // Ensure that system indexes exist for the user collection indexCatalog->findIndexesByKeyPattern(opCtx, v3SystemUsersKeyPattern, false, &indexes); if (indexes.empty()) { try { generateSystemIndexForExistingCollection( opCtx, collection, systemUsers, v3SystemUsersIndexSpec); } catch (...) { return exceptionToStatus(); } } } // Ensure that system indexes exist for the roles collection, if it exists. collection = autoDb.getDb()->getCollection(opCtx, systemRoles); if (collection) { IndexCatalog* indexCatalog = collection->getIndexCatalog(); invariant(indexCatalog); std::vector<IndexDescriptor*> indexes; indexCatalog->findIndexesByKeyPattern(opCtx, v3SystemRolesKeyPattern, false, &indexes); if (indexes.empty()) { try { generateSystemIndexForExistingCollection( opCtx, collection, systemRoles, v3SystemRolesIndexSpec); } catch (...) { return exceptionToStatus(); } } } // Ensure that system indexes exist for the sessions collection, if it exists. collection = autoDb.getDb()->getCollection(opCtx, sessionCollectionNamespace); if (collection) { IndexCatalog* indexCatalog = collection->getIndexCatalog(); invariant(indexCatalog); std::vector<IndexDescriptor*> indexes; indexCatalog->findIndexesByKeyPattern(opCtx, v1SystemSessionsKeyPattern, false, &indexes); if (indexes.empty()) { try { generateSystemIndexForExistingCollection( opCtx, collection, sessionCollectionNamespace, v1SystemSessionsIndexSpec); } catch (...) { return exceptionToStatus(); } } } return Status::OK(); }