PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
instance_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
18#pragma once
19
21
22#include <kcenon/common/patterns/result.h>
23
24#include <memory>
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
39class instance_repository : public base_repository<instance_record, int64_t> {
40public:
45 explicit instance_repository(std::shared_ptr<pacs_database_adapter> db);
46 ~instance_repository() override = default;
47
49 auto operator=(const instance_repository&) -> instance_repository& = delete;
50 instance_repository(instance_repository&&) noexcept = default;
51 auto operator=(instance_repository&&) noexcept -> instance_repository& = default;
52
64 [[nodiscard]] auto upsert_instance(int64_t series_pk,
65 std::string_view sop_uid,
66 std::string_view sop_class_uid,
67 std::string_view file_path,
68 int64_t file_size,
69 std::string_view transfer_syntax = "",
70 std::optional<int> instance_number = std::nullopt)
71 -> Result<int64_t>;
72
78 [[nodiscard]] auto upsert_instance(const instance_record& record)
79 -> Result<int64_t>;
80
86 [[nodiscard]] auto find_instance(std::string_view sop_uid)
87 -> std::optional<instance_record>;
88
94 [[nodiscard]] auto find_instance_by_pk(int64_t pk)
95 -> std::optional<instance_record>;
96
102 [[nodiscard]] auto list_instances(std::string_view series_uid)
103 -> Result<std::vector<instance_record>>;
104
110 [[nodiscard]] auto search_instances(const instance_query& query)
111 -> Result<std::vector<instance_record>>;
112
118 [[nodiscard]] auto delete_instance(std::string_view sop_uid)
119 -> VoidResult;
120
125 [[nodiscard]] auto instance_count() -> Result<size_t>;
126
132 [[nodiscard]] auto instance_count(std::string_view series_uid)
133 -> Result<size_t>;
134
141 [[nodiscard]] auto get_file_path(std::string_view sop_instance_uid)
142 -> Result<std::optional<std::string>>;
143
149 [[nodiscard]] auto get_study_files(std::string_view study_instance_uid)
150 -> Result<std::vector<std::string>>;
151
157 [[nodiscard]] auto get_series_files(std::string_view series_instance_uid)
158 -> Result<std::vector<std::string>>;
159
160protected:
161 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
162 -> instance_record override;
163 [[nodiscard]] auto entity_to_row(const instance_record& entity) const
164 -> std::map<std::string, database_value> override;
165 [[nodiscard]] auto get_pk(const instance_record& entity) const
166 -> int64_t override;
167 [[nodiscard]] auto has_pk(const instance_record& entity) const
168 -> bool override;
169 [[nodiscard]] auto select_columns() const -> std::vector<std::string> override;
170
171private:
172 [[nodiscard]] auto parse_timestamp(const std::string& str) const
173 -> std::chrono::system_clock::time_point;
174 [[nodiscard]] auto format_timestamp(
175 std::chrono::system_clock::time_point tp) const -> std::string;
176};
177
178} // namespace kcenon::pacs::storage
179
180#else // !PACS_WITH_DATABASE_SYSTEM
181
182struct sqlite3;
183
184namespace kcenon::pacs::storage {
185
186template <typename T>
188
189using VoidResult = kcenon::common::VoidResult;
190
195public:
200 explicit instance_repository(sqlite3* db);
202
206 auto operator=(instance_repository&&) noexcept -> instance_repository&;
207
219 [[nodiscard]] auto upsert_instance(int64_t series_pk,
220 std::string_view sop_uid,
221 std::string_view sop_class_uid,
222 std::string_view file_path,
223 int64_t file_size,
224 std::string_view transfer_syntax = "",
225 std::optional<int> instance_number = std::nullopt)
226 -> Result<int64_t>;
227
233 [[nodiscard]] auto upsert_instance(const instance_record& record)
234 -> Result<int64_t>;
235
241 [[nodiscard]] auto find_instance(std::string_view sop_uid) const
242 -> std::optional<instance_record>;
243
249 [[nodiscard]] auto find_instance_by_pk(int64_t pk) const
250 -> std::optional<instance_record>;
251
257 [[nodiscard]] auto list_instances(std::string_view series_uid) const
258 -> Result<std::vector<instance_record>>;
259
265 [[nodiscard]] auto search_instances(const instance_query& query) const
266 -> Result<std::vector<instance_record>>;
267
273 [[nodiscard]] auto delete_instance(std::string_view sop_uid)
274 -> VoidResult;
275
280 [[nodiscard]] auto instance_count() const -> Result<size_t>;
281
287 [[nodiscard]] auto instance_count(std::string_view series_uid) const
288 -> Result<size_t>;
289
296 [[nodiscard]] auto get_file_path(std::string_view sop_instance_uid) const
297 -> Result<std::optional<std::string>>;
298
304 [[nodiscard]] auto get_study_files(std::string_view study_instance_uid) const
305 -> Result<std::vector<std::string>>;
306
312 [[nodiscard]] auto get_series_files(std::string_view series_instance_uid) const
313 -> Result<std::vector<std::string>>;
314
315private:
316 [[nodiscard]] auto parse_instance_row(void* stmt) const -> instance_record;
317 [[nodiscard]] static auto parse_timestamp(const std::string& str)
318 -> std::chrono::system_clock::time_point;
319
320 sqlite3* db_{nullptr};
321};
322
323} // namespace kcenon::pacs::storage
324
325#endif // PACS_WITH_DATABASE_SYSTEM
Generic base repository for CRUD operations.
Repository for instance metadata persistence (legacy SQLite interface)
auto find_instance_by_pk(int64_t pk) const -> std::optional< instance_record >
Find an instance record by its database primary key.
instance_repository(const instance_repository &)=delete
auto parse_instance_row(void *stmt) const -> instance_record
auto instance_count() const -> Result< size_t >
Get the total number of instance records in the repository.
instance_repository(instance_repository &&) noexcept
auto get_file_path(std::string_view sop_instance_uid) const -> Result< std::optional< std::string > >
Retrieve the file system path for a stored instance.
instance_repository(sqlite3 *db)
Construct an instance repository with a raw SQLite database handle.
auto upsert_instance(int64_t series_pk, std::string_view sop_uid, std::string_view sop_class_uid, std::string_view file_path, int64_t file_size, std::string_view transfer_syntax="", std::optional< int > instance_number=std::nullopt) -> Result< int64_t >
Insert or update an instance record by individual fields.
auto search_instances(const instance_query &query) const -> Result< std::vector< instance_record > >
Search for instance records matching the given query criteria.
auto get_study_files(std::string_view study_instance_uid) const -> Result< std::vector< std::string > >
Retrieve all file paths for instances belonging to a study.
auto list_instances(std::string_view series_uid) const -> Result< std::vector< instance_record > >
List all instance records belonging to a given series.
auto delete_instance(std::string_view sop_uid) -> VoidResult
Delete an instance record by its SOP Instance UID.
auto find_instance(std::string_view sop_uid) const -> std::optional< instance_record >
Find an instance record by its SOP Instance UID.
auto get_series_files(std::string_view series_instance_uid) const -> Result< std::vector< std::string > >
Retrieve all file paths for instances belonging to a series.
static auto parse_timestamp(const std::string &str) -> std::chrono::system_clock::time_point
auto operator=(const instance_repository &) -> instance_repository &=delete
Instance record data structures for database operations.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Instance record from the database.