/
db.go
117 lines (104 loc) · 2.45 KB
/
db.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
107
108
109
110
111
112
113
114
115
116
117
package db
import (
"fmt"
"sync"
"xorm.io/xorm"
)
var (
//handlerMap is a list of handler to generate db url
handlerMap sync.Map
)
//handler handle some specific code to db
type handler struct {
GenerateURL func(host, user, pass, database string) (string, string, error)
}
//initConn start the database connection and settings
func initConn(t, s string) (*xorm.Engine, error) {
engine, err := xorm.NewEngine(t, s)
if err != nil {
return nil, err
}
//engine.SetLogger(generateSQLLogger())
//engine.ShowSQL(true)
engine.ShowSQL(false)
return engine, engine.Ping()
}
//SupportedTypes list suported db handler
func SupportedTypes() []string {
dbTypeEntryArr := make([]string, 0)
handlerMap.Range(func(key, value interface{}) bool {
dbTypeEntryArr = append(dbTypeEntryArr, key.(string))
return true
})
return dbTypeEntryArr
}
//DB contain the DB
type DB struct {
dbType string
//Engine contane the connection to the Database
cfgEngine *xorm.Engine
cfgURL string
rtmeEngine *xorm.Engine
rtmeURL string
}
//NewDB create DB object
func NewDB(dbType, host, user, pass, cfg, rtme string) (*DB, error) {
if dbType == "" {
return nil, fmt.Errorf("Invalid db type")
}
dbHandlerStringer, ok := handlerMap.Load(dbType)
if !ok {
return nil, fmt.Errorf("Invalid db type")
}
_, cu, err := dbHandlerStringer.(handler).GenerateURL(host, user, pass, cfg)
if err != nil {
return nil, err
}
_, ru, err := dbHandlerStringer.(handler).GenerateURL(host, user, pass, cfg)
if err != nil {
return nil, err
}
return &DB{
dbType: dbType,
cfgURL: cu,
rtmeURL: ru,
}, nil
}
//NewDBFromURL create DB object directly from url
func NewDBFromURL(dbType, cfgURL, rtmeURL string) *DB {
return &DB{
dbType: dbType,
cfgURL: cfgURL,
rtmeURL: rtmeURL,
}
}
//RTME handle to rtme database
func (db *DB) RTME() (*xorm.Engine, error) {
if db.rtmeEngine == nil {
e, err := generetaDBEngine(db.dbType, db.rtmeURL)
if err != nil {
return nil, err
}
db.rtmeEngine = e
}
return db.rtmeEngine, nil
}
//CFG handle to config database
func (db *DB) CFG() (*xorm.Engine, error) {
if db.cfgEngine == nil {
e, err := generetaDBEngine(db.dbType, db.cfgURL)
if err != nil {
return nil, err
}
db.cfgEngine = e
}
return db.cfgEngine, nil
}
//generetaDBEngine create DB object from a specific url
func generetaDBEngine(dbType, dbURL string) (*xorm.Engine, error) {
e, err := initConn(dbType, dbURL)
if err != nil {
return nil, err
}
return e, nil
}