Storage Engine API
database.h
Go to the documentation of this file.
1 
29 #pragma once
30 
31 #include <memory>
32 #include <string>
33 
34 #include "mongo/base/shim.h"
35 #include "mongo/base/status.h"
36 #include "mongo/base/string_data.h"
37 #include "mongo/bson/bsonobj.h"
40 #include "mongo/db/namespace_string.h"
41 #include "mongo/db/repl/optime.h"
43 #include "mongo/db/views/view.h"
44 #include "mongo/db/views/view_catalog.h"
45 #include "mongo/stdx/functional.h"
46 #include "mongo/util/mongoutils/str.h"
47 #include "mongo/util/string_map.h"
48 
49 namespace mongo {
50 
57 class Database : public Decorable<Database> {
58 public:
59  typedef StringMap<Collection*> CollectionMap;
60 
61  class Impl {
62  public:
63  virtual ~Impl() = 0;
64 
65  virtual void init(OperationContext* opCtx) = 0;
66 
67  virtual void close(OperationContext* opCtx, const std::string& reason) = 0;
68 
69  virtual const std::string& name() const = 0;
70 
71  virtual void clearTmpCollections(OperationContext* opCtx) = 0;
72 
73  virtual Status setProfilingLevel(OperationContext* opCtx, int newLevel) = 0;
74 
75  virtual int getProfilingLevel() const = 0;
76 
77  virtual const char* getProfilingNS() const = 0;
78 
79  virtual void setDropPending(OperationContext* opCtx, bool dropPending) = 0;
80 
81  virtual bool isDropPending(OperationContext* opCtx) const = 0;
82 
83  virtual void getStats(OperationContext* opCtx, BSONObjBuilder* output, double scale) = 0;
84 
85  virtual const DatabaseCatalogEntry* getDatabaseCatalogEntry() const = 0;
86 
87  virtual Status dropCollection(OperationContext* opCtx,
88  StringData fullns,
89  repl::OpTime dropOpTime) = 0;
90  virtual Status dropCollectionEvenIfSystem(OperationContext* opCtx,
91  const NamespaceString& fullns,
92  repl::OpTime dropOpTime) = 0;
93 
94  virtual Status dropView(OperationContext* opCtx, StringData fullns) = 0;
95 
96  virtual Collection* createCollection(OperationContext* opCtx,
97  StringData ns,
98  const CollectionOptions& options,
100  const BSONObj& idIndex) = 0;
101 
102  virtual Status createView(OperationContext* opCtx,
103  StringData viewName,
104  const CollectionOptions& options) = 0;
105 
106  virtual Collection* getCollection(OperationContext* opCtx, StringData ns) const = 0;
107 
108  virtual ViewCatalog* getViewCatalog() = 0;
109 
110  virtual Collection* getOrCreateCollection(OperationContext* opCtx,
111  const NamespaceString& nss) = 0;
112 
113  virtual Status renameCollection(OperationContext* opCtx,
114  StringData fromNS,
115  StringData toNS,
116  bool stayTemp) = 0;
117 
118  virtual const NamespaceString& getSystemIndexesName() const = 0;
119 
120  virtual const std::string& getSystemViewsName() const = 0;
121 
123  OperationContext* opCtx, StringData collectionNameModel) = 0;
124 
125  virtual CollectionMap& collections() = 0;
126  virtual const CollectionMap& collections() const = 0;
127  };
128 
129 public:
130  static MONGO_DECLARE_SHIM((OperationContext * opCtx)->void) dropAllDatabasesExceptLocal;
131 
138  static MONGO_DECLARE_SHIM((OperationContext * opCtx,
139  Database* db,
140  StringData ns,
142  bool createDefaultIndexes = true,
143  const BSONObj& idIndex = BSONObj())
144  ->Status) userCreateNS;
145 
147  OperationContext* opCtx,
148  StringData name,
150  PrivateTo<Database>)
151  ->std::unique_ptr<Impl>) makeImpl;
152 
156  class iterator {
157  public:
158  using iterator_category = std::forward_iterator_tag;
160  using pointer = const value_type*;
161  using reference = const value_type&;
162  using difference_type = ptrdiff_t;
163 
164  explicit inline iterator() = default;
165  inline iterator(CollectionMap::const_iterator it) : _it(std::move(it)) {}
166 
167  inline reference operator*() const {
168  return _it->second;
169  }
170 
171  inline pointer operator->() const {
172  return &_it->second;
173  }
174 
175  inline friend bool operator==(const iterator& lhs, const iterator& rhs) {
176  return lhs._it == rhs._it;
177  }
178 
179  inline friend bool operator!=(const iterator& lhs, const iterator& rhs) {
180  return !(lhs == rhs);
181  }
182 
183  inline iterator& operator++() {
184  ++_it;
185  return *this;
186  }
187 
188  inline iterator operator++(int) {
189  auto oldPosition = *this;
190  ++_it;
191  return oldPosition;
192  }
193 
194  private:
195  CollectionMap::const_iterator _it;
196  };
197 
198  explicit inline Database(OperationContext* const opCtx,
199  const StringData name,
201  : _pimpl(makeImpl(this, opCtx, name, dbEntry, PrivateCall<Database>{})) {
202  this->_impl().init(opCtx);
203  }
204 
205  // must call close first
206  inline ~Database() = default;
207 
208  inline Database(Database&&) = delete;
209  inline Database& operator=(Database&&) = delete;
210 
211  inline iterator begin() const {
212  return iterator(this->_impl().collections().begin());
213  }
214 
215  inline iterator end() const {
216  return iterator(this->_impl().collections().end());
217  }
218 
219  // closes files and other cleanup see below.
220  inline void close(OperationContext* const opCtx, const std::string& reason) {
221  return this->_impl().close(opCtx, reason);
222  }
223 
224  inline const std::string& name() const {
225  return this->_impl().name();
226  }
227 
228  inline void clearTmpCollections(OperationContext* const opCtx) {
229  return this->_impl().clearTmpCollections(opCtx);
230  }
231 
238  inline Status setProfilingLevel(OperationContext* const opCtx, const int newLevel) {
239  return this->_impl().setProfilingLevel(opCtx, newLevel);
240  }
241 
242  inline int getProfilingLevel() const {
243  return this->_impl().getProfilingLevel();
244  }
245 
246  inline const char* getProfilingNS() const {
247  return this->_impl().getProfilingNS();
248  }
249 
258  inline void setDropPending(OperationContext* opCtx, bool dropPending) {
259  this->_impl().setDropPending(opCtx, dropPending);
260  }
261 
266  inline bool isDropPending(OperationContext* opCtx) const {
267  return this->_impl().isDropPending(opCtx);
268  }
269 
270  inline void getStats(OperationContext* const opCtx,
271  BSONObjBuilder* const output,
272  const double scale = 1) {
273  return this->_impl().getStats(opCtx, output, scale);
274  }
275 
277  return this->_impl().getDatabaseCatalogEntry();
278  }
279 
287  inline Status dropCollection(OperationContext* const opCtx,
288  const StringData fullns,
289  repl::OpTime dropOpTime = {}) {
290  return this->_impl().dropCollection(opCtx, fullns, dropOpTime);
291  }
292  inline Status dropCollectionEvenIfSystem(OperationContext* const opCtx,
293  const NamespaceString& fullns,
294  repl::OpTime dropOpTime = {}) {
295  return this->_impl().dropCollectionEvenIfSystem(opCtx, fullns, dropOpTime);
296  }
297 
298  inline Status dropView(OperationContext* const opCtx, const StringData fullns) {
299  return this->_impl().dropView(opCtx, fullns);
300  }
301 
302  inline Collection* createCollection(OperationContext* const opCtx,
303  StringData ns,
304  const CollectionOptions& options = CollectionOptions(),
305  const bool createDefaultIndexes = true,
306  const BSONObj& idIndex = BSONObj()) {
307  return this->_impl().createCollection(opCtx, ns, options, createDefaultIndexes, idIndex);
308  }
309 
310  inline Status createView(OperationContext* const opCtx,
311  const StringData viewName,
312  const CollectionOptions& options) {
313  return this->_impl().createView(opCtx, viewName, options);
314  }
315 
319  inline Collection* getCollection(OperationContext* opCtx, const StringData ns) const {
320  return this->_impl().getCollection(opCtx, ns);
321  }
322 
323  inline Collection* getCollection(OperationContext* opCtx, const NamespaceString& ns) const {
324  return this->_impl().getCollection(opCtx, ns.ns());
325  }
326 
331  inline ViewCatalog* getViewCatalog() {
332  return this->_impl().getViewCatalog();
333  }
334 
335  inline Collection* getOrCreateCollection(OperationContext* const opCtx,
336  const NamespaceString& nss) {
337  return this->_impl().getOrCreateCollection(opCtx, nss);
338  }
339 
340  inline Status renameCollection(OperationContext* const opCtx,
341  const StringData fromNS,
342  const StringData toNS,
343  const bool stayTemp) {
344  return this->_impl().renameCollection(opCtx, fromNS, toNS, stayTemp);
345  }
346 
354  static MONGO_DECLARE_SHIM((OperationContext * opCtx, Database* db)->void) dropDatabase;
355 
356  inline const NamespaceString& getSystemIndexesName() const {
357  return this->_impl().getSystemIndexesName();
358  }
359 
360  inline const std::string& getSystemViewsName() const {
361  return this->_impl().getSystemViewsName();
362  }
363 
375  OperationContext* opCtx, StringData collectionNameModel) {
376  return this->_impl().makeUniqueCollectionNamespace(opCtx, collectionNameModel);
377  }
378 
379 private:
380  // This structure exists to give us a customization point to decide how to force users of this
381  // class to depend upon the corresponding `database.cpp` Translation Unit (TU). All public
382  // forwarding functions call `_impl(), and `_impl` creates an instance of this structure.
383  struct TUHook {
384  static void hook() noexcept;
385 
386  explicit inline TUHook() noexcept {
387  if (kDebugBuild)
388  this->hook();
389  }
390  };
391 
392  inline const Impl& _impl() const {
393  TUHook{};
394  return *this->_pimpl;
395  }
396 
397  inline Impl& _impl() {
398  TUHook{};
399  return *this->_pimpl;
400  }
401 
402  std::unique_ptr<Impl> _pimpl;
403 };
404 } // namespace mongo
virtual Status dropCollectionEvenIfSystem(OperationContext *opCtx, const NamespaceString &fullns, repl::OpTime dropOpTime)=0
virtual Status renameCollection(OperationContext *opCtx, StringData fromNS, StringData toNS, bool stayTemp)=0
StatusWith< NamespaceString > makeUniqueCollectionNamespace(OperationContext *opCtx, StringData collectionNameModel)
Generates a collection namespace suitable for creating a temporary collection.
Definition: database.h:374
StringMap< Collection * > CollectionMap
Definition: database.h:59
Database(OperationContext *const opCtx, const StringData name, DatabaseCatalogEntry *const dbEntry)
Definition: database.h:198
virtual Status createView(OperationContext *opCtx, StringData viewName, const CollectionOptions &options)=0
ViewCatalog * getViewCatalog()
Get the view catalog, which holds the definition for all views created on this database.
Definition: database.h:331
iterator & operator++()
Definition: database.h:183
const char * getProfilingNS() const
Definition: database.h:246
virtual void init(OperationContext *opCtx)=0
Collection * getCollection(OperationContext *opCtx, const NamespaceString &ns) const
Definition: database.h:323
ptrdiff_t difference_type
Definition: database.h:162
iterator begin() const
Definition: database.h:211
virtual Collection * getOrCreateCollection(OperationContext *opCtx, const NamespaceString &nss)=0
Status dropView(OperationContext *const opCtx, const StringData fullns)
Definition: database.h:298
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
OperationContext Database StringData CollectionOptions collectionOptions
Definition: database_impl.cpp:949
virtual const NamespaceString & getSystemIndexesName() const =0
static void hook() noexcept
Definition: database.cpp:41
Collection * getCollection(OperationContext *opCtx, const StringData ns) const
Definition: database.h:319
Definition: database.h:61
Definition: collection_options.h:57
reference operator*() const
Definition: database.h:167
Database *const OperationContext *const const StringData DatabaseCatalogEntry *const dbEntry
Definition: database_impl.cpp:82
const std::string & name() const
Definition: database.h:224
Status dropCollectionEvenIfSystem(OperationContext *const opCtx, const NamespaceString &fullns, repl::OpTime dropOpTime={})
Definition: database.h:292
virtual StatusWith< NamespaceString > makeUniqueCollectionNamespace(OperationContext *opCtx, StringData collectionNameModel)=0
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
virtual int getProfilingLevel() const =0
virtual const DatabaseCatalogEntry * getDatabaseCatalogEntry() const =0
Database *const this_
Definition: database_impl.cpp:82
friend bool operator!=(const iterator &lhs, const iterator &rhs)
Definition: database.h:179
Iterating over a Database yields Collection* pointers.
Definition: database.h:156
std::forward_iterator_tag iterator_category
Definition: database.h:158
Collection * getOrCreateCollection(OperationContext *const opCtx, const NamespaceString &nss)
Definition: database.h:335
TUHook() noexcept
Definition: database.h:386
virtual Collection * getCollection(OperationContext *opCtx, StringData ns) const =0
const std::string & getSystemViewsName() const
Definition: database.h:360
this is NOT safe through a yield right now.
Definition: collection.h:160
Status dropCollection(OperationContext *const opCtx, const StringData fullns, repl::OpTime dropOpTime={})
dropCollection() will refuse to drop system collections.
Definition: database.h:287
static MONGO_DECLARE_SHIM((OperationContext *opCtx) ->void) dropAllDatabasesExceptLocal
Database & operator=(Database &&)=delete
void close(OperationContext *const opCtx, const std::string &reason)
Definition: database.h:220
CollectionMap::const_iterator _it
Definition: database.h:195
virtual void setDropPending(OperationContext *opCtx, bool dropPending)=0
const NamespaceString & getSystemIndexesName() const
Definition: database.h:356
Status createView(OperationContext *const opCtx, const StringData viewName, const CollectionOptions &options)
Definition: database.h:310
virtual void close(OperationContext *opCtx, const std::string &reason)=0
virtual const std::string & name() const =0
OperationContext Database StringData CollectionOptions bool const BSONObj &idIndex Status
Definition: database_impl.cpp:955
IndexSet::const_iterator it
Definition: ephemeral_for_test_btree_impl.cpp:458
Definition: index_key_validate.h:40
const DatabaseCatalogEntry * getDatabaseCatalogEntry() const
Definition: database.h:276
pointer operator->() const
Definition: database.h:171
Collection * createCollection(OperationContext *const opCtx, StringData ns, const CollectionOptions &options=CollectionOptions(), const bool createDefaultIndexes=true, const BSONObj &idIndex=BSONObj())
Definition: database.h:302
~Database()=default
std::unique_ptr< Impl > _pimpl
Definition: database.h:402
OperationContext Database StringData CollectionOptions bool createDefaultIndexes
Definition: database_impl.cpp:949
virtual const std::string & getSystemViewsName() const =0
Status dropDatabase(OperationContext *opCtx, const std::string &dbName)
Drops the database "dbName".
Definition: drop_database.cpp:85
Definition: database_catalog_entry.h:50
iterator operator++(int)
Definition: database.h:188
Represents a logical database containing Collections.
Definition: database.h:57
virtual const char * getProfilingNS() const =0
iterator end() const
Definition: database.h:215
iterator(CollectionMap::const_iterator it)
Definition: database.h:165
void setDropPending(OperationContext *opCtx, bool dropPending)
Sets the 'drop-pending' state of this Database.
Definition: database.h:258
OperationContext Database * db
Definition: database_impl.cpp:949
virtual bool isDropPending(OperationContext *opCtx) const =0
virtual void getStats(OperationContext *opCtx, BSONObjBuilder *output, double scale)=0
int getProfilingLevel() const
Definition: database.h:242
virtual ViewCatalog * getViewCatalog()=0
const Impl & _impl() const
Definition: database.h:392
Definition: database.h:383
const NamespaceString & ns() const
Definition: collection.h:378
bool isDropPending(OperationContext *opCtx) const
Returns the 'drop-pending' state of this Database.
Definition: database.h:266
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
virtual CollectionMap & collections()=0
Status renameCollection(OperationContext *const opCtx, const StringData fromNS, const StringData toNS, const bool stayTemp)
Definition: database.h:340
void clearTmpCollections(OperationContext *const opCtx)
Definition: database.h:228
void getStats(OperationContext *const opCtx, BSONObjBuilder *const output, const double scale=1)
Definition: database.h:270
friend bool operator==(const iterator &lhs, const iterator &rhs)
Definition: database.h:175
virtual Collection * createCollection(OperationContext *opCtx, StringData ns, const CollectionOptions &options, bool createDefaultIndexes, const BSONObj &idIndex)=0
Status setProfilingLevel(OperationContext *const opCtx, const int newLevel)
Sets a new profiling level for the database and returns the outcome.
Definition: database.h:238
Impl & _impl()
Definition: database.h:397
virtual void clearTmpCollections(OperationContext *opCtx)=0
virtual Status dropCollection(OperationContext *opCtx, StringData fullns, repl::OpTime dropOpTime)=0
virtual Status setProfilingLevel(OperationContext *opCtx, int newLevel)=0
virtual Status dropView(OperationContext *opCtx, StringData fullns)=0