PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
prefetch_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
23#pragma once
24
26
27#include <kcenon/common/patterns/result.h>
28
29#include <memory>
30#include <optional>
31#include <string>
32#include <string_view>
33#include <vector>
34
35#ifdef PACS_WITH_DATABASE_SYSTEM
36
38
39namespace kcenon::pacs::storage {
40
42template <typename T>
44
46using VoidResult = kcenon::common::VoidResult;
47
51struct prefetch_rule_query_options {
52 std::optional<bool> enabled_only;
53 std::optional<client::prefetch_trigger> trigger;
54 size_t limit{100};
55 size_t offset{0};
56};
57
61struct prefetch_history_query_options {
62 std::optional<std::string> patient_id;
63 std::optional<std::string> rule_id;
64 std::optional<std::string> status;
65 size_t limit{100};
66 size_t offset{0};
67};
68
108class prefetch_repository {
109public:
110 // =========================================================================
111 // Construction / Destruction
112 // =========================================================================
113
119 explicit prefetch_repository(std::shared_ptr<pacs_database_adapter> db);
120
125
126 // Non-copyable, movable
128 auto operator=(const prefetch_repository&) -> prefetch_repository& = delete;
130 auto operator=(prefetch_repository&&) noexcept -> prefetch_repository&;
131
132 // =========================================================================
133 // Rule CRUD Operations
134 // =========================================================================
135
145 [[nodiscard]] auto save_rule(const client::prefetch_rule& rule) -> VoidResult;
146
153 [[nodiscard]] auto find_rule_by_id(std::string_view rule_id) const
154 -> std::optional<client::prefetch_rule>;
155
162 [[nodiscard]] auto find_rule_by_pk(int64_t pk) const
163 -> std::optional<client::prefetch_rule>;
164
171 [[nodiscard]] auto find_rules(const prefetch_rule_query_options& options = {}) const
172 -> std::vector<client::prefetch_rule>;
173
179 [[nodiscard]] auto find_enabled_rules() const
180 -> std::vector<client::prefetch_rule>;
181
188 [[nodiscard]] auto remove_rule(std::string_view rule_id) -> VoidResult;
189
196 [[nodiscard]] auto rule_exists(std::string_view rule_id) const -> bool;
197
198 // =========================================================================
199 // Rule Statistics
200 // =========================================================================
201
210 [[nodiscard]] auto increment_triggered(std::string_view rule_id) -> VoidResult;
211
219 [[nodiscard]] auto increment_studies_prefetched(
220 std::string_view rule_id, size_t count = 1) -> VoidResult;
221
228 [[nodiscard]] auto enable_rule(std::string_view rule_id) -> VoidResult;
229
236 [[nodiscard]] auto disable_rule(std::string_view rule_id) -> VoidResult;
237
238 // =========================================================================
239 // History Operations
240 // =========================================================================
241
248 [[nodiscard]] auto save_history(const client::prefetch_history& history) -> VoidResult;
249
256 [[nodiscard]] auto find_history(const prefetch_history_query_options& options = {}) const
257 -> std::vector<client::prefetch_history>;
258
265 [[nodiscard]] auto is_study_prefetched(std::string_view study_uid) const -> bool;
266
272 [[nodiscard]] auto count_completed_today() const -> size_t;
273
279 [[nodiscard]] auto count_failed_today() const -> size_t;
280
288 [[nodiscard]] auto update_history_status(
289 std::string_view study_uid,
290 std::string_view status) -> VoidResult;
291
298 [[nodiscard]] auto cleanup_old_history(std::chrono::hours max_age)
299 -> Result<size_t>;
300
301 // =========================================================================
302 // Statistics
303 // =========================================================================
304
310 [[nodiscard]] auto rule_count() const -> size_t;
311
317 [[nodiscard]] auto enabled_rule_count() const -> size_t;
318
324 [[nodiscard]] auto history_count() const -> size_t;
325
326 // =========================================================================
327 // Database Information
328 // =========================================================================
329
335 [[nodiscard]] auto is_valid() const noexcept -> bool;
336
344 [[nodiscard]] auto initialize_tables() -> VoidResult;
345
346private:
347 // =========================================================================
348 // Private Implementation
349 // =========================================================================
350
351 [[nodiscard]] auto map_row_to_rule(const database_row& row) const
352 -> client::prefetch_rule;
353 [[nodiscard]] auto map_row_to_history(const database_row& row) const
354 -> client::prefetch_history;
355 [[nodiscard]] static auto serialize_modalities(
356 const std::vector<std::string>& modalities) -> std::string;
357 [[nodiscard]] static auto deserialize_modalities(
358 std::string_view json) -> std::vector<std::string>;
359 [[nodiscard]] static auto serialize_node_ids(
360 const std::vector<std::string>& node_ids) -> std::string;
361 [[nodiscard]] static auto deserialize_node_ids(
362 std::string_view json) -> std::vector<std::string>;
363 [[nodiscard]] auto parse_timestamp(const std::string& str) const
364 -> std::chrono::system_clock::time_point;
365 [[nodiscard]] auto format_timestamp(
366 std::chrono::system_clock::time_point tp) const -> std::string;
367
368 std::shared_ptr<pacs_database_adapter> db_;
369};
370
371} // namespace kcenon::pacs::storage
372
373#else // !PACS_WITH_DATABASE_SYSTEM
374
375// =============================================================================
376// Legacy SQLite Interface
377// =============================================================================
378
379struct sqlite3;
380
381namespace kcenon::pacs::storage {
382
384template <typename T>
386
388using VoidResult = kcenon::common::VoidResult;
389
394 std::optional<bool> enabled_only;
395 std::optional<client::prefetch_trigger> trigger;
396 size_t limit{100};
397 size_t offset{0};
398};
399
404 std::optional<std::string> patient_id;
405 std::optional<std::string> rule_id;
406 std::optional<std::string> status;
407 size_t limit{100};
408 size_t offset{0};
409};
410
415public:
416 explicit prefetch_repository(sqlite3* db);
418
422 auto operator=(prefetch_repository&&) noexcept -> prefetch_repository&;
423
424 // Rule Operations
425 [[nodiscard]] auto save_rule(const client::prefetch_rule& rule) -> VoidResult;
426 [[nodiscard]] auto find_rule_by_id(std::string_view rule_id) const
427 -> std::optional<client::prefetch_rule>;
428 [[nodiscard]] auto find_rule_by_pk(int64_t pk) const
429 -> std::optional<client::prefetch_rule>;
430 [[nodiscard]] auto find_rules(const prefetch_rule_query_options& options = {}) const
431 -> std::vector<client::prefetch_rule>;
432 [[nodiscard]] auto find_enabled_rules() const
433 -> std::vector<client::prefetch_rule>;
434 [[nodiscard]] auto remove_rule(std::string_view rule_id) -> VoidResult;
435 [[nodiscard]] auto rule_exists(std::string_view rule_id) const -> bool;
436
437 // Rule Statistics
438 [[nodiscard]] auto increment_triggered(std::string_view rule_id) -> VoidResult;
439 [[nodiscard]] auto increment_studies_prefetched(
440 std::string_view rule_id, size_t count = 1) -> VoidResult;
441 [[nodiscard]] auto enable_rule(std::string_view rule_id) -> VoidResult;
442 [[nodiscard]] auto disable_rule(std::string_view rule_id) -> VoidResult;
443
444 // History Operations
445 [[nodiscard]] auto save_history(const client::prefetch_history& history) -> VoidResult;
446 [[nodiscard]] auto find_history(const prefetch_history_query_options& options = {}) const
447 -> std::vector<client::prefetch_history>;
448 [[nodiscard]] auto is_study_prefetched(std::string_view study_uid) const -> bool;
449 [[nodiscard]] auto count_completed_today() const -> size_t;
450 [[nodiscard]] auto count_failed_today() const -> size_t;
451 [[nodiscard]] auto update_history_status(
452 std::string_view study_uid, std::string_view status) -> VoidResult;
453 [[nodiscard]] auto cleanup_old_history(std::chrono::hours max_age)
454 -> Result<size_t>;
455
456 // Statistics
457 [[nodiscard]] auto rule_count() const -> size_t;
458 [[nodiscard]] auto enabled_rule_count() const -> size_t;
459 [[nodiscard]] auto history_count() const -> size_t;
460
461 // Database Information
462 [[nodiscard]] auto is_valid() const noexcept -> bool;
463 [[nodiscard]] auto initialize_tables() -> VoidResult;
464
465private:
466 [[nodiscard]] auto parse_rule_row(void* stmt) const -> client::prefetch_rule;
467 [[nodiscard]] auto parse_history_row(void* stmt) const -> client::prefetch_history;
468 [[nodiscard]] static auto serialize_modalities(
469 const std::vector<std::string>& modalities) -> std::string;
470 [[nodiscard]] static auto deserialize_modalities(
471 std::string_view json) -> std::vector<std::string>;
472 [[nodiscard]] static auto serialize_node_ids(
473 const std::vector<std::string>& node_ids) -> std::string;
474 [[nodiscard]] static auto deserialize_node_ids(
475 std::string_view json) -> std::vector<std::string>;
476
477 sqlite3* db_{nullptr};
478};
479
480} // namespace kcenon::pacs::storage
481
482#endif // PACS_WITH_DATABASE_SYSTEM
Repository for prefetch persistence (legacy SQLite interface)
auto find_history(const prefetch_history_query_options &options={}) const -> std::vector< client::prefetch_history >
auto find_rules(const prefetch_rule_query_options &options={}) const -> std::vector< client::prefetch_rule >
auto find_rule_by_pk(int64_t pk) const -> std::optional< client::prefetch_rule >
auto update_history_status(std::string_view study_uid, std::string_view status) -> VoidResult
auto find_enabled_rules() const -> std::vector< client::prefetch_rule >
auto enable_rule(std::string_view rule_id) -> VoidResult
auto save_history(const client::prefetch_history &history) -> VoidResult
auto cleanup_old_history(std::chrono::hours max_age) -> Result< size_t >
auto rule_exists(std::string_view rule_id) const -> bool
auto increment_triggered(std::string_view rule_id) -> VoidResult
auto is_study_prefetched(std::string_view study_uid) const -> bool
static auto deserialize_node_ids(std::string_view json) -> std::vector< std::string >
auto parse_history_row(void *stmt) const -> client::prefetch_history
auto parse_rule_row(void *stmt) const -> client::prefetch_rule
auto save_rule(const client::prefetch_rule &rule) -> VoidResult
auto find_rule_by_id(std::string_view rule_id) const -> std::optional< client::prefetch_rule >
prefetch_repository(const prefetch_repository &)=delete
auto disable_rule(std::string_view rule_id) -> VoidResult
static auto serialize_node_ids(const std::vector< std::string > &node_ids) -> std::string
auto increment_studies_prefetched(std::string_view rule_id, size_t count=1) -> VoidResult
auto operator=(const prefetch_repository &) -> prefetch_repository &=delete
static auto serialize_modalities(const std::vector< std::string > &modalities) -> std::string
auto remove_rule(std::string_view rule_id) -> VoidResult
prefetch_repository(prefetch_repository &&) noexcept
static auto deserialize_modalities(std::string_view json) -> std::vector< std::string >
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Unified database adapter for PACS system.
Types and structures for prefetch manager.
Query options for listing prefetch history.
Query options for listing prefetch rules.
std::optional< client::prefetch_trigger > trigger