aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--api/umosapi.cpp9
-rw-r--r--db/mongo_access.cpp16
-rw-r--r--db/mongo_access.h43
-rw-r--r--shared.h2
5 files changed, 69 insertions, 3 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 964ead7..56af362 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -41,7 +41,7 @@ or
endif(NOT JSONC_FOUND)
-add_executable(umosapi main.cpp config.cpp api/umosapi.cpp api/umosapi.h config.h shared.h)
+add_executable(umosapi main.cpp config.cpp api/umosapi.cpp db/mongo_access.cpp api/umosapi.h config.h db/mongo_access.h shared.h)
set_property(TARGET umosapi PROPERTY CXX_STANDARD 17)
diff --git a/api/umosapi.cpp b/api/umosapi.cpp
index 65f28d2..de2a2c3 100644
--- a/api/umosapi.cpp
+++ b/api/umosapi.cpp
@@ -14,6 +14,9 @@
#include "umosapi.h"
#include "../shared.h"
+#include "../db/mongo_access.h"
+
+mongo_access mongo;
using bsoncxx::builder::stream::close_array;
@@ -40,6 +43,8 @@ UmosapiService::UmosapiService(Address addr)
{ }
void UmosapiService::init(size_t thr = 2) {
+ auto uri = mongocxx::uri{config["mongoURI"]};
+ mongo.configure(std::move(uri));
auto opts = Http::Endpoint::options()
.threads(thr);
httpEndpoint->init(opts);
@@ -101,9 +106,9 @@ void UmosapiService::createDescription() {
}
void UmosapiService::retrieveAll(const Rest::Request& request, Http::ResponseWriter response) {
- mongocxx::client conn{mongocxx::uri{config["mongoURI"]}};
+ auto conn = mongo.get_connection();
- auto collection = conn[config["mongo_db"]][request.param(":mcollection").as<string>()];
+ auto collection = (*conn)[config["mongo_db"]][request.param(":mcollection").as<string>()];
auto cursor = collection.find({});
diff --git a/db/mongo_access.cpp b/db/mongo_access.cpp
new file mode 100644
index 0000000..56936f3
--- /dev/null
+++ b/db/mongo_access.cpp
@@ -0,0 +1,16 @@
+#include "mongo_access.h"
+
+mongo_access::mongo_access(void) {};
+mongo_access::~mongo_access(void) {};
+
+void mongo_access::configure(mongocxx::uri uri) {
+ class noop_logger : public mongocxx::logger {
+ public:
+ virtual void operator()(mongocxx::log_level,
+ bsoncxx::stdx::string_view,
+ bsoncxx::stdx::string_view) noexcept {}
+ };
+
+ _pool = bsoncxx::stdx::make_unique<mongocxx::pool>(std::move(uri));
+ _instance = bsoncxx::stdx::make_unique<mongocxx::instance>(bsoncxx::stdx::make_unique<noop_logger>());
+}
diff --git a/db/mongo_access.h b/db/mongo_access.h
new file mode 100644
index 0000000..f03cece
--- /dev/null
+++ b/db/mongo_access.h
@@ -0,0 +1,43 @@
+#ifndef MongoAccess_H_
+#define MongoAccess_H_
+
+#include <cstdlib>
+#include <memory>
+
+#include <bsoncxx/stdx/make_unique.hpp>
+#include <bsoncxx/stdx/optional.hpp>
+#include <bsoncxx/stdx/string_view.hpp>
+
+#include <mongocxx/instance.hpp>
+#include <mongocxx/logger.hpp>
+#include <mongocxx/pool.hpp>
+#include <mongocxx/uri.hpp>
+
+#include <iostream>
+
+
+class mongo_access {
+ public:
+
+ mongo_access ();
+ ~mongo_access ();
+
+ void configure(mongocxx::uri uri);
+
+ using connection = mongocxx::pool::entry;
+
+ connection get_connection() {
+ return _pool->acquire();
+ }
+
+ bsoncxx::stdx::optional<connection> try_get_connection() {
+ return _pool->try_acquire();
+ }
+
+ private:
+ std::unique_ptr<mongocxx::instance> _instance = nullptr;
+ std::unique_ptr<mongocxx::pool> _pool = nullptr;
+
+};
+
+#endif
diff --git a/shared.h b/shared.h
index 0814b6c..7ba7006 100644
--- a/shared.h
+++ b/shared.h
@@ -2,7 +2,9 @@
#define SHARED_H_
#include <map>
+#include "db/mongo_access.h"
extern std::map<std::string, std::string> config;
+extern mongo_access mongo;
#endif