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 virtual ~SqlMigrationExecutor() =
default;
42 virtual void OnCreateTable(SqlCreateTablePlan
const& createTable) = 0;
45 virtual void OnDropTable(std::string_view tableName) = 0;
52 using MigrationList = std::list<MigrationBase const*>;
54 LIGHTWEIGHT_API
static MigrationManager& GetInstance()
56 static MigrationManager instance;
60 LIGHTWEIGHT_API
void AddMigration(MigrationBase
const* migration);
62 [[nodiscard]] LIGHTWEIGHT_API MigrationList
const& GetAllMigrations() const noexcept;
64 [[nodiscard]] LIGHTWEIGHT_API MigrationBase const* GetMigration(MigrationTimestamp timestamp) const;
66 LIGHTWEIGHT_API
void RemoveAllMigrations();
68 [[nodiscard]] LIGHTWEIGHT_API std::list<MigrationBase const*> GetPending() const noexcept;
70 using ExecuteCallback = std::function<
void(MigrationBase const& ,
size_t ,
size_t )>;
72 LIGHTWEIGHT_API
void ApplySingleMigration(MigrationTimestamp timestamp);
73 LIGHTWEIGHT_API
void ApplySingleMigration(MigrationBase const& migration);
74 LIGHTWEIGHT_API
size_t ApplyPendingMigrations(ExecuteCallback const& feedbackCallback = {});
76 LIGHTWEIGHT_API
void CreateMigrationHistory();
77 [[nodiscard]] LIGHTWEIGHT_API std::vector<MigrationTimestamp> GetAppliedMigrationIds()
const;
79 [[nodiscard]] LIGHTWEIGHT_API
DataMapper& GetDataMapper();
81 [[nodiscard]] LIGHTWEIGHT_API
DataMapper& GetDataMapper()
const
83 return const_cast<MigrationManager*
>(
this)->GetDataMapper();
86 LIGHTWEIGHT_API
void CloseDataMapper();
91 MigrationList _migrations;
92 mutable std::optional<DataMapper> _mapper;
99 MigrationBase(MigrationTimestamp timestamp, std::string_view title):
100 _timestamp { timestamp },
103 MigrationManager::GetInstance().AddMigration(
this);
106 virtual ~MigrationBase() =
default;
110 [[nodiscard]] MigrationTimestamp GetTimestamp() const noexcept
115 [[nodiscard]] std::string_view GetTitle() const noexcept
121 MigrationTimestamp _timestamp;
122 std::string_view _title;
125class Migration:
public MigrationBase
128 Migration(MigrationTimestamp timestamp,
129 std::string_view title,
131 MigrationBase(timestamp, title),
147#define LIGHTWEIGHT_CONCATENATE(s1, s2) s1##s2
149#define LIGHTWEIGHT_MIGRATION_INSTANCE(timestamp) migration_##timestamp
157#define LIGHTWEIGHT_SQL_MIGRATION(timestamp, description) \
158 struct Migration_##timestamp: public SqlMigration::MigrationBase \
160 explicit Migration_##timestamp(): \
161 MigrationBase(SqlMigration::MigrationTimestamp { timestamp }, description) \
165 void Execute(SqlMigrationQueryBuilder& planer) const override; \
168 static Migration_##timestamp LIGHTWEIGHT_CONCATENATE(migration_, timestamp); \
170 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.