PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
series_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 <memory>
25#include <optional>
26#include <string>
27#include <string_view>
28#include <vector>
29
30#ifdef PACS_WITH_DATABASE_SYSTEM
31
33
34namespace kcenon::pacs::storage {
35
39class series_repository : public base_repository<series_record, int64_t> {
40public:
41 explicit series_repository(std::shared_ptr<pacs_database_adapter> db);
42 ~series_repository() override = default;
43
44 series_repository(const series_repository&) = delete;
45 auto operator=(const series_repository&) -> series_repository& = delete;
46 series_repository(series_repository&&) noexcept = default;
47 auto operator=(series_repository&&) noexcept -> series_repository& = default;
48
49 [[nodiscard]] auto upsert_series(int64_t study_pk,
50 std::string_view series_uid,
51 std::string_view modality = "",
52 std::optional<int> series_number = std::nullopt,
53 std::string_view series_description = "",
54 std::string_view body_part_examined = "",
55 std::string_view station_name = "")
56 -> Result<int64_t>;
57 [[nodiscard]] auto upsert_series(const series_record& record)
58 -> Result<int64_t>;
59 [[nodiscard]] auto find_series(std::string_view series_uid)
60 -> std::optional<series_record>;
61 [[nodiscard]] auto find_series_by_pk(int64_t pk)
62 -> std::optional<series_record>;
63 [[nodiscard]] auto list_series(std::string_view study_uid)
64 -> Result<std::vector<series_record>>;
65 [[nodiscard]] auto search_series(const series_query& query)
66 -> Result<std::vector<series_record>>;
67 [[nodiscard]] auto delete_series(std::string_view series_uid)
68 -> VoidResult;
69 [[nodiscard]] auto series_count() -> Result<size_t>;
70 [[nodiscard]] auto series_count(std::string_view study_uid)
71 -> Result<size_t>;
72
73protected:
74 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
75 -> series_record override;
76 [[nodiscard]] auto entity_to_row(const series_record& entity) const
77 -> std::map<std::string, database_value> override;
78 [[nodiscard]] auto get_pk(const series_record& entity) const
79 -> int64_t override;
80 [[nodiscard]] auto has_pk(const series_record& entity) const
81 -> bool override;
82 [[nodiscard]] auto select_columns() const -> std::vector<std::string> override;
83
84private:
85 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
86 -> std::string;
87 [[nodiscard]] auto parse_timestamp(const std::string& str) const
88 -> std::chrono::system_clock::time_point;
89 [[nodiscard]] auto format_timestamp(
90 std::chrono::system_clock::time_point tp) const -> std::string;
91};
92
93} // namespace kcenon::pacs::storage
94
95#else // !PACS_WITH_DATABASE_SYSTEM
96
97struct sqlite3;
98
99namespace kcenon::pacs::storage {
100
101template <typename T>
103
104using VoidResult = kcenon::common::VoidResult;
105
110public:
111 explicit series_repository(sqlite3* db);
113
117 auto operator=(series_repository&&) noexcept -> series_repository&;
118
119 [[nodiscard]] auto upsert_series(int64_t study_pk,
120 std::string_view series_uid,
121 std::string_view modality = "",
122 std::optional<int> series_number = std::nullopt,
123 std::string_view series_description = "",
124 std::string_view body_part_examined = "",
125 std::string_view station_name = "")
126 -> Result<int64_t>;
127 [[nodiscard]] auto upsert_series(const series_record& record)
128 -> Result<int64_t>;
129 [[nodiscard]] auto find_series(std::string_view series_uid) const
130 -> std::optional<series_record>;
131 [[nodiscard]] auto find_series_by_pk(int64_t pk) const
132 -> std::optional<series_record>;
133 [[nodiscard]] auto list_series(std::string_view study_uid) const
134 -> Result<std::vector<series_record>>;
135 [[nodiscard]] auto search_series(const series_query& query) const
136 -> Result<std::vector<series_record>>;
137 [[nodiscard]] auto delete_series(std::string_view series_uid)
138 -> VoidResult;
139 [[nodiscard]] auto series_count() const -> Result<size_t>;
140 [[nodiscard]] auto series_count(std::string_view study_uid) const
141 -> Result<size_t>;
142
143private:
144 [[nodiscard]] auto parse_series_row(void* stmt) const -> series_record;
145 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
146 -> std::string;
147 [[nodiscard]] static auto parse_timestamp(const std::string& str)
148 -> std::chrono::system_clock::time_point;
149
150 sqlite3* db_{nullptr};
151};
152
153} // namespace kcenon::pacs::storage
154
155#endif // PACS_WITH_DATABASE_SYSTEM
Generic base repository for CRUD operations.
Repository for series metadata persistence (legacy SQLite interface)
series_repository(const series_repository &)=delete
auto series_count() const -> Result< size_t >
series_repository(series_repository &&) noexcept
auto find_series(std::string_view series_uid) const -> std::optional< series_record >
auto operator=(const series_repository &) -> series_repository &=delete
auto list_series(std::string_view study_uid) const -> Result< std::vector< series_record > >
auto delete_series(std::string_view series_uid) -> VoidResult
auto find_series_by_pk(int64_t pk) const -> std::optional< series_record >
auto parse_series_row(void *stmt) const -> series_record
auto search_series(const series_query &query) const -> Result< std::vector< series_record > >
auto upsert_series(int64_t study_pk, std::string_view series_uid, std::string_view modality="", std::optional< int > series_number=std::nullopt, std::string_view series_description="", std::string_view body_part_examined="", std::string_view station_name="") -> Result< int64_t >
static auto to_like_pattern(std::string_view pattern) -> std::string
static auto parse_timestamp(const std::string &str) -> std::chrono::system_clock::time_point
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Series record data structures for database operations.
Series record from the database.