6#include "DataMapper/DataMapper.hpp"
8#include "SqlTransaction.hpp"
23 struct MigrationTimestamp
27 constexpr bool operator==(MigrationTimestamp
const& other)
const noexcept
29 return value == other.value;
32 constexpr bool operator!=(MigrationTimestamp
const& other)
const noexcept
34 return !(*
this == other);
39 class SqlMigrationExecutor
42 SqlMigrationExecutor(SqlMigrationExecutor
const&) =
default;
43 SqlMigrationExecutor(SqlMigrationExecutor&&) =
delete;
44 SqlMigrationExecutor& operator=(SqlMigrationExecutor
const&) =
default;
45 SqlMigrationExecutor& operator=(SqlMigrationExecutor&&) =
delete;
46 virtual ~SqlMigrationExecutor() =
default;
48 virtual void OnCreateTable(SqlCreateTablePlan
const& createTable) = 0;
49 virtual void OnAlterTable(SqlAlterTablePlan
const& alterTable) = 0;
51 virtual void OnDropTable(std::string_view tableName) = 0;
55 class MigrationManager
58 using MigrationList = std::list<MigrationBase const*>;
60 LIGHTWEIGHT_API
static MigrationManager& GetInstance()
62 static MigrationManager instance;
66 LIGHTWEIGHT_API
void AddMigration(MigrationBase
const* migration);
68 [[nodiscard]] LIGHTWEIGHT_API MigrationList
const& GetAllMigrations() const noexcept;
70 [[nodiscard]] LIGHTWEIGHT_API MigrationBase const* GetMigration(MigrationTimestamp timestamp) const;
72 LIGHTWEIGHT_API
void RemoveAllMigrations();
74 [[nodiscard]] LIGHTWEIGHT_API std::list<MigrationBase const*> GetPending() const noexcept;
76 using ExecuteCallback =
77 std::function<
void(MigrationBase const& ,
size_t ,
size_t )>;
79 LIGHTWEIGHT_API
void ApplySingleMigration(MigrationTimestamp timestamp);
80 LIGHTWEIGHT_API
void ApplySingleMigration(MigrationBase const& migration);
81 LIGHTWEIGHT_API
size_t ApplyPendingMigrations(ExecuteCallback const& feedbackCallback = {});
83 LIGHTWEIGHT_API
void CreateMigrationHistory();
84 [[nodiscard]] LIGHTWEIGHT_API std::vector<MigrationTimestamp> GetAppliedMigrationIds()
const;
86 [[nodiscard]] LIGHTWEIGHT_API DataMapper& GetDataMapper();
88 [[nodiscard]] LIGHTWEIGHT_API DataMapper& GetDataMapper()
const
90 return const_cast<MigrationManager*
>(
this)->GetDataMapper();
93 LIGHTWEIGHT_API
void CloseDataMapper();
95 LIGHTWEIGHT_API SqlTransaction Transaction();
98 MigrationList _migrations;
99 mutable std::optional<DataMapper> _mapper;
106 MigrationBase(MigrationBase
const&) =
default;
107 MigrationBase(MigrationBase&&) =
delete;
108 MigrationBase& operator=(MigrationBase
const&) =
default;
109 MigrationBase& operator=(MigrationBase&&) =
delete;
110 MigrationBase(MigrationTimestamp timestamp, std::string_view title):
111 _timestamp { timestamp },
114 MigrationManager::GetInstance().AddMigration(
this);
117 virtual ~MigrationBase() =
default;
119 virtual void Execute(SqlMigrationQueryBuilder& planer)
const = 0;
121 [[nodiscard]] MigrationTimestamp GetTimestamp() const noexcept
126 [[nodiscard]] std::string_view GetTitle() const noexcept
132 MigrationTimestamp _timestamp;
133 std::string_view _title;
136 class Migration:
public MigrationBase
139 Migration(MigrationTimestamp timestamp,
140 std::string_view title,
141 std::function<
void(SqlMigrationQueryBuilder&)>
const& plan):
142 MigrationBase(timestamp, title),
147 void Execute(SqlMigrationQueryBuilder& planer)
const override
153 std::function<void(SqlMigrationQueryBuilder&)> _plan;
160#define LIGHTWEIGHT_CONCATENATE(s1, s2) s1##s2
162#define LIGHTWEIGHT_MIGRATION_INSTANCE(timestamp) migration_##timestamp
170#define LIGHTWEIGHT_SQL_MIGRATION(timestamp, description) \
171 struct Migration_##timestamp: public Lightweight::SqlMigration::MigrationBase \
173 explicit Migration_##timestamp(): \
174 Lightweight::SqlMigration::MigrationBase(Lightweight::SqlMigration::MigrationTimestamp { timestamp }, \
179 void Execute(Lightweight::SqlMigrationQueryBuilder& planer) const override; \
182 static Migration_##timestamp LIGHTWEIGHT_CONCATENATE(migration_, timestamp); \
184 void Migration_##timestamp::Execute(Lightweight::SqlMigrationQueryBuilder& plan) const