From 92593d1af174244ba5560be29908b4f729fec78c Mon Sep 17 00:00:00 2001 From: Andy Schwerin Date: Thu, 26 Mar 2015 16:40:28 -0400 Subject: SERVER-17758 Move AutoGet* and Client::*Context to their own file. The new file is mongo/db/db_raii.h. Also, Client::Context is now OldClientContext and Client::WriteContext is OldClientWriteContext. --- src/mongo/db/client.h | 168 -------------------------------------------------- 1 file changed, 168 deletions(-) (limited to 'src/mongo/db/client.h') diff --git a/src/mongo/db/client.h b/src/mongo/db/client.h index b83ce05c9c0..bd3f83667a5 100644 --- a/src/mongo/db/client.h +++ b/src/mongo/db/client.h @@ -40,7 +40,6 @@ #include #include "mongo/bson/optime.h" -#include "mongo/db/catalog/database.h" #include "mongo/db/client_basic.h" #include "mongo/db/concurrency/d_concurrency.h" #include "mongo/db/lasterror.h" @@ -61,100 +60,6 @@ namespace mongo { typedef long long ConnectionId; - /** - * RAII-style class, which acquires a lock on the specified database in the requested mode and - * obtains a reference to the database. Used as a shortcut for calls to dbHolder().get(). - * - * It is guaranteed that locks will be released when this object goes out of scope, therefore - * the database reference returned by this class should not be retained. - * - * TODO: This should be moved outside of client.h (maybe dbhelpers.h) - */ - class AutoGetDb { - MONGO_DISALLOW_COPYING(AutoGetDb); - public: - AutoGetDb(OperationContext* txn, StringData ns, LockMode mode); - - Database* getDb() const { - return _db; - } - - private: - const Lock::DBLock _dbLock; - Database* const _db; - }; - - /** - * RAII-style class, which acquires a lock on the specified database in the requested mode and - * obtains a reference to the database, creating it was non-existing. Used as a shortcut for - * calls to dbHolder().openDb(), taking care of locking details. The requested mode must be - * MODE_IX or MODE_X. If the database needs to be created, the lock will automatically be - * reacquired as MODE_X. - * - * It is guaranteed that locks will be released when this object goes out of scope, therefore - * the database reference returned by this class should not be retained. - * - * TODO: This should be moved outside of client.h (maybe dbhelpers.h) - */ - class AutoGetOrCreateDb { - MONGO_DISALLOW_COPYING(AutoGetOrCreateDb); - public: - AutoGetOrCreateDb(OperationContext* txn, StringData ns, LockMode mode); - - Database* getDb() const { - return _db; - } - - bool justCreated() const { - return _justCreated; - } - - Lock::DBLock& lock() { return _dbLock; } - - private: - ScopedTransaction _transaction; - Lock::DBLock _dbLock; // not const, as we may need to relock for implicit create - Database* _db; - bool _justCreated; - }; - - /** - * RAII-style class, which would acquire the appropritate hierarchy of locks for obtaining - * a particular collection and would retrieve a reference to the collection. - * - * It is guaranteed that locks will be released when this object goes out of scope, therefore - * database and collection references returned by this class should not be retained. - * - * TODO: This should be moved outside of client.h (maybe dbhelpers.h) - */ - class AutoGetCollectionForRead { - MONGO_DISALLOW_COPYING(AutoGetCollectionForRead); - public: - AutoGetCollectionForRead(OperationContext* txn, const std::string& ns); - AutoGetCollectionForRead(OperationContext* txn, const NamespaceString& nss); - ~AutoGetCollectionForRead(); - - Database* getDb() const { - return _db.getDb(); - } - - Collection* getCollection() const { - return _coll; - } - - private: - void _init(const std::string& ns, - StringData coll); - - const Timer _timer; - OperationContext* const _txn; - const ScopedTransaction _transaction; - const AutoGetDb _db; - const Lock::CollectionLock _collLock; - - Collection* _coll; - }; - typedef unordered_set ClientSet; /** the database's concept of an outside "client" */ @@ -269,79 +174,6 @@ namespace mongo { // Tracks if Client::shutdown() gets called (TODO: Is this necessary?) bool _shutdown; - - public: - - /** - * Opens the database that we want to use and sets the appropriate namespace on the - * current operation. - */ - class Context { - MONGO_DISALLOW_COPYING(Context); - public: - /** this is probably what you want */ - Context(OperationContext* txn, const std::string& ns, bool doVersion = true); - - /** - * Below still calls _finishInit, but assumes database has already been acquired - * or just created. - */ - Context(OperationContext* txn, - const std::string& ns, - Database* db, - bool justCreated); - - /** - * note: this does not call _finishInit -- i.e., does not call - * ensureShardVersionOKOrThrow for example. - * see also: reset(). - */ - Context(OperationContext* txn, const std::string& ns, Database * db); - - ~Context(); - - Database* db() const { return _db; } - const char* ns() const { return _ns.c_str(); } - - /** @return if the db was created by this Context */ - bool justCreated() const { return _justCreated; } - - private: - friend class CurOp; - void _finishInit(); - void _checkNotStale() const; - - bool _justCreated; - bool _doVersion; - const std::string _ns; - Database * _db; - OperationContext* _txn; - - Timer _timer; - }; // class Client::Context - - - class WriteContext { - MONGO_DISALLOW_COPYING(WriteContext); - public: - WriteContext(OperationContext* opCtx, const std::string& ns); - - Database* db() const { return _c.db(); } - - Collection* getCollection() const { - return _c.db()->getCollection(_nss.ns()); - } - - private: - OperationContext* const _txn; - const NamespaceString _nss; - - AutoGetOrCreateDb _autodb; - Lock::CollectionLock _collk; - Context _c; - Collection* _collection; - }; - }; /** get the Client object for this thread. */ -- cgit v1.2.1