PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
mpps_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 <memory>
26#include <optional>
27#include <string>
28#include <string_view>
29#include <vector>
30
31#ifdef PACS_WITH_DATABASE_SYSTEM
32
34
35namespace kcenon::pacs::storage {
36
47class mpps_repository : public base_repository<mpps_record, int64_t> {
48public:
53 explicit mpps_repository(std::shared_ptr<pacs_database_adapter> db);
54 ~mpps_repository() override = default;
55
56 mpps_repository(const mpps_repository&) = delete;
57 auto operator=(const mpps_repository&) -> mpps_repository& = delete;
58 mpps_repository(mpps_repository&&) noexcept = default;
59 auto operator=(mpps_repository&&) noexcept -> mpps_repository& = default;
60
74 [[nodiscard]] auto create_mpps(std::string_view mpps_uid,
75 std::string_view station_ae = "",
76 std::string_view modality = "",
77 std::string_view study_uid = "",
78 std::string_view accession_no = "",
79 std::string_view start_datetime = "")
80 -> Result<int64_t>;
81
87 [[nodiscard]] auto create_mpps(const mpps_record& record) -> Result<int64_t>;
88
102 [[nodiscard]] auto update_mpps(std::string_view mpps_uid,
103 std::string_view new_status,
104 std::string_view end_datetime = "",
105 std::string_view performed_series = "")
106 -> VoidResult;
107
113 [[nodiscard]] auto update_mpps(const mpps_record& record) -> VoidResult;
114
120 [[nodiscard]] auto find_mpps(std::string_view mpps_uid)
121 -> std::optional<mpps_record>;
122
128 [[nodiscard]] auto find_mpps_by_pk(int64_t pk)
129 -> std::optional<mpps_record>;
130
136 [[nodiscard]] auto list_active_mpps(std::string_view station_ae)
137 -> Result<std::vector<mpps_record>>;
138
144 [[nodiscard]] auto find_mpps_by_study(std::string_view study_uid)
145 -> Result<std::vector<mpps_record>>;
146
152 [[nodiscard]] auto search_mpps(const mpps_query& query)
153 -> Result<std::vector<mpps_record>>;
154
160 [[nodiscard]] auto delete_mpps(std::string_view mpps_uid) -> VoidResult;
161
166 [[nodiscard]] auto mpps_count() -> Result<size_t>;
167
173 [[nodiscard]] auto mpps_count(std::string_view status) -> Result<size_t>;
174
175protected:
176 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
177 -> mpps_record override;
178 [[nodiscard]] auto entity_to_row(const mpps_record& entity) const
179 -> std::map<std::string, database_value> override;
180 [[nodiscard]] auto get_pk(const mpps_record& entity) const
181 -> int64_t override;
182 [[nodiscard]] auto has_pk(const mpps_record& entity) const
183 -> bool override;
184 [[nodiscard]] auto select_columns() const -> std::vector<std::string> override;
185
186private:
187 [[nodiscard]] auto parse_timestamp(const std::string& str) const
188 -> std::chrono::system_clock::time_point;
189 [[nodiscard]] auto format_timestamp(
190 std::chrono::system_clock::time_point tp) const -> std::string;
191};
192
193} // namespace kcenon::pacs::storage
194
195#else
196
197struct sqlite3;
198
199namespace kcenon::pacs::storage {
200
201template <typename T>
203
204using VoidResult = kcenon::common::VoidResult;
205
213public:
218 explicit mpps_repository(sqlite3* db);
220
222 auto operator=(const mpps_repository&) -> mpps_repository& = delete;
224 auto operator=(mpps_repository&&) noexcept -> mpps_repository&;
225
227 [[nodiscard]] auto create_mpps(std::string_view mpps_uid,
228 std::string_view station_ae = "",
229 std::string_view modality = "",
230 std::string_view study_uid = "",
231 std::string_view accession_no = "",
232 std::string_view start_datetime = "")
233 -> Result<int64_t>;
235 [[nodiscard]] auto create_mpps(const mpps_record& record) -> Result<int64_t>;
237 [[nodiscard]] auto update_mpps(std::string_view mpps_uid,
238 std::string_view new_status,
239 std::string_view end_datetime = "",
240 std::string_view performed_series = "")
241 -> VoidResult;
243 [[nodiscard]] auto update_mpps(const mpps_record& record) -> VoidResult;
245 [[nodiscard]] auto find_mpps(std::string_view mpps_uid) const
246 -> std::optional<mpps_record>;
248 [[nodiscard]] auto find_mpps_by_pk(int64_t pk) const
249 -> std::optional<mpps_record>;
251 [[nodiscard]] auto list_active_mpps(std::string_view station_ae) const
252 -> Result<std::vector<mpps_record>>;
254 [[nodiscard]] auto find_mpps_by_study(std::string_view study_uid) const
255 -> Result<std::vector<mpps_record>>;
257 [[nodiscard]] auto search_mpps(const mpps_query& query) const
258 -> Result<std::vector<mpps_record>>;
260 [[nodiscard]] auto delete_mpps(std::string_view mpps_uid) -> VoidResult;
262 [[nodiscard]] auto mpps_count() const -> Result<size_t>;
264 [[nodiscard]] auto mpps_count(std::string_view status) const
265 -> Result<size_t>;
266
267private:
268 [[nodiscard]] auto parse_mpps_row(void* stmt) const -> mpps_record;
269 [[nodiscard]] static auto parse_timestamp(const std::string& str)
270 -> std::chrono::system_clock::time_point;
271
272 sqlite3* db_{nullptr};
273};
274
275} // namespace kcenon::pacs::storage
276
277#endif
Generic base repository for CRUD operations.
Legacy direct-SQLite fallback when database_system is disabled.
static auto parse_timestamp(const std::string &str) -> std::chrono::system_clock::time_point
auto find_mpps(std::string_view mpps_uid) const -> std::optional< mpps_record >
Look up an MPPS record by MPPS SOP Instance UID.
auto operator=(const mpps_repository &) -> mpps_repository &=delete
auto parse_mpps_row(void *stmt) const -> mpps_record
auto find_mpps_by_pk(int64_t pk) const -> std::optional< mpps_record >
Look up an MPPS record by database primary key.
auto update_mpps(std::string_view mpps_uid, std::string_view new_status, std::string_view end_datetime="", std::string_view performed_series="") -> VoidResult
Apply an MPPS status transition (N-SET)
auto create_mpps(std::string_view mpps_uid, std::string_view station_ae="", std::string_view modality="", std::string_view study_uid="", std::string_view accession_no="", std::string_view start_datetime="") -> Result< int64_t >
Create a new MPPS record in IN_PROGRESS state (inline fields)
auto search_mpps(const mpps_query &query) const -> Result< std::vector< mpps_record > >
Search MPPS records using a structured query.
mpps_repository(const mpps_repository &)=delete
auto mpps_count() const -> Result< size_t >
Total number of MPPS records currently stored.
auto delete_mpps(std::string_view mpps_uid) -> VoidResult
Delete an MPPS record by MPPS SOP Instance UID.
mpps_repository(sqlite3 *db)
Construct repository bound to a raw sqlite3 handle.
auto find_mpps_by_study(std::string_view study_uid) const -> Result< std::vector< mpps_record > >
Find all MPPS records referencing a Study Instance UID.
auto list_active_mpps(std::string_view station_ae) const -> Result< std::vector< mpps_record > >
List non-terminal MPPS records for a station AE.
MPPS (Modality Performed Procedure Step) record data structures.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Query parameters for MPPS search.
MPPS record from the database.