package postgres import ( "fmt" "strings" ) const ( defaultUser string = "postgres" defaultDatabase string = "postgres" ) type SSLMode string const ( Prefer SSLMode = "prefer" Disable SSLMode = "disable" Require SSLMode = "require" VerifyCA SSLMode = "verify-ca" VerifyFull SSLMode = "verify-full" ) func (m SSLMode) String() string { switch m { case Prefer: return "prefer" case Disable: return "disable" case Require: return "require" case VerifyCA: return "verify-ca" case VerifyFull: return "verify-full" } return "" } // TODO(help_wanted) - should probably expose max conns at least // DSNOptions ... // list of all connection string parameters https://pkg.go.dev/github.com/lib/pq#hdr-Connection_String_Parameters type DSNOptions struct { Host string Port int DBName string User string Password string SSLMode SSLMode // underlying pgx lib defaults to "prefer" } func (dsn *DSNOptions) ToString() string { var parts []string if dsn.Host != "" { parts = append(parts, fmt.Sprintf("host=%s", dsn.Host)) } if dsn.Port != 0 { parts = append(parts, fmt.Sprintf("port=%d", dsn.Port)) } if dsn.DBName != "" { // dbname && database both work - https://github.com/jackc/pgconn/blob/15f8e6323e113feb44678e5cb16cfbeba4630bf6/config.go#L495-L497 parts = append(parts, fmt.Sprintf("database=%s", dsn.DBName)) } else { // default to postgres default value parts = append(parts, fmt.Sprintf("database=%s", defaultDatabase)) } if dsn.User != "" { parts = append(parts, fmt.Sprintf("user=%s", dsn.User)) } else { // default to postgres default and not pgx value of user.Current(), "os/user" pgconn/defaults.go parts = append(parts, fmt.Sprintf("user=%s", defaultUser)) } if dsn.Password != "" { parts = append(parts, fmt.Sprintf("password=%s", dsn.Password)) } if dsn.SSLMode != "" { parts = append(parts, fmt.Sprintf("sslmode=%s", dsn.SSLMode.String())) } return strings.Join(parts[:], " ") }