Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
database::integrated::unified_database_system::impl Class Reference
Collaboration diagram for database::integrated::unified_database_system::impl:
Collaboration graph

Public Member Functions

 impl (const unified_db_config &config)
 
 ~impl ()
 
kcenon::common::VoidResult connect (backend_type backend, const std::string &connection_string)
 
kcenon::common::VoidResult disconnect ()
 
bool is_connected () const
 
kcenon::common::Result< query_resultexecute (const std::string &query, const std::vector< query_param > &params)
 
std::future< kcenon::common::Result< query_result > > execute_async (const std::string &query, const std::vector< query_param > &params)
 
std::future< kcenon::common::Result< query_result > > execute_async_priority (const std::string &query, int priority, const std::vector< query_param > &params)
 
kcenon::common::Result< std::unique_ptr< transaction > > begin_transaction ()
 
kcenon::common::VoidResult execute_transaction (const std::vector< std::string > &queries)
 
database_metrics get_metrics () const
 
health_check check_health () const
 
void reset_metrics ()
 
const unified_db_configget_config () const
 
backend_type get_backend_type () const
 
unified_database_system::pool_stats get_pool_stats () const
 
query_builder create_query_builder () const
 

Private Member Functions

kcenon::common::VoidResult ensure_initialized ()
 
void update_metrics (std::chrono::microseconds latency, bool success)
 

Private Attributes

unified_db_config config_
 
std::unique_ptr< database_coordinatorcoordinator_
 
backend_type backend_type_
 
std::string connection_string_
 
bool connected_
 
bool initialized_
 
std::shared_ptr< core::database_backendbackend_
 
database_metrics metrics_
 
std::mutex mutex_
 

Detailed Description

Definition at line 285 of file unified_database_system.cpp.

Constructor & Destructor Documentation

◆ impl()

Definition at line 287 of file unified_database_system.cpp.

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 }
@ postgres
PostgreSQL database.
std::chrono::steady_clock::time_point measurement_start

References database::integrated::database_metrics::measurement_start, and metrics_.

◆ ~impl()

database::integrated::unified_database_system::impl::~impl ( )
inline

Definition at line 299 of file unified_database_system.cpp.

299 {
300 disconnect();
301 coordinator_->shutdown();
302 }

References coordinator_, and disconnect().

Here is the call graph for this function:

Member Function Documentation

◆ begin_transaction()

kcenon::common::Result< std::unique_ptr< transaction > > database::integrated::unified_database_system::impl::begin_transaction ( )
inline

Definition at line 494 of file unified_database_system.cpp.

494 {
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 }

References backend_, connected_, metrics_, mutex_, and database::integrated::database_metrics::transactions_started.

Referenced by execute_transaction().

Here is the caller graph for this function:

◆ check_health()

health_check database::integrated::unified_database_system::impl::check_health ( ) const
inline

Definition at line 542 of file unified_database_system.cpp.

542 {
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_) {
563 health.status = health_status::failed;
564 health.issues.push_back("Not connected to database");
565 } else {
566 health.status = health_status::healthy;
567 }
568
569 return health;
570 }

References connected_, database::integrated::health_check::connection_pool_healthy, database::integrated::health_check::connection_pool_utilization, coordinator_, database::integrated::failed, database::integrated::healthy, database::integrated::health_check::is_connected, database::integrated::health_check::issues, database::integrated::health_check::last_check, database::integrated::health_check::logger_healthy, database::integrated::health_check::monitor_healthy, mutex_, database::integrated::health_check::status, and database::integrated::health_check::thread_pool_healthy.

◆ connect()

kcenon::common::VoidResult database::integrated::unified_database_system::impl::connect ( backend_type backend,
const std::string & connection_string )
inline

Definition at line 306 of file unified_database_system.cpp.

306 {
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 }
static std::shared_ptr< core::database_backend > create_backend(backend_type type)
Create database backend instance.
static connection_config from_string(const std::string &connect_string)
Construct connection_config from legacy connection string.

