ClientCursor::ClientCursor(int queryOptions, const shared_ptr<Cursor>& c, const string& ns, BSONObj query ) : _ns(ns), _db( cc().database() ), _c(c), _pos(0), _query(query), _queryOptions(queryOptions), _idleAgeMillis(0), _pinValue(0), _doingDeletes(false), _yieldSometimesTracker(128,10) { Lock::assertAtLeastReadLocked(ns); verify( _db ); verify( str::startsWith(_ns, _db->name) ); if( queryOptions & QueryOption_NoCursorTimeout ) noTimeout(); recursive_scoped_lock lock(ccmutex); _cursorid = allocCursorId_inlock(); clientCursorsById.insert( make_pair(_cursorid, this) ); if ( ! _c->modifiedKeys() ) { // store index information so we can decide if we can // get something out of the index key rather than full object int x = 0; BSONObjIterator i( _c->indexKeyPattern() ); while ( i.more() ) { BSONElement e = i.next(); if ( e.isNumber() ) { // only want basic index fields, not "2d" etc _indexedFields[e.fieldName()] = x; } x++; } } }
ClientCursor::ClientCursor(int queryOptions, const shared_ptr<Cursor>& c, const string& ns, BSONObj query, const bool inMultiStatementTxn, bool createCursorID ) : _cursorid(INVALID_CURSOR_ID), _ns(ns), _db( cc().database() ), _c(c), _pos(0), _query(query), _queryOptions(queryOptions), _slaveReadTillTS(0), _idleAgeMillis(0), _pinValue(0), _partOfMultiStatementTxn(inMultiStatementTxn) { Lock::assertAtLeastReadLocked(ns); verify( _db ); verify( str::startsWith(_ns, _db->name()) ); if( queryOptions & QueryOption_NoCursorTimeout ) noTimeout(); if ( ! _c->modifiedKeys() ) { // store index information so we can decide if we can // get something out of the index key rather than full object int x = 0; BSONObjIterator i( _c->indexKeyPattern() ); while ( i.more() ) { BSONElement e = i.next(); if ( e.isNumber() ) { // only want basic index fields, not "2d" etc _indexedFields[e.fieldName()] = x; } x++; } } if (createCursorID) { initCursorID(); } }