4#include "Stroika/Frameworks/StroikaPreComp.h"
10#include "Stroika/Foundation/Database/Document/MongoDBClient.h"
13#include "Stroika/Foundation/Execution/CommandLine.h"
14#include "Stroika/Foundation/Execution/Module.h"
18#include "ComputerNetwork.h"
19#include "EmployeesDB.h"
25using namespace Stroika::Foundation::Database;
28int main ([[maybe_unused]]
int argc, [[maybe_unused]]
const char* argv[])
30 using namespace Database::Document;
32 using namespace Stroika::Samples::Document;
34#if qStroika_HasComponent_mongocxxdriver
35 optional<String> mongoConnectionString;
40 using namespace StandardCommandLineOptions;
42 .fLongName =
"mongoConnectionString"sv,
43 .fSupportsArgument =
true,
44 .fHelpOptionText =
"Connect to this mongo database for testing, eg: mongodb://admin:pass@localhost:27017; OR ENV VAR MONGO_CONNECTION_STRING"sv};
46 const initializer_list<CommandLine::Option> kAllOptions_{kHelp,
47#if qStroika_HasComponent_mongocxxdriver
48 kMongoConnectionStringOption_
53 if (cmdLine.Has (kHelp)) {
54 cerr << CommandLine::GenerateUsage (
"documentDB", kAllOptions_);
57 if (
auto error = cmdLine.ValidateQuietly (kAllOptions_)) {
58 cerr <<
"{}"_f(*error) << endl;
59 cerr << CommandLine::GenerateUsage (
"myApp", kAllOptions_) << endl;
61#if qStroika_HasComponent_mongocxxdriver
62 mongoConnectionString = Memory::Or_Else (cmdLine.GetArgument (kMongoConnectionStringOption_),
63 [] () { return kEnvironment->Lookup (
"MONGO_CONNECTION_STRING"sv); });
67#if qStroika_HasComponent_mongocxxdriver
68 Database::Document::MongoDBClient::Activator activator{};
71#if qStroika_HasComponent_mongocxxdriver
72 if (not mongoConnectionString) {
73 cerr <<
"Warning: skipping mongodb test because no connection string specified on command-line nor environment variable" << endl;
75 if (mongoConnectionString) {
76 using namespace Stroika::Foundation::Database::Document::MongoDBClient;
77 const String kTestDBName_ =
"DocumentDB-Sample-Networks"sv;
79 static const Activity kActivity_{
"performing MongoDBClient test on {}"_f(kTestDBName_)};
81 auto adminDB = AdminConnection::New (AdminConnection::Options{.fConnectionTarget = *mongoConnectionString});
82 IgnoreExceptionsForCall (adminDB.DropDatabase (kTestDBName_));
83 adminDB.CreateDatabase (kTestDBName_);
84 cerr <<
"Starting MongoDBClient networks sample:" << endl;
85 ComputerNetworksModel ([=] () {
87 cerr <<
"\tConnecting to {} database {}"_f(*mongoConnectionString, kTestDBName_) << endl;
88 return MongoDBClient::Connection::New (
89 MongoDBClient::Connection::Options{.fConnectionTarget = *mongoConnectionString, .fDatabase = kTestDBName_});
91 cerr <<
"done." << endl;
94 cerr <<
"\t{}"_f(current_exception ()) << endl;
97 if (mongoConnectionString) {
98 using namespace Stroika::Foundation::Database::Document::MongoDBClient;
99 const String kTestDBName_ =
"DocumentDB-Sample-Employees"sv;
101 static const Activity kActivity_{
"performing MongoDBClient test on {}"_f(kTestDBName_)};
103 auto adminDB = AdminConnection::New (AdminConnection::Options{.fConnectionTarget = *mongoConnectionString});
104 IgnoreExceptionsForCall (adminDB.DropDatabase (kTestDBName_));
105 adminDB.CreateDatabase (kTestDBName_);
107 .fInternallySynchronizedLetter = eInternallySynchronized, .fConnectionTarget = *mongoConnectionString, .fDatabase = kTestDBName_});
108 cerr <<
"Starting mongodb employees sample:" << endl;
109 EmployeesDB ([=] () {
110 cerr <<
"\tConnecting to {} database {}"_f(*mongoConnectionString, kTestDBName_) << endl;
111 return internallySyncrhonizedConnection;
114 cerr <<
"done." << endl;
117 cerr <<
"\t{}"_f(current_exception ()) << endl;
122#if qStroika_HasComponent_sqlite
125 const String kTestDBName_ =
"DocumentDB-Sample-Networks"sv;
126 static const Activity kActivity_{
"performing sqlite document db networks sample on {}"_f(kTestDBName_)};
128 cerr <<
"Starting sqlite document db networks sample:" << endl;
129 ComputerNetworksModel ([=] () {
130 cerr <<
"\tConnecting to sqlite memory db: {}"_f(kTestDBName_) << endl;
131 return SQLite::Connection::New (SQLite::Connection::Options{.fInMemoryDB = kTestDBName_});
133 cerr <<
"done." << endl;
136 cerr <<
"\t{}"_f(current_exception ()) << endl;
139 const String kTestDBName_ =
"DocumentDB-Sample-Employees"sv;
140 static const Activity kActivity_{
"performing sqlite document db employees sample on {}"_f(kTestDBName_)};
142 cerr <<
"Starting sqlite document db employees sample on memory db {}"_f(kTestDBName_) << endl;
143 EmployeesDB ([=] () {
144 cerr <<
"\tConnecting to sqlite memory db: {}"_f(kTestDBName_) << endl;
145 return SQLite::Connection::New (SQLite::Connection::Options{.fInMemoryDB = kTestDBName_});
147 cerr <<
"done." << endl;
150 cerr <<
"\t{}"_f(current_exception ()) << endl;
155 static const Activity kActivity_{
"performing sqlite document db networks sample on {}"_f(dbPath)};
158 cerr <<
"Starting sqlite document db networks sample:" << endl;
159 ComputerNetworksModel ([=] () {
160 cerr <<
"\tConnecting to sqlite db: {}"_f(dbPath) << endl;
161 return SQLite::Connection::New (SQLite::Connection::Options{.fDBPath = dbPath});
163 cerr <<
"done." << endl;
166 cerr <<
"\t{}"_f(current_exception ()) << endl;
170 static const Activity kActivity_{
"performing Starting sqlite document db employees sample on {}"_f(dbPath)};
173 cerr <<
"Starting sqlite document db employees sample on {}"_f(dbPath) << endl;
174 EmployeesDB ([=] () {
175 cerr <<
"\tConnecting to sqlite db: {}"_f(dbPath) << endl;
176 auto c = SQLite::Connection::New (SQLite::Connection::Options{.fDBPath = dbPath});
179 cerr <<
"done." << endl;
182 cerr <<
"\t{}"_f(current_exception ()) << endl;
187 static constexpr Activity kActivity_{
"performing trivial document db networks sample"sv};
189 cerr <<
"Starting trivial document db networks sample:" << endl;
192 ComputerNetworksModel ([=] () {
193 cerr <<
"\tConnecting to trivial document db: memory" << endl;
194 return internallySynchronizedDBConnection;
196 cerr <<
"done." << endl;
199 cerr <<
"\t{}"_f(current_exception ()) << endl;
202 static constexpr Activity kActivity_{
"performing trivial document db employees sample"sv};
204 cerr <<
"Starting trivial document db employees sample:" << endl;
207 EmployeesDB ([=] () {
208 cerr <<
"\tConnecting to trivial document db: memory" << endl;
209 return internallySynchronizedDBConnection;
211 cerr <<
"done." << endl;
214 cerr <<
"\t{}"_f(current_exception ()) << endl;
217 static constexpr Activity kActivity_{
"performing trivial document db employees sample"sv};
219 cerr <<
"Starting trivial document db employees sample:" << endl;
223 EmployeesDB ([=] () {
224 cerr <<
"\tConnecting to trivial document db: {}"_f(p) << endl;
225 return internallySynchronizedDBConnection;
227 cerr <<
"done." << endl;
230 cerr <<
"\t{}"_f(current_exception ()) << endl;
233 static constexpr Activity kActivity_{
"performing trivial document db employees sample"sv};
235 cerr <<
"Starting trivial document db employees sample:" << endl;
239 EmployeesDB ([=] () {
240 cerr <<
"\tConnecting to trivial document db: {}"_f(p) << endl;
241 return internallySynchronizedDBConnection;
243 cerr <<
"done." << endl;
246 cerr <<
"\t{}"_f(current_exception ()) << endl;
String is like std::u32string, except it is much easier to use, often much more space efficient,...
filesystem::path GetTemporary()
Execution::InternallySynchronized fInternallySynchronizedLetter
use eInternallySynchronized to make letter internally synchronized