3D Repo Bouncer  1.4
repo_database_handler_mongo.h
1 
22 #pragma once
23 
24 #include <string>
25 #include <iostream>
26 #include <sstream>
27 
28 #if defined(_WIN32) || defined(_WIN64)
29 #include <WinSock2.h>
30 #include <Windows.h>
31 
32 #define strcasecmp _stricmp
33 #endif
34 
35 #include <mongo/client/dbclient.h>
36 
37 #include "repo_database_handler_abstract.h"
38 #include "connectionpool/repo_connection_pool_mongo.h"
39 #include "../model/repo_node_utils.h"
40 #include "../model/bson/repo_bson.h"
41 #include "../model/bson/repo_bson_builder.h"
42 #include "../model/bson/repo_bson_role.h"
43 #include "../model/bson/repo_bson_user.h"
44 #include "../../lib/repo_stack.h"
45 
46 namespace repo{
47  namespace core{
48  namespace handler {
50  enum class OPERATION { DROP, INSERT, UPDATE };
51  public:
52  /*
53  * =================================== Public Fields ========================================
54  */
55  static const std::string ID;
56  static const std::string UUID;
57  static const std::string ADMIN_DATABASE;
58  static const std::string SYSTEM_ROLES_COLLECTION;
59  static const std::string AUTH_MECH;
60  static const std::list<std::string> ANY_DATABASE_ROLES;
63  static const std::list<std::string> ADMIN_ONLY_DATABASE_ROLES;
64 
65  /*
66  * =============================================================================================
67  */
68 
69  /*
70  * =================================== Public Functions ========================================
71  */
72 
77 
82  static void disconnectHandler();
83 
96  std::string &errMsg,
97  const std::string &host,
98  const int &port,
99  const uint32_t &maxConnections = 1,
100  const std::string &dbName = std::string(),
101  const std::string &username = std::string(),
102  const std::string &password = std::string(),
103  const bool &pwDigested = false);
104 
116  std::string &errMsg,
117  const std::string &host,
118  const int &port,
119  const uint32_t &maxConnections,
120  const std::string &dbName = std::string(),
121  const model::RepoBSON *credentials = nullptr);
122 
129  const std::string &host)
130  {
131  return handler;
132  }
133 
143  const std::string &dbName,
144  const std::string &username,
145  const std::string &password,
146  const bool &pwDigested = false)
147  {
148  mongo::BSONObj *mongoBSON = createAuthBSON(dbName, username, password, pwDigested);
149  return mongoBSON ? new repo::core::model::RepoBSON(*mongoBSON) : nullptr;
150  }
151 
152  /*
153  * ------------- Database info lookup --------------
154  */
155 
163  uint64_t countItemsInCollection(
164  const std::string &database,
165  const std::string &collection,
166  std::string &errMsg);
167 
181  std::vector<repo::core::model::RepoBSON>
183  const std::string &database,
184  const std::string &collection,
185  const uint64_t &skip = 0,
186  const uint32_t &limit = 0,
187  const std::list<std::string> &fields = std::list<std::string>(),
188  const std::string &sortField = std::string(),
189  const int &sortOrder = -1);
190 
197  std::list<std::string> getCollections(const std::string &database);
198 
207  const std::string &database,
208  const std::string &collection,
209  std::string &errMsg);
210 
216  std::list<std::string> getDatabases(const bool &sorted = true);
217 
222  std::map<std::string, std::list<std::string> > getDatabasesWithProjects(
223  const std::list<std::string> &databases,
224  const std::string &projectExt = "history");
225 
233  std::list<std::string> getProjects(const std::string &database, const std::string &projectExt);
234 
239  std::list<std::string> getAdminDatabaseRoles()
240  {
242  }
243 
248  static std::string getAdminDatabaseName()
249  {
250  return ADMIN_DATABASE;
251  }
252 
257  std::list<std::string> getStandardDatabaseRoles()
258  {
259  return ANY_DATABASE_ROLES;
260  }
261  /*
262  * ------------- Database operations (insert/delete/update) --------------
263  */
264 
270  virtual void createCollection(const std::string &database, const std::string &name);
271 
278  bool dropCollection(
279  const std::string &database,
280  const std::string &collection,
281  std::string &errMsg);
282 
288  bool dropDatabase(
289  const std::string &database,
290  std::string &errMsg);
291 
299  bool dropDocument(
300  const repo::core::model::RepoBSON bson,
301  const std::string &database,
302  const std::string &collection,
303  std::string &errMsg);
304 
312  bool dropDocuments(
313  const repo::core::model::RepoBSON criteria,
314  const std::string &database,
315  const std::string &collection,
316  std::string &errMsg);
317 
325  bool dropRawFile(
326  const std::string &database,
327  const std::string &collection,
328  const std::string &fileName,
329  std::string &errMsg);
330 
337  bool dropRole(
338  const repo::core::model::RepoRole &role,
339  std::string &errmsg)
340  {
341  return performRoleCmd(OPERATION::DROP, role, errmsg);
342  }
343 
350  bool dropUser(
351  const repo::core::model::RepoUser &user,
352  std::string &errmsg)
353  {
354  return performUserCmd(OPERATION::DROP, user, errmsg);
355  }
356 
365  bool insertDocument(
366  const std::string &database,
367  const std::string &collection,
368  const repo::core::model::RepoBSON &obj,
369  std::string &errMsg);
370 
381  bool insertRawFile(
382  const std::string &database,
383  const std::string &collection,
384  const std::string &fileName,
385  const std::vector<uint8_t> &bin,
386  std::string &errMsg,
387  const std::string &contentType = "binary/octet-stream"
388  );
389 
397  const repo::core::model::RepoRole &role,
398  std::string &errmsg)
399  {
400  return performRoleCmd(OPERATION::INSERT, role, errmsg);
401  }
402 
410  const repo::core::model::RepoUser &user,
411  std::string &errmsg)
412  {
413  return performUserCmd(OPERATION::INSERT, user, errmsg);
414  }
415 
426  bool upsertDocument(
427  const std::string &database,
428  const std::string &collection,
429  const repo::core::model::RepoBSON &obj,
430  const bool &overwrite,
431  std::string &errMsg);
432 
440  const repo::core::model::RepoRole &role,
441  std::string &errmsg)
442  {
443  return performRoleCmd(OPERATION::UPDATE, role, errmsg);
444  }
445 
453  const repo::core::model::RepoUser &user,
454  std::string &errmsg)
455  {
456  return performUserCmd(OPERATION::UPDATE, user, errmsg);
457  }
458 
459  /*
460  * ------------- Query operations --------------
461  */
462 
470  std::vector<repo::core::model::RepoBSON> findAllByUniqueIDs(
471  const std::string& database,
472  const std::string& collection,
473  const repo::core::model::RepoBSON& uuids);
474 
482  std::vector<repo::core::model::RepoBSON> findAllByCriteria(
483  const std::string& database,
484  const std::string& collection,
485  const repo::core::model::RepoBSON& criteria);
486 
496  const std::string& database,
497  const std::string& collection,
498  const repo::core::model::RepoBSON& criteria,
499  const std::string& sortField = ""
500  );
501 
513  const std::string& database,
514  const std::string& collection,
515  const repoUUID& uuid,
516  const std::string& sortField);
517 
526  const std::string& database,
527  const std::string& collection,
528  const repoUUID& uuid);
529 
537  std::vector<uint8_t> getRawFile(
538  const std::string& database,
539  const std::string& collection,
540  const std::string& fname
541  );
542 
543  /*
544  * =============================================================================================
545  */
546 
547  protected:
548  /*
549  * =================================== Protected Fields ========================================
550  */
551  static MongoDatabaseHandler *handler; /* !the single instance of this class*/
552  /*
553  * =============================================================================================
554  */
555 
556  private:
557  /*
558  * =================================== Private Fields ========================================
559  */
560 
562 
568  std::map<std::string, std::pair<std::string, std::string> > databasesAuthentication;
569 
570  mongo::ConnectionString dbAddress; /* !address of the database (host:port)*/
571 
572  /*
573  * =============================================================================================
574  */
575 
576  /*
577  * =================================== Private Functions ========================================
578  */
579 
589  const mongo::ConnectionString &dbAddress,
590  const uint32_t &maxConnections,
591  const std::string &dbName,
592  const std::string &username = std::string(),
593  const std::string &password = std::string(),
594  const bool &pwDigested = false);
595 
604  const mongo::ConnectionString &dbAddress,
605  const uint32_t &maxConnections,
606  const std::string &dbName,
607  const model::RepoBSON *cred);
608 
620  repo::core::model::RepoBSON createRepoBSON(
621  mongo::DBClientBase *worker,
622  const std::string &database,
623  const std::string &collection,
624  const mongo::BSONObj &obj);
625 
634  static mongo::BSONObj* createAuthBSON(
635  const std::string &database,
636  const std::string &username,
637  const std::string &password,
638  const bool &pwDigested);
645  mongo::BSONObj fieldsToReturn(
646  const std::list<std::string>& fields,
647  bool excludeIdField = false);
648 
654  std::string getCollectionFromNamespace(const std::string &ns);
655 
664  std::vector<uint8_t> getBigFile(
665  mongo::DBClientBase *worker,
666  const std::string &database,
667  const std::string &collection,
668  const std::string &fileName);
669 
677  std::string getNamespace(
678  const std::string &database,
679  const std::string &collection);
680 
686  std::string getProjectFromCollection(const std::string &ns, const std::string &projectExt);
687 
695  bool performRoleCmd(
696  const OPERATION &op,
697  const repo::core::model::RepoRole &role,
698  std::string &errMsg);
699 
707  bool performUserCmd(
708  const OPERATION &op,
709  const repo::core::model::RepoUser &user,
710  std::string &errMsg);
711 
722  bool storeBigFiles(
723  mongo::DBClientBase *worker,
724  const std::string &database,
725  const std::string &collection,
726  const repo::core::model::RepoBSON &obj,
727  std::string &errMsg);
728 
735  static bool caseInsensitiveStringCompare(const std::string& s1, const std::string& s2);
736 
737  /*
738  * =========================================================================================
739  */
740  };
741  } /* namespace handler */
742  }
743 }
repo::core::model::RepoBSON findOneByUniqueID(const std::string &database, const std::string &collection, const repoUUID &uuid)
Definition: repo_database_handler_mongo.cpp:537
~MongoDatabaseHandler()
Definition: repo_database_handler_mongo.cpp:75
Definition: repo_bson_collection_stats.h:30
uint64_t countItemsInCollection(const std::string &database, const std::string &collection, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:88
std::vector< uint8_t > getRawFile(const std::string &database, const std::string &collection, const std::string &fname)
Definition: repo_database_handler_mongo.cpp:846
static const std::list< std::string > ANY_DATABASE_ROLES
Built in any database roles. See http://docs.mongodb.org/manual/reference/built-in-roles/.
Definition: repo_database_handler_mongo.h:61
repo::core::model::RepoBSON findOneBySharedID(const std::string &database, const std::string &collection, const repoUUID &uuid, const std::string &sortField)
Definition: repo_database_handler_mongo.cpp:503
bool dropCollection(const std::string &database, const std::string &collection, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:193
static const std::string ADMIN_DATABASE
"uuid"
Definition: repo_database_handler_mongo.h:57
static const std::string UUID
"_id"
Definition: repo_database_handler_mongo.h:56
Definition: repo_connection_pool_mongo.h:36
std::list< std::string > getCollections(const std::string &database)
Definition: repo_database_handler_mongo.cpp:603
static void disconnectHandler()
Definition: repo_database_handler_mongo.cpp:179
Definition: repo_connection_pool_mongo.h:32
bool insertRole(const repo::core::model::RepoRole &role, std::string &errmsg)
Definition: repo_database_handler_mongo.h:396
static repo::core::model::RepoBSON * createBSONCredentials(const std::string &dbName, const std::string &username, const std::string &password, const bool &pwDigested=false)
Definition: repo_database_handler_mongo.h:142
std::list< std::string > getProjects(const std::string &database, const std::string &projectExt)
Definition: repo_database_handler_mongo.cpp:831
bool dropRole(const repo::core::model::RepoRole &role, std::string &errmsg)
Definition: repo_database_handler_mongo.h:337
bool dropDocument(const repo::core::model::RepoBSON bson, const std::string &database, const std::string &collection, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:249
Definition: repo_database_handler_abstract.h:37
bool insertUser(const repo::core::model::RepoUser &user, std::string &errmsg)
Definition: repo_database_handler_mongo.h:409
bool updateUser(const repo::core::model::RepoUser &user, std::string &errmsg)
Definition: repo_database_handler_mongo.h:452
std::vector< repo::core::model::RepoBSON > findAllByUniqueIDs(const std::string &database, const std::string &collection, const repo::core::model::RepoBSON &uuids)
Definition: repo_database_handler_mongo.cpp:456
static std::string getAdminDatabaseName()
Definition: repo_database_handler_mongo.h:248
bool insertDocument(const std::string &database, const std::string &collection, const repo::core::model::RepoBSON &obj, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:897
static MongoDatabaseHandler * getHandler(const std::string &host)
Definition: repo_database_handler_mongo.h:128
static MongoDatabaseHandler * getHandler(std::string &errMsg, const std::string &host, const int &port, const uint32_t &maxConnections=1, const std::string &dbName=std::string(), const std::string &username=std::string(), const std::string &password=std::string(), const bool &pwDigested=false)
Definition: repo_database_handler_mongo.cpp:748
bool dropDatabase(const std::string &database, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:222
std::vector< repo::core::model::RepoBSON > getAllFromCollectionTailable(const std::string &database, const std::string &collection, const uint64_t &skip=0, const uint32_t &limit=0, const std::list< std::string > &fields=std::list< std::string >(), const std::string &sortField=std::string(), const int &sortOrder=-1)
Definition: repo_database_handler_mongo.cpp:564
bool dropUser(const repo::core::model::RepoUser &user, std::string &errmsg)
Definition: repo_database_handler_mongo.h:350
bool dropRawFile(const std::string &database, const std::string &collection, const std::string &fileName, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:325
std::list< std::string > getStandardDatabaseRoles()
Definition: repo_database_handler_mongo.h:257
bool updateRole(const repo::core::model::RepoRole &role, std::string &errmsg)
Definition: repo_database_handler_mongo.h:439
std::list< std::string > getDatabases(const bool &sorted=true)
Definition: repo_database_handler_mongo.cpp:656
Definition: repo_bson.h:53
static const std::string SYSTEM_ROLES_COLLECTION
"admin"
Definition: repo_database_handler_mongo.h:58
static const std::string AUTH_MECH
"system.roles"
Definition: repo_database_handler_mongo.h:59
Definition: repo_bson_role.h:45
std::list< std::string > getAdminDatabaseRoles()
Definition: repo_database_handler_mongo.h:239
repo::core::model::CollectionStats getCollectionStats(const std::string &database, const std::string &collection, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:622
bool insertRawFile(const std::string &database, const std::string &collection, const std::string &fileName, const std::vector< uint8_t > &bin, std::string &errMsg, const std::string &contentType="binary/octet-stream")
Definition: repo_database_handler_mongo.cpp:929
virtual void createCollection(const std::string &database, const std::string &name)
Definition: repo_database_handler_mongo.cpp:135
std::map< std::string, std::list< std::string > > getDatabasesWithProjects(const std::list< std::string > &databases, const std::string &projectExt="history")
Definition: repo_database_handler_mongo.cpp:727
static const std::list< std::string > ADMIN_ONLY_DATABASE_ROLES
Built in admin database roles. See http://docs.mongodb.org/manual/reference/built-in-roles/.
Definition: repo_database_handler_mongo.h:63
bool upsertDocument(const std::string &database, const std::string &collection, const repo::core::model::RepoBSON &obj, const bool &overwrite, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:1120
Definition: repo_bson_user.h:69
repo::core::model::RepoBSON findOneByCriteria(const std::string &database, const std::string &collection, const repo::core::model::RepoBSON &criteria, const std::string &sortField="")
Definition: repo_database_handler_mongo.cpp:423
bool dropDocuments(const repo::core::model::RepoBSON criteria, const std::string &database, const std::string &collection, std::string &errMsg)
Definition: repo_database_handler_mongo.cpp:289
Definition: repo_database_handler_mongo.h:49
std::vector< repo::core::model::RepoBSON > findAllByCriteria(const std::string &database, const std::string &collection, const repo::core::model::RepoBSON &criteria)
Definition: repo_database_handler_mongo.cpp:384