PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
measurement_repository.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
19#pragma once
20
22
23#include <kcenon/common/patterns/result.h>
24
25#include <optional>
26#include <string>
27#include <string_view>
28#include <vector>
29
30#ifdef PACS_WITH_DATABASE_SYSTEM
31
33
34namespace kcenon::pacs::storage {
35
63class measurement_repository
64 : public base_repository<measurement_record, std::string> {
65public:
66 explicit measurement_repository(std::shared_ptr<pacs_database_adapter> db);
67 ~measurement_repository() override = default;
68
71 -> measurement_repository& = delete;
73 auto operator=(measurement_repository&&) noexcept
74 -> measurement_repository& = default;
75
76 // Bring base class count() into scope
77 using base_repository::count;
78
79 // ========================================================================
80 // Domain-Specific Operations
81 // ========================================================================
82
89 [[nodiscard]] auto find_by_pk(int64_t pk) -> result_type;
90
97 [[nodiscard]] auto find_by_instance(std::string_view sop_instance_uid)
98 -> list_result_type;
99
106 [[nodiscard]] auto search(const measurement_query& query)
107 -> list_result_type;
108
115 [[nodiscard]] auto count(const measurement_query& query) -> Result<size_t>;
116
117protected:
118 // ========================================================================
119 // base_repository overrides
120 // ========================================================================
121
122 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
123 -> measurement_record override;
124
125 [[nodiscard]] auto entity_to_row(const measurement_record& entity) const
126 -> std::map<std::string, database_value> override;
127
128 [[nodiscard]] auto get_pk(const measurement_record& entity) const
129 -> std::string override;
130
131 [[nodiscard]] auto has_pk(const measurement_record& entity) const
132 -> bool override;
133
134 [[nodiscard]] auto select_columns() const
135 -> std::vector<std::string> override;
136
137private:
138 [[nodiscard]] auto parse_timestamp(const std::string& str) const
139 -> std::chrono::system_clock::time_point;
140
141 [[nodiscard]] auto format_timestamp(
142 std::chrono::system_clock::time_point tp) const -> std::string;
143};
144
145} // namespace kcenon::pacs::storage
146
147#else // !PACS_WITH_DATABASE_SYSTEM
148
149// Legacy interface for builds without database_system
150struct sqlite3;
151
152namespace kcenon::pacs::storage {
153
154template <typename T>
156
157using VoidResult = kcenon::common::VoidResult;
158
167public:
168 explicit measurement_repository(sqlite3* db);
170
173 -> measurement_repository& = delete;
175 auto operator=(measurement_repository&&) noexcept
177
178 [[nodiscard]] auto save(const measurement_record& record) -> VoidResult;
179 [[nodiscard]] auto find_by_id(std::string_view measurement_id) const
180 -> std::optional<measurement_record>;
181 [[nodiscard]] auto find_by_pk(int64_t pk) const
182 -> std::optional<measurement_record>;
183 [[nodiscard]] auto find_by_instance(std::string_view sop_instance_uid) const
184 -> std::vector<measurement_record>;
185 [[nodiscard]] auto search(const measurement_query& query) const
186 -> std::vector<measurement_record>;
187 [[nodiscard]] auto remove(std::string_view measurement_id) -> VoidResult;
188 [[nodiscard]] auto exists(std::string_view measurement_id) const -> bool;
189 [[nodiscard]] auto count() const -> size_t;
190 [[nodiscard]] auto count(const measurement_query& query) const -> size_t;
191 [[nodiscard]] auto is_valid() const noexcept -> bool;
192
193private:
194 [[nodiscard]] auto parse_row(void* stmt) const -> measurement_record;
195
196 sqlite3* db_{nullptr};
197};
198
199} // namespace kcenon::pacs::storage
200
201#endif // PACS_WITH_DATABASE_SYSTEM
Generic base repository for CRUD operations.
Repository for measurement persistence (legacy SQLite interface)
auto find_by_pk(int64_t pk) const -> std::optional< measurement_record >
auto find_by_id(std::string_view measurement_id) const -> std::optional< measurement_record >
measurement_repository(measurement_repository &&) noexcept
auto find_by_instance(std::string_view sop_instance_uid) const -> std::vector< measurement_record >
auto remove(std::string_view measurement_id) -> VoidResult
auto operator=(const measurement_repository &) -> measurement_repository &=delete
auto search(const measurement_query &query) const -> std::vector< measurement_record >
auto save(const measurement_record &record) -> VoidResult
auto parse_row(void *stmt) const -> measurement_record
auto exists(std::string_view measurement_id) const -> bool
measurement_repository(const measurement_repository &)=delete
Measurement record data structures for database operations.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Measurement record from the database.