@@ -18,6 +18,7 @@ import (
1818 "github.com/lib/pq"
1919 "github.com/pkg/errors"
2020 "go.uber.org/zap"
21+ "go.uber.org/zap/zapcore"
2122 "golang.org/x/sync/errgroup"
2223 "golang.org/x/sync/semaphore"
2324 "net"
@@ -108,13 +109,15 @@ func NewDbFromConfig(c *Config, logger *logging.Logger, connectorCallbacks Retry
108109 if utils .IsUnixAddr (c .Host ) {
109110 config .Net = "unix"
110111 config .Addr = c .Host
112+ addr = "(" + config .Addr + ")"
111113 } else {
112114 config .Net = "tcp"
113115 port := c .Port
114116 if port == 0 {
115117 port = 3306
116118 }
117119 config .Addr = net .JoinHostPort (c .Host , fmt .Sprint (port ))
120+ addr = config .Addr
118121 }
119122
120123 config .DBName = c .Database
@@ -150,7 +153,6 @@ func NewDbFromConfig(c *Config, logger *logging.Logger, connectorCallbacks Retry
150153 return unsafeSetSessionVariableIfExists (ctx , conn , "wsrep_sync_wait" , fmt .Sprint (c .Options .WsrepSyncWait ))
151154 }
152155
153- addr = config .Addr
154156 db = sqlx .NewDb (sql .OpenDB (NewConnector (connector , logger , connectorCallbacks )), MySQL )
155157 case "pgsql" :
156158 uri := & url.URL {
@@ -208,12 +210,23 @@ func NewDbFromConfig(c *Config, logger *logging.Logger, connectorCallbacks Retry
208210 return nil , errors .Wrap (err , "can't open pgsql database" )
209211 }
210212
211- addr = utils .JoinHostPort (c .Host , port )
213+ if utils .IsUnixAddr (c .Host ) {
214+ // https://www.postgresql.org/docs/17/runtime-config-connection.html#GUC-UNIX-SOCKET-DIRECTORIES
215+ addr = fmt .Sprintf ("(%s/.s.PGSQL.%d)" , strings .TrimRight (c .Host , "/" ), port )
216+ } else {
217+ addr = utils .JoinHostPort (c .Host , port )
218+ }
212219 db = sqlx .NewDb (sql .OpenDB (NewConnector (connector , logger , connectorCallbacks )), PostgreSQL )
213220 default :
214221 return nil , unknownDbType (c .Type )
215222 }
216223
224+ if c .TlsOptions .Enable {
225+ addr = fmt .Sprintf ("%s+tls://%s@%s/%s" , c .Type , c .User , addr , c .Database )
226+ } else {
227+ addr = fmt .Sprintf ("%s://%s@%s/%s" , c .Type , c .User , addr , c .Database )
228+ }
229+
217230 db .SetMaxIdleConns (c .Options .MaxConnections / 3 )
218231 db .SetMaxOpenConns (c .Options .MaxConnections )
219232
@@ -229,11 +242,22 @@ func NewDbFromConfig(c *Config, logger *logging.Logger, connectorCallbacks Retry
229242 }, nil
230243}
231244
232- // GetAddr returns the database host:port or Unix socket address.
245+ // GetAddr returns a URI-like database connection string.
246+ //
247+ // It has the following syntax:
248+ //
249+ // type[+tls]://user@host[:port]/database
233250func (db * DB ) GetAddr () string {
234251 return db .addr
235252}
236253
254+ // MarshalLogObject implements [zapcore.ObjectMarshaler], adding the database address [DB.GetAddr] to each log message.
255+ func (db * DB ) MarshalLogObject (encoder zapcore.ObjectEncoder ) error {
256+ encoder .AddString ("database_address" , db .GetAddr ())
257+
258+ return nil
259+ }
260+
237261// BuildColumns returns all columns of the given struct.
238262func (db * DB ) BuildColumns (subject interface {}) []string {
239263 return slices .Clone (db .columnMap .Columns (subject ))
0 commit comments