-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxorm.go
88 lines (74 loc) · 2.09 KB
/
xorm.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
package database
import (
`fmt`
`strings`
`time`
`github.com/elliotchance/sshtunnel`
`github.com/pangum/logging`
`github.com/pangum/pangu`
`golang.org/x/crypto/ssh`
`xorm.io/core`
`xorm.io/xorm`
)
// 创建Xorm操作引擎
func newEngine(config *pangu.Config, logger *logging.Logger) (engine *Engine, err error) {
_panguConfig := new(panguConfig)
if err = config.Load(_panguConfig); nil != err {
return
}
database := _panguConfig.Database
// 创建引擎
if engine, err = newXorm(database, logger); nil != err {
return
}
// 替换成统一的日志框架
engine.SetLogger(newXormLogger(logger))
// 调试模式下打开各种可调试的选项
if database.Show {
engine.ShowSQL()
}
// 配置数据库连接池
engine.SetMaxOpenConns(database.Connection.Open)
engine.SetMaxIdleConns(database.Connection.Idle)
engine.SetConnMaxLifetime(database.Connection.Lifetime)
// 测试数据库连接成功
if database.Ping {
if err = engine.Ping(); nil != err {
return
}
}
// 设置名称转换(列名及表名)
core.NewCacheMapper(core.GonicMapper{})
if `` != strings.TrimSpace(database.Prefix) {
core.NewPrefixMapper(core.GonicMapper{}, database.Prefix)
}
if `` != strings.TrimSpace(database.Suffix) {
core.NewSuffixMapper(core.GonicMapper{}, database.Suffix)
}
return
}
func newXorm(database config, logger *logging.Logger) (engine *Engine, err error) {
if nil != database.SSH && database.SSH.Enable() {
var auth ssh.AuthMethod
if `` != database.SSH.Password {
auth = ssh.Password(database.SSH.Password)
} else {
auth = sshtunnel.PrivateKeyFile(database.SSH.Keyfile)
}
host := fmt.Sprintf(`%s@%s`, database.SSH.Username, database.SSH.Addr)
tunnel := sshtunnel.NewSSHTunnel(host, auth, database.Addr, `65512`)
tunnel.Log = newSSHLogger(logger)
go func() {
err = tunnel.Start()
}()
time.Sleep(100 * time.Millisecond)
database.Addr = fmt.Sprintf(`127.0.0.1:%d`, tunnel.Local.Port)
}
var dsn string
if dsn, err = database.dsn(); nil != err {
return
}
engine = new(Engine)
engine.Engine, err = xorm.NewEngine(database.Type, dsn)
return
}