-
Notifications
You must be signed in to change notification settings - Fork 0
/
dsn.go
70 lines (66 loc) · 1.95 KB
/
dsn.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
// Package sql
package sql
import (
"fmt"
"strings"
)
// Создание DSN для подключения к базе данных.
func (mys *impl) makeDsn() (err error) {
const keyTcp, keySocket = `tcp`, `socket`
var (
n int
found bool
)
// Проверка конфигурации.
if mys.cfg == nil {
err = mys.Errors().ConfigurationIsEmpty(0)
return
}
// Проверка драйвера базы данных.
for n = range supportDrivers {
if strings.EqualFold(mys.cfg.Driver, supportDrivers[n]) {
mys.cfg.Driver, found = supportDrivers[n], true
break
}
}
if !found {
err = mys.Errors().UnknownDatabaseDriver(0, mys.cfg.Driver)
return
}
// Самая простая конфигурация: sqlite
if mys.cfg.Driver == driverSqlite {
mys.dsn = fmt.Sprintf("%s?%s", mys.cfg.Name, dsnTimeSettings)
return
}
// Имя пользователя.
if mys.cfg.Login == "" {
err = mys.Errors().UsernameIsEmpty(0)
return
}
// Имя пользователя и пароль можно добавлять в DSN.
mys.dsn = fmt.Sprintf("%s:%s", mys.cfg.Login, mys.cfg.Password)
// Тип подключения.
switch strings.ToLower(mys.cfg.Type) {
case keyTcp:
mys.dsn += fmt.Sprintf("@%s(%s:%d)", keyTcp, mys.cfg.Host, mys.cfg.Port)
case keySocket:
mys.dsn += fmt.Sprintf(dsnUnixTpl, mys.cfg.Socket)
default:
err = mys.Errors().WrongConnectionType(0, mys.cfg.Type)
return
}
mys.cfg.Type = strings.ToLower(mys.cfg.Type)
// Название базы данных.
mys.dsn += fmt.Sprintf("/%s", mys.cfg.Name)
// Парсинг времени.
mys.dsn += fmt.Sprintf(dsnTimeSettings, mys.cfg.ParseTime)
// Зона времени.
if mys.cfg.TimezoneLocation != "" {
mys.dsn += fmt.Sprintf(dsnLocationSettings, mys.cfg.TimezoneLocation)
}
// Кодировка соединения с базой данных.
if mys.cfg.Charset != "" {
mys.dsn += fmt.Sprintf(dsnCharsetTpl, mys.cfg.Charset)
}
return
}