34 lines
1.9 KiB
PowerShell
34 lines
1.9 KiB
PowerShell
$ErrorActionPreference = 'Stop'
|
|
$env:MYSQL_PWD = if ($env:IM_DB_PASSWORD) { $env:IM_DB_PASSWORD } else { 'root' }
|
|
$mysql = if ($env:IM_MYSQL_BIN) { $env:IM_MYSQL_BIN } else { 'mysql' }
|
|
$hostName = if ($env:IM_DB_HOST) { $env:IM_DB_HOST } else { '127.0.0.1' }
|
|
$userName = if ($env:IM_DB_USER) { $env:IM_DB_USER } else { 'root' }
|
|
$database = if ($env:IM_DB_NAME) { $env:IM_DB_NAME } else { 'im' }
|
|
|
|
$baseArgs = @('-h', $hostName, '-u', $userName, '--default-character-set=utf8mb4', '--batch', '--skip-column-names', $database)
|
|
& $mysql @baseArgs --execute "CREATE TABLE IF NOT EXISTS schema_migrations (version VARCHAR(255) NOT NULL PRIMARY KEY, checksum CHAR(64) NOT NULL, applied_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
|
|
if ($LASTEXITCODE -ne 0) { throw 'Could not initialize schema_migrations.' }
|
|
|
|
Get-ChildItem -LiteralPath "$PSScriptRoot\..\backend\migrations" -Filter '*.sql' |
|
|
Sort-Object Name |
|
|
ForEach-Object {
|
|
$version = $_.Name.Replace("'", "''")
|
|
$checksum = (Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256).Hash.ToLowerInvariant()
|
|
$existing = (& $mysql @baseArgs --execute "SELECT checksum FROM schema_migrations WHERE version='$version'") -join ''
|
|
if ($LASTEXITCODE -ne 0) { throw "Could not inspect migration: $($_.Name)" }
|
|
$existing = $existing.Trim()
|
|
if ($existing) {
|
|
if ($existing -ne $checksum) { throw "Migration checksum mismatch: $($_.Name)" }
|
|
Write-Host "Already applied $($_.Name)."
|
|
return
|
|
}
|
|
Write-Host "Applying $($_.Name)..."
|
|
$migrationPath = $_.FullName.Replace('\', '/')
|
|
& $mysql @baseArgs --execute "source $migrationPath"
|
|
if ($LASTEXITCODE -ne 0) { throw "Migration failed: $($_.Name)" }
|
|
& $mysql @baseArgs --execute "INSERT INTO schema_migrations(version,checksum) VALUES('$version','$checksum')"
|
|
if ($LASTEXITCODE -ne 0) { throw "Could not record migration: $($_.Name)" }
|
|
}
|
|
|
|
Write-Host 'Database migrations completed.'
|