25#include <kcenon/common/patterns/result.h>
36#ifdef PACS_WITH_DATABASE_SYSTEM
37#include <database/database_types.h>
38#include <database/integrated/unified_database_system.h>
39#include <database/query_builder.h>
49using VoidResult = kcenon::common::VoidResult;
51#ifdef PACS_WITH_DATABASE_SYSTEM
59using database_row = std::map<std::string, std::string>;
67struct database_result {
69 std::vector<database_row>
rows;
72 std::size_t affected_rows{0};
75 std::chrono::microseconds execution_time{0};
78 [[nodiscard]]
auto empty() const noexcept ->
bool {
return rows.empty(); }
81 [[nodiscard]]
auto size() const noexcept -> std::
size_t {
86 [[nodiscard]]
auto operator[](std::size_t index)
const
87 ->
const database_row& {
88 return rows.at(index);
92 [[nodiscard]]
auto operator[](std::size_t index) -> database_row& {
93 return rows.at(index);
97 auto begin() {
return rows.begin(); }
98 auto end() {
return rows.end(); }
99 [[nodiscard]]
auto begin()
const {
return rows.begin(); }
100 [[nodiscard]]
auto end()
const {
return rows.end(); }
104class scoped_transaction;
105class pacs_database_adapter;
106class pacs_unit_of_work;
114class pacs_storage_session {
116 explicit pacs_storage_session(pacs_database_adapter& adapter)
noexcept;
118 [[nodiscard]]
auto create_query_builder() const -> database::query_builder;
119 [[nodiscard]] auto select(const std::
string& query)
120 -> Result<database_result>;
121 [[nodiscard]] auto insert(const std::
string& query) -> Result<uint64_t>;
122 [[nodiscard]] auto update(const std::
string& query) -> Result<uint64_t>;
123 [[nodiscard]] auto remove(const std::
string& query) -> Result<uint64_t>;
124 [[nodiscard]] auto execute(const std::
string& query) -> VoidResult;
125 [[nodiscard]] auto last_insert_rowid() const -> int64_t;
126 [[nodiscard]] auto begin_unit_of_work() -> Result<pacs_unit_of_work>;
129 pacs_database_adapter* adapter_{
nullptr};
135class pacs_unit_of_work {
137 pacs_unit_of_work() =
default;
138 pacs_unit_of_work(pacs_database_adapter& adapter,
bool active)
noexcept;
139 ~pacs_unit_of_work();
141 pacs_unit_of_work(
const pacs_unit_of_work&) =
delete;
142 auto operator=(
const pacs_unit_of_work&) -> pacs_unit_of_work& =
delete;
143 pacs_unit_of_work(pacs_unit_of_work&& other)
noexcept;
144 auto operator=(pacs_unit_of_work&& other)
noexcept -> pacs_unit_of_work&;
146 [[nodiscard]]
auto create_query_builder() const -> database::query_builder;
147 [[nodiscard]] auto select(const std::
string& query)
148 -> Result<database_result>;
149 [[nodiscard]] auto insert(const std::
string& query) -> Result<uint64_t>;
150 [[nodiscard]] auto update(const std::
string& query) -> Result<uint64_t>;
151 [[nodiscard]] auto remove(const std::
string& query) -> Result<uint64_t>;
152 [[nodiscard]] auto execute(const std::
string& query) -> VoidResult;
153 [[nodiscard]] auto last_insert_rowid() const -> int64_t;
154 [[nodiscard]] auto commit() -> VoidResult;
155 [[nodiscard]] auto rollback() -> VoidResult;
156 [[nodiscard]] auto is_active() const noexcept ->
bool;
159 pacs_database_adapter* adapter_{
nullptr};
206class pacs_database_adapter {
216 explicit pacs_database_adapter(
const std::filesystem::path& db_path);
226 pacs_database_adapter(database::database_types type,
227 const std::string& connection_string);
232 ~pacs_database_adapter();
235 pacs_database_adapter(
const pacs_database_adapter&) =
delete;
236 auto operator=(
const pacs_database_adapter&)
237 -> pacs_database_adapter& =
delete;
240 pacs_database_adapter(pacs_database_adapter&&) noexcept;
241 auto operator=(pacs_database_adapter&&) noexcept -> pacs_database_adapter&;
254 [[nodiscard]] auto connect() -> VoidResult;
263 [[nodiscard]] auto disconnect() -> VoidResult;
270 [[nodiscard]] auto is_connected() const noexcept ->
bool;
278 [[nodiscard]] auto open_session() -> pacs_storage_session;
279 [[nodiscard]] auto open_session() const -> pacs_storage_session;
284 [[nodiscard]] auto begin_unit_of_work() -> Result<pacs_unit_of_work>;
309 [[nodiscard]] auto create_query_builder() -> database::query_builder;
321 [[nodiscard]] auto select(const std::
string& query)
322 -> Result<database_result>;
332 [[nodiscard]] auto insert(const std::
string& query) -> Result<uint64_t>;
342 [[nodiscard]] auto update(const std::
string& query) -> Result<uint64_t>;
352 [[nodiscard]] auto remove(const std::
string& query) -> Result<uint64_t>;
363 [[nodiscard]] auto execute(const std::
string& query) -> VoidResult;
374 [[nodiscard]] auto begin_transaction() -> VoidResult;
381 [[nodiscard]] auto commit() -> VoidResult;
388 [[nodiscard]] auto rollback() -> VoidResult;
395 [[nodiscard]] auto in_transaction() const noexcept ->
bool;
421 template <typename Func>
422 [[nodiscard]] auto transaction(Func&& func) -> VoidResult {
423 auto begin_result = begin_transaction();
424 if (begin_result.is_err()) {
429 auto result = std::forward<Func>(func)();
430 if (result.is_err()) {
436 }
catch (
const std::exception& e) {
438 return VoidResult(kcenon::common::error_info{
439 -1, std::string(
"Transaction failed: ") + e.what(),
"storage"});
455 [[nodiscard]]
auto last_insert_rowid() const -> int64_t;
462 [[nodiscard]] auto last_error() const -> std::
string;
465 friend class pacs_storage_session;
466 friend class pacs_unit_of_work;
468 [[nodiscard]] auto run_select(const std::
string& query)
469 -> Result<database_result>;
470 [[nodiscard]] auto run_insert(const std::
string& query)
472 [[nodiscard]] auto run_update(const std::
string& query)
474 [[nodiscard]] auto run_remove(const std::
string& query)
476 [[nodiscard]] auto run_execute(const std::
string& query) -> VoidResult;
477 [[nodiscard]] auto begin_transaction_internal() -> VoidResult;
478 [[nodiscard]] auto commit_internal() -> VoidResult;
479 [[nodiscard]] auto rollback_internal() -> VoidResult;
482 std::unique_ptr<impl> impl_;
506class scoped_transaction {
514 explicit scoped_transaction(pacs_database_adapter& db);
519 ~scoped_transaction();
522 scoped_transaction(
const scoped_transaction&) =
delete;
523 auto operator=(
const scoped_transaction&) -> scoped_transaction& =
delete;
524 scoped_transaction(scoped_transaction&&) =
delete;
525 auto operator=(scoped_transaction&&) -> scoped_transaction& =
delete;
534 [[nodiscard]]
auto commit() -> VoidResult;
541 void rollback() noexcept;
548 [[nodiscard]] auto is_active() const noexcept ->
bool;
551 pacs_database_adapter& db_;
552 bool committed_{
false};
@ empty
Z - Replace with zero-length value.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.