PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
study_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
47class study_repository : public base_repository<study_record, int64_t> {
48public:
49 explicit study_repository(std::shared_ptr<pacs_database_adapter> db);
50 ~study_repository() override = default;
51
52 study_repository(const study_repository&) = delete;
53 auto operator=(const study_repository&) -> study_repository& = delete;
54 study_repository(study_repository&&) noexcept = default;
55 auto operator=(study_repository&&) noexcept -> study_repository& = default;
56
57 // =========================================================================
58 // Domain-Specific Operations
59 // =========================================================================
60
64 [[nodiscard]] auto upsert_study(int64_t patient_pk,
65 std::string_view study_uid,
66 std::string_view study_id = "",
67 std::string_view study_date = "",
68 std::string_view study_time = "",
69 std::string_view accession_number = "",
70 std::string_view referring_physician = "",
71 std::string_view study_description = "")
72 -> Result<int64_t>;
73
77 [[nodiscard]] auto upsert_study(const study_record& record)
78 -> Result<int64_t>;
79
83 [[nodiscard]] auto find_study(std::string_view study_uid)
84 -> std::optional<study_record>;
85
89 [[nodiscard]] auto find_study_by_pk(int64_t pk)
90 -> std::optional<study_record>;
91
98 [[nodiscard]] auto search_studies(const study_query& query)
99 -> Result<std::vector<study_record>>;
100
104 [[nodiscard]] auto delete_study(std::string_view study_uid) -> VoidResult;
105
109 [[nodiscard]] auto study_count() -> Result<size_t>;
110
114 [[nodiscard]] auto study_count_for_patient(int64_t patient_pk)
115 -> Result<size_t>;
116
123 [[nodiscard]] auto update_modalities_in_study(int64_t study_pk)
124 -> VoidResult;
125
126protected:
127 // =========================================================================
128 // base_repository overrides
129 // =========================================================================
130
131 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
132 -> study_record override;
133
134 [[nodiscard]] auto entity_to_row(const study_record& entity) const
135 -> std::map<std::string, database_value> override;
136
137 [[nodiscard]] auto get_pk(const study_record& entity) const
138 -> int64_t override;
139
140 [[nodiscard]] auto has_pk(const study_record& entity) const
141 -> bool override;
142
143 [[nodiscard]] auto select_columns() const
144 -> std::vector<std::string> override;
145
146private:
147 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
148 -> std::string;
149
150 [[nodiscard]] auto parse_timestamp(const std::string& str) const
151 -> std::chrono::system_clock::time_point;
152
153 [[nodiscard]] auto format_timestamp(
154 std::chrono::system_clock::time_point tp) const -> std::string;
155};
156
157} // namespace kcenon::pacs::storage
158
159#else // !PACS_WITH_DATABASE_SYSTEM
160
161struct sqlite3;
162
163namespace kcenon::pacs::storage {
164
165template <typename T>
167
168using VoidResult = kcenon::common::VoidResult;
169
174public:
175 explicit study_repository(sqlite3* db);
177
179 auto operator=(const study_repository&) -> study_repository& = delete;
181 auto operator=(study_repository&&) noexcept -> study_repository&;
182
183 [[nodiscard]] auto upsert_study(int64_t patient_pk,
184 std::string_view study_uid,
185 std::string_view study_id = "",
186 std::string_view study_date = "",
187 std::string_view study_time = "",
188 std::string_view accession_number = "",
189 std::string_view referring_physician = "",
190 std::string_view study_description = "")
191 -> Result<int64_t>;
192 [[nodiscard]] auto upsert_study(const study_record& record)
193 -> Result<int64_t>;
194 [[nodiscard]] auto find_study(std::string_view study_uid) const
195 -> std::optional<study_record>;
196 [[nodiscard]] auto find_study_by_pk(int64_t pk) const
197 -> std::optional<study_record>;
198 [[nodiscard]] auto search_studies(const study_query& query) const
199 -> Result<std::vector<study_record>>;
200 [[nodiscard]] auto delete_study(std::string_view study_uid) -> VoidResult;
201 [[nodiscard]] auto study_count() const -> Result<size_t>;
202 [[nodiscard]] auto study_count_for_patient(int64_t patient_pk) const
203 -> Result<size_t>;
204 [[nodiscard]] auto update_modalities_in_study(int64_t study_pk)
205 -> VoidResult;
206
207private:
208 [[nodiscard]] auto parse_study_row(void* stmt) const -> study_record;
209 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
210 -> std::string;
211
212 sqlite3* db_{nullptr};
213};
214
215} // namespace kcenon::pacs::storage
216
217#endif // PACS_WITH_DATABASE_SYSTEM
Generic base repository for CRUD operations.
Repository for study metadata persistence (legacy SQLite interface)
auto find_study_by_pk(int64_t pk) const -> std::optional< study_record >
auto study_count_for_patient(int64_t patient_pk) const -> Result< size_t >
auto delete_study(std::string_view study_uid) -> VoidResult
auto find_study(std::string_view study_uid) const -> std::optional< study_record >
auto upsert_study(int64_t patient_pk, std::string_view study_uid, std::string_view study_id="", std::string_view study_date="", std::string_view study_time="", std::string_view accession_number="", std::string_view referring_physician="", std::string_view study_description="") -> Result< int64_t >
auto parse_study_row(void *stmt) const -> study_record
auto update_modalities_in_study(int64_t study_pk) -> VoidResult
study_repository(const study_repository &)=delete
auto operator=(const study_repository &) -> study_repository &=delete
auto search_studies(const study_query &query) const -> Result< std::vector< study_record > >
study_repository(study_repository &&) noexcept
static auto to_like_pattern(std::string_view pattern) -> std::string
auto study_count() const -> Result< size_t >
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Study record from the database.
Study record data structures for database operations.