PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
annotation_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
20#pragma once
21
23
24#include <kcenon/common/patterns/result.h>
25
26#include <memory>
27#include <optional>
28#include <string>
29#include <string_view>
30#include <vector>
31
32#ifdef PACS_WITH_DATABASE_SYSTEM
33
35
36namespace kcenon::pacs::storage {
37
64class annotation_repository
65 : public base_repository<annotation_record, std::string> {
66public:
67 explicit annotation_repository(std::shared_ptr<pacs_database_adapter> db);
68 ~annotation_repository() override = default;
69
72 -> annotation_repository& = delete;
73 annotation_repository(annotation_repository&&) noexcept = default;
74 auto operator=(annotation_repository&&) noexcept
75 -> annotation_repository& = default;
76
77 // =========================================================================
78 // Domain-Specific Operations
79 // =========================================================================
80
87 [[nodiscard]] auto find_by_pk(int64_t pk) -> result_type;
88
95 [[nodiscard]] auto find_by_instance(std::string_view sop_instance_uid)
96 -> list_result_type;
97
104 [[nodiscard]] auto find_by_study(std::string_view study_uid)
105 -> list_result_type;
106
113 [[nodiscard]] auto search(const annotation_query& query) -> list_result_type;
114
121 [[nodiscard]] auto update_annotation(const annotation_record& record)
122 -> VoidResult;
123
130 [[nodiscard]] auto count_matching(const annotation_query& query)
131 -> Result<size_t>;
132
133protected:
134 // =========================================================================
135 // base_repository overrides
136 // =========================================================================
137
138 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
139 -> annotation_record override;
140
141 [[nodiscard]] auto entity_to_row(const annotation_record& entity) const
142 -> std::map<std::string, database_value> override;
143
144 [[nodiscard]] auto get_pk(const annotation_record& entity) const
145 -> std::string override;
146
147 [[nodiscard]] auto has_pk(const annotation_record& entity) const
148 -> bool override;
149
150 [[nodiscard]] auto select_columns() const
151 -> std::vector<std::string> override;
152
153private:
154 [[nodiscard]] auto parse_timestamp(const std::string& str) const
155 -> std::chrono::system_clock::time_point;
156
157 [[nodiscard]] auto format_timestamp(
158 std::chrono::system_clock::time_point tp) const -> std::string;
159
160 [[nodiscard]] static auto serialize_style(const annotation_style& style)
161 -> std::string;
162 [[nodiscard]] static auto deserialize_style(std::string_view json)
163 -> annotation_style;
164};
165
166} // namespace kcenon::pacs::storage
167
168#else // !PACS_WITH_DATABASE_SYSTEM
169
170// Legacy interface for builds without database_system
171struct sqlite3;
172
173namespace kcenon::pacs::storage {
174
175template <typename T>
177
178using VoidResult = kcenon::common::VoidResult;
179
188public:
189 explicit annotation_repository(sqlite3* db);
191
195 auto operator=(annotation_repository&&) noexcept -> annotation_repository&;
196
197 [[nodiscard]] auto save(const annotation_record& record) -> VoidResult;
198 [[nodiscard]] auto find_by_id(std::string_view annotation_id) const
199 -> std::optional<annotation_record>;
200 [[nodiscard]] auto find_by_pk(int64_t pk) const
201 -> std::optional<annotation_record>;
202 [[nodiscard]] auto find_by_instance(std::string_view sop_instance_uid) const
203 -> std::vector<annotation_record>;
204 [[nodiscard]] auto find_by_study(std::string_view study_uid) const
205 -> std::vector<annotation_record>;
206 [[nodiscard]] auto search(const annotation_query& query) const
207 -> std::vector<annotation_record>;
208 [[nodiscard]] auto update(const annotation_record& record) -> VoidResult;
209 [[nodiscard]] auto remove(std::string_view annotation_id) -> VoidResult;
210 [[nodiscard]] auto exists(std::string_view annotation_id) const -> bool;
211 [[nodiscard]] auto count() const -> size_t;
212 [[nodiscard]] auto count(const annotation_query& query) const -> size_t;
213 [[nodiscard]] auto is_valid() const noexcept -> bool;
214
215private:
216 [[nodiscard]] auto parse_row(void* stmt) const -> annotation_record;
217
218 [[nodiscard]] static auto serialize_style(const annotation_style& style) -> std::string;
219 [[nodiscard]] static auto deserialize_style(std::string_view json) -> annotation_style;
220
221 sqlite3* db_{nullptr};
222};
223
224} // namespace kcenon::pacs::storage
225
226#endif // PACS_WITH_DATABASE_SYSTEM
Annotation record data structures for database operations.
return style
Generic base repository for CRUD operations.
Repository for annotation persistence (legacy SQLite interface)
auto remove(std::string_view annotation_id) -> VoidResult
auto find_by_instance(std::string_view sop_instance_uid) const -> std::vector< annotation_record >
auto find_by_study(std::string_view study_uid) const -> std::vector< annotation_record >
annotation_repository(annotation_repository &&) noexcept
static auto serialize_style(const annotation_style &style) -> std::string
annotation_repository(const annotation_repository &)=delete
auto exists(std::string_view annotation_id) const -> bool
auto find_by_id(std::string_view annotation_id) const -> std::optional< annotation_record >
static auto deserialize_style(std::string_view json) -> annotation_style
auto search(const annotation_query &query) const -> std::vector< annotation_record >
auto parse_row(void *stmt) const -> annotation_record
auto save(const annotation_record &record) -> VoidResult
auto operator=(const annotation_repository &) -> annotation_repository &=delete
auto find_by_pk(int64_t pk) const -> std::optional< annotation_record >
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Annotation record from the database.
Style information for annotations.