From 8dfb6b9406ecf74e0a16b76ae884dd43269abc2b Mon Sep 17 00:00:00 2001 From: gabdevele Date: Tue, 2 Jun 2026 19:38:27 +0200 Subject: [PATCH] Track SQL migrations --- repositories/MigrationRunner.cc | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/repositories/MigrationRunner.cc b/repositories/MigrationRunner.cc index fa52e7a..44f0cd0 100644 --- a/repositories/MigrationRunner.cc +++ b/repositories/MigrationRunner.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,13 @@ std::vector splitStatements(const std::string &sql) } return statements; } + +bool hasMigration(const drogon::orm::DbClientPtr &db, const std::string &name) +{ + const auto result = db->execSqlSync( + "SELECT name FROM schema_migrations WHERE name = ? LIMIT 1", name); + return !result.empty(); +} } // namespace void MigrationRunner::run(const std::string &directory) @@ -86,8 +94,20 @@ void MigrationRunner::run(const std::string &directory) std::sort(files.begin(), files.end()); auto db = drogon::app().getDbClient(); + db->execSqlSync( + "CREATE TABLE IF NOT EXISTS schema_migrations (" + "name VARCHAR(255) NOT NULL PRIMARY KEY, " + "applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP" + ")"); + for (const auto &file : files) { + const auto name = file.filename().string(); + if (hasMigration(db, name)) + { + continue; + } + std::ifstream input(file); std::stringstream buffer; buffer << input.rdbuf(); @@ -96,8 +116,8 @@ void MigrationRunner::run(const std::string &directory) { db->execSqlSync(statement); } - LOG_INFO << "Applied migration " << file.string(); + db->execSqlSync("INSERT INTO schema_migrations (name) VALUES (?)", name); + LOG_INFO << "Applied migration " << name; } } } // namespace visione::repositories -