.. _program_listing_file_include_util_db_relational_Database.hpp: Program Listing for File Database.hpp ===================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include\util\db\relational\Database.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include "util/db/relational/BackendConcept.hpp" #include namespace PDJE_UTIL::db::relational { template class RelationalDatabase { public: using backend_type = Backend; using config_type = typename Backend::config_type; static common::Result create(const config_type &cfg) { return Backend::create(cfg); } static common::Result destroy(const config_type &cfg) { return Backend::destroy(cfg); } static common::Result open(const config_type &cfg) { RelationalDatabase db; auto opened = db.backend_.open(cfg); if (!opened.ok()) { return common::Result::failure(opened.status()); } db.is_open_ = true; return common::Result::success(std::move(db)); } RelationalDatabase() = default; RelationalDatabase(RelationalDatabase &&other) noexcept : backend_(std::move(other.backend_)), is_open_(std::exchange(other.is_open_, false)) { } RelationalDatabase & operator=(RelationalDatabase &&other) noexcept { if (this != &other) { if (is_open_) { (void)close(); } backend_ = std::move(other.backend_); is_open_ = std::exchange(other.is_open_, false); } return *this; } RelationalDatabase(const RelationalDatabase &) = delete; RelationalDatabase & operator=(const RelationalDatabase &) = delete; ~RelationalDatabase() { if (is_open_) { (void)close(); } } common::Result close() { if (!is_open_) { return common::Result::success(); } auto closed = backend_.close(); if (closed.ok()) { is_open_ = false; } return closed; } bool is_open() const noexcept { return is_open_; } common::Result execute(std::string_view sql, const Params ¶ms = {}) { return backend_.execute(sql, params); } common::Result query(std::string_view sql, const Params ¶ms = {}) const { return backend_.query(sql, params); } common::Result begin_transaction() { return backend_.begin_transaction(); } common::Result commit() { return backend_.commit(); } common::Result rollback() { return backend_.rollback(); } backend_type & backend() noexcept { return backend_; } const backend_type & backend() const noexcept { return backend_; } private: Backend backend_; bool is_open_ = false; }; } // namespace PDJE_UTIL::db::relational