PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
database_cursor.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
22#pragma once
23
25
26#ifdef PACS_WITH_DATABASE_SYSTEM
27
32
33#include <kcenon/common/patterns/result.h>
34
35#include <cstdint>
36#include <memory>
37#include <optional>
38#include <string>
39#include <variant>
40#include <vector>
41
42namespace kcenon::pacs::services {
43
45template <typename T>
47
49using VoidResult = kcenon::common::VoidResult;
50
57using query_record = std::variant<storage::patient_record, storage::study_record,
58 storage::series_record, storage::instance_record>;
59
91class database_cursor {
92public:
96 enum class record_type { patient, study, series, instance };
97
101 ~database_cursor();
102
103 // Non-copyable
104 database_cursor(const database_cursor&) = delete;
105 auto operator=(const database_cursor&) -> database_cursor& = delete;
106
107 // Movable
108 database_cursor(database_cursor&& other) noexcept;
109 auto operator=(database_cursor&& other) noexcept -> database_cursor&;
110
111 // =========================================================================
112 // Factory Methods
113 // =========================================================================
114
122 [[nodiscard]] static auto create_patient_cursor(
123 std::shared_ptr<storage::pacs_database_adapter> db,
124 const storage::patient_query& query) -> Result<std::unique_ptr<database_cursor>>;
125
133 [[nodiscard]] static auto create_study_cursor(
134 std::shared_ptr<storage::pacs_database_adapter> db,
135 const storage::study_query& query) -> Result<std::unique_ptr<database_cursor>>;
136
144 [[nodiscard]] static auto create_series_cursor(
145 std::shared_ptr<storage::pacs_database_adapter> db,
146 const storage::series_query& query) -> Result<std::unique_ptr<database_cursor>>;
147
155 [[nodiscard]] static auto create_instance_cursor(
156 std::shared_ptr<storage::pacs_database_adapter> db,
157 const storage::instance_query& query) -> Result<std::unique_ptr<database_cursor>>;
158
159
160 // =========================================================================
161 // Cursor Operations
162 // =========================================================================
163
169 [[nodiscard]] auto has_more() const noexcept -> bool;
170
178 [[nodiscard]] auto fetch_next() -> std::optional<query_record>;
179
188 [[nodiscard]] auto fetch_batch(size_t batch_size) -> std::vector<query_record>;
189
195 [[nodiscard]] auto position() const noexcept -> size_t;
196
202 [[nodiscard]] auto type() const noexcept -> record_type;
203
211 [[nodiscard]] auto reset() -> VoidResult;
212
213 // =========================================================================
214 // Cursor State
215 // =========================================================================
216
225 [[nodiscard]] auto serialize() const -> std::string;
226
227private:
231 database_cursor(std::vector<query_record> results, record_type type);
232
236 [[nodiscard]] static auto parse_patient_row(
237 const storage::database_row& row) -> storage::patient_record;
238
242 [[nodiscard]] static auto parse_study_row(
243 const storage::database_row& row) -> storage::study_record;
244
248 [[nodiscard]] static auto parse_series_row(
249 const storage::database_row& row) -> storage::series_record;
250
254 [[nodiscard]] static auto parse_instance_row(
255 const storage::database_row& row) -> storage::instance_record;
256
263 static void add_dicom_condition(
264 database::query_builder& builder,
265 const std::string& field,
266 const std::string& value);
267
269 std::vector<query_record> results_;
270
277 [[nodiscard]] static auto to_like_pattern(std::string_view pattern) -> std::string;
278
282 [[nodiscard]] static auto contains_dicom_wildcards(std::string_view pattern) -> bool;
283
285 record_type type_;
286
288 size_t position_{0};
289
291 bool has_more_{true};
292
294 bool stepped_{false};
295};
296
297} // namespace kcenon::pacs::services
298
299#endif // PACS_WITH_DATABASE_SYSTEM
Instance record data structures for database operations.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Unified database adapter for PACS system.
Patient record data structures for database operations.
Series record data structures for database operations.
Study record data structures for database operations.