#include <iostream>
#include <vector>
#include <future>
#include <chrono>
#include <iomanip>
using namespace std::chrono;
std::cout << "\n" << std::string(60, '=') << "\n";
std::cout << title << "\n";
std::cout << std::string(60, '=') << "\n\n";
}
std::cout << "Submitting async query...\n";
auto start = steady_clock::now();
std::cout << "Query submitted, continuing with other work...\n";
std::this_thread::sleep_for(milliseconds(10));
std::cout << "Other work completed\n";
std::cout << "Waiting for query result...\n";
auto result = future.get();
auto duration = duration_cast<milliseconds>(steady_clock::now() - start);
if (result.is_ok()) {
std::cout << "β
Query succeeded\n";
std::cout << " Rows: " << result.value().size() << "\n";
std::cout << " Duration: " << duration.count() << " ms\n";
} else {
std::cout << "β Query failed: " << result.error().message << "\n";
}
}
const int num_queries = 5;
std::vector<std::future<kcenon::common::Result<query_result>>> futures;
std::cout << "Submitting " << num_queries << " concurrent queries...\n";
auto start = steady_clock::now();
for (int i = 0; i < num_queries; ++i) {
std::string query = "SELECT " + std::to_string(i) + " as query_id";
}
std::cout << "All queries submitted\n";
std::cout << "Waiting for results...\n";
int succeeded = 0;
for (size_t i = 0; i < futures.size(); ++i) {
auto result = futures[i].get();
if (result.is_ok()) {
succeeded++;
std::cout << " Query " << (i + 1) << ": β
Success\n";
} else {
std::cout << " Query " << (i + 1) << ": β Failed - "
<< result.error().message << "\n";
}
}
auto duration = duration_cast<milliseconds>(steady_clock::now() - start);
std::cout << "\nResults:\n";
std::cout << " Succeeded: " << succeeded << "\n";
std::cout <<
" Failed: " <<
failed <<
"\n";
std::cout << " Total Duration: " << duration.count() << " ms\n";
std::cout << " Avg Duration: " << (duration.count() / num_queries) << " ms/query\n";
}
std::cout << "Submitting query with 2 second timeout...\n";
auto status = future.wait_for(seconds(2));
if (status == std::future_status::ready) {
std::cout << "β
Query completed within timeout\n";
auto result = future.get();
if (result.is_ok()) {
std::cout << " Result: Success\n";
} else {
std::cout << " Result: " << result.error().message << "\n";
}
} else if (status == std::future_status::timeout) {
std::cout << "β±οΈ Query timed out (still executing in background)\n";
} else {
std::cout << "βΈοΈ Query deferred\n";
}
}
struct QueryTask {
std::string name;
std::string query;
std::future<kcenon::common::Result<query_result>> future;
};
std::vector<QueryTask> tasks;
tasks.push_back({"User count", "SELECT COUNT(*) FROM users", {}});
tasks.push_back({"Active sessions", "SELECT COUNT(*) FROM sessions WHERE active = true", {}});
tasks.push_back({"Recent orders", "SELECT COUNT(*) FROM orders WHERE created_at > NOW() - INTERVAL '1 hour'", {}});
tasks.push_back({"System status", "SELECT 1", {}});
std::cout << "Submitting batch of " << tasks.size() << " queries...\n";
auto start = steady_clock::now();
for (auto& task : tasks) {
}
std::cout << "All queries submitted, processing results...\n\n";
for (auto& task : tasks) {
std::cout << " " << std::setw(20) << std::left << task.name << ": ";
auto result = task.future.get();
if (result.is_ok()) {
std::cout << "β
" << result.value().size() << " rows\n";
} else {
std::cout << "β " << result.error().message << "\n";
}
}
auto duration = duration_cast<milliseconds>(steady_clock::now() - start);
std::cout << "\nTotal Duration: " << duration.count() << " ms\n";
}
std::cout << "Submitting intentionally invalid query...\n";
auto future = db.
execute_async(
"SELECT * FROM nonexistent_table");
std::cout << "Query submitted, waiting for result...\n";
auto result = future.get();
if (result.is_ok()) {
std::cout << "β
Query succeeded (unexpected)\n";
} else {
std::cout << "β Query failed (expected):\n";
std::cout << " Error Code: " << result.error().code << "\n";
std::cout << " Error Message: " << result.error().message << "\n";
}
}
int main(
int argc,
char* argv[]) {
print_header(
"Unified Database System - Async Queries Example");
std::cout << "Creating database instance with async support...\n";
auto db_result = unified_database_system::create_builder()
.enable_logging(db_log_level::info, "./logs")
.enable_monitoring(true)
.enable_async(8)
.set_pool_size(2, 10)
.build();
if (db_result.is_err()) {
std::cerr << "Failed to create database instance: " << db_result.error().message << "\n";
return 1;
}
auto db = std::move(db_result.value());
std::cout << "β
Database instance created with async support\n";
if (argc > 1) {
std::string conn_string = argv[1];
std::cout << "Connecting to database...\n";
auto connect_result = db->
connect(conn_string);
if (connect_result.is_ok()) {
std::cout << "β
Connected successfully\n";
std::cout << "Successful: " << metrics.successful_queries << "\n";
std::cout << "Failed: " << metrics.failed_queries << "\n";
std::cout << "Avg Latency: " << std::fixed << std::setprecision(3)
<< (metrics.average_latency.count() / 1000.0) << " ms\n";
std::cout << "\nβ
Disconnected\n";
} else {
std::cout << "β Connection failed: " << connect_result.error().message << "\n";
std::cout << "\nNote: This example requires a real database connection.\n";
std::cout << "Usage: " << argv[0] << " \"host=localhost dbname=test user=test password=test\"\n";
return 1;
}
} else {
std::cout << "\nβ No connection string provided.\n";
std::cout << "Usage: " << argv[0] << " [connection_string]\n";
std::cout << "Example: " << argv[0]
<< " \"host=localhost dbname=test user=test password=test\"\n";
return 1;
}
std::cout << "β
All async query examples completed!\n\n";
return 0;
}
void example_query_with_timeout(unified_database_system &db)
void example_concurrent_queries(unified_database_system &db)
void print_header(const std::string &title)
void example_error_handling(unified_database_system &db)
void example_single_async_query(unified_database_system &db)
void example_batch_operations(unified_database_system &db)
Main unified database system class.
std::future< kcenon::common::Result< query_result > > execute_async(const std::string &query, const std::vector< query_param > ¶ms={})
database_metrics get_metrics() const
Get current performance metrics.
kcenon::common::VoidResult connect(const std::string &connection_string)
Connect to database.
kcenon::common::VoidResult disconnect()
Disconnect from database.
Zero-configuration database system with integrated adapters (Phase 6)