PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
commitment_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 <chrono>
25#include <cstdint>
26#include <memory>
27#include <optional>
28#include <string>
29#include <vector>
30
31#ifdef PACS_WITH_DATABASE_SYSTEM
32
34
35namespace kcenon::pacs::storage {
36
37// =============================================================================
38// Entity Types
39// =============================================================================
40
44enum class commitment_status {
45 pending,
46 success,
47 partial,
48 failed
49};
50
51[[nodiscard]] inline std::string_view to_string(commitment_status s) noexcept {
52 switch (s) {
53 case commitment_status::pending: return "pending";
54 case commitment_status::success: return "success";
55 case commitment_status::partial: return "partial";
56 case commitment_status::failed: return "failed";
57 }
58 return "unknown";
59}
60
61[[nodiscard]] inline commitment_status commitment_status_from_string(
62 std::string_view str) noexcept {
63 if (str == "success") return commitment_status::success;
64 if (str == "partial") return commitment_status::partial;
65 if (str == "failed") return commitment_status::failed;
66 return commitment_status::pending;
67}
68
72struct commitment_record {
73 std::string transaction_uid;
74 std::string requesting_ae;
75 std::string request_time;
76 std::string completion_time;
77 commitment_status status{commitment_status::pending};
78 int total_instances{0};
79 int success_count{0};
80 int failure_count{0};
81};
82
86struct commitment_reference_record {
87 std::string transaction_uid;
88 std::string sop_class_uid;
89 std::string sop_instance_uid;
90 std::string status{"pending"};
91 std::optional<int> failure_reason;
92};
93
94// =============================================================================
95// Repository
96// =============================================================================
97
104class commitment_repository
105 : public base_repository<commitment_record, std::string> {
106public:
107 explicit commitment_repository(std::shared_ptr<pacs_database_adapter> db);
108 ~commitment_repository() override = default;
109
110 commitment_repository(const commitment_repository&) = delete;
111 auto operator=(const commitment_repository&)
112 -> commitment_repository& = delete;
113 commitment_repository(commitment_repository&&) noexcept = default;
114 auto operator=(commitment_repository&&) noexcept
115 -> commitment_repository& = default;
116
117 // =========================================================================
118 // Domain-Specific Operations
119 // =========================================================================
120
132 [[nodiscard]] auto record_request(
133 const std::string& transaction_uid,
134 const std::string& requesting_ae,
135 const std::vector<services::sop_reference>& references) -> VoidResult;
136
147 [[nodiscard]] auto update_result(
148 const std::string& transaction_uid,
149 const services::commitment_result& result) -> VoidResult;
150
157 [[nodiscard]] auto get_status(const std::string& transaction_uid)
158 -> Result<commitment_status>;
159
166 [[nodiscard]] auto is_duplicate_transaction(
167 const std::string& transaction_uid) -> bool;
168
175 [[nodiscard]] auto get_references(const std::string& transaction_uid)
176 -> Result<std::vector<commitment_reference_record>>;
177
185 [[nodiscard]] auto find_by_status(commitment_status status,
186 size_t limit = 100)
187 -> list_result_type;
188
195 [[nodiscard]] auto cleanup_old_transactions(std::chrono::hours max_age)
196 -> Result<size_t>;
197
198protected:
199 // =========================================================================
200 // base_repository Overrides
201 // =========================================================================
202
203 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
204 -> commitment_record override;
205
206 [[nodiscard]] auto entity_to_row(const commitment_record& entity) const
207 -> std::map<std::string, database_value> override;
208
209 [[nodiscard]] auto get_pk(const commitment_record& entity) const
210 -> std::string override;
211
212 [[nodiscard]] auto has_pk(const commitment_record& entity) const
213 -> bool override;
214
215private:
216 [[nodiscard]] auto format_timestamp(
217 std::chrono::system_clock::time_point tp) const -> std::string;
218
219 [[nodiscard]] auto insert_references(
220 const std::string& transaction_uid,
221 const std::vector<services::sop_reference>& references) -> VoidResult;
222};
223
224} // namespace kcenon::pacs::storage
225
226#endif // PACS_WITH_DATABASE_SYSTEM
Generic base repository for CRUD operations.
@ pending
Job is queued but not started.
constexpr dicom_tag failure_reason
Failure Reason — reason code for commitment failure (PS3.4 Table J.3-2)
constexpr dicom_tag sop_instance_uid
SOP Instance UID.
constexpr dicom_tag status
Status.
constexpr dicom_tag sop_class_uid
SOP Class UID.
constexpr dicom_tag transaction_uid
Transaction UID — identifies a Storage Commitment transaction (PS3.4 J.3)
@ partial
PARTIAL - Document is not complete.
auto to_string(annotation_type type) -> std::string
Convert annotation_type to string.
Data types for DICOM Storage Commitment Push Model Service.