25#include <kcenon/common/patterns/result.h>
39using database_value = std::variant<std::string, int64_t, double, bool, std::nullptr_t>;
57 std::map<std::string, std::string>
options;
145 virtual kcenon::common::Result<database_result>
select_query(
const std::string& query_string) = 0;
152 virtual kcenon::common::VoidResult
execute_query(
const std::string& query_string) = 0;
170 const std::string& query,
171 const std::vector<database_value>& params)
188 const std::string& query,
189 const std::vector<database_value>& params)
246 const std::string& query,
247 const std::vector<database_value>& params)
249 std::string result = query;
252 for (
size_t i = params.size(); i > 0; --i) {
253 auto placeholder =
"$" + std::to_string(i);
254 auto pos = result.find(placeholder);
255 if (pos != std::string::npos) {
256 result.replace(pos, placeholder.size(),
value_to_sql(params[i - 1]));
261 size_t param_idx = 0;
262 auto pos = result.find(
'?');
263 while (pos != std::string::npos && param_idx < params.size()) {
265 result.replace(pos, 1, val);
266 pos = result.find(
'?', pos + val.size());
275 return std::visit([](
const auto& v) -> std::string {
276 using T = std::decay_t<
decltype(v)>;
277 if constexpr (std::is_same_v<T, std::nullptr_t>) {
279 }
else if constexpr (std::is_same_v<T, bool>) {
280 return v ?
"TRUE" :
"FALSE";
281 }
else if constexpr (std::is_same_v<T, std::string>) {
284 escaped.reserve(v.size() + 2);
287 if (c ==
'\'') escaped +=
"''";
293 return std::to_string(v);
Abstract base class for database backends.
virtual kcenon::common::VoidResult initialize(const connection_config &config)=0
Initialize the database backend.
virtual std::string last_error() const =0
Get last error message from backend.
virtual kcenon::common::VoidResult rollback_transaction()=0
Rollback the current transaction.
static std::string expand_params(const std::string &query, const std::vector< database_value > ¶ms)
Expand positional parameters into a SQL string (fallback)
virtual bool in_transaction() const =0
Check if backend is currently in a transaction.
virtual kcenon::common::VoidResult begin_transaction()=0
Begin a transaction.
virtual kcenon::common::VoidResult commit_transaction()=0
Commit the current transaction.
virtual bool is_initialized() const =0
Check if backend is initialized and ready.
virtual ~database_backend()=default
virtual std::map< std::string, std::string > connection_info() const =0
Get backend-specific connection information.
virtual kcenon::common::VoidResult shutdown()=0
Shutdown the database backend gracefully.
virtual kcenon::common::VoidResult execute_prepared(const std::string &query, const std::vector< database_value > ¶ms)
Execute a parameterized DML/DDL query (prepared statement)
virtual database_types type() const =0
Get the database type of this backend.
virtual kcenon::common::Result< database_result > select_prepared(const std::string &query, const std::vector< database_value > ¶ms)
Execute a parameterized SELECT query (prepared statement)
virtual kcenon::common::Result< database_result > select_query(const std::string &query_string)=0
Execute a SELECT query.
virtual kcenon::common::VoidResult execute_query(const std::string &query_string)=0
Execute a general SQL query (DDL, DML)
static std::string value_to_sql(const database_value &val)
Defines the enumeration of supported database types.
std::unique_ptr< database_backend >(*)() backend_factory_fn
Factory function type for creating database backends.
std::vector< database_row > database_result
std::map< std::string, database_value > database_row
std::variant< std::string, int64_t, double, bool, std::nullptr_t > database_value
database_types
Represents various database backends or modes.
Configuration for database connection.
std::map< std::string, std::string > options
static connection_config from_string(const std::string &connect_string)
Construct connection_config from legacy connection string.