Common System 0.2.0
Common interfaces and patterns for system integration
Loading...
Searching...
No Matches
main.cpp
Go to the documentation of this file.
1
15
17#include <kcenon/common/config/config_reader.h>
18#include <kcenon/database/core/database.h>
19#include <kcenon/thread/core/thread_pool.h>
20#include <kcenon/logger/core/logger.h>
21
22#include <iostream>
23#include <csignal>
24#include <atomic>
25
26using namespace kcenon;
27
28// Application state
29std::atomic<bool> g_running{true};
30
31// Signal handler for graceful shutdown
32void signal_handler(int signal) {
33 std::cout << "\nReceived signal " << signal << ", shutting down...\n";
34 g_running = false;
35}
36
37// User data model
38struct User {
39 int id;
40 std::string name;
41 std::string email;
42};
43
44// Business logic: Process user registration
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
51 // Validate input
52 if (name.empty() || email.empty()) {
55 "Name and email are required",
56 "register_user"
57 );
58 }
59
60 logger->log(common::log_level::info,
61 "Registering user: " + name + " <" + email + ">");
62
63 // Check if user already exists
64 auto check_query = "SELECT COUNT(*) FROM users WHERE email = '" + email + "'";
65 auto check_result = db->query(check_query);
66
67 if (check_result.is_err()) {
68 return common::make_error<User>(check_result.error());
69 }
70
71 if (check_result.value().rows[0].get<int>(0) > 0) {
74 "User with email already exists",
75 "register_user"
76 );
77 }
78
79 // Insert new user
80 auto insert_query = "INSERT INTO users (name, email) VALUES ('"
81 + name + "', '" + email + "')";
82 auto insert_result = db->execute(insert_query);
83
84 if (insert_result.is_err()) {
85 logger->log(common::log_level::error,
86 "Failed to insert user: " + insert_result.error().message);
87 return common::make_error<User>(insert_result.error());
88 }
89
90 // Retrieve inserted user
91 auto user_id = db->last_insert_id();
92
93 logger->log(common::log_level::info,
94 "User registered successfully with ID: " + std::to_string(user_id));
95
96 return common::ok(User{
97 .id = static_cast<int>(user_id),
98 .name = name,
99 .email = email
100 });
101}
102
103int main(int argc, char** argv) {
104 // Install signal handlers
105 std::signal(SIGINT, signal_handler);
106 std::signal(SIGTERM, signal_handler);
107
108 std::cout << "=== Multi-System Application Demo ===\n\n";
109
110 // Step 1: Load Configuration
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";
116 }
117 auto cfg = config_result.is_ok() ? config_result.value()
118 : common::config::Config::defaults();
119
120 // Step 2: Initialize Systems
121 std::cout << "2. Initializing systems...\n";
123 opts.enable_logging = true;
124 opts.enable_database = true;
125 opts.config_path = "app.yaml";
126
127 auto init_result = common::di::unified_bootstrapper::initialize(opts);
128 if (init_result.is_err()) {
129 std::cerr << "Initialization failed: "
130 << init_result.error().message << "\n";
131 return 1;
132 }
133
134 std::cout << " ✓ Systems initialized successfully\n\n";
135
136 // Step 3: Resolve Services
138 auto logger = services.resolve<common::interfaces::ILogger>();
139 auto executor = services.resolve<common::interfaces::IExecutor>();
140
141 // Step 4: Setup Database
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";
146
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";
152 return 1;
153 }
154 auto db = db_result.value();
155
156 // Create users table
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"
162 ")"
163 );
164
165 if (create_table_result.is_err()) {
166 std::cerr << "Table creation failed\n";
168 return 1;
169 }
170
171 std::cout << " ✓ Database ready\n\n";
172
173 // Step 5: Application Logic
174 std::cout << "4. Running application...\n";
175 logger->log(common::log_level::info, "Application started");
176
177 // Register sample users
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"}
182 };
183
184 for (const auto& [name, email] : sample_users) {
185 auto result = register_user(db, logger, name, email);
186
187 if (result.is_ok()) {
188 const auto& user = result.value();
189 std::cout << " ✓ Registered: " << user.name
190 << " (ID: " << user.id << ")\n";
191 } else {
192 std::cout << " ✗ Failed: " << name
193 << " - " << result.error().message << "\n";
194 }
195
196 // Simulate some processing time
197 std::this_thread::sleep_for(std::chrono::milliseconds(100));
198
199 if (!g_running) {
200 break;
201 }
202 }
203
204 // Query all users
205 std::cout << "\n5. Querying all users...\n";
206 auto users_result = db->query("SELECT id, name, email FROM users");
207
208 if (users_result.is_ok()) {
209 const auto& rows = users_result.value().rows;
210 std::cout << " Total users: " << rows.size() << "\n";
211
212 for (const auto& row : rows) {
213 std::cout << " - " << row.get<std::string>(1)
214 << " <" << row.get<std::string>(2) << ">\n";
215 }
216 }
217
218 logger->log(common::log_level::info, "Application completed");
219
220 // Step 6: Graceful Shutdown
221 std::cout << "\n6. Shutting down...\n";
222 auto shutdown_result = common::di::unified_bootstrapper::shutdown(
223 std::chrono::seconds(5)
224 );
225
226 if (shutdown_result.is_err()) {
227 std::cerr << "Shutdown error: "
228 << shutdown_result.error().message << "\n";
229 return 1;
230 }
231
232 std::cout << " ✓ Shutdown complete\n";
233 std::cout << "\n=== Application Finished ===\n";
234
235 return 0;
236}
int main()
Result type for error handling with member function support.
Definition core.cppm:165
static service_container & services()
Get the service container.
static VoidResult shutdown(std::chrono::milliseconds timeout=std::chrono::seconds(30))
Shutdown the unified system gracefully.
static VoidResult initialize(const bootstrapper_options &opts={})
Initialize the unified system.
Abstract interface for task execution systems.
Definition executor.cppm:80
Standard interface for logging implementations.
Definition logger.cppm:95
void signal_handler(int signal)
Definition main.cpp:32
std::atomic< bool > g_running
Definition main.cpp:29
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 >
Definition main.cpp:45
constexpr int ALREADY_EXISTS
Definition compat.h:37
constexpr int INVALID_ARGUMENT
Definition compat.h:31
Result< T > make_error(int code, const std::string &message, const std::string &module="")
Create an error result with code and message.
Definition utilities.h:91
VoidResult ok()
Create a successful void result.
Definition utilities.h:71
Definition main.cpp:38
std::string name
Definition main.cpp:40
int id
Definition main.cpp:39
std::string email
Definition main.cpp:41
Configuration options for the unified bootstrapper.
bool enable_logging
Enable logging system services.
bool enable_database
Enable database system services.
std::string config_path
Path to configuration file (optional)
Unified system bootstrapper for initialization and shutdown.