References backend_, backend_type_, connected_, connection_string_, coordinator_, database::integrated::create_backend(), ensure_initialized(), database::core::connection_config::from_string(), and mutex_.

Here is the call graph for this function:

◆ create_query_builder()

query_builder database::integrated::unified_database_system::impl::create_query_builder ( ) const
inline

Definition at line 605 of file unified_database_system.cpp.

605 {
606 return query_builder{database_types::sqlite};
607 }
@ sqlite
Indicates a SQLite database.

References database::sqlite.

◆ disconnect()

kcenon::common::VoidResult database::integrated::unified_database_system::impl::disconnect ( )
inline

Definition at line 347 of file unified_database_system.cpp.

347 {
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 }

References backend_, connected_, connection_string_, coordinator_, and mutex_.

Referenced by ~impl().

Here is the caller graph for this function:

◆ ensure_initialized()

kcenon::common::VoidResult database::integrated::unified_database_system::impl::ensure_initialized ( )
inlineprivate

Definition at line 610 of file unified_database_system.cpp.

610 {
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 }

References coordinator_, and initialized_.

Referenced by connect().

Here is the caller graph for this function:

◆ execute()

kcenon::common::Result< query_result > database::integrated::unified_database_system::impl::execute ( const std::string & query,
const std::vector< query_param > & params )
inline

Definition at line 380 of file unified_database_system.cpp.

382 {
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 }
void update_metrics(std::chrono::microseconds latency, bool success)
std::vector< database_row > database_result
static query_result convert_result(const core::database_result &db_result, std::chrono::microseconds exec_time)
Convert core::database_result to query_result.
db_log_level min_log_level
Minimum log level to output.
db_logger_config logger
Logger configuration.

References backend_, config_, connected_, database::integrated::convert_result(), coordinator_, database::integrated::unified_db_config::logger, database::integrated::db_logger_config::min_log_level, mutex_, and update_metrics().

Referenced by execute_async(), and execute_async_priority().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ execute_async()

std::future< kcenon::common::Result< query_result > > database::integrated::unified_database_system::impl::execute_async ( const std::string & query,
const std::vector< query_param > & params )
inline

Definition at line 453 of file unified_database_system.cpp.

455 {
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 }
kcenon::common::Result< query_result > execute(const std::string &query, const std::vector< query_param > &params)

References coordinator_, and execute().

Here is the call graph for this function:

◆ execute_async_priority()

std::future< kcenon::common::Result< query_result > > database::integrated::unified_database_system::impl::execute_async_priority ( const std::string & query,
int priority,
const std::vector< query_param > & params )
inline

Definition at line 471 of file unified_database_system.cpp.

474 {
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 }

References coordinator_, and execute().

Here is the call graph for this function:

◆ execute_transaction()

kcenon::common::VoidResult database::integrated::unified_database_system::impl::execute_transaction ( const std::vector< std::string > & queries)
inline

Definition at line 508 of file unified_database_system.cpp.

508 {
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 }
kcenon::common::Result< std::unique_ptr< transaction > > begin_transaction()

References begin_transaction(), metrics_, database::integrated::database_metrics::transactions_committed, and database::integrated::database_metrics::transactions_rolled_back.

Here is the call graph for this function:

◆ get_backend_type()

backend_type database::integrated::unified_database_system::impl::get_backend_type ( ) const
inline

Definition at line 584 of file unified_database_system.cpp.

584 {
585 return backend_type_;
586 }

References backend_type_.

◆ get_config()

const unified_db_config & database::integrated::unified_database_system::impl::get_config ( ) const
inline

Definition at line 580 of file unified_database_system.cpp.

580 {
581 return config_;
582 }

References config_.

◆ get_metrics()

database_metrics database::integrated::unified_database_system::impl::get_metrics ( ) const
inline

