summaryrefslogtreecommitdiff
path: root/src/mongo/db/db_raii.cpp
diff options
context:
space:
mode:
authorKyle Suarez <kyle.suarez@mongodb.com>2016-06-24 15:36:49 -0400
committerKyle Suarez <kyle.suarez@mongodb.com>2016-07-07 10:35:40 -0400
commite39c46b27f4ae58f96b685dd625b0165761fee0d (patch)
tree147d97c8a4989f50e4fe40c0a82b765b4a14aa76 /src/mongo/db/db_raii.cpp
parent21e0ff71b1693f42e1b44885a57de3b7b3cdacba (diff)
downloadmongo-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.cpp39
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,