46 std::shared_ptr<database::database> db,
47 std::shared_ptr<common::interfaces::ILogger> logger,
48 const std::string& name,
49 const std::string& email
52 if (name.empty() || email.empty()) {
55 "Name and email are required",
60 logger->log(common::log_level::info,
61 "Registering user: " + name +
" <" + email +
">");
64 auto check_query =
"SELECT COUNT(*) FROM users WHERE email = '" + email +
"'";
65 auto check_result = db->query(check_query);
67 if (check_result.is_err()) {
71 if (check_result.value().rows[0].get<
int>(0) > 0) {
74 "User with email already exists",
80 auto insert_query =
"INSERT INTO users (name, email) VALUES ('"
81 + name +
"', '" + email +
"')";
82 auto insert_result = db->execute(insert_query);
84 if (insert_result.is_err()) {
85 logger->log(common::log_level::error,
86 "Failed to insert user: " + insert_result.error().message);
91 auto user_id = db->last_insert_id();
93 logger->log(common::log_level::info,
94 "User registered successfully with ID: " + std::to_string(user_id));
97 .id =
static_cast<int>(user_id),
103int main(
int argc,
char** argv) {
108 std::cout <<
"=== Multi-System Application Demo ===\n\n";
111 std::cout <<
"1. Loading configuration...\n";
112 auto config_result = common::config::read_yaml(
"app.yaml");
113 if (config_result.is_err()) {
114 std::cerr <<
"Config error: " << config_result.error().message <<
"\n";
115 std::cerr <<
"Using default configuration\n";
117 auto cfg = config_result.is_ok() ? config_result.value()
118 : common::config::Config::defaults();
121 std::cout <<
"2. Initializing systems...\n";
128 if (init_result.is_err()) {
129 std::cerr <<
"Initialization failed: "
130 << init_result.error().message <<
"\n";
134 std::cout <<
" ✓ Systems initialized successfully\n\n";
142 std::cout <<
"3. Setting up database...\n";
143 database::connection_config db_config;
144 db_config.type = database::db_type::sqlite;
145 db_config.path =
"users.db";
147 auto db_result = database::database::connect(db_config);
148 if (db_result.is_err()) {
149 std::cerr <<
"Database connection failed: "
150 << db_result.error().message <<
"\n";
154 auto db = db_result.value();
157 auto create_table_result = db->execute(
158 "CREATE TABLE IF NOT EXISTS users ("
159 " id INTEGER PRIMARY KEY AUTOINCREMENT,"
160 " name TEXT NOT NULL,"
161 " email TEXT UNIQUE NOT NULL"
165 if (create_table_result.is_err()) {
166 std::cerr <<
"Table creation failed\n";
171 std::cout <<
" ✓ Database ready\n\n";
174 std::cout <<
"4. Running application...\n";
175 logger->log(common::log_level::info,
"Application started");
178 std::vector<std::pair<std::string, std::string>> sample_users = {
179 {
"Alice Smith",
"alice@example.com"},
180 {
"Bob Johnson",
"bob@example.com"},
181 {
"Carol Williams",
"carol@example.com"}
184 for (
const auto& [name, email] : sample_users) {
187 if (result.is_ok()) {
188 const auto& user = result.value();
189 std::cout <<
" ✓ Registered: " << user.name
190 <<
" (ID: " << user.id <<
")\n";
192 std::cout <<
" ✗ Failed: " << name
193 <<
" - " << result.error().message <<
"\n";
197 std::this_thread::sleep_for(std::chrono::milliseconds(100));
205 std::cout <<
"\n5. Querying all users...\n";
206 auto users_result = db->query(
"SELECT id, name, email FROM users");
208 if (users_result.is_ok()) {
209 const auto& rows = users_result.value().rows;
210 std::cout <<
" Total users: " << rows.size() <<
"\n";
212 for (
const auto& row : rows) {
213 std::cout <<
" - " << row.get<std::string>(1)
214 <<
" <" << row.get<std::string>(2) <<
">\n";
218 logger->log(common::log_level::info,
"Application completed");
221 std::cout <<
"\n6. Shutting down...\n";
223 std::chrono::seconds(5)
226 if (shutdown_result.is_err()) {
227 std::cerr <<
"Shutdown error: "
228 << shutdown_result.error().message <<
"\n";
232 std::cout <<
" ✓ Shutdown complete\n";
233 std::cout <<
"\n=== Application Finished ===\n";
void signal_handler(int signal)
std::atomic< bool > g_running
auto register_user(std::shared_ptr< database::database > db, std::shared_ptr< common::interfaces::ILogger > logger, const std::string &name, const std::string &email) -> common::Result< User >