9 std::mutex ConnectionManager::initializationMutex;
10 bool ConnectionManager::initialized =
false;
11 std::map<std::string, std::unique_ptr<mongocxx::pool>> ConnectionManager::Connections = {};
15 std::string armarx_home = std::string(getenv(
"HOME")) +
"/.armarx";
16 if (getenv(
"ARMARX_DEFAULTS_DIR"))
18 armarx_home = getenv(
"ARMARX_DEFAULTS_DIR");
20 std::ifstream cFile(armarx_home +
"/default.cfg");
24 while (getline(cFile, line))
26 line.erase(std::remove_if(line.begin(), line.end(), isspace), line.end());
27 if (line[0] ==
'#' || line.empty())
31 auto delimiterPos = line.find(
"=");
32 const auto name = line.substr(0, delimiterPos);
33 const auto value = line.substr(delimiterPos + 1);
34 if (name ==
"ArmarX.MongoHost")
38 if (name ==
"ArmarX.MongoPort")
42 if (name ==
"ArmarX.MongoUser")
46 if (name ==
"ArmarX.MongoPassword")
58 return !host.empty() and port != 0;
70 if (!password.empty())
72 ss <<
":" << password;
98 return uri() +
"&database=" + database;
102 ConnectionManager::initialize_if()
105 initializationMutex);
109 mongocxx::instance instance{};
118 const auto uri_str = settings.
uri();
119 auto it = Connections.find(uri_str);
120 if (it == Connections.end())
122 mongocxx::uri uri(uri_str);
123 auto pool = std::make_unique<mongocxx::pool>(uri);
124 auto con = Connections.emplace(settings.
key(), std::move(pool));
125 return *con.first->second;
141 if (!forceNewConnection)
143 auto it = Connections.find(settings.
key());
144 if (it != Connections.end())
146 auto client = it->second->acquire();
147 auto admin = client->database(
"admin");
148 auto result = admin.run_command(bsoncxx::builder::basic::make_document(
149 bsoncxx::builder::basic::kvp(
"isMaster", 1)));
154 mongocxx::uri uri(settings.
uri());
155 auto client = mongocxx::client(uri);
156 auto admin = client[
"admin"];
157 auto result = admin.run_command(bsoncxx::builder::basic::make_document(
158 bsoncxx::builder::basic::kvp(
"isMaster", 1)));
161 catch (
const std::exception& xcp)
172 auto it = Connections.find(settings.
key());
173 return it != Connections.end();