Definition at line 537 of file unified_database_system.cpp.

537 {
538 std::lock_guard<std::mutex> lock(mutex_);
539 return metrics_;
540 }

References metrics_, and mutex_.

◆ get_pool_stats()

unified_database_system::pool_stats database::integrated::unified_database_system::impl::get_pool_stats ( ) const
inline

Definition at line 588 of file unified_database_system.cpp.

588 {
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
593 unified_database_system::pool_stats stats;
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 }

References database::integrated::unified_database_system::pool_stats::active_connections, connected_, database::integrated::unified_database_system::pool_stats::idle_connections, mutex_, database::integrated::unified_database_system::pool_stats::total_connections, database::integrated::unified_database_system::pool_stats::utilization_percent, and database::integrated::unified_database_system::pool_stats::wait_queue_size.

◆ is_connected()

bool database::integrated::unified_database_system::impl::is_connected ( ) const
inline

Definition at line 373 of file unified_database_system.cpp.

373 {
374 std::lock_guard<std::mutex> lock(mutex_);
375 return connected_;
376 }

References connected_, and mutex_.

◆ reset_metrics()

void database::integrated::unified_database_system::impl::reset_metrics ( )
inline

Definition at line 572 of file unified_database_system.cpp.

572 {
573 std::lock_guard<std::mutex> lock(mutex_);
574 metrics_ = database_metrics{};
575 metrics_.measurement_start = std::chrono::steady_clock::now();
576 }

References database::integrated::database_metrics::measurement_start, metrics_, and mutex_.

◆ update_metrics()

void database::integrated::unified_database_system::impl::update_metrics ( std::chrono::microseconds latency,
bool success )
inlineprivate

Definition at line 623 of file unified_database_system.cpp.

623 {
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 }
std::chrono::milliseconds slow_query_threshold
Threshold for considering a query "slow".

References database::integrated::database_metrics::average_latency, config_, database::integrated::database_metrics::failed_queries, database::integrated::unified_db_config::logger, database::integrated::database_metrics::max_latency, database::integrated::database_metrics::measurement_start, metrics_, database::integrated::database_metrics::min_latency, database::integrated::database_metrics::queries_per_second, database::integrated::database_metrics::slow_queries, database::integrated::db_logger_config::slow_query_threshold, database::success, database::integrated::database_metrics::successful_queries, and database::integrated::database_metrics::total_queries.

Referenced by execute().

Here is the caller graph for this function:

Member Data Documentation

◆ backend_

std::shared_ptr<core::database_backend> database::integrated::unified_database_system::impl::backend_
private

Definition at line 677 of file unified_database_system.cpp.

Referenced by begin_transaction(), connect(), disconnect(), and execute().

◆ backend_type_

backend_type database::integrated::unified_database_system::impl::backend_type_
private

Definition at line 672 of file unified_database_system.cpp.

Referenced by connect(), and get_backend_type().

◆ config_

unified_db_config database::integrated::unified_database_system::impl::config_
private

Definition at line 669 of file unified_database_system.cpp.

Referenced by execute(), get_config(), and update_metrics().

◆ connected_

bool database::integrated::unified_database_system::impl::connected_
private

◆ connection_string_

std::string database::integrated::unified_database_system::impl::connection_string_
private

Definition at line 673 of file unified_database_system.cpp.

Referenced by connect(), and disconnect().

◆ coordinator_

std::unique_ptr<database_coordinator> database::integrated::unified_database_system::impl::coordinator_
private

◆ initialized_

bool database::integrated::unified_database_system::impl::initialized_
private

Definition at line 675 of file unified_database_system.cpp.

Referenced by ensure_initialized().

◆ metrics_

database_metrics database::integrated::unified_database_system::impl::metrics_
private

◆ mutex_

std::mutex database::integrated::unified_database_system::impl::mutex_
mutableprivate

The documentation for this class was generated from the following file: