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++; } } }
void ClientCursor::initCursorID() { { recursive_scoped_lock lock(ccmutex); _cursorid = allocCursorId_inlock(); clientCursorsById.insert( make_pair(_cursorid, this) ); } if (_partOfMultiStatementTxn) { transactions = cc().txnStack(); // This cursor is now part of a multi-statement transaction and must be // closed before that txn commits or aborts. Note it in the rollback. ClientCursorRollback &rollback = cc().txn().clientCursorRollback(); rollback.noteClientCursor(_cursorid); } }
void ClientCursor::init() { _db = cc().database(); verify( _db ); verify( _db->ownsNS( _ns ) ); isAggCursor = false; _idleAgeMillis = 0; _leftoverMaxTimeMicros = 0; _pinValue = 0; _pos = 0; Lock::assertAtLeastReadLocked(_ns); if (_queryOptions & QueryOption_NoCursorTimeout) { // cursors normally timeout after an inactivity period to prevent excess memory use // setting this prevents timeout of the cursor in question. ++_pinValue; } recursive_scoped_lock lock(ccmutex); _cursorid = allocCursorId_inlock(); clientCursorsById.insert( make_pair(_cursorid, this) ); }