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,
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 
141  static MONGO_DECLARE_SHIM(
142  (OperationContext * opCtx,
143  Database* db,
144  StringData ns,
145  BSONObj options,
147  bool createDefaultIndexes = true,
148  const BSONObj& idIndex = BSONObj())
149  ->Status) userCreateNS;
150 
152  OperationContext* opCtx,
153  StringData name,
155  PrivateTo<Database>)
156  ->std::unique_ptr<Impl>) makeImpl;
157 
161  class iterator {
162  public:
163  using iterator_category = std::forward_iterator_tag;
165  using pointer = const value_type*;
166  using reference = const value_type&;
167  using difference_type = ptrdiff_t;
168 
169  explicit inline iterator() = default;
170  inline iterator(CollectionMap::const_iterator it) : _it(std::move(it)) {}
171 
172  inline reference operator*() const {
173  return _it->second;
174  }
175 
176  inline pointer operator->() const {
177  return &_it->second;
178  }
179 
180  inline friend bool operator==(const iterator& lhs, const iterator& rhs) {
181  return lhs._it == rhs._it;
182  }
183 
184  inline friend bool operator!=(const iterator& lhs, const iterator& rhs) {
185  return !(lhs == rhs);
186  }
187 
188  inline iterator& operator++() {
189  ++_it;
190  return *this;
191  }
192 
193  inline iterator operator++(int) {
194  auto oldPosition = *this;
195  ++_it;
196  return oldPosition;
197  }
198 
199  private:
200  CollectionMap::const_iterator _it;
201  };
202 
203  explicit inline Database(OperationContext* const opCtx,
204  const StringData name,
206  : _pimpl(makeImpl(this, opCtx, name, dbEntry, PrivateCall<Database>{})) {
207  this->_impl().init(opCtx);
208  }
209 
210  // must call close first
211  inline ~Database() = default;
212 
213  inline Database(Database&&) = delete;
214  inline Database& operator=(Database&&) = delete;
215 
216  inline iterator begin() const {
217  return iterator(this->_impl().collections().begin());
218  }
219 
220  inline iterator end() const {
221  return iterator(this->_impl().collections().end());
222  }
223 
224  // closes files and other cleanup see below.
225  inline void close(OperationContext* const opCtx, const std::string& reason) {
226  return this->_impl().close(opCtx, reason);
227  }
228 
229  inline const std::string& name() const {
230  return this->_impl().name();
231  }
232 
233  inline void clearTmpCollections(OperationContext* const opCtx) {
234  return this->_impl().clearTmpCollections(opCtx);
235  }
236 
243  inline Status setProfilingLevel(OperationContext* const opCtx, const int newLevel) {
244  return this->_impl().setProfilingLevel(opCtx, newLevel);
245  }
246 
247  inline int getProfilingLevel() const {
248  return this->_impl().getProfilingLevel();
249  }
250 
251  inline const char* getProfilingNS() const {
252  return this->_impl().getProfilingNS();
253  }
254 
263  inline void setDropPending(OperationContext* opCtx, bool dropPending) {
264  this->_impl().setDropPending(opCtx, dropPending);
265  }
266 
271  inline bool isDropPending(OperationContext* opCtx) const {
272  return this->_impl().isDropPending(opCtx);
273  }
274 
275  inline void getStats(OperationContext* const opCtx,
276  BSONObjBuilder* const output,
277  const double scale = 1) {
278  return this->_impl().getStats(opCtx, output, scale);
279  }
280 
282  return this->_impl().getDatabaseCatalogEntry();
283  }
284 
292  inline Status dropCollection(OperationContext* const opCtx,
293  const StringData fullns,
294  repl::OpTime dropOpTime = {}) {
295  return this->_impl().dropCollection(opCtx, fullns, dropOpTime);
296  }
297  inline Status dropCollectionEvenIfSystem(OperationContext* const opCtx,
298  const NamespaceString& fullns,
299  repl::OpTime dropOpTime = {}) {
300  return this->_impl().dropCollectionEvenIfSystem(opCtx, fullns, dropOpTime);
301  }
302 
303  inline Status dropView(OperationContext* const opCtx, const StringData fullns) {
304  return this->_impl().dropView(opCtx, fullns);
305  }
306 
307  inline Collection* createCollection(OperationContext* const opCtx,
308  StringData ns,
309  const CollectionOptions& options = CollectionOptions(),
310  const bool createDefaultIndexes = true,
311  const BSONObj& idIndex = BSONObj()) {
312  return this->_impl().createCollection(opCtx, ns, options, createDefaultIndexes, idIndex);
313  }
314 
315  inline Status createView(OperationContext* const opCtx,
316  const StringData viewName,
317  const CollectionOptions& options) {
318  return this->_impl().createView(opCtx, viewName, options);
319  }
320 
324  inline Collection* getCollection(OperationContext* opCtx, const StringData ns) const {
325  return this->_impl().getCollection(opCtx, ns);
326  }
327 
328  inline Collection* getCollection(OperationContext* opCtx, const NamespaceString& ns) const {
329  return this->_impl().getCollection(opCtx, ns.ns());
330  }
331 
336  inline ViewCatalog* getViewCatalog() {
337  return this->_impl().getViewCatalog();
338  }
339 
340  inline Collection* getOrCreateCollection(OperationContext* const opCtx,
341  const NamespaceString& nss) {
342  return this->_impl().getOrCreateCollection(opCtx, nss);
343  }
344 
345  inline Status renameCollection(OperationContext* const opCtx,
346  const StringData fromNS,
347  const StringData toNS,
348  const bool stayTemp) {
349  return this->_impl().renameCollection(opCtx, fromNS, toNS, stayTemp);
350  }
351 
359  static MONGO_DECLARE_SHIM((OperationContext * opCtx, Database* db)->void) dropDatabase;
360 
361  inline const NamespaceString& getSystemIndexesName() const {
362  return this->_impl().getSystemIndexesName();
363  }
364 
365  inline const std::string& getSystemViewsName() const {
366  return this->_impl().getSystemViewsName();
367  }
368 
380  OperationContext* opCtx, StringData collectionNameModel) {
381  return this->_impl().makeUniqueCollectionNamespace(opCtx, collectionNameModel);
382  }
383 
384 private:
385  // This structure exists to give us a customization point to decide how to force users of this
386  // class to depend upon the corresponding `database.cpp` Translation Unit (TU). All public
387  // forwarding functions call `_impl(), and `_impl` creates an instance of this structure.
388  struct TUHook {
389  static void hook() noexcept;
390 
391  explicit inline TUHook() noexcept {
392  if (kDebugBuild)
393  this->hook();
394  }
395  };
396 
397  inline const Impl& _impl() const {
398  TUHook{};
399  return *this->_pimpl;
400  }
401 
402  inline Impl& _impl() {
403  TUHook{};
404  return *this->_pimpl;
405  }
406 
407  std::unique_ptr<Impl> _pimpl;
408 };
409 } // 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:379
StringMap< Collection * > CollectionMap
Definition: database.h:59
Database(OperationContext *const opCtx, const StringData name, DatabaseCatalogEntry *const dbEntry)
Definition: database.h:203
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:336
iterator & operator++()
Definition: database.h:188
const char * getProfilingNS() const
Definition: database.h:251
virtual void init(OperationContext *opCtx)=0
Collection * getCollection(OperationContext *opCtx, const NamespaceString &ns) const
Definition: database.h:328
ptrdiff_t difference_type
Definition: database.h:167
iterator begin() const
Definition: database.h:216
virtual Collection * getOrCreateCollection(OperationContext *opCtx, const NamespaceString &nss)=0
Status dropView(OperationContext *const opCtx, const StringData fullns)
Definition: database.h:303
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
virtual const NamespaceString & getSystemIndexesName() const =0
Collection * getCollection(OperationContext *opCtx, const StringData ns) const
Definition: database.h:324
Definition: database.h:61
Definition: collection_options.h:57
reference operator*() const
Definition: database.h:172
Database *const OperationContext *const const StringData DatabaseCatalogEntry *const dbEntry
Definition: database_impl.cpp:82
const std::string & name() const
Definition: database.h:229
Status dropCollectionEvenIfSystem(OperationContext *const opCtx, const NamespaceString &fullns, repl::OpTime dropOpTime={})
Definition: database.h:297
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:184
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
Iterating over a Database yields Collection* pointers.
Definition: database.h:161
Definition: collection_options.h:68
std::forward_iterator_tag iterator_category
Definition: database.h:163
Collection * getOrCreateCollection(OperationContext *const opCtx, const NamespaceString &nss)
Definition: database.h:340
TUHook() noexcept
Definition: database.h:391
virtual Collection * getCollection(OperationContext *opCtx, StringData ns) const =0
const std::string & getSystemViewsName() const
Definition: database.h:365
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:292
static MONGO_DECLARE_SHIM((OperationContext *opCtx) ->void) dropAllDatabasesExceptLocal
Database & operator=(Database &&)=delete
void close(OperationContext *const opCtx, const std::string &reason)
Definition: database.h:225
CollectionMap::const_iterator _it
Definition: database.h:200
virtual void setDropPending(OperationContext *opCtx, bool dropPending)=0
const NamespaceString & getSystemIndexesName() const
Definition: database.h:361
Status createView(OperationContext *const opCtx, const StringData viewName, const CollectionOptions &options)
Definition: database.h:315
virtual void close(OperationContext *opCtx, const std::string &reason)=0
virtual const std::string & name() const =0
IndexSet::const_iterator it
Definition: ephemeral_for_test_btree_impl.cpp:458
ParseKind
The &#39;uuid&#39; member is a collection property stored in the catalog with user-settable options...
Definition: collection_options.h:68
Definition: index_key_validate.h:40
const DatabaseCatalogEntry * getDatabaseCatalogEntry() const
Definition: database.h:281
pointer operator->() const
Definition: database.h:176
Collection * createCollection(OperationContext *const opCtx, StringData ns, const CollectionOptions &options=CollectionOptions(), const bool createDefaultIndexes=true, const BSONObj &idIndex=BSONObj())
Definition: database.h:307
~Database()=default
IndexSet::const_iterator _it
Definition: ephemeral_for_test_btree_impl.cpp:452
OperationContext Database StringData BSONObj CollectionOptions::ParseKind parseKind
Definition: database_impl.cpp:949
std::unique_ptr< Impl > _pimpl
Definition: database.h:407
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:193
Represents a logical database containing Collections.
Definition: database.h:57
virtual const char * getProfilingNS() const =0
iterator end() const
Definition: database.h:220
iterator(CollectionMap::const_iterator it)
Definition: database.h:170
void setDropPending(OperationContext *opCtx, bool dropPending)
Sets the &#39;drop-pending&#39; state of this Database.
Definition: database.h:263
OperationContext Database * db
Definition: database_impl.cpp:949
OperationContext Database StringData BSONObj options
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:247
virtual ViewCatalog * getViewCatalog()=0
const Impl & _impl() const
Definition: database.h:397
Definition: database.h:388
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool createDefaultIndexes
Definition: database_impl.cpp:949
bool isDropPending(OperationContext *opCtx) const
Returns the &#39;drop-pending&#39; state of this Database.
Definition: database.h:271
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:345
void clearTmpCollections(OperationContext *const opCtx)
Definition: database.h:233
void getStats(OperationContext *const opCtx, BSONObjBuilder *const output, const double scale=1)
Definition: database.h:275
friend bool operator==(const iterator &lhs, const iterator &rhs)
Definition: database.h:180
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:243
Impl & _impl()
Definition: database.h:402
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