diff options
author | Kyle Suarez <kyle.suarez@mongodb.com> | 2016-06-24 15:36:49 -0400 |
---|---|---|
committer | Kyle Suarez <kyle.suarez@mongodb.com> | 2016-07-07 10:35:40 -0400 |
commit | e39c46b27f4ae58f96b685dd625b0165761fee0d (patch) | |
tree | 147d97c8a4989f50e4fe40c0a82b765b4a14aa76 /src/mongo/db/db_raii.cpp | |
parent | 21e0ff71b1693f42e1b44885a57de3b7b3cdacba (diff) | |
download | mongo-e39c46b27f4ae58f96b685dd625b0165761fee0d.tar.gz |
SERVER-24766 implement basic views library
Adds the basic infrastructure for read-only non-materialized views, as well as
the ability to create them (but not use them).
Views are disabled by default unless mongod is given the setParameter
enableViews=1.
Diffstat (limited to 'src/mongo/db/db_raii.cpp')
-rw-r--r-- | src/mongo/db/db_raii.cpp | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/src/mongo/db/db_raii.cpp b/src/mongo/db/db_raii.cpp index 945dee16aab..160de246216 100644 --- a/src/mongo/db/db_raii.cpp +++ b/src/mongo/db/db_raii.cpp @@ -46,16 +46,18 @@ AutoGetDb::AutoGetDb(OperationContext* txn, StringData ns, LockMode mode) AutoGetCollection::AutoGetCollection(OperationContext* txn, const NamespaceString& nss, - LockMode modeAll) - : AutoGetCollection(txn, nss, modeAll, modeAll) {} - -AutoGetCollection::AutoGetCollection(OperationContext* txn, - const NamespaceString& nss, LockMode modeDB, - LockMode modeColl) - : _autoDb(txn, nss.db(), modeDB), + LockMode modeColl, + ViewMode viewMode) + : _viewMode(viewMode), + _autoDb(txn, nss.db(), modeDB), _collLock(txn->lockState(), nss.ns(), modeColl), - _coll(_autoDb.getDb() ? _autoDb.getDb()->getCollection(nss) : nullptr) {} + _coll(_autoDb.getDb() ? _autoDb.getDb()->getCollection(nss) : nullptr) { + Database* db = _autoDb.getDb(); + if (_viewMode == ViewMode::kViewsForbidden && db && db->getViewCatalog()->lookup(nss.ns())) + uasserted(ErrorCodes::CommandNotSupportedOnView, + str::stream() << "Namespace " << nss.ns() << " is a view, not a collection"); +} AutoGetOrCreateDb::AutoGetOrCreateDb(OperationContext* txn, StringData ns, LockMode mode) : _transaction(txn, MODE_IX), @@ -73,14 +75,13 @@ AutoGetOrCreateDb::AutoGetOrCreateDb(OperationContext* txn, StringData ns, LockM } } -AutoGetCollectionForRead::AutoGetCollectionForRead(OperationContext* txn, const std::string& ns) - : AutoGetCollectionForRead(txn, NamespaceString(ns)) {} - AutoGetCollectionForRead::AutoGetCollectionForRead(OperationContext* txn, - const NamespaceString& nss) + const NamespaceString& nss, + AutoGetCollection::ViewMode viewMode) : _txn(txn), _transaction(txn, MODE_IS) { { - _autoColl.emplace(txn, nss, MODE_IS); + _autoColl.emplace(txn, nss, MODE_IS, MODE_IS, viewMode); + auto curOp = CurOp::get(_txn); stdx::lock_guard<Client> lk(*_txn->getClient()); @@ -153,6 +154,18 @@ void AutoGetCollectionForRead::_ensureMajorityCommittedSnapshotIsValid(const Nam } } +AutoGetCollectionOrViewForRead::AutoGetCollectionOrViewForRead(OperationContext* txn, + const NamespaceString& nss) + : AutoGetCollectionForRead(txn, nss, AutoGetCollection::ViewMode::kViewsPermitted), + _view(_autoColl->getDb() ? _autoColl->getDb()->getViewCatalog()->lookup(nss.ns()) : nullptr) { +} + +void AutoGetCollectionOrViewForRead::releaseLocksForView() noexcept { + invariant(_view); + _view = nullptr; + _autoColl = boost::none; +} + OldClientContext::OldClientContext(OperationContext* txn, const std::string& ns, Database* db, |