6#include "DataMapper/DataMapper.hpp"
8#include "SqlTransaction.hpp"
21struct MigrationTimestamp
25 constexpr bool operator==(MigrationTimestamp
const& other)
const noexcept
27 return value == other.value;
30 constexpr bool operator!=(MigrationTimestamp
const& other)
const noexcept
32 return !(*
this == other);
37class SqlMigrationExecutor
40 SqlMigrationExecutor(SqlMigrationExecutor
const&) =
default;
41 SqlMigrationExecutor(SqlMigrationExecutor&&) =
delete;
42 SqlMigrationExecutor& operator=(SqlMigrationExecutor
const&) =
default;
43 SqlMigrationExecutor& operator=(SqlMigrationExecutor&&) =
delete;
44 virtual ~SqlMigrationExecutor() =
default;
46 virtual void OnCreateTable(SqlCreateTablePlan
const& createTable) = 0;
49 virtual void OnDropTable(std::string_view tableName) = 0;
56 using MigrationList = std::list<MigrationBase const*>;
58 LIGHTWEIGHT_API
static MigrationManager& GetInstance()
60 static MigrationManager instance;
64 LIGHTWEIGHT_API
void AddMigration(MigrationBase
const* migration);
66 [[nodiscard]] LIGHTWEIGHT_API MigrationList
const& GetAllMigrations() const noexcept;
68 [[nodiscard]] LIGHTWEIGHT_API MigrationBase const* GetMigration(MigrationTimestamp timestamp) const;
70 LIGHTWEIGHT_API
void RemoveAllMigrations();
72 [[nodiscard]] LIGHTWEIGHT_API std::list<MigrationBase const*> GetPending() const noexcept;
74 using ExecuteCallback = std::function<
void(MigrationBase const& ,
size_t ,
size_t )>;
76 LIGHTWEIGHT_API
void ApplySingleMigration(MigrationTimestamp timestamp);
77 LIGHTWEIGHT_API
void ApplySingleMigration(MigrationBase const& migration);
78 LIGHTWEIGHT_API
size_t ApplyPendingMigrations(ExecuteCallback const& feedbackCallback = {});
80 LIGHTWEIGHT_API
void CreateMigrationHistory();
81 [[nodiscard]] LIGHTWEIGHT_API std::vector<MigrationTimestamp> GetAppliedMigrationIds()
const;
83 [[nodiscard]] LIGHTWEIGHT_API
DataMapper& GetDataMapper();
85 [[nodiscard]] LIGHTWEIGHT_API
DataMapper& GetDataMapper()
const
87 return const_cast<MigrationManager*
>(
this)->GetDataMapper();
90 LIGHTWEIGHT_API
void CloseDataMapper();
95 MigrationList _migrations;
96 mutable std::optional<DataMapper> _mapper;
103 MigrationBase(MigrationBase
const&) =
default;
104 MigrationBase(MigrationBase&&) =
delete;
105 MigrationBase& operator=(MigrationBase
const&) =
default;
106 MigrationBase& operator=(MigrationBase&&) =
delete;
107 MigrationBase(MigrationTimestamp timestamp, std::string_view title):
108 _timestamp { timestamp },
111 MigrationManager::GetInstance().AddMigration(
this);
114 virtual ~MigrationBase() =
default;
118 [[nodiscard]] MigrationTimestamp GetTimestamp() const noexcept
123 [[nodiscard]] std::string_view GetTitle() const noexcept
129 MigrationTimestamp _timestamp;
130 std::string_view _title;
133class Migration:
public MigrationBase
136 Migration(MigrationTimestamp timestamp,
137 std::string_view title,
139 MigrationBase(timestamp, title),
155#define LIGHTWEIGHT_CONCATENATE(s1, s2) s1##s2
157#define LIGHTWEIGHT_MIGRATION_INSTANCE(timestamp) migration_##timestamp
165#define LIGHTWEIGHT_SQL_MIGRATION(timestamp, description) \
166 struct Migration_##timestamp: public SqlMigration::MigrationBase \
168 explicit Migration_##timestamp(): \
169 MigrationBase(SqlMigration::MigrationTimestamp { timestamp }, description) \
173 void Execute(SqlMigrationQueryBuilder& planer) const override; \
176 static Migration_##timestamp LIGHTWEIGHT_CONCATENATE(migration_, timestamp); \
178 void Migration_##timestamp::Execute(SqlMigrationQueryBuilder& plan) const
Main API for mapping records to and from the database using high level C++ syntax.
Represents a connection to a SQL database.
Query builder for building SQL migration queries.
Represents a SQL ALTER TABLE plan on a given table.