4#include "Stroika/Frameworks/StroikaPreComp.h"
9#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;
80 static const Activity kMongoCXXActivity_{
"performing MongoDBConnection test on {}"_f(kTestDBName_)};
82 auto adminDB = AdminConnection::New (AdminConnection::Options{.fConnectionTarget = *mongoConnectionString});
83 IgnoreExceptionsForCall (adminDB.DropDatabase (kTestDBName_));
84 adminDB.CreateDatabase (kTestDBName_);
86 MongoDBClient::Connection::Options{.fConnectionTarget = *mongoConnectionString, .fDatabase = kTestDBName_});
87 cerr <<
"Starting mongodb networks sample:" << endl;
88 ComputerNetworksModel ([=] () {
89 cerr <<
"\tConnecting to {} database {}"_f(*mongoConnectionString, kTestDBName_) << endl;
90 return MongoDBClient::Connection::New (
91 MongoDBClient::Connection::Options{.fConnectionTarget = *mongoConnectionString, .fDatabase = kTestDBName_});
93 cerr <<
"done." << endl;
96 cerr <<
"\t{}"_f(current_exception ()) << endl;
99 if (mongoConnectionString) {
100 using namespace Stroika::Foundation::Database::Document::MongoDBClient;
101 const String kTestDBName_ =
"DocumentDB-Sample-Employees"sv;
104 static const Activity kMongoCXXActivity_{
"performing MongoDBConnection test on {}"_f(kTestDBName_)};
106 auto adminDB = AdminConnection::New (AdminConnection::Options{.fConnectionTarget = *mongoConnectionString});
107 IgnoreExceptionsForCall (adminDB.DropDatabase (kTestDBName_));
108 adminDB.CreateDatabase (kTestDBName_);
110 MongoDBClient::Connection::Options{.fConnectionTarget = *mongoConnectionString, .fDatabase = kTestDBName_});
111 cerr <<
"Starting mongodb employees sample:" << endl;
112 EmployeesDB ([=] () {
113 cerr <<
"\tConnecting to {} database {}"_f(*mongoConnectionString, kTestDBName_) << endl;
114 return MongoDBClient::Connection::New (
115 MongoDBClient::Connection::Options{.fConnectionTarget = *mongoConnectionString, .fDatabase = kTestDBName_});
117 cerr <<
"done." << endl;
120 cerr <<
"\t{}"_f(current_exception ()) << endl;
125#if qStroika_HasComponent_sqlite
128 const String kTestDBName_ =
"DocumentDB-Sample-Networks"sv;
129 cerr <<
"Starting sqlite document db networks sample:" << endl;
130 ComputerNetworksModel ([=] () {
131 cerr <<
"\tConnecting to sqlite memory db: {}"_f(kTestDBName_) << endl;
132 return SQLite::Connection::New (SQLite::Connection::Options{.fInMemoryDB = kTestDBName_});
134 cerr <<
"done." << endl;
137 const String kTestDBName_ =
"DocumentDB-Sample-Employees"sv;
138 cerr <<
"Starting sqlite document db employees sample:" << endl;
139 EmployeesDB ([=] () {
140 cerr <<
"\tConnecting to sqlite memory db: {}"_f(kTestDBName_) << endl;
142 return SQLite::Connection::New (SQLite::Connection::Options{.fInMemoryDB = kTestDBName_, .fBusyTimeout = 100ms});
144 cerr <<
"done." << endl;
150 cerr <<
"Starting sqlite document db networks sample:" << endl;
151 ComputerNetworksModel ([=] () {
152 cerr <<
"\tConnecting to sqlite db: {}"_f(dbPath) << endl;
153 return SQLite::Connection::New (SQLite::Connection::Options{.fDBPath = dbPath});
155 cerr <<
"done." << endl;
160 cerr <<
"Starting sqlite document db employees sample:" << endl;
161 EmployeesDB ([=] () {
162 cerr <<
"\tConnecting to sqlite db: {}"_f(dbPath) << endl;
164 auto c = SQLite::Connection::New (SQLite::Connection::Options{.fDBPath = dbPath, .fBusyTimeout = 100ms});
167 cerr <<
"done." << endl;
171 cerr <<
"Starting trivial document db networks sample:" << endl;
172 auto internallySynchronizedDBConnection =
174 ComputerNetworksModel ([=] () {
175 cerr <<
"\tConnecting to trivial document db: {}" << endl;
176 return internallySynchronizedDBConnection;
178 cerr <<
"done." << endl;
181 cerr <<
"Starting trivial document db employees sample:" << endl;
182 auto internallySynchronizedDBConnection =
184 EmployeesDB ([=] () {
185 cerr <<
"\tConnecting to trivial document db: {}" << endl;
186 return internallySynchronizedDBConnection;
188 cerr <<
"done." << endl;
String is like std::u32string, except it is much easier to use, often much more space efficient,...
filesystem::path GetTemporary()