param([Parameter(Mandatory=$true)][string]$BackupFile,[Parameter(Mandatory=$true)][string]$TargetDatabase) $ErrorActionPreference='Stop' if(-not $env:DATABASE_URL){throw 'DATABASE_URL is required'} if($TargetDatabase -notmatch '^[A-Za-z0-9_]+$'){throw 'TargetDatabase contains invalid characters'} $file=(Resolve-Path -LiteralPath $BackupFile).Path $checksum="$file.sha256" if(-not(Test-Path -LiteralPath $checksum)){throw 'checksum file is required'} $expected=(Get-Content -LiteralPath $checksum).Split(' ')[0] if((Get-FileHash -Algorithm SHA256 -LiteralPath $file).Hash.ToLowerInvariant() -ne $expected){throw 'backup checksum mismatch'} $uri=[Uri]$env:DATABASE_URL;$credential=$uri.UserInfo.Split(':',2);$env:MYSQL_PWD=[Uri]::UnescapeDataString($credential[1]);$user=[Uri]::UnescapeDataString($credential[0]) & mysql --host $uri.Host --port $uri.Port --user $user --execute "CREATE DATABASE IF NOT EXISTS ``$TargetDatabase`` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" if($LASTEXITCODE -ne 0){throw 'target database creation failed'} Get-Content -LiteralPath $file -Raw | & mysql --host $uri.Host --port $uri.Port --user $user $TargetDatabase if($LASTEXITCODE -ne 0){throw 'restore failed'} Write-Output "Restore completed into $TargetDatabase"