84 lines
1.6 KiB
Go
Raw Normal View History

package sqlstore
2018-05-08 12:31:51 +02:00
import (
"regexp"
2018-07-30 09:33:49 +02:00
"strings"
2018-10-03 15:27:36 +02:00
mysql "github.com/go-sql-driver/mysql"
)
2018-05-08 12:31:51 +02:00
type Config struct {
Driver string `default:"sqlite3"`
URL string `default:""`
Host string `default:""`
User string `default:""`
Password string `default:""`
Name string `default:"fathom.db"`
SSLMode string `default:""`
2018-05-08 12:31:51 +02:00
}
func (c *Config) DSN() string {
var dsn string
// if FATHOM_DATABASE_URL was set, use that
// this relies on the user to set the appropriate parameters, eg ?parseTime=true when using MySQL
if c.URL != "" {
return c.URL
}
// otherwise, generate from individual fields
2018-05-08 12:31:51 +02:00
switch c.Driver {
2018-10-03 15:27:36 +02:00
case POSTGRES:
if c.Host != "" {
dsn += " host=" + c.Host
}
if c.Name != "" {
dsn += " dbname=" + c.Name
}
if c.User != "" {
dsn += " user=" + c.User
}
if c.Password != "" {
dsn += " password=" + c.Password
}
if c.SSLMode != "" {
dsn += " sslmode=" + c.SSLMode
2018-07-29 13:32:04 -03:00
}
dsn = strings.TrimSpace(dsn)
2018-10-03 15:27:36 +02:00
case MYSQL:
mc := mysql.NewConfig()
mc.User = c.User
mc.Passwd = c.Password
mc.Addr = c.Host
mc.Net = "tcp"
mc.DBName = c.Name
mc.Params = map[string]string{
"parseTime": "true",
}
if c.SSLMode != "" {
mc.Params["tls"] = c.SSLMode
}
dsn = mc.FormatDSN()
2018-10-03 15:27:36 +02:00
case SQLITE:
2018-12-24 09:09:22 +01:00
dsn = c.Name + "?_busy_timeout=10000"
2018-05-08 12:31:51 +02:00
}
return dsn
}
// Dbname returns the database name, either from config values or from the connection URL
func (c *Config) Dbname() string {
if c.Name != "" {
return c.Name
}
re := regexp.MustCompile(`(?:dbname=|[^\/]?\/)(\w+)`)
m := re.FindStringSubmatch(c.URL)
if len(m) > 1 {
return m[1]
}
return ""
}