Commit 41bb1b4d authored by Doug Barrett's avatar Doug Barrett
Browse files

fix(v2/postgres): use pgxpool.ParseConfig to create pool config

pgxpool.NewWithConfig panics when given a Config not created by
ParseConfig (it checks an internal createdByParseConfig flag).
Store the DSN and re-parse it in Start() via pgxpool.ParseConfig,
then overlay the connection-level settings (query exec mode, tracer)
from the eagerly-parsed ConnConfig.
parent 3f701cc7
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ type Config struct {
// batch queries, and LISTEN/NOTIFY.
type Client struct {
	name            string
	dsn             string
	connCfg         *pgx.ConnConfig
	db              *sql.DB
	pool            *pgxpool.Pool
@@ -133,6 +134,7 @@ func NewWithConfig(cfg *Config) (*Client, error) {

	return &Client{
		name:            name,
		dsn:             cfg.DSN,
		connCfg:         connCfg,
		maxConns:        cfg.MaxConns,
		minConns:        cfg.MinConns,
@@ -177,9 +179,17 @@ func (c *Client) QueryTracer() pgx.QueryTracer {
// Start creates the connection pool and verifies connectivity with a ping.
// It satisfies [app.Component] and should be called via [app.App.Start].
func (c *Client) Start(ctx context.Context) error {
	poolCfg := &pgxpool.Config{
		ConnConfig: c.connCfg,
	// pgxpool requires configs created via ParseConfig (it sets an internal
	// flag). We re-parse the DSN here and overlay connection-level settings
	// that were configured in NewWithConfig.
	poolCfg, err := pgxpool.ParseConfig(c.dsn)
	if err != nil {
		return fmt.Errorf("%s: parsing pool config: %w", c.name, err)
	}
	// Apply connection-level settings from the eagerly-parsed ConnConfig
	// (query exec mode, tracer, etc.).
	poolCfg.ConnConfig = c.connCfg

	if c.maxConns > 0 {
		poolCfg.MaxConns = int32(c.maxConns) //nolint:gosec
	}