Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
unified_database_system.cpp
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
17#include "../postgres_manager.h"
18
19#include <mutex>
20#include <chrono>
21#include <algorithm>
22#include <cctype>
23#include <stdexcept>
24#include <sstream>
25
26namespace database::integrated {
27
28// ============================================================================
29// Helper Functions
30// ============================================================================
31
32namespace {
33
34// Helper to create error VoidResult
35inline kcenon::common::VoidResult make_error(const std::string& msg, int code = -1, const std::string& context = "")
36{
37 return kcenon::common::VoidResult(kcenon::common::error_info{code, msg, context});
38}
39
40// Helper to create error Result<T>
41template <typename T>
42inline kcenon::common::Result<T> make_error_result(const std::string& msg, int code = -1, const std::string& context = "")
43{
44 return kcenon::common::Result<T>(kcenon::common::error_info{code, msg, context});
45}
46
47} // anonymous namespace
48
49
53static std::string backend_type_to_name(backend_type type) {
54 switch (type) {
55 case backend_type::postgres: return "postgresql";
56 case backend_type::sqlite: return "sqlite";
57 case backend_type::mongodb: return "mongodb";
58 case backend_type::redis: return "redis";
59 default: return "";
60 }
61}
62
69static std::shared_ptr<core::database_backend> create_backend(backend_type type) {
70 switch (type) {
72 return std::make_shared<postgres_manager>();
73 default: {
74 // Fall back to backend_registry for other types
75 auto name = backend_type_to_name(type);
76 if (!name.empty()) {
77 auto backend = core::backend_registry::instance().create(name);
78 if (backend) {
79 return std::shared_ptr<core::database_backend>(std::move(backend));
80 }
81 }
82 return nullptr;
83 }
84 }
85}
86
90static std::string value_to_string(const core::database_value& value) {
91 return std::visit([](const auto& v) -> std::string {
92 using T = std::decay_t<decltype(v)>;
93 if constexpr (std::is_same_v<T, std::string>) {
94 return v;
95 } else if constexpr (std::is_same_v<T, int64_t>) {
96 return std::to_string(v);
97 } else if constexpr (std::is_same_v<T, double>) {
98 return std::to_string(v);
99 } else if constexpr (std::is_same_v<T, bool>) {
100 return v ? "true" : "false";
101 } else if constexpr (std::is_same_v<T, std::nullptr_t>) {
102 return "NULL";
103 }
104 return "";
105 }, value);
106}
107
112 const core::database_result& db_result,
113 std::chrono::microseconds exec_time) {
114
115 query_result result;
116 result.rows.reserve(db_result.size());
117
118 // Convert each row: map<string, database_value> -> map<string, string>
119 for (const auto& db_row : db_result) {
120 row_data converted_row;
121 for (const auto& [key, value] : db_row) {
122 converted_row[key] = value_to_string(value);
123 }
124 result.rows.push_back(std::move(converted_row));
125 }
126
127 result.affected_rows = db_result.size();
128 result.execution_time = exec_time;
129
130 return result;
131}
132
133// ============================================================================
134// Prepared Statement Helpers
135// ============================================================================
136
137namespace {
138
142std::vector<core::database_value> convert_params(const std::vector<query_param>& params) {
143 std::vector<core::database_value> values;
144 values.reserve(params.size());
145 for (const auto& p : params) {
146 if (p.is_null()) {
147 values.emplace_back(nullptr);
148 } else {
149 values.emplace_back(p.get_value());
150 }
151 }
152 return values;
153}
154
158bool is_select_query(const std::string& query) {
159 // Skip leading whitespace and find the first keyword
160 auto pos = query.find_first_not_of(" \t\n\r");
161 if (pos == std::string::npos) return false;
162 // Case-insensitive check for SELECT (or WITH which precedes CTEs)
163 auto keyword = query.substr(pos, 6);
164 for (auto& c : keyword) c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
165 return keyword.substr(0, 6) == "select" || keyword.substr(0, 4) == "with";
166}
167
168} // anonymous namespace
169
170// ============================================================================
171// Transaction Implementation
172// ============================================================================
173
175public:
176 explicit transaction_impl(std::shared_ptr<core::database_backend> backend)
177 : backend_(std::move(backend)), active_(false) {
178
179 // Begin transaction
180 if (backend_) {
181 auto result = backend_->begin_transaction();
182 if (result.is_ok()) {
183 active_ = true;
184 }
185 }
186 }
187
188 ~transaction_impl() override {
189 if (active_) {
190 // Auto-rollback if not committed
191 backend_->rollback_transaction();
192 }
193 }
194
195 kcenon::common::Result<query_result> execute(
196 const std::string& query,
197 const std::vector<query_param>& params) override {
198
199 if (!active_) {
200 return make_error_result<query_result>("Transaction not active", -1, "transaction");
201 }
202
203 auto start = std::chrono::steady_clock::now();
204
205 kcenon::common::Result<core::database_result> db_result = [&]() {
206 if (params.empty()) {
207 if (is_select_query(query)) {
208 return backend_->select_query(query);
209 }
210 auto exec_res = backend_->execute_query(query);
211 if (exec_res.is_err()) {
212 return kcenon::common::Result<core::database_result>(exec_res.error());
213 }
214 return kcenon::common::Result<core::database_result>(core::database_result{});
215 }
216 auto values = convert_params(params);
217 if (is_select_query(query)) {
218 return backend_->select_prepared(query, values);
219 }
220 auto exec_res = backend_->execute_prepared(query, values);
221 if (exec_res.is_err()) {
222 return kcenon::common::Result<core::database_result>(exec_res.error());
223 }
224 return kcenon::common::Result<core::database_result>(core::database_result{});
225 }();
226
227 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
228 std::chrono::steady_clock::now() - start);
229
230 if (db_result.is_err()) {
231 return db_result.error();
232 }
233
234 auto qr = convert_result(db_result.value(), duration);
235 // execute_query / execute_prepared return VoidResult (no row count),
236 // so affected_rows stays 0 after convert_result. For successful DML
237 // queries we report at least 1 affected row.
238 if (!is_select_query(query) && qr.affected_rows == 0) {
239 qr.affected_rows = 1;
240 }
241 return qr;
242 }
243
244 kcenon::common::VoidResult commit() override {
245 if (!active_) {
246 return make_error("Transaction not active", -1, "transaction");
247 }
248
249 auto result = backend_->commit_transaction();
250 if (result.is_err()) {
251 return make_error("Commit failed: " + result.error().message, -1, "transaction");
252 }
253
254 active_ = false;
255 return kcenon::common::ok();
256 }
257
258 kcenon::common::VoidResult rollback() override {
259 if (!active_) {
260 return make_error("Transaction not active", -1, "transaction");
261 }
262
263 auto result = backend_->rollback_transaction();
264 if (result.is_err()) {
265 return make_error("Rollback failed: " + result.error().message, -1, "transaction");
266 }
267
268 active_ = false;
269 return kcenon::common::ok();
270 }
271
272 bool is_active() const override {
273 return active_;
274 }
275
276private:
277 std::shared_ptr<core::database_backend> backend_;
279};
280
281// ============================================================================
282// PIMPL Implementation
283// ============================================================================
284
286public:
287 impl(const unified_db_config& config)
288 : config_(config)
289 , coordinator_(std::make_unique<database_coordinator>(config))
291 , connected_(false)
292 , initialized_(false)
293 {
294 // Coordinator initialization is deferred to ensure_initialized()
295 // to maintain the no-throw guarantee documented in the public API.
296 metrics_.measurement_start = std::chrono::steady_clock::now();
297 }
298
300 disconnect();
301 coordinator_->shutdown();
302 }
303
304 // Connection management
305
306 kcenon::common::VoidResult connect(backend_type backend, const std::string& connection_string) {
307 std::lock_guard<std::mutex> lock(mutex_);
308
309 auto init_result = ensure_initialized();
310 if (!init_result.is_ok()) {
311 return init_result;
312 }
313
314 if (connected_) {
315 return make_error("Already connected", -1, "unified_database_system");
316 }
317
318 backend_type_ = backend;
319 connection_string_ = connection_string;
320
321 // Create backend instance
322 backend_ = create_backend(backend);
323 if (!backend_) {
324 return make_error("Unsupported backend type", -2, "unified_database_system");
325 }
326
327 // Connect to database using connection_config
328 auto config = core::connection_config::from_string(connection_string);
329 auto result = backend_->initialize(config);
330 if (result.is_err()) {
331 return make_error("Connection failed: " + result.error().message, -3, "unified_database_system");
332 }
333
334 connected_ = true;
335
336 // Log connection
337 if (auto* logger = coordinator_->get_logger()) {
338 logger->log_connection_event(
339 "connected",
340 "Connection established to: " + connection_string
341 );
342 }
343
344 return kcenon::common::ok();
345 }
346
347 kcenon::common::VoidResult disconnect() {
348 std::lock_guard<std::mutex> lock(mutex_);
349
350 if (!connected_) {
351 return kcenon::common::ok();
352 }
353
354 // Disconnect backend
355 if (backend_) {
356 backend_->shutdown();
357 backend_.reset();
358 }
359
360 connected_ = false;
361
362 // Log disconnection
363 if (auto* logger = coordinator_->get_logger()) {
364 logger->log_connection_event(
365 "disconnected",
366 "Connection closed: " + connection_string_
367 );
368 }
369
370 return kcenon::common::ok();
371 }
372
373 bool is_connected() const {
374 std::lock_guard<std::mutex> lock(mutex_);
375 return connected_;
376 }
377
378 // Query execution (sync)
379
380 kcenon::common::Result<query_result> execute(
381 const std::string& query,
382 const std::vector<query_param>& params) {
383
384 std::lock_guard<std::mutex> lock(mutex_);
385
386 if (!connected_) {
387 return make_error_result<query_result>("Not connected to database", -1, "unified_database_system");
388 }
389
390 // Record query start
391 auto start = std::chrono::steady_clock::now();
392
393 // Execute query — use prepared statements when params are provided
394 kcenon::common::Result<core::database_result> db_result = [&]() {
395 if (params.empty()) {
396 if (is_select_query(query)) {
397 return backend_->select_query(query);
398 }
399 auto exec_res = backend_->execute_query(query);
400 if (exec_res.is_err()) {
401 return kcenon::common::Result<core::database_result>(exec_res.error());
402 }
403 return kcenon::common::Result<core::database_result>(core::database_result{});
404 }
405 auto values = convert_params(params);
406 if (is_select_query(query)) {
407 return backend_->select_prepared(query, values);
408 }
409 auto exec_res = backend_->execute_prepared(query, values);
410 if (exec_res.is_err()) {
411 return kcenon::common::Result<core::database_result>(exec_res.error());
412 }
413 return kcenon::common::Result<core::database_result>(core::database_result{});
414 }();
415
416 // Calculate execution time
417 auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
418 std::chrono::steady_clock::now() - start);
419
420 if (db_result.is_err()) {
421 update_metrics(duration, false);
422 return db_result.error();
423 }
424
425 // Update metrics
426 update_metrics(duration, true);
427
428 // Log query
429 if (auto* logger = coordinator_->get_logger()) {
430 logger->log(
432 "Query executed: " + query + " (" + std::to_string(duration.count()) + "us)"
433 );
434 }
435
436 // Record metrics
437 if (auto* monitor = coordinator_->get_monitor()) {
438 monitor->record_query_execution(duration, true);
439 }
440
441 auto qr = convert_result(db_result.value(), duration);
442 // execute_query / execute_prepared return VoidResult (no row count),
443 // so affected_rows stays 0 after convert_result. For successful DML
444 // queries we report at least 1 affected row.
445 if (!is_select_query(query) && qr.affected_rows == 0) {
446 qr.affected_rows = 1;
447 }
448 return qr;
449 }
450
451 // Query execution (async)
452
453 std::future<kcenon::common::Result<query_result>> execute_async(
454 const std::string& query,
455 const std::vector<query_param>& params) {
456
457 // Submit to thread pool
458 auto* thread_pool = coordinator_->get_thread_pool();
459 if (!thread_pool) {
460 std::promise<kcenon::common::Result<query_result>> promise;
461 promise.set_value(make_error_result<query_result>("Thread pool not available", -1, "unified_database_system"));
462 return promise.get_future();
463 }
464
465 // Create task
466 return thread_pool->submit([this, query, params]() -> kcenon::common::Result<query_result> {
467 return this->execute(query, params);
468 });
469 }
470
471 std::future<kcenon::common::Result<query_result>> execute_async_priority(
472 const std::string& query,
473 int priority,
474 const std::vector<query_param>& params) {
475
476 auto* thread_pool = coordinator_->get_thread_pool();
477 if (!thread_pool) {
478 std::promise<kcenon::common::Result<query_result>> promise;
479 promise.set_value(make_error_result<query_result>("Thread pool not available", -1, "unified_database_system"));
480 return promise.get_future();
481 }
482
483 // Note: Priority parameter is currently ignored
484 // Backend pattern removed priority support for simplification
485 (void)priority; // Suppress unused parameter warning
486
487 return thread_pool->submit([this, query, params]() -> kcenon::common::Result<query_result> {
488 return this->execute(query, params);
489 });
490 }
491
492 // Transaction management
493
494 kcenon::common::Result<std::unique_ptr<transaction>> begin_transaction() {
495 std::lock_guard<std::mutex> lock(mutex_);
496
497 if (!connected_) {
498 return make_error_result<std::unique_ptr<transaction>>("Not connected to database", -1, "unified_database_system");
499 }
500
502
503 auto tx_impl = std::make_unique<transaction_impl>(backend_);
504 std::unique_ptr<transaction> tx = std::move(tx_impl);
505 return tx;
506 }
507
508 kcenon::common::VoidResult execute_transaction(const std::vector<std::string>& queries) {
509 auto tx_result = begin_transaction();
510 if (!tx_result.is_ok()) {
511 return tx_result.error();
512 }
513
514 auto tx = std::move(tx_result.value());
515
516 for (const auto& query : queries) {
517 auto result = tx->execute(query, {});
518 if (!result.is_ok()) {
519 tx->rollback();
521 return result.error();
522 }
523 }
524
525 auto commit_result = tx->commit();
526 if (commit_result.is_ok()) {
528 } else {
530 }
531
532 return commit_result;
533 }
534
535 // Monitoring
536
538 std::lock_guard<std::mutex> lock(mutex_);
539 return metrics_;
540 }
541
543 std::lock_guard<std::mutex> lock(mutex_);
544
545 health_check health;
546 health.last_check = std::chrono::steady_clock::now();
547 health.is_connected = connected_;
548
549 // Check coordinator health
550 auto coord_health = coordinator_->check_health();
551 if (coord_health.is_ok() && coord_health.value()) {
552 health.logger_healthy = true;
553 health.monitor_healthy = true;
554 health.thread_pool_healthy = true;
555 }
556
557 // Connection pooling not yet implemented on client side
558 health.connection_pool_healthy = true;
559 health.connection_pool_utilization = 0.0;
560
561 // Determine overall health
562 if (!connected_) {
564 health.issues.push_back("Not connected to database");
565 } else {
567 }
568
569 return health;
570 }
571
573 std::lock_guard<std::mutex> lock(mutex_);
575 metrics_.measurement_start = std::chrono::steady_clock::now();
576 }
577
578 // Configuration access
579
581 return config_;
582 }
583
585 return backend_type_;
586 }
587
589 std::lock_guard<std::mutex> lock(mutex_);
590
591 // Connection pooling not yet implemented on client side
592 // Return empty stats for client-side
594 stats.total_connections = connected_ ? 1 : 0;
595 stats.active_connections = connected_ ? 1 : 0;
596 stats.idle_connections = 0;
597 stats.wait_queue_size = 0;
598 stats.utilization_percent = connected_ ? 100.0 : 0.0;
599
600 return stats;
601 }
602
603 // Query builder
604
608
609private:
610 kcenon::common::VoidResult ensure_initialized() {
611 if (initialized_) {
612 return kcenon::common::ok();
613 }
614 auto init_result = coordinator_->initialize();
615 if (!init_result.is_ok()) {
616 return make_error("Failed to initialize database coordinator: " +
617 init_result.error().message, -10, "unified_database_system");
618 }
619 initialized_ = true;
620 return kcenon::common::ok();
621 }
622
623 void update_metrics(std::chrono::microseconds latency, bool success) {
625
626 if (success) {
628 } else {
630 }
631
632 // Update latency stats
633 if (metrics_.min_latency == std::chrono::microseconds{0} ||
634 latency < metrics_.min_latency) {
635 metrics_.min_latency = latency;
636 }
637
638 if (latency > metrics_.max_latency) {
639 metrics_.max_latency = latency;
640 }
641
642 // Exponential Moving Average (EMA) with alpha = 0.1 (gives more weight to recent values)
643 // EMA formula: EMA_new = alpha * value + (1 - alpha) * EMA_old
644 constexpr double alpha = 0.1;
645 if (metrics_.total_queries == 1) {
646 // First query: initialize with actual latency
647 metrics_.average_latency = latency;
648 } else {
649 // Subsequent queries: apply EMA formula
650 auto current_avg_us = metrics_.average_latency.count();
651 auto new_latency_us = latency.count();
652 auto ema_us = static_cast<int64_t>(alpha * new_latency_us + (1.0 - alpha) * current_avg_us);
653 metrics_.average_latency = std::chrono::microseconds{ema_us};
654 }
655
656 // Calculate throughput
657 auto duration = std::chrono::steady_clock::now() - metrics_.measurement_start;
658 auto seconds = std::chrono::duration_cast<std::chrono::seconds>(duration).count();
659 if (seconds > 0) {
660 metrics_.queries_per_second = static_cast<double>(metrics_.total_queries) / seconds;
661 }
662
663 // Check for slow query
664 if (latency > config_.logger.slow_query_threshold) {
666 }
667 }
668
670 std::unique_ptr<database_coordinator> coordinator_;
671
676
677 std::shared_ptr<core::database_backend> backend_; // shared_ptr for transaction support
678
680
681 mutable std::mutex mutex_;
682};
683
684// ============================================================================
685// unified_database_system Implementation
686// ============================================================================
687
688// Constructors
689
693
695 : pimpl_(std::make_unique<impl>(config)) {
696}
697
699
702
703// Connection management
704
705kcenon::common::VoidResult unified_database_system::connect(const std::string& connection_string) {
706 return pimpl_->connect(backend_type::postgres, connection_string);
707}
708
709kcenon::common::VoidResult unified_database_system::connect(
710 backend_type backend,
711 const std::string& connection_string) {
712 return pimpl_->connect(backend, connection_string);
713}
714
715kcenon::common::VoidResult unified_database_system::disconnect() {
716 return pimpl_->disconnect();
717}
718
720 return pimpl_->is_connected();
721}
722
723// Query execution (sync)
724
725kcenon::common::Result<query_result> unified_database_system::execute(
726 const std::string& query,
727 const std::vector<query_param>& params) {
728 return pimpl_->execute(query, params);
729}
730
731kcenon::common::Result<query_result> unified_database_system::select(
732 const std::string& query,
733 const std::vector<query_param>& params) {
734 return pimpl_->execute(query, params);
735}
736
737kcenon::common::Result<size_t> unified_database_system::insert(
738 const std::string& query,
739 const std::vector<query_param>& params) {
740 auto result = pimpl_->execute(query, params);
741 if (result.is_ok()) {
742 return result.value().affected_rows;
743 }
744 return result.error();
745}
746
747kcenon::common::Result<size_t> unified_database_system::update(
748 const std::string& query,
749 const std::vector<query_param>& params) {
750 auto result = pimpl_->execute(query, params);
751 if (result.is_ok()) {
752 return result.value().affected_rows;
753 }
754 return result.error();
755}
756
757kcenon::common::Result<size_t> unified_database_system::remove(
758 const std::string& query,
759 const std::vector<query_param>& params) {
760 auto result = pimpl_->execute(query, params);
761 if (result.is_ok()) {
762 return result.value().affected_rows;
763 }
764 return result.error();
765}
766
767// Query execution (async)
768
769std::future<kcenon::common::Result<query_result>> unified_database_system::execute_async(
770 const std::string& query,
771 const std::vector<query_param>& params) {
772 return pimpl_->execute_async(query, params);
773}
774
775std::future<kcenon::common::Result<query_result>> unified_database_system::execute_async_priority(
776 const std::string& query,
777 int priority,
778 const std::vector<query_param>& params) {
779 return pimpl_->execute_async_priority(query, priority, params);
780}
781
782// Transaction management
783
784kcenon::common::Result<std::unique_ptr<transaction>> unified_database_system::begin_transaction() {
785 return pimpl_->begin_transaction();
786}
787
789 const std::vector<std::string>& queries) {
790 return pimpl_->execute_transaction(queries);
791}
792
793// Monitoring
794
796 return pimpl_->get_metrics();
797}
798
800 return pimpl_->check_health();
801}
802
804 pimpl_->reset_metrics();
805}
806
807// Configuration access
808
810 return pimpl_->get_config();
811}
812
814 return pimpl_->get_backend_type();
815}
816
820
821// Query builder
822
824 return pimpl_->create_query_builder();
825}
826
827// ============================================================================
828// Builder Implementation
829// ============================================================================
830
832 // Set smart defaults
835 config_.connection_pool.connection_timeout = std::chrono::seconds(5);
836
839 config_.logger.log_directory = "./logs";
840 config_.logger.slow_query_threshold = std::chrono::milliseconds(1000);
841
843 config_.monitoring.metrics_interval = std::chrono::seconds(60);
844
846}
847
849 backend_type type) {
850 config_.database.type = type;
851 return *this;
852}
853
855 const std::string& conn_str) {
856 connection_string_ = conn_str;
857 return *this;
858}
859
861 size_t min_size,
862 size_t max_size) {
863 config_.connection_pool.min_connections = min_size;
864 config_.connection_pool.max_connections = max_size;
865 return *this;
866}
867
869 db_log_level level,
870 const std::string& log_dir) {
871 config_.logger.min_log_level = level;
872 config_.logger.log_directory = log_dir;
873 config_.logger.enable_file_logging = true;
874 return *this;
875}
876
878 bool enable) {
879 config_.monitoring.enable_metrics = enable;
880 return *this;
881}
882
884 size_t worker_threads) {
885 config_.thread.thread_count = worker_threads;
886 return *this;
887}
888
890 std::chrono::milliseconds threshold) {
891 config_.logger.slow_query_threshold = threshold;
892 return *this;
893}
894
895kcenon::common::Result<std::unique_ptr<unified_database_system>> unified_database_system::builder::build() {
896 auto system = std::make_unique<unified_database_system>(config_);
897
898 // Auto-connect if connection string provided
899 if (!connection_string_.empty()) {
900 auto result = system->connect(config_.database.type, connection_string_);
901 if (!result.is_ok()) {
902 return make_error_result<std::unique_ptr<unified_database_system>>(
903 "Failed to connect: " + result.error().message,
904 result.error().code,
905 "unified_database_system"
906 );
907 }
908 }
909
910 return std::move(system);
911}
912
916
917} // namespace database::integrated
Registry for database backend plugins.
static backend_registry & instance()
Get the singleton instance.
std::unique_ptr< database_backend > create(const std::string &name) const
Create a backend instance by name.
Manages lifecycle and coordination of all database system adapters.
bool is_active() const override
Check if transaction is active.
kcenon::common::VoidResult commit() override
Commit the transaction.
transaction_impl(std::shared_ptr< core::database_backend > backend)
kcenon::common::Result< query_result > execute(const std::string &query, const std::vector< query_param > &params) override
Execute a query within the transaction.
kcenon::common::VoidResult rollback() override
Rollback the transaction.
std::shared_ptr< core::database_backend > backend_
Transaction interface for ACID operations.
builder & enable_monitoring(bool enable=true)
Enable monitoring and metrics collection.
builder & set_connection_string(const std::string &conn_str)
Set the connection string.
builder & set_pool_size(size_t min_size, size_t max_size)
Set connection pool size.
builder & enable_async(size_t worker_threads=4)
Enable async operations.
builder & set_slow_query_threshold(std::chrono::milliseconds threshold)
Set slow query threshold.
kcenon::common::Result< std::unique_ptr< unified_database_system > > build()
Build and return the configured database system.
builder & enable_logging(db_log_level level, const std::string &log_dir="./logs")
Enable logging.
builder & set_backend(backend_type type)
Set the database backend type.
std::future< kcenon::common::Result< query_result > > execute_async(const std::string &query, const std::vector< query_param > &params)
kcenon::common::VoidResult connect(backend_type backend, const std::string &connection_string)
kcenon::common::VoidResult execute_transaction(const std::vector< std::string > &queries)
kcenon::common::Result< query_result > execute(const std::string &query, const std::vector< query_param > &params)
void update_metrics(std::chrono::microseconds latency, bool success)
unified_database_system::pool_stats get_pool_stats() const
kcenon::common::Result< std::unique_ptr< transaction > > begin_transaction()
std::future< kcenon::common::Result< query_result > > execute_async_priority(const std::string &query, int priority, const std::vector< query_param > &params)
const unified_db_config & get_config() const
Get current configuration.
~unified_database_system()
Destructor - automatically disconnects and cleans up.
kcenon::common::Result< std::unique_ptr< transaction > > begin_transaction()
std::future< kcenon::common::Result< query_result > > execute_async(const std::string &query, const std::vector< query_param > &params={})
backend_type get_backend_type() const
Get database backend type.
database_metrics get_metrics() const
Get current performance metrics.
kcenon::common::Result< size_t > update(const std::string &query, const std::vector< query_param > &params={})
Execute an UPDATE query.
kcenon::common::Result< query_result > execute(const std::string &query, const std::vector< query_param > &params={})
health_check check_health() const
Perform health check.
kcenon::common::VoidResult execute_transaction(const std::vector< std::string > &queries)
Execute multiple queries in a transaction.
kcenon::common::VoidResult connect(const std::string &connection_string)
Connect to database.
static builder create_builder()
Create a builder for custom configuration.
kcenon::common::Result< size_t > insert(const std::string &query, const std::vector< query_param > &params={})
Execute an INSERT query.
kcenon::common::Result< query_result > select(const std::string &query, const std::vector< query_param > &params={})
Execute a SELECT query.
kcenon::common::Result< size_t > remove(const std::string &query, const std::vector< query_param > &params={})
Execute a DELETE query.
unified_database_system()
Default constructor (zero-config)
kcenon::common::VoidResult disconnect()
Disconnect from database.
std::future< kcenon::common::Result< query_result > > execute_async_priority(const std::string &query, int priority, const std::vector< query_param > &params={})
Execute a SQL query asynchronously with priority.
bool is_connected() const
Check if connected to database.
Universal query builder that adapts to different database types.
Abstract interface for database backends.
Lifecycle manager for all database system adapters (Phase 5)
Database logging adapter with runtime backend selection.
Database monitoring adapter with runtime backend selection.
async_result< T > make_error_result(const std::exception &error)
std::vector< database_row > database_result
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
static std::string backend_type_to_name(backend_type type)
Convert backend_type to registry name string.
db_log_level
Database logging level enumeration.
@ info
Informational messages (default)
static query_result convert_result(const core::database_result &db_result, std::chrono::microseconds exec_time)
Convert core::database_result to query_result.
std::map< std::string, std::string > row_data
Database row representation.
static std::shared_ptr< core::database_backend > create_backend(backend_type type)
Create database backend instance.
static std::string value_to_string(const core::database_value &value)
Convert database_value (variant) to string.
backend_type
Database backend type enumeration.
@ mongodb
MongoDB NoSQL database.
@ sqlite
SQLite embedded database.
@ redis
Redis key-value store.
@ postgres
PostgreSQL database.
kcenon::common::VoidResult VoidResult
Primary VoidResult type - use this for void operations.
Definition result.h:33
@ sqlite
Indicates a SQLite database.
static connection_config from_string(const std::string &connect_string)
Construct connection_config from legacy connection string.
std::chrono::steady_clock::time_point measurement_start
bool enable_file_logging
Enable logging to file (in addition to console)
std::string log_directory
Directory for log files.
std::chrono::milliseconds slow_query_threshold
Threshold for considering a query "slow".
db_log_level min_log_level
Minimum log level to output.
bool enable_metrics
Enable metrics collection.
std::chrono::seconds metrics_interval
Interval for collecting metrics.
std::size_t thread_count
Number of worker threads (0 = auto-detect from hardware)
std::chrono::steady_clock::time_point last_check
std::size_t min_connections
Minimum number of connections to maintain.
std::chrono::seconds connection_timeout
Timeout for acquiring a connection from the pool.
std::size_t max_connections
Maximum number of connections allowed.
db_logger_config logger
Logger configuration.
pool_config connection_pool
Connection pool configuration.
db_monitoring_config monitoring
Monitoring configuration.
db_thread_config thread
Thread pool configuration.
Thread pool adapter with runtime backend selection.
Zero-configuration database system with integrated adapters (Phase 6)