| 170 | } |
| 171 | |
| 172 | func getPGConnectionConfig(config db.ConnectionConfig) (*pgx.ConnConfig, error) { |
| 173 | if config.DataSource.Username == "" { |
| 174 | return nil, errors.Errorf("user must be set") |
| 175 | } |
| 176 | |
| 177 | if config.DataSource.Host == "" { |
| 178 | return nil, errors.Errorf("host must be set") |
| 179 | } |
| 180 | |
| 181 | if config.DataSource.Port == "" { |
| 182 | return nil, errors.Errorf("port must be set") |
| 183 | } |
| 184 | |
| 185 | if (config.DataSource.GetSslCert() == "" && config.DataSource.GetSslKey() != "") || |
| 186 | (config.DataSource.GetSslCert() != "" && config.DataSource.GetSslKey() == "") { |
| 187 | return nil, errors.Errorf("ssl-cert and ssl-key must be both set or unset") |
| 188 | } |
| 189 | |
| 190 | connStr := fmt.Sprintf("host=%s port=%s", config.DataSource.Host, config.DataSource.Port) |
| 191 | if config.DataSource.GetUseSsl() { |
| 192 | connStr += fmt.Sprintf(" sslmode=%s", util.GetPGSSLMode(config.DataSource)) |
| 193 | } |
| 194 | |
| 195 | // Add target_session_attrs=read-write if specified in ExtraConnectionParameters |
| 196 | for key, value := range config.DataSource.GetExtraConnectionParameters() { |
| 197 | connStr += fmt.Sprintf(" %s=%s", key, value) |
| 198 | } |
| 199 | |
| 200 | connConfig, err := pgx.ParseConfig(connStr) |
| 201 | if err != nil { |
| 202 | return nil, err |
| 203 | } |
| 204 | connConfig.User = config.DataSource.Username |
| 205 | connConfig.Password = config.Password |
| 206 | connConfig.Database = config.ConnectionContext.DatabaseName |
| 207 | |
| 208 | tlscfg, err := util.GetTLSConfig(config.DataSource) |
| 209 | if err != nil { |
| 210 | return nil, err |
| 211 | } |
| 212 | if tlscfg != nil { |
| 213 | connConfig.TLSConfig = tlscfg |
| 214 | util.ApplyPGTLSConfig(tlscfg, connConfig.Host, connConfig.Fallbacks) |
| 215 | } |
| 216 | |
| 217 | // Apply pgbouncer-safe defaults unless the user has explicitly configured |
| 218 | // them via ExtraConnectionParameters (preserves escape hatches such as |
| 219 | // default_query_exec_mode=simple_protocol for non-PostgreSQL-compatible proxies). |
| 220 | extraParams := config.DataSource.GetExtraConnectionParameters() |
| 221 | if _, ok := extraParams["default_query_exec_mode"]; !ok { |
| 222 | connConfig.DefaultQueryExecMode = pgx.QueryExecModeExec |
| 223 | } |
| 224 | if _, ok := extraParams["statement_cache_capacity"]; !ok { |
| 225 | connConfig.StatementCacheCapacity = 0 |
| 226 | } |
| 227 | return connConfig, nil |
| 228 | } |
| 229 | |