PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
ups_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
21#pragma once
22
24
25#include <kcenon/common/patterns/result.h>
26
27#include <memory>
28#include <optional>
29#include <string>
30#include <string_view>
31#include <vector>
32
33#ifdef PACS_WITH_DATABASE_SYSTEM
34
36
37namespace kcenon::pacs::storage {
38
49class ups_repository : public base_repository<ups_workitem, int64_t> {
50public:
55 explicit ups_repository(std::shared_ptr<pacs_database_adapter> db);
56 ~ups_repository() override = default;
57
58 ups_repository(const ups_repository&) = delete;
59 auto operator=(const ups_repository&) -> ups_repository& = delete;
60 ups_repository(ups_repository&&) noexcept = default;
61 auto operator=(ups_repository&&) noexcept -> ups_repository& = default;
62
72 [[nodiscard]] auto create_ups_workitem(const ups_workitem& workitem)
73 -> Result<int64_t>;
74
80 [[nodiscard]] auto update_ups_workitem(const ups_workitem& workitem)
81 -> VoidResult;
82
95 [[nodiscard]] auto change_ups_state(std::string_view workitem_uid,
96 std::string_view new_state,
97 std::string_view transaction_uid = "")
98 -> VoidResult;
99
105 [[nodiscard]] auto find_ups_workitem(std::string_view workitem_uid)
106 -> std::optional<ups_workitem>;
107
113 [[nodiscard]] auto search_ups_workitems(const ups_workitem_query& query)
114 -> Result<std::vector<ups_workitem>>;
115
124 [[nodiscard]] auto delete_ups_workitem(std::string_view workitem_uid)
125 -> VoidResult;
126
131 [[nodiscard]] auto ups_workitem_count() -> Result<size_t>;
132
138 [[nodiscard]] auto ups_workitem_count(std::string_view state)
139 -> Result<size_t>;
140
151 [[nodiscard]] auto subscribe_ups(const ups_subscription& subscription)
152 -> Result<int64_t>;
153
161 [[nodiscard]] auto unsubscribe_ups(std::string_view subscriber_ae,
162 std::string_view workitem_uid = "")
163 -> VoidResult;
164
170 [[nodiscard]] auto get_ups_subscriptions(std::string_view subscriber_ae)
171 -> Result<std::vector<ups_subscription>>;
172
181 [[nodiscard]] auto get_ups_subscribers(std::string_view workitem_uid)
182 -> Result<std::vector<std::string>>;
183
184protected:
185 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
186 -> ups_workitem override;
187 [[nodiscard]] auto entity_to_row(const ups_workitem& entity) const
188 -> std::map<std::string, database_value> override;
189 [[nodiscard]] auto get_pk(const ups_workitem& entity) const
190 -> int64_t override;
191 [[nodiscard]] auto has_pk(const ups_workitem& entity) const
192 -> bool override;
193 [[nodiscard]] auto select_columns() const -> std::vector<std::string> override;
194
195private:
196 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
197 -> std::string;
198 [[nodiscard]] auto parse_timestamp(const std::string& str) const
199 -> std::chrono::system_clock::time_point;
200 [[nodiscard]] auto format_timestamp(
201 std::chrono::system_clock::time_point tp) const -> std::string;
202};
203
204} // namespace kcenon::pacs::storage
205
206#else
207
208struct sqlite3;
209
210namespace kcenon::pacs::storage {
211
212template <typename T>
214
215using VoidResult = kcenon::common::VoidResult;
216
224public:
229 explicit ups_repository(sqlite3* db);
231
233 auto operator=(const ups_repository&) -> ups_repository& = delete;
234 ups_repository(ups_repository&&) noexcept;
235 auto operator=(ups_repository&&) noexcept -> ups_repository&;
236
238 [[nodiscard]] auto create_ups_workitem(const ups_workitem& workitem)
239 -> Result<int64_t>;
241 [[nodiscard]] auto update_ups_workitem(const ups_workitem& workitem)
242 -> VoidResult;
244 [[nodiscard]] auto change_ups_state(std::string_view workitem_uid,
245 std::string_view new_state,
246 std::string_view transaction_uid = "")
247 -> VoidResult;
249 [[nodiscard]] auto find_ups_workitem(std::string_view workitem_uid) const
250 -> std::optional<ups_workitem>;
252 [[nodiscard]] auto search_ups_workitems(const ups_workitem_query& query) const
253 -> Result<std::vector<ups_workitem>>;
255 [[nodiscard]] auto delete_ups_workitem(std::string_view workitem_uid)
256 -> VoidResult;
258 [[nodiscard]] auto ups_workitem_count() const -> Result<size_t>;
260 [[nodiscard]] auto ups_workitem_count(std::string_view state) const
261 -> Result<size_t>;
263 [[nodiscard]] auto subscribe_ups(const ups_subscription& subscription)
264 -> Result<int64_t>;
266 [[nodiscard]] auto unsubscribe_ups(std::string_view subscriber_ae,
267 std::string_view workitem_uid = "")
268 -> VoidResult;
270 [[nodiscard]] auto get_ups_subscriptions(std::string_view subscriber_ae) const
271 -> Result<std::vector<ups_subscription>>;
273 [[nodiscard]] auto get_ups_subscribers(std::string_view workitem_uid) const
274 -> Result<std::vector<std::string>>;
275
276private:
277 [[nodiscard]] auto parse_ups_workitem_row(void* stmt) const -> ups_workitem;
278 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
279 -> std::string;
280 [[nodiscard]] static auto parse_timestamp(const std::string& str)
281 -> std::chrono::system_clock::time_point;
282
283 sqlite3* db_{nullptr};
284};
285
286} // namespace kcenon::pacs::storage
287
288#endif
Generic base repository for CRUD operations.
Legacy direct-SQLite fallback when database_system is disabled.
auto get_ups_subscriptions(std::string_view subscriber_ae) const -> Result< std::vector< ups_subscription > >
List every subscription owned by a subscriber AE.
auto delete_ups_workitem(std::string_view workitem_uid) -> VoidResult
Delete a UPS work item by SOP Instance UID.
auto operator=(const ups_repository &) -> ups_repository &=delete
auto create_ups_workitem(const ups_workitem &workitem) -> Result< int64_t >
Insert a new UPS work item (N-CREATE)
ups_repository(const ups_repository &)=delete
auto ups_workitem_count() const -> Result< size_t >
Total number of UPS work items currently stored.
auto subscribe_ups(const ups_subscription &subscription) -> Result< int64_t >
Register a UPS subscription (N-ACTION Subscribe)
static auto to_like_pattern(std::string_view pattern) -> std::string
auto change_ups_state(std::string_view workitem_uid, std::string_view new_state, std::string_view transaction_uid="") -> VoidResult
Change the UPS Procedure Step State (N-ACTION Change State)
auto unsubscribe_ups(std::string_view subscriber_ae, std::string_view workitem_uid="") -> VoidResult
Remove a UPS subscription (N-ACTION Unsubscribe)
static auto parse_timestamp(const std::string &str) -> std::chrono::system_clock::time_point
ups_repository(sqlite3 *db)
Construct repository bound to a raw sqlite3 handle.
auto parse_ups_workitem_row(void *stmt) const -> ups_workitem
auto get_ups_subscribers(std::string_view workitem_uid) const -> Result< std::vector< std::string > >
List subscriber AEs that should be notified for a work item.
auto find_ups_workitem(std::string_view workitem_uid) const -> std::optional< ups_workitem >
Look up a UPS work item by SOP Instance UID.
auto update_ups_workitem(const ups_workitem &workitem) -> VoidResult
Persist all fields of a UPS work item (N-SET)
auto search_ups_workitems(const ups_workitem_query &query) const -> Result< std::vector< ups_workitem > >
Search UPS work items with a structured query.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
UPS subscription record from the database.
Query parameters for UPS workitem search.
UPS workitem record from the database.
Unified Procedure Step (UPS) workitem data structures.