2018-05-15 13:30:37 +02:00
|
|
|
package sqlstore
|
2018-05-08 12:31:51 +02:00
|
|
|
|
2018-06-13 10:04:42 +02:00
|
|
|
import (
|
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-06-13 10:04:42 +02:00
|
|
|
)
|
2018-05-08 12:31:51 +02:00
|
|
|
|
|
|
|
type Config struct {
|
2018-05-08 16:21:22 +02:00
|
|
|
Driver string `default:"sqlite3"`
|
2018-11-02 11:50:43 +01:00
|
|
|
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
|
|
|
|
|
2018-07-31 15:29:15 +02:00
|
|
|
// if FATHOM_DATABASE_URL was set, use that
|
|
|
|
// this relies on the user to set the appropriate parameters, eg ?parseTime=true when using MySQL
|
2018-11-02 11:50:43 +01:00
|
|
|
if c.url != "" {
|
|
|
|
return c.url
|
2018-07-31 15:29:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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:
|
2018-07-31 15:29:15 +02:00
|
|
|
|
2018-11-02 11:50:43 +01:00
|
|
|
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
|
|
|
}
|
2018-07-31 15:29:15 +02:00
|
|
|
|
|
|
|
dsn = strings.TrimSpace(dsn)
|
2018-10-03 15:27:36 +02:00
|
|
|
case MYSQL:
|
2018-06-13 10:04:42 +02:00
|
|
|
mc := mysql.NewConfig()
|
2018-11-02 11:50:43 +01:00
|
|
|
mc.User = c.user
|
|
|
|
mc.Passwd = c.password
|
|
|
|
mc.Addr = c.host
|
2018-06-13 10:04:42 +02:00
|
|
|
mc.Net = "tcp"
|
2018-11-02 11:50:43 +01:00
|
|
|
mc.DBName = c.name
|
2018-06-13 10:04:42 +02:00
|
|
|
mc.Params = map[string]string{
|
|
|
|
"parseTime": "true",
|
|
|
|
"loc": "Local",
|
|
|
|
}
|
2018-11-02 11:50:43 +01:00
|
|
|
if c.sslmode != "" {
|
|
|
|
mc.Params["tls"] = c.sslmode
|
2018-07-12 13:37:52 +02:00
|
|
|
}
|
2018-06-13 10:04:42 +02:00
|
|
|
dsn = mc.FormatDSN()
|
2018-10-03 15:27:36 +02:00
|
|
|
case SQLITE:
|
2018-11-02 11:50:43 +01:00
|
|
|
dsn = c.name + "?_loc=auto&_busy_timeout=5000"
|
2018-05-08 12:31:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return dsn
|
|
|
|
}
|