-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprepare.go
106 lines (86 loc) · 2.13 KB
/
prepare.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
96
97
98
99
100
101
102
103
104
105
106
package db
import (
"net/url"
"github.com/pkg/errors"
"github.com/spf13/viper"
"go.uber.org/zap"
"upper.io/db.v3/mongo"
"upper.io/db.v3/mssql"
"upper.io/db.v3/mysql"
"upper.io/db.v3/postgresql"
)
const (
databaseKey = "database"
mongoScheme = "mongodb"
mysqlScheme = "mysql://"
postgreScheme = "postgres"
)
var replacements = map[string]string{
"parsetime": "parseTime",
}
// PrepareConfig prepare options for connection
func PrepareConfig(key string, v *viper.Viper, log *zap.Logger) ([]ConnectionOption, error) {
if key == "" || !v.IsSet(key+".adapter") {
return nil, errors.Wrapf(ErrConfigNotFound, key)
}
var (
adapter = v.GetString(key + ".adapter")
opts = make([]ConnectionOption, 0, 4)
vals = make(url.Values)
conf = &url.URL{
Scheme: adapter,
Host: v.GetString(key + ".hostname"),
Path: v.GetString(key + ".database"),
}
)
if adapter == "" {
return nil, ErrEmptyAdapter
}
conf.Host = v.GetString(key + ".hostname")
switch adapter {
case postgreScheme, postgresql.Adapter:
adapter = postgresql.Adapter
conf.Scheme = postgreScheme
case mysql.Adapter:
adapter = mysql.Adapter
conf.Scheme = mysql.Adapter
conf.Host = "tcp(" + conf.Host + ")"
case mssql.Adapter:
adapter = mssql.Adapter
conf.Scheme = mssql.Adapter
case mongoScheme, mongo.Adapter:
adapter = mongo.Adapter
conf.Scheme = mongoScheme
default:
return nil, ErrUnknownAdapter
}
conf.User = url.UserPassword(
v.GetString(key+".username"),
v.GetString(key+".password"))
if options := v.GetStringMap(key + ".options"); len(options) > 0 {
for opt := range options {
if rep, ok := replacements[opt]; ok {
opt = rep
}
vals[opt] = v.GetStringSlice(key + ".options." + opt)
}
conf.RawQuery = vals.Encode()
}
opts = append(opts,
Adapter(adapter),
Config(urlWrapper{
url: conf,
adapter: adapter,
}))
if v.GetBool(key + ".debug") {
opts = append(opts, Debug())
}
if log != nil {
opts = append(opts, Logger(log))
log.Debug("connection options",
zap.String("key", key),
zap.String("adapter", "mysql"),
zap.Any("options", conf.String()))
}
return opts, nil
}