db/pgx/connector.go

49 lines
1.1 KiB
Go
Raw Permalink Normal View History

package pgx
import (
"context"
"crypto/tls"
"database/sql/driver"
"fmt"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/stdlib"
"apigo.cc/go/db"
"apigo.cc/go/safe"
)
type SecurePgxConnector struct {
conf *db.Config
pwd *safe.SafeBuf
tls *tls.Config
}
func (c *SecurePgxConnector) Connect(ctx context.Context) (driver.Conn, error) {
dsn := fmt.Sprintf("postgres://%s@%s/%s?%s", c.conf.User, c.conf.Host, c.conf.DB, c.conf.Args)
pgxConfig, err := pgx.ParseConfig(dsn)
if err != nil {
return nil, err
}
if c.tls != nil {
pgxConfig.TLSConfig = c.tls
}
pwdBuf := c.pwd.Open()
defer pwdBuf.Close()
pgxConfig.Password = pwdBuf.String()
tmpConnector := stdlib.GetConnector(*pgxConfig)
return tmpConnector.Connect(ctx)
}
func (c *SecurePgxConnector) Driver() driver.Driver {
return stdlib.GetDefaultDriver()
}
func PgxConnector(conf *db.Config, pwd *safe.SafeBuf, tls *tls.Config) driver.Connector {
return &SecurePgxConnector{conf: conf, pwd: pwd, tls: tls}
}
func init() {
db.RegisterConnector("postgres", PgxConnector)
db.RegisterConnector("pgx", PgxConnector)
}