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;
43#ifndef qStroika_HasComponent_mongocxxdriver
44#error "qStroika_HasComponent_mongocxxdriver should normally be defined indirectly by StroikaConfig.h"
47namespace Stroika::Foundation::Database::Document::MongoDBClient {
49#if qStroika_HasComponent_mongocxxdriver
65 struct Activator final {
66 enum AllowReactivateFlag {
70 Activator (AllowReactivateFlag);
74 bool fAllowReactivation_;
75 static unique_ptr<mongocxx::instance> sMongoInstance_;
84 class ConnectionPool final {
86 ConnectionPool () =
delete;
87 ConnectionPool (
const ConnectionPool&) =
default;
88 ConnectionPool (shared_ptr<mongocxx::pool>&& poolRep);
89 ConnectionPool (
const String& connectionString);
90 ~ConnectionPool () =
default;
95 nonvirtual mongocxx::pool& PeekPool ()
const;
99 shared_ptr<mongocxx::pool> fPool_;
102 namespace AdminConnection {
108 class Ptr :
public shared_ptr<IRep> {
110 using inherited = shared_ptr<IRep>;
115 Ptr () noexcept = default;
116 Ptr (const Ptr& src) noexcept = default;
117 Ptr (const shared_ptr<IRep>& src) noexcept;
118 Ptr (nullptr_t) noexcept;
121 ~Ptr () noexcept = default;
126 nonvirtual Document run_command (const Document& v);
131 nonvirtual mongocxx::client& GetClientRef ();
136 nonvirtual Set<String> GetDatabases ();
141 nonvirtual
void DropDatabase (const String& dbName);
146 nonvirtual
void CreateDatabase (const String& dbName);
154 virtual Document run_command (
const Document& v) = 0;
157 virtual mongocxx::client& GetClientRef () = 0;
160 virtual Set<String> GetDatabases () = 0;
163 virtual void DropDatabase (
const String& dbName) = 0;
166 virtual void CreateDatabase (
const String& dbName) = 0;
174 struct Options final : Database::Document::Connection::Options {
183 Execution::InternallySynchronized fInternallySynchronizedLetter{Execution::eNotKnownInternallySynchronized};
188 variant<String, ConnectionPool> fConnectionTarget;
194 Ptr New (
const Options& options);
197 namespace Connection {
199 using namespace Database::Document::Connection;
208 struct Options final : Database::Document::Connection::Options {
217 Execution::InternallySynchronized fInternallySynchronizedLetter{Execution::eNotKnownInternallySynchronized};
222 variant<String, ConnectionPool> fConnectionTarget;
236 class Ptr :
public Database::Document::Connection::Ptr {
238 using inherited = Database::Document::Connection::Ptr;
243 Ptr () noexcept = default;
244 Ptr (const Ptr& src);
245 Ptr (const shared_ptr<IRep>& src);
246 Ptr (nullptr_t) noexcept;
254 nonvirtual Ptr& operator= (const Ptr& src);
255 nonvirtual Ptr& operator= (Ptr&& src) noexcept;
260 nonvirtual IRep* operator->() const noexcept;
265 nonvirtual mongocxx::client& GetClientRef ();
271 Ptr New (const Options& options);
278 class IRep : public Database::Document::Connection::IRep {
280 virtual mongocxx::client& GetClientRef () = 0;
288 class Transaction :
public Database::Document::Transaction {
290 using inherited = Database::Document::Transaction;
295 Transaction () =
delete;
296 Transaction (
const Connection::Ptr& db);
297 Transaction (
const Transaction&) =
delete;
311#include "MongoDBClient.inl"
Mapping< String, VariantValue > Document