From 8118f97b8fa00e7dd6c8167af8388cc67439f10d Mon Sep 17 00:00:00 2001 From: gilles Date: Mon, 14 Sep 2026 16:12:39 +0200 Subject: [PATCH] feat: runner de migrations --- database/migrate.php | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 database/migrate.php diff --git a/database/migrate.php b/database/migrate.php new file mode 100644 index 0000000..01199c8 --- /dev/null +++ b/database/migrate.php @@ -0,0 +1,60 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + +$pdo->exec( + "CREATE TABLE IF NOT EXISTS migrations ( + version TEXT PRIMARY KEY, + applied_at TEXT NOT NULL DEFAULT (datetime('now')) + )" +); + +$applied = array_column($pdo->query('SELECT version FROM migrations')->fetchAll(), 'version'); + +$files = glob($root . '/database/migrations/*.sql'); + +if ($files === false || $files === []) { + echo "Aucune migration trouvee.\n"; + exit(0); +} + +sort($files); + +$count = 0; + +foreach ($files as $file) { + $version = basename($file); + + if (in_array($version, $applied, true)) { + echo "Skipped {$version}\n"; + continue; + } + + $pdo->beginTransaction(); + + try { + $pdo->exec((string) file_get_contents($file)); + + $stmt = $pdo->prepare('INSERT INTO migrations (version) VALUES (:version)'); + $stmt->execute(['version' => $version]); + + $pdo->commit(); + } catch (Throwable $e) { + $pdo->rollBack(); + throw $e; + } + + echo "Applied {$version}\n"; + $applied[] = $version; + $count++; +} + +if ($count === 0) { + echo "Nothing to migrate.\n"; +} \ No newline at end of file