4#ifndef _Stroika_Foundation_Database_Document_MongoDBClient_h_
5#define _Stroika_Foundation_Database_Document_MongoDBClient_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
9#if qStroika_HasComponent_mongocxxdriver
12namespace mongocxx::v_noabi {
18 using ::mongocxx::v_noabi::client;
19 using ::mongocxx::v_noabi::instance;
20 using ::mongocxx::v_noabi::pool;
42#ifndef qStroika_HasComponent_mongocxxdriver
43#error "qStroika_HasComponent_mongocxxdriver should normally be defined indirectly by StroikaConfig.h"
46namespace Stroika::Foundation::Database::Document::MongoDBClient {
48#if qStroika_HasComponent_mongocxxdriver
64 struct Activator final {
65 enum AllowReactivateFlag {
69 Activator (AllowReactivateFlag);
73 bool fAllowReactivation_;
74 static unique_ptr<mongocxx::instance> sMongoInstance_;
83 class ConnectionPool final {
85 ConnectionPool () =
delete;
86 ConnectionPool (
const ConnectionPool&) =
default;
87 ConnectionPool (shared_ptr<mongocxx::pool>&& poolRep);
88 ConnectionPool (
const String& connectionString);
89 ~ConnectionPool () =
default;
94 nonvirtual mongocxx::pool& PeekPool ()
const;
98 shared_ptr<mongocxx::pool> fPool_;
101 namespace AdminConnection {
107 class Ptr :
public shared_ptr<IRep> {
109 using inherited = shared_ptr<IRep>;
114 Ptr (
const Ptr& src)
noexcept =
default;
115 Ptr (
const shared_ptr<IRep>& src =
nullptr) noexcept;
118 ~Ptr () noexcept = default;
123 nonvirtual Document run_command (const Document& v);
128 nonvirtual mongocxx::client& GetClientRef ();
133 nonvirtual Set<String> GetDatabases ();
138 nonvirtual
void DropDatabase (const String& dbName);
143 nonvirtual
void CreateDatabase (const String& dbName);
151 virtual Document run_command (
const Document& v) = 0;
154 virtual mongocxx::client& GetClientRef () = 0;
157 virtual Set<String> GetDatabases () = 0;
160 virtual void DropDatabase (
const String& dbName) = 0;
163 virtual void CreateDatabase (
const String& dbName) = 0;
171 struct Options final {
175 variant<String, ConnectionPool> fConnectionTarget;
181 Ptr New (
const Options& options);
184 namespace Connection {
186 using namespace Database::Document::Connection;
195 struct Options final {
199 variant<String, ConnectionPool> fConnectionTarget;
213 class Ptr :
public Database::Document::Connection::Ptr {
215 using inherited = Database::Document::Connection::Ptr;
220 Ptr (
const Ptr& src);
221 Ptr (
const shared_ptr<IRep>& src =
nullptr);
229 nonvirtual Ptr& operator= (
const Ptr& src);
230 nonvirtual Ptr& operator= (Ptr&& src)
noexcept;
235 nonvirtual IRep* operator->() const noexcept;
240 nonvirtual mongocxx::client& GetClientRef ();
246 Ptr New (const Options& options);
253 class IRep : public Database::Document::Connection::IRep {
255 virtual mongocxx::client& GetClientRef () = 0;
263 class Transaction :
public Database::Document::Transaction {
265 using inherited = Database::Document::Transaction;
270 Transaction () =
delete;
271 Transaction (
const Connection::Ptr& db);
272 Transaction (
const Transaction&) =
delete;
286#include "MongoDBClient.inl"
Mapping< String, VariantValue > Document