forked from gobuffalo/pop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
connection_details.go
95 lines (86 loc) · 2.51 KB
/
connection_details.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package pop
import (
"fmt"
"net/url"
"strconv"
"strings"
"time"
"github.com/markbates/going/defaults"
"github.com/pkg/errors"
)
type ConnectionDetails struct {
// Example: "postgres" or "sqlite3" or "mysql"
Dialect string
// The name of your database. Example: "foo_development"
Database string
// The host of your database. Example: "127.0.0.1"
Host string
// The port of your database. Example: 1234
// Will default to the "default" port for each dialect.
Port string
// The username of the database user. Example: "root"
User string
// The password of the database user. Example: "password"
Password string
// Instead of specifying each individual piece of the
// connection you can instead just specify the URL of the
// database. Example: "postgres://postgres:postgres@localhost:5432/pop_test?sslmode=disable"
URL string
// Defaults to 0 "unlimited". See https://golang.org/pkg/database/sql/#DB.SetMaxOpenConns
Pool int
Options map[string]string
}
// Finalize cleans up the connection details by normalizing names,
// filling in default values, etc...
func (cd *ConnectionDetails) Finalize() error {
if cd.URL != "" {
u, err := url.Parse(cd.URL)
if err != nil {
return errors.Wrapf(err, "couldn't parse %s", cd.URL)
}
cd.Dialect = u.Scheme
cd.Database = u.Path
hp := strings.Split(u.Host, ":")
cd.Host = hp[0]
if len(hp) > 1 {
cd.Port = hp[1]
}
if u.User != nil {
cd.User = u.User.Username()
cd.Password, _ = u.User.Password()
}
}
switch strings.ToLower(cd.Dialect) {
case "postgres", "postgresql", "pg":
cd.Dialect = "postgres"
cd.Port = defaults.String(cd.Port, "5432")
cd.Database = strings.TrimPrefix(cd.Database, "/")
case "mysql":
cd.Port = defaults.String(cd.Port, "3006")
cd.Database = strings.TrimPrefix(cd.Database, "/")
case "sqlite", "sqlite3":
cd.Dialect = "sqlite3"
default:
return errors.Errorf("Unknown dialect %s!", cd.Dialect)
}
return nil
}
// Parse is deprecated! Please use `ConnectionDetails.Finalize()` instead!
func (cd *ConnectionDetails) Parse(port string) error {
fmt.Println("[POP] ConnectionDetails#Parse(port string) has been deprecated!")
return cd.Finalize()
}
func (cd *ConnectionDetails) RetrySleep() time.Duration {
d, err := time.ParseDuration(defaults.String(cd.Options["retry_sleep"], "1ms"))
if err != nil {
return 1 * time.Millisecond
}
return d
}
func (cd *ConnectionDetails) RetryLimit() int {
i, err := strconv.Atoi(defaults.String(cd.Options["retry_limit"], "1000"))
if err != nil {
return 100
}
return i
}