PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
migration_runner.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
24#include "migration_record.h"
25
26#include <kcenon/common/patterns/result.h>
27
28#include <functional>
29#include <memory>
30#include <string>
31#include <string_view>
32#include <vector>
33
34// Forward declaration for pacs_database_adapter
35#ifdef PACS_WITH_DATABASE_SYSTEM
36namespace kcenon::pacs::storage {
37class pacs_database_adapter;
38}
39#endif
40
41// Forward declaration of SQLite handle
42struct sqlite3;
43
44namespace kcenon::pacs::storage {
45
47using VoidResult = kcenon::common::VoidResult;
48
58using migration_function = std::function<VoidResult(sqlite3* db)>;
59
60#ifdef PACS_WITH_DATABASE_SYSTEM
70using adapter_migration_function =
71 std::function<VoidResult(pacs_database_adapter&)>;
72#endif
73
104public:
109
113 ~migration_runner() = default;
114
115 // Non-copyable, non-movable (stateless service)
117 auto operator=(const migration_runner&) -> migration_runner& = delete;
120
121 // ========================================================================
122 // Migration Operations
123 // ========================================================================
124
137 [[nodiscard]] auto run_migrations(sqlite3* db) -> VoidResult;
138
146 [[nodiscard]] auto run_migrations_to(sqlite3* db, int target_version)
147 -> VoidResult;
148
149#ifdef PACS_WITH_DATABASE_SYSTEM
150 // ========================================================================
151 // Migration Operations (pacs_database_adapter)
152 // ========================================================================
153
166 [[nodiscard]] auto run_migrations(pacs_database_adapter& db) -> VoidResult;
167
175 [[nodiscard]] auto run_migrations_to(pacs_database_adapter& db,
176 int target_version) -> VoidResult;
177
184 [[nodiscard]] auto get_current_version(pacs_database_adapter& db) const
185 -> int;
186
193 [[nodiscard]] auto needs_migration(pacs_database_adapter& db) const -> bool;
194
201 [[nodiscard]] auto get_history(pacs_database_adapter& db) const
202 -> std::vector<migration_record>;
203#endif
204
205 // ========================================================================
206 // Version Information
207 // ========================================================================
208
218 [[nodiscard]] auto get_current_version(sqlite3* db) const -> int;
219
225 [[nodiscard]] auto get_latest_version() const noexcept -> int;
226
233 [[nodiscard]] auto needs_migration(sqlite3* db) const -> bool;
234
235 // ========================================================================
236 // Migration History
237 // ========================================================================
238
247 [[nodiscard]] auto get_history(sqlite3* db) const
248 -> std::vector<migration_record>;
249
250private:
251 // ========================================================================
252 // Internal Implementation
253 // ========================================================================
254
261 [[nodiscard]] auto ensure_schema_version_table(sqlite3* db) -> VoidResult;
262
270 [[nodiscard]] auto apply_migration(sqlite3* db, int version) -> VoidResult;
271
280 [[nodiscard]] auto record_migration(sqlite3* db, int version,
281 std::string_view description)
282 -> VoidResult;
283
291 [[nodiscard]] auto execute_sql(sqlite3* db, std::string_view sql)
292 -> VoidResult;
293
294 // Migration implementations (SQLite)
295 [[nodiscard]] auto migrate_v1(sqlite3* db) -> VoidResult;
296 [[nodiscard]] auto migrate_v2(sqlite3* db) -> VoidResult;
297 [[nodiscard]] auto migrate_v3(sqlite3* db) -> VoidResult;
298 [[nodiscard]] auto migrate_v4(sqlite3* db) -> VoidResult;
299 [[nodiscard]] auto migrate_v5(sqlite3* db) -> VoidResult;
300 [[nodiscard]] auto migrate_v6(sqlite3* db) -> VoidResult;
301 [[nodiscard]] auto migrate_v7(sqlite3* db) -> VoidResult;
302 [[nodiscard]] auto migrate_v8(sqlite3* db) -> VoidResult;
303 [[nodiscard]] auto migrate_v9(sqlite3* db) -> VoidResult;
304
305#ifdef PACS_WITH_DATABASE_SYSTEM
306 // ========================================================================
307 // Internal Implementation (pacs_database_adapter)
308 // ========================================================================
309
316 [[nodiscard]] auto ensure_schema_version_table(pacs_database_adapter& db)
317 -> VoidResult;
318
326 [[nodiscard]] auto apply_migration(pacs_database_adapter& db, int version)
327 -> VoidResult;
328
337 [[nodiscard]] auto record_migration(pacs_database_adapter& db, int version,
338 std::string_view description)
339 -> VoidResult;
340
348 [[nodiscard]] auto execute_sql(pacs_database_adapter& db,
349 std::string_view sql) -> VoidResult;
350
351 // Migration implementations (pacs_database_adapter)
352 [[nodiscard]] auto migrate_v1(pacs_database_adapter& db) -> VoidResult;
353 [[nodiscard]] auto migrate_v2(pacs_database_adapter& db) -> VoidResult;
354 [[nodiscard]] auto migrate_v3(pacs_database_adapter& db) -> VoidResult;
355 [[nodiscard]] auto migrate_v4(pacs_database_adapter& db) -> VoidResult;
356 [[nodiscard]] auto migrate_v5(pacs_database_adapter& db) -> VoidResult;
357 [[nodiscard]] auto migrate_v6(pacs_database_adapter& db) -> VoidResult;
358 [[nodiscard]] auto migrate_v7(pacs_database_adapter& db) -> VoidResult;
359 [[nodiscard]] auto migrate_v8(pacs_database_adapter& db) -> VoidResult;
360 [[nodiscard]] auto migrate_v9(pacs_database_adapter& db) -> VoidResult;
361
363 std::vector<std::pair<int, adapter_migration_function>> adapter_migrations_;
364#endif
365
367 static constexpr int LATEST_VERSION = 9;
368
370 std::vector<std::pair<int, migration_function>> migrations_;
371};
372
373} // namespace kcenon::pacs::storage
auto operator=(migration_runner &&) -> migration_runner &=delete
migration_runner(migration_runner &&)=delete
auto migrate_v4(sqlite3 *db) -> VoidResult
auto migrate_v9(sqlite3 *db) -> VoidResult
auto migrate_v2(sqlite3 *db) -> VoidResult
auto run_migrations_to(sqlite3 *db, int target_version) -> VoidResult
Run migrations up to a specific version.
auto migrate_v6(sqlite3 *db) -> VoidResult
static constexpr int LATEST_VERSION
Latest schema version (increment when adding migrations)
std::vector< std::pair< int, migration_function > > migrations_
Migration function registry.
auto get_current_version(sqlite3 *db) const -> int
Get the current schema version.
auto migrate_v8(sqlite3 *db) -> VoidResult
auto operator=(const migration_runner &) -> migration_runner &=delete
auto ensure_schema_version_table(sqlite3 *db) -> VoidResult
Create the schema_version table if it doesn't exist.
auto migrate_v5(sqlite3 *db) -> VoidResult
auto migrate_v1(sqlite3 *db) -> VoidResult
auto get_latest_version() const noexcept -> int
Get the latest available schema version.
auto execute_sql(sqlite3 *db, std::string_view sql) -> VoidResult
Execute SQL statement and handle errors.
migration_runner(const migration_runner &)=delete
auto needs_migration(sqlite3 *db) const -> bool
Check if migration is needed.
auto apply_migration(sqlite3 *db, int version) -> VoidResult
Apply a single migration.
~migration_runner()=default
Default destructor.
auto record_migration(sqlite3 *db, int version, std::string_view description) -> VoidResult
Record a migration in the schema_version table.
auto get_history(sqlite3 *db) const -> std::vector< migration_record >
Get the migration history.
auto run_migrations(sqlite3 *db) -> VoidResult
Run all pending migrations.
auto migrate_v3(sqlite3 *db) -> VoidResult
auto migrate_v7(sqlite3 *db) -> VoidResult
Migration record structure for schema version tracking.
std::function< VoidResult(sqlite3 *db)> migration_function
Function type for migration implementations (SQLite)
Represents a record of an applied database migration.