48 lines
1.3 KiB
C++
48 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include <expected>
|
|
#include <functional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <boost/asio/awaitable.hpp>
|
|
|
|
#include <modulus.hpp>
|
|
|
|
#include <noto/connection.hpp>
|
|
#include <noto/schema.hpp>
|
|
|
|
namespace noto {
|
|
|
|
struct migration {
|
|
std::string id{};
|
|
std::string description{};
|
|
std::string checksum{};
|
|
std::function<boost::asio::awaitable<std::expected<void, modulus::error>>(noto::connection&)> up{};
|
|
std::function<boost::asio::awaitable<std::expected<void, modulus::error>>(noto::connection&)> down{};
|
|
};
|
|
|
|
struct migration_record {
|
|
std::string id{};
|
|
std::string description{};
|
|
std::string checksum{};
|
|
std::string applied_at{};
|
|
};
|
|
|
|
struct migration_options {
|
|
noto::table_name table{{}, "_noto_schema_migrations"};
|
|
};
|
|
|
|
class migrator {
|
|
public:
|
|
migrator(noto::connection& connection, noto::migration_options options = {});
|
|
auto async_applied_migrations() -> boost::asio::awaitable<std::expected<std::vector<noto::migration_record>, modulus::error>>;
|
|
auto async_migrate(std::vector<noto::migration> migrations) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
auto async_rollback(std::vector<noto::migration> migrations, std::string target_id = {}) -> boost::asio::awaitable<std::expected<void, modulus::error>>;
|
|
private:
|
|
noto::connection* connection_{};
|
|
noto::migration_options options_{};
|
|
};
|
|
|
|
}
|