84 lines
2.0 KiB
PHP
84 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
// Runner de migrations SQL.
|
|
// Appelé sur le serveur après chaque rsync : php database/migrate.php
|
|
|
|
$baseDir = dirname(__DIR__);
|
|
$envFile = $baseDir . '/.env';
|
|
|
|
if (!file_exists($envFile)) {
|
|
fwrite(STDERR, "Fichier .env introuvable : $envFile\n");
|
|
exit(1);
|
|
}
|
|
|
|
$env = [];
|
|
foreach (file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
|
|
$line = trim($line);
|
|
if ($line === '' || str_starts_with($line, '#')) {
|
|
continue;
|
|
}
|
|
[$k, $v] = array_pad(explode('=', $line, 2), 2, '');
|
|
$env[trim($k)] = trim($v, '"\'');
|
|
}
|
|
|
|
$dsn = $env['DB_DSN'] ?? '';
|
|
$user = $env['DB_USER'] ?? '';
|
|
$pass = $env['DB_PASS'] ?? '';
|
|
|
|
if (!$dsn) {
|
|
fwrite(STDERR, "DB_DSN manquant dans .env\n");
|
|
exit(1);
|
|
}
|
|
|
|
$pdo = new PDO($dsn, $user, $pass, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
]);
|
|
|
|
// Crée la table de suivi si elle n'existe pas encore
|
|
$pdo->exec('
|
|
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
name TEXT NOT NULL PRIMARY KEY,
|
|
applied_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
)
|
|
');
|
|
|
|
// Migrations déjà appliquées
|
|
$applied = array_flip(
|
|
$pdo->query('SELECT name FROM schema_migrations ORDER BY name')
|
|
->fetchAll(PDO::FETCH_COLUMN)
|
|
);
|
|
|
|
// Fichiers de migration dans le même dossier, triés par nom
|
|
$files = glob(__DIR__ . '/migration_*.sql') ?: [];
|
|
sort($files);
|
|
|
|
$count = 0;
|
|
foreach ($files as $file) {
|
|
$name = basename($file);
|
|
if (isset($applied[$name])) {
|
|
continue;
|
|
}
|
|
|
|
$sql = file_get_contents($file);
|
|
if ($sql === false || trim($sql) === '') {
|
|
echo " ⚠ $name : fichier vide ou illisible, ignoré\n";
|
|
continue;
|
|
}
|
|
|
|
echo " → $name ... ";
|
|
$pdo->exec($sql);
|
|
$pdo->prepare('INSERT INTO schema_migrations (name) VALUES (?)')
|
|
->execute([$name]);
|
|
echo "✓\n";
|
|
$count++;
|
|
}
|
|
|
|
if ($count === 0) {
|
|
echo " (aucune migration en attente)\n";
|
|
} else {
|
|
echo " $count migration(s) appliquée(s).\n";
|
|
}
|