65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
package dbx
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// DBConfig provides a template for database connection configuration compatible
|
|
// with go-toolkit/config. If used as a field in a struct, remember to include
|
|
// the `validate:"dive"` tag to ensure that the validator checks sub-fields.
|
|
type DBConfig struct {
|
|
User string `validate:"required"`
|
|
Password string `validate:"required"`
|
|
URI string `validate:"hostname_port,required"`
|
|
Name string `validate:"required"`
|
|
MaxConn int `validate:"min=1,max=1000"`
|
|
AutoMigrate bool
|
|
DebugLog bool
|
|
}
|
|
|
|
// ConnectionString returns a connection string compatible with the given
|
|
// SQL dialect.
|
|
func (cfg *DBConfig) ConnectionString(dialect Dialect) string {
|
|
switch dialect {
|
|
case DialectPostgres:
|
|
return fmt.Sprintf("postgres://%s:%s@%s/%s?sslmode=disable",
|
|
cfg.User, cfg.Password, cfg.URI, cfg.Name)
|
|
case DialectMySQL:
|
|
return fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true&loc=Local",
|
|
cfg.User, cfg.Password, cfg.URI, cfg.Name)
|
|
default:
|
|
panic("unsupported dialect: " + string(dialect))
|
|
}
|
|
}
|
|
|
|
// Host returns the host portion of the database URI.
|
|
func (cfg *DBConfig) Host() (string, error) {
|
|
host, _, err := cfg.split()
|
|
return host, err
|
|
}
|
|
|
|
// Port returns the port portion of the database URI.
|
|
func (cfg *DBConfig) Port() (int, error) {
|
|
_, port, err := cfg.split()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
portInt, err := strconv.Atoi(port)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("invalid port: %w", err)
|
|
}
|
|
return portInt, nil
|
|
}
|
|
|
|
// splits the URI into host and port.
|
|
func (cfg *DBConfig) split() (string, string, error) {
|
|
split := strings.Split(cfg.URI, ":")
|
|
if len(split) != 2 {
|
|
return "", "", fmt.Errorf("invalid URI format")
|
|
}
|
|
return split[0], split[1], nil
|
|
}
|