23#define PACS_STORAGE_BASE_REPOSITORY_HPP_INCLUDED
34#ifdef PACS_WITH_DATABASE_SYSTEM
36#include <database/core/database_backend.h>
37#include <database/database_types.h>
42using database_value = database::core::database_value;
122template <
typename Entity,
typename PrimaryKey =
int64_t>
123class base_repository {
126 using entity_type = Entity;
129 using pk_type = PrimaryKey;
132 using result_type = Result<Entity>;
135 using list_result_type = Result<std::vector<Entity>>;
144 explicit base_repository(std::shared_ptr<pacs_database_adapter> db,
145 std::string table_name,
146 std::string pk_column =
"id");
149 virtual ~base_repository() =
default;
152 base_repository(
const base_repository&) =
delete;
153 auto operator=(
const base_repository&) -> base_repository& =
delete;
156 base_repository(base_repository&&)
noexcept =
default;
157 auto operator=(base_repository&&)
noexcept -> base_repository& =
default;
172 [[nodiscard]]
virtual auto find_by_id(PrimaryKey
id) -> result_type;
182 [[nodiscard]]
virtual auto find_all(std::optional<size_t> limit = std::nullopt)
201 [[nodiscard]]
virtual auto find_where(
const std::string& column,
202 const std::string& op,
203 const database_value& value)
212 [[nodiscard]]
virtual auto exists(PrimaryKey
id) -> Result<bool>;
219 [[nodiscard]]
virtual auto count() -> Result<size_t>;
235 [[nodiscard]]
virtual auto save(
const Entity& entity)
236 -> Result<PrimaryKey>;
246 [[nodiscard]]
virtual auto insert(
const Entity& entity)
247 -> Result<PrimaryKey>;
257 [[nodiscard]]
virtual auto update(
const Entity& entity) -> VoidResult;
265 [[nodiscard]]
virtual auto remove(PrimaryKey
id) -> VoidResult;
275 [[nodiscard]]
virtual auto remove_where(
const std::string& column,
276 const std::string& op,
277 const database_value& value)
293 [[nodiscard]]
virtual auto insert_batch(
const std::vector<Entity>& entities)
294 -> Result<std::vector<PrimaryKey>>;
319 template <
typename Func>
320 [[nodiscard]]
auto in_transaction(Func&& func)
321 -> std::invoke_result_t<Func>;
337 [[nodiscard]]
virtual auto map_row_to_entity(
const database_row& row)
const
352 [[nodiscard]]
virtual auto entity_to_row(
const Entity& entity)
const
353 -> std::map<std::string, database_value> = 0;
361 [[nodiscard]]
virtual auto get_pk(
const Entity& entity)
const
372 [[nodiscard]]
virtual auto has_pk(
const Entity& entity)
const ->
bool = 0;
382 [[nodiscard]]
virtual auto select_columns()
const
383 -> std::vector<std::string>;
394 [[nodiscard]]
auto query_builder() -> database::query_builder;
399 [[nodiscard]]
auto storage_session() -> pacs_storage_session;
406 [[nodiscard]]
auto db() -> std::shared_ptr<pacs_database_adapter>;
413 [[nodiscard]]
auto table_name()
const ->
const std::string&;
420 [[nodiscard]]
auto pk_column()
const ->
const std::string&;
424 std::shared_ptr<pacs_database_adapter> db_;
427 std::string table_name_;
430 std::string pk_column_;
Template implementation of base_repository.
Unified database adapter for PACS system.