Add connection string builder
This commit is contained in:
81
connection_string.go
Normal file
81
connection_string.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os/user"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func formatConnectionUrl(opts Options) (string, error) {
|
||||
url := opts.Url
|
||||
|
||||
// Make sure to only accept urls in a standard format
|
||||
if !strings.Contains(url, "postgres://") {
|
||||
return "", errors.New("Invalid URL. Valid format: postgres://user:password@host:port/db?sslmode=mode")
|
||||
}
|
||||
|
||||
// Special handling for local connections
|
||||
if strings.Contains(url, "localhost") || strings.Contains(url, "127.0.0.1") {
|
||||
if !strings.Contains(url, "?sslmode") {
|
||||
if opts.Ssl == "" {
|
||||
url += fmt.Sprintf("?sslmode=%s", "disable")
|
||||
} else {
|
||||
url += fmt.Sprintf("?sslmode=%s", opts.Ssl)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Append sslmode parameter only if its defined as a flag and not present
|
||||
// in the connection string.
|
||||
if !strings.Contains(url, "?sslmode") && opts.Ssl != "" {
|
||||
url += fmt.Sprintf("?sslmode=%s", opts.Ssl)
|
||||
}
|
||||
|
||||
return url, nil
|
||||
}
|
||||
|
||||
func buildConnectionString(opts Options) (string, error) {
|
||||
if opts.Url != "" {
|
||||
return formatConnectionUrl(opts)
|
||||
}
|
||||
|
||||
// Try to detect user from current OS user
|
||||
// TODO: remove os/user dependency
|
||||
if opts.User == "" {
|
||||
user, err := user.Current()
|
||||
|
||||
if err == nil {
|
||||
opts.User = user.Username
|
||||
}
|
||||
}
|
||||
|
||||
// Disable ssl for localhost connections, most users have it disabled
|
||||
if opts.Host == "localhost" || opts.Host == "127.0.0.1" {
|
||||
if opts.Ssl == "" {
|
||||
opts.Ssl = "disable"
|
||||
}
|
||||
}
|
||||
|
||||
url := "postgres://"
|
||||
|
||||
if opts.User != "" {
|
||||
url += opts.User
|
||||
}
|
||||
|
||||
if opts.Pass != "" {
|
||||
url += fmt.Sprintf(":%s", opts.Pass)
|
||||
}
|
||||
|
||||
url += fmt.Sprintf("@%s:%d", opts.Host, opts.Port)
|
||||
|
||||
if opts.DbName != "" {
|
||||
url += fmt.Sprintf("/%s", opts.DbName)
|
||||
}
|
||||
|
||||
if opts.Ssl != "" {
|
||||
url += fmt.Sprintf("?sslmode=%s", opts.Ssl)
|
||||
}
|
||||
|
||||
return url, nil
|
||||
}
|
||||
Reference in New Issue
Block a user