Database System 0.1.0
Advanced C++20 Database System with Multi-Backend Support
Loading...
Searching...
No Matches
database_manager.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
6
10#ifdef USE_MONGODB
12#endif
13#ifdef USE_REDIS
15#endif
16#include <sstream>
17
18namespace database
19{
20 database_manager::database_manager(std::shared_ptr<database_context> context)
21 : connected_(false)
22 , database_(nullptr)
23 , context_(std::move(context))
24 {
25 // DI constructor - recommended for new code
26 if (!context_)
27 {
28 // Fallback to default context if nullptr passed
29 context_ = std::make_shared<database_context>();
30 }
31 }
32
34
35 bool database_manager::set_mode(const database_types& database_type)
36 {
37 if (connected_)
38 {
39 return false;
40 }
41
42 database_.reset();
43
44 // Create the appropriate backend directly
45 // This ensures backends are linked even when static library registration
46 // might not work due to initialization order
47 switch (database_type)
48 {
51 break;
54 break;
55#ifdef USE_MONGODB
58 break;
59#endif
60#ifdef USE_REDIS
63 break;
64#endif
65 default:
66 return false;
67 }
68
69 if (database_ == nullptr)
70 {
71 return false;
72 }
73
74 return true;
75 }
76
78 {
79 if (!database_)
80 {
82 }
83
84 return database_->type();
85 }
86
87 kcenon::common::VoidResult database_manager::connect_result(const std::string& connect_string)
88 {
89 if (!database_)
90 {
91 return kcenon::common::VoidResult(
92 kcenon::common::error_info{-1, "No database backend configured", "database_manager"});
93 }
94
95 // Store connection string for potential reconnection
96 connect_string_ = connect_string;
97
98 // Use database_backend's initialize method with connection_config
99 auto config = core::connection_config::from_string(connect_string);
100 auto result = database_->initialize(config);
101
102 if (result.is_ok())
103 {
104 connected_ = true;
105 }
106 return result;
107 }
108
109 kcenon::common::VoidResult database_manager::disconnect_result()
110 {
111 if (!database_)
112 {
113 return kcenon::common::VoidResult(
114 kcenon::common::error_info{-1, "No database backend", "database_manager"});
115 }
116
117 auto result = database_->shutdown();
118 if (result.is_ok())
119 {
120 connected_ = false;
121 }
122 return result;
123 }
124
125 kcenon::common::VoidResult database_manager::create_query_result(const std::string& query_string)
126 {
127 if (!database_)
128 {
129 return kcenon::common::VoidResult(
130 kcenon::common::error_info{-1, "No database backend", "database_manager"});
131 }
132 // database_backend uses execute_query for DDL/prepared statements
133 return database_->execute_query(query_string);
134 }
135
136 kcenon::common::Result<core::database_result> database_manager::select_query_result(const std::string& query_string)
137 {
138 if (!database_)
139 {
140 return kcenon::common::Result<core::database_result>(
141 kcenon::common::error_info{-1, "No database backend", "database_manager"});
142 }
143 return database_->select_query(query_string);
144 }
145
146 kcenon::common::VoidResult database_manager::execute_query_result(const std::string& query_string)
147 {
148 if (!database_)
149 {
150 return kcenon::common::VoidResult(
151 kcenon::common::error_info{-1, "No database backend", "database_manager"});
152 }
153 return database_->execute_query(query_string);
154 }
155
156 kcenon::common::VoidResult database_manager::begin_transaction()
157 {
158 if (!database_)
159 {
160 return kcenon::common::VoidResult(
161 kcenon::common::error_info{-1, "No database backend", "database_manager"});
162 }
163 return database_->begin_transaction();
164 }
165
166 kcenon::common::VoidResult database_manager::commit_transaction()
167 {
168 if (!database_)
169 {
170 return kcenon::common::VoidResult(
171 kcenon::common::error_info{-1, "No database backend", "database_manager"});
172 }
173 return database_->commit_transaction();
174 }
175
176 kcenon::common::VoidResult database_manager::rollback_transaction()
177 {
178 if (!database_)
179 {
180 return kcenon::common::VoidResult(
181 kcenon::common::error_info{-1, "No database backend", "database_manager"});
182 }
183 return database_->rollback_transaction();
184 }
185
187 {
188 if (!database_)
189 {
190 return false;
191 }
192 return database_->in_transaction();
193 }
194
196 {
197 if (!database_)
198 {
199 return "No database backend";
200 }
201 return database_->last_error();
202 }
203
204 std::map<std::string, std::string> database_manager::connection_info() const
205 {
206 if (!database_)
207 {
208 return {};
209 }
210 return database_->connection_info();
211 }
212
213 // Connection pool methods moved to header as inline functions for performance
214
219
224
225}; // namespace database
Registry for database backend plugins.
kcenon::common::VoidResult connect_result(const std::string &connect_string)
Result-based wrapper for connect().
std::map< std::string, std::string > connection_info() const
Get connection information for monitoring.
kcenon::common::VoidResult commit_transaction()
Commit the current transaction.
std::string last_error() const
Get last error message from the backend.
kcenon::common::VoidResult disconnect_result()
Result-based wrapper for disconnect().
bool set_mode(const database_types &database_type)
Sets the database mode (type) for the manager.
std::string connect_string_
Cached connection string for initialization.
query_builder create_query_builder()
Creates a query builder for the current database type.
kcenon::common::VoidResult rollback_transaction()
Rollback the current transaction.
virtual ~database_manager()
Destructor.
std::unique_ptr< core::database_backend > database_
The underlying database backend.
std::shared_ptr< database_context > context_
Dependency injection context.
bool connected_
Indicates whether a database connection is active.
database_types database_type(void)
Retrieves the current database type used by the manager.
kcenon::common::VoidResult begin_transaction()
Begin a database transaction.
bool in_transaction() const
Check if currently in a transaction.
kcenon::common::VoidResult create_query_result(const std::string &query_string)
Result-based wrapper for create_query().
kcenon::common::VoidResult execute_query_result(const std::string &query_string)
Result-based wrapper for execute_query().
database_manager(std::shared_ptr< database_context > context)
kcenon::common::Result< core::database_result > select_query_result(const std::string &query_string)
Execute a SELECT query and return results.
Universal query builder that adapts to different database types.
MongoDB database backend plugin implementation.
database_types
Represents various database backends or modes.
@ none
No specific database type is set.
@ mongodb
Indicates a MongoDB database (future implementation).
@ sqlite
Indicates a SQLite database.
@ redis
Indicates a Redis database (future implementation).
@ postgres
Indicates a PostgreSQL database.
PostgreSQL database backend plugin implementation.
Redis database backend plugin implementation.
SQLite database backend plugin implementation.
static connection_config from_string(const std::string &connect_string)
Construct connection_config from legacy connection string.