$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.'