|
| 1 | +Set-StrictMode -Version Latest |
| 2 | +$ErrorActionPreference = 'Stop' |
| 3 | + |
| 4 | +<# |
| 5 | +.SYNOPSIS |
| 6 | + 生成统一的 PostgreSQL 连接上下文。 |
| 7 | +
|
| 8 | +.DESCRIPTION |
| 9 | + 按“显式参数 > 连接串 > env-file > 当前进程环境变量”的优先级合并连接配置, |
| 10 | + 让后续命令构建逻辑只依赖一个规范化对象。 |
| 11 | +
|
| 12 | +.PARAMETER CliOptions |
| 13 | + 由 `ConvertFrom-LongOptionList` 返回的参数表。 |
| 14 | +
|
| 15 | +.OUTPUTS |
| 16 | + PSCustomObject |
| 17 | + 返回统一的连接上下文,至少包含 `Host`、`Port`、`User`、`Password`、`Database`。 |
| 18 | +#> |
| 19 | +function Resolve-PgContext { |
| 20 | + [CmdletBinding()] |
| 21 | + param( |
| 22 | + [Parameter(Mandatory)] |
| 23 | + [hashtable]$CliOptions |
| 24 | + ) |
| 25 | + |
| 26 | + $envFilePath = if ($CliOptions.ContainsKey('env_file')) { [string]$CliOptions['env_file'] } else { $null } |
| 27 | + $connectionString = if ($CliOptions.ContainsKey('connection_string')) { [string]$CliOptions['connection_string'] } else { $null } |
| 28 | + $envFileValues = Import-PgEnvFile -Path $envFilePath |
| 29 | + $connectionValues = ConvertFrom-PgConnectionString -ConnectionString $connectionString |
| 30 | + |
| 31 | + $connectionHost = if ($connectionValues.ContainsKey('Host')) { $connectionValues['Host'] } else { $null } |
| 32 | + $connectionPort = if ($connectionValues.ContainsKey('Port')) { $connectionValues['Port'] } else { $null } |
| 33 | + $connectionUser = if ($connectionValues.ContainsKey('User')) { $connectionValues['User'] } else { $null } |
| 34 | + $connectionPassword = if ($connectionValues.ContainsKey('Password')) { $connectionValues['Password'] } else { $null } |
| 35 | + $connectionDatabase = if ($connectionValues.ContainsKey('Database')) { $connectionValues['Database'] } else { $null } |
| 36 | + |
| 37 | + $envFileHost = if ($envFileValues.ContainsKey('PGHOST')) { $envFileValues['PGHOST'] } else { $null } |
| 38 | + $envFilePort = if ($envFileValues.ContainsKey('PGPORT')) { $envFileValues['PGPORT'] } else { $null } |
| 39 | + $envFileUser = if ($envFileValues.ContainsKey('PGUSER')) { $envFileValues['PGUSER'] } else { $null } |
| 40 | + $envFilePassword = if ($envFileValues.ContainsKey('PGPASSWORD')) { $envFileValues['PGPASSWORD'] } else { $null } |
| 41 | + $envFileDatabase = if ($envFileValues.ContainsKey('PGDATABASE')) { $envFileValues['PGDATABASE'] } else { $null } |
| 42 | + |
| 43 | + $resolvedHost = if ($CliOptions.ContainsKey('host')) { [string]$CliOptions['host'] } elseif ($connectionHost) { $connectionHost } elseif ($envFileHost) { $envFileHost } else { $env:PGHOST } |
| 44 | + $resolvedPort = if ($CliOptions.ContainsKey('port')) { [int]$CliOptions['port'] } elseif ($connectionPort) { [int]$connectionPort } elseif ($envFilePort) { [int]$envFilePort } elseif ($env:PGPORT) { [int]$env:PGPORT } else { 5432 } |
| 45 | + $resolvedUser = if ($CliOptions.ContainsKey('user')) { [string]$CliOptions['user'] } elseif ($connectionUser) { $connectionUser } elseif ($envFileUser) { $envFileUser } else { $env:PGUSER } |
| 46 | + $resolvedPassword = if ($CliOptions.ContainsKey('password')) { [string]$CliOptions['password'] } elseif ($connectionPassword) { $connectionPassword } elseif ($envFilePassword) { $envFilePassword } else { $env:PGPASSWORD } |
| 47 | + $resolvedDatabase = if ($CliOptions.ContainsKey('database')) { [string]$CliOptions['database'] } elseif ($connectionDatabase) { $connectionDatabase } elseif ($envFileDatabase) { $envFileDatabase } else { $env:PGDATABASE } |
| 48 | + |
| 49 | + return [PSCustomObject]@{ |
| 50 | + Host = $resolvedHost |
| 51 | + Port = $resolvedPort |
| 52 | + User = $resolvedUser |
| 53 | + Password = $resolvedPassword |
| 54 | + Database = $resolvedDatabase |
| 55 | + EnvFile = $envFilePath |
| 56 | + } |
| 57 | +} |
0 commit comments