Storage Engine API
database_impl.h
Go to the documentation of this file.
1 
29 #pragma once
30 
32 
33 #include <memory>
34 #include <string>
35 
36 #include "mongo/base/string_data.h"
37 #include "mongo/bson/bsonobj.h"
39 #include "mongo/db/namespace_string.h"
41 #include "mongo/db/views/view.h"
42 #include "mongo/db/views/view_catalog.h"
43 #include "mongo/util/mongoutils/str.h"
44 #include "mongo/util/string_map.h"
45 
46 namespace mongo {
47 
48 class Collection;
49 class DatabaseCatalogEntry;
50 class IndexCatalog;
51 class NamespaceDetails;
52 class OperationContext;
53 class PseudoRandom;
54 
61 class DatabaseImpl : public Database::Impl {
62 public:
63  typedef StringMap<Collection*> CollectionMap;
64 
68  class iterator {
69  public:
70  using iterator_category = std::forward_iterator_tag;
72  using pointer = const value_type*;
73  using reference = const value_type&;
74  using difference_type = ptrdiff_t;
75 
76  iterator() = default;
77  iterator(CollectionMap::const_iterator it) : _it(it) {}
78 
79  reference operator*() const {
80  return _it->second;
81  }
82 
83  pointer operator->() const {
84  return &_it->second;
85  }
86 
87  bool operator==(const iterator& other) {
88  return _it == other._it;
89  }
90 
91  bool operator!=(const iterator& other) {
92  return _it != other._it;
93  }
94 
96  ++_it;
97  return *this;
98  }
99 
101  auto oldPosition = *this;
102  ++_it;
103  return oldPosition;
104  }
105 
106  private:
107  CollectionMap::const_iterator _it;
108  };
109 
110  explicit DatabaseImpl(Database* this_,
111  OperationContext* opCtx,
112  StringData name,
114 
115  // must call close first
116  ~DatabaseImpl();
117 
118  void init(OperationContext*) final;
119 
120  iterator begin() const {
121  return iterator(_collections.begin());
122  }
123 
124  iterator end() const {
125  return iterator(_collections.end());
126  }
127 
128  // closes files and other cleanup see below.
129  void close(OperationContext* opCtx, const std::string& reason) final;
130 
131  const std::string& name() const final {
132  return _name;
133  }
134 
135  void clearTmpCollections(OperationContext* opCtx) final;
136 
143  Status setProfilingLevel(OperationContext* opCtx, int newLevel) final;
144 
145  int getProfilingLevel() const final {
146  return _profile;
147  }
148  const char* getProfilingNS() const final {
149  return _profileName.c_str();
150  }
151 
152  void setDropPending(OperationContext* opCtx, bool dropPending) final;
153 
154  bool isDropPending(OperationContext* opCtx) const final;
155 
156  void getStats(OperationContext* opCtx, BSONObjBuilder* output, double scale = 1) final;
157 
158  const DatabaseCatalogEntry* getDatabaseCatalogEntry() const final;
159 
167  Status dropCollection(OperationContext* opCtx,
168  StringData fullns,
169  repl::OpTime dropOpTime) final;
170  Status dropCollectionEvenIfSystem(OperationContext* opCtx,
171  const NamespaceString& fullns,
172  repl::OpTime dropOpTime) final;
173 
174  Status dropView(OperationContext* opCtx, StringData fullns) final;
175 
176  Collection* createCollection(OperationContext* opCtx,
177  StringData ns,
179  bool createDefaultIndexes = true,
180  const BSONObj& idIndex = BSONObj()) final;
181 
182  Status createView(OperationContext* opCtx,
183  StringData viewName,
184  const CollectionOptions& options) final;
185 
189  Collection* getCollection(OperationContext* opCtx, StringData ns) const final;
190 
191  Collection* getCollection(OperationContext* opCtx, const NamespaceString& ns) const;
192 
197  ViewCatalog* getViewCatalog() final {
198  return &_views;
199  }
200 
201  Collection* getOrCreateCollection(OperationContext* opCtx, const NamespaceString& nss) final;
202 
203  Status renameCollection(OperationContext* opCtx,
204  StringData fromNS,
205  StringData toNS,
206  bool stayTemp) final;
207 
215  static void dropDatabase(OperationContext* opCtx, Database* db);
216 
217  static Status validateDBName(StringData dbname);
218 
219  const NamespaceString& getSystemIndexesName() const final {
220  return _indexesName;
221  }
222 
223  const std::string& getSystemViewsName() const final {
224  return _viewsName;
225  }
226 
228  StringData collectionNameModel) final;
229 
230  inline CollectionMap& collections() final {
231  return _collections;
232  }
233  inline const CollectionMap& collections() const final {
234  return _collections;
235  }
236 
237 private:
245  Collection* _getOrCreateCollectionInstance(OperationContext* opCtx, const NamespaceString& nss);
246 
250  void _checkCanCreateCollection(OperationContext* opCtx,
251  const NamespaceString& nss,
252  const CollectionOptions& options);
253 
259  void _clearCollectionCache(OperationContext* opCtx,
260  StringData fullns,
261  const std::string& reason,
262  bool collectionGoingAway);
263 
271  Status _finishDropCollection(OperationContext* opCtx,
272  const NamespaceString& fullns,
274 
275  class AddCollectionChange;
277 
278  const std::string _name; // "dbname"
279 
280  DatabaseCatalogEntry* _dbEntry; // not owned here
281 
282  const std::string _profileName; // "dbname.system.profile"
283  const NamespaceString _indexesName; // "dbname.system.indexes"
284  const std::string _viewsName; // "dbname.system.views"
285 
286  int _profile; // 0=off.
287 
288  // If '_dropPending' is true, this Database is in the midst of a two-phase drop. No new
289  // collections may be created in this Database.
290  // This variable may only be read/written while the database is locked in MODE_X.
291  bool _dropPending = false;
292 
293  // Random number generator used to create unique collection namespaces suitable for temporary
294  // collections.
295  // Lazily created on first call to makeUniqueCollectionNamespace().
296  // This variable may only be read/written while the database is locked in MODE_X.
297  std::unique_ptr<PseudoRandom> _uniqueCollectionNamespacePseudoRandom;
298 
299  CollectionMap _collections;
300 
301  DurableViewCatalogImpl _durableViews; // interface for system.views operations
302  ViewCatalog _views; // in-memory representation of _durableViews
303  Database* _this; // Pointer to wrapper, for external caller compatibility.
304 
305  friend class Collection;
306  friend class NamespaceDetails;
307  friend class IndexCatalog;
308 };
309 
310 void dropAllDatabasesExceptLocalImpl(OperationContext* opCtx);
311 
312 } // namespace mongo
static Status validateDBName(StringData dbname)
Definition: database_impl.cpp:177
const DatabaseCatalogEntry * getDatabaseCatalogEntry() const final
Definition: database_impl.cpp:850
Status dropCollection(OperationContext *opCtx, StringData fullns, repl::OpTime dropOpTime) final
dropCollection() will refuse to drop system collections.
Definition: database_impl.cpp:439
Status createView(OperationContext *opCtx, StringData viewName, const CollectionOptions &options) final
Definition: database_impl.cpp:746
int getProfilingLevel() const final
Definition: database_impl.h:145
const CollectionMap & collections() const final
Definition: database_impl.h:233
bool operator!=(const iterator &other)
Definition: database_impl.h:91
ptrdiff_t difference_type
Definition: database_impl.h:74
void getStats(OperationContext *opCtx, BSONObjBuilder *output, double scale=1) final
Definition: database_impl.cpp:366
ViewCatalog _views
Definition: database_impl.h:302
CollectionMap _collections
Definition: database_impl.h:299
Collection *const const NamespaceString & ns
Definition: collection_info_cache_impl.cpp:53
int _profile
Definition: database_impl.h:286
Definition: database.h:61
Definition: collection_options.h:57
Database *const OperationContext *const const StringData DatabaseCatalogEntry *const dbEntry
Definition: database_impl.cpp:82
std::forward_iterator_tag iterator_category
Definition: database_impl.h:70
void clearTmpCollections(OperationContext *opCtx) final
Definition: database_impl.cpp:289
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
Database *const this_
Definition: database_impl.cpp:82
Collection *const collection
Definition: collection_info_cache_impl.cpp:53
const std::string & name() const final
Definition: database_impl.h:131
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
pointer operator->() const
Definition: database_impl.h:83
void dropAllDatabasesExceptLocalImpl(OperationContext *opCtx)
iterator(CollectionMap::const_iterator it)
Definition: database_impl.h:77
Represents a logical database containing Collections.
Definition: database_impl.h:61
iterator operator++(int)
Definition: database_impl.h:100
iterator end() const
Definition: database_impl.h:124
Iterating over a Database yields Collection* pointers.
Definition: database_impl.h:68
void _checkCanCreateCollection(OperationContext *opCtx, const NamespaceString &nss, const CollectionOptions &options)
Throws if there is a reason &#39;ns&#39; cannot be created as a user collection.
Definition: database_impl.cpp:717
Collection * getOrCreateCollection(OperationContext *opCtx, const NamespaceString &nss) final
Definition: database_impl.cpp:707
void close(OperationContext *opCtx, const std::string &reason) final
Definition: database_impl.cpp:165
this is NOT safe through a yield right now.
Definition: collection.h:160
const NamespaceString _indexesName
Definition: database_impl.h:283
const NamespaceString & getSystemIndexesName() const final
Definition: database_impl.h:219
Collection * _getOrCreateCollectionInstance(OperationContext *opCtx, const NamespaceString &nss)
Gets or creates collection instance from existing metadata, Returns NULL if invalid.
Definition: database_impl.cpp:210
Definition: namespace_details.h:47
const std::string _viewsName
Definition: database_impl.h:284
DurableViewCatalogImpl _durableViews
Definition: database_impl.h:301
how many: 1 per Collection.
Definition: index_catalog.h:62
bool isDropPending(OperationContext *opCtx) const final
Definition: database_impl.cpp:361
const std::string _profileName
Definition: database_impl.h:282
IndexSet::const_iterator it
Definition: ephemeral_for_test_btree_impl.cpp:458
Database * _this
Definition: database_impl.h:303
iterator & operator++()
Definition: database_impl.h:95
Definition: index_key_validate.h:40
Status dropView(OperationContext *opCtx, StringData fullns) final
Definition: database_impl.cpp:433
const char * getProfilingNS() const final
Definition: database_impl.h:148
Definition: database_impl.cpp:141
Definition: database_impl.cpp:109
CollectionMap & collections() final
Definition: database_impl.h:230
const std::string _name
Definition: database_impl.h:276
void init(OperationContext *) final
Definition: database_impl.cpp:256
void setDropPending(OperationContext *opCtx, bool dropPending) final
Definition: database_impl.cpp:348
iterator begin() const
Definition: database_impl.h:120
Status dropCollectionEvenIfSystem(OperationContext *opCtx, const NamespaceString &fullns, repl::OpTime dropOpTime) final
Definition: database_impl.cpp:468
~DatabaseImpl()
Definition: database_impl.cpp:160
ViewCatalog * getViewCatalog() final
Get the view catalog, which holds the definition for all views created on this database.
Definition: database_impl.h:197
const std::string & getSystemViewsName() const final
Definition: database_impl.h:223
Definition: database_catalog_entry.h:50
Collection * getCollection(OperationContext *opCtx, StringData ns) const final
Definition: database_impl.cpp:643
Represents a logical database containing Collections.
Definition: database.h:57
DatabaseImpl(Database *this_, OperationContext *opCtx, StringData name, DatabaseCatalogEntry *dbEntry)
Definition: database_impl.cpp:243
OperationContext Database * db
Definition: database_impl.cpp:949
std::unique_ptr< PseudoRandom > _uniqueCollectionNamespacePseudoRandom
Definition: database_impl.h:297
OperationContext Database StringData BSONObj options
Definition: database_impl.cpp:949
void _clearCollectionCache(OperationContext *opCtx, StringData fullns, const std::string &reason, bool collectionGoingAway)
Deregisters and invalidates all cursors on collection &#39;fullns&#39;.
Definition: database_impl.cpp:626
DatabaseCatalogEntry * _dbEntry
Definition: database_impl.h:280
CollectionMap::const_iterator _it
Definition: database_impl.h:107
static void dropDatabase(OperationContext *opCtx, Database *db)
Physically drops the specified opened database and removes it from the server&#39;s metadata.
Definition: database_impl.cpp:854
bool _dropPending
Definition: database_impl.h:291
StringMap< Collection * > CollectionMap
Definition: database_impl.h:63
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool createDefaultIndexes
Definition: database_impl.cpp:949
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
Collection * createCollection(OperationContext *opCtx, StringData ns, const CollectionOptions &options=CollectionOptions(), bool createDefaultIndexes=true, const BSONObj &idIndex=BSONObj()) final
Definition: database_impl.cpp:764
reference operator*() const
Definition: database_impl.h:79
bool operator==(const iterator &other)
Definition: database_impl.h:87
StatusWith< NamespaceString > makeUniqueCollectionNamespace(OperationContext *opCtx, StringData collectionNameModel) final
Definition: database_impl.cpp:882
Status _finishDropCollection(OperationContext *opCtx, const NamespaceString &fullns, Collection *collection)
Completes a collection drop by removing all the indexes and removing the collection itself from the s...
Definition: database_impl.cpp:605
Status setProfilingLevel(OperationContext *opCtx, int newLevel) final
Sets a new profiling level for the database and returns the outcome.
Definition: database_impl.cpp:323
Status renameCollection(OperationContext *opCtx, StringData fromNS, StringData toNS, bool stayTemp) final
Definition: database_impl.cpp:664