/
helper.go
148 lines (137 loc) · 3.11 KB
/
helper.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package gorm
import (
"errors"
"github.com/henrylee2cn/faygo"
"github.com/jinzhu/gorm"
)
// MustDB gets the specified database engine,
// or the default DB if no name is specified.
func MustDB(name ...string) *gorm.DB {
if len(name) == 0 {
return dbService.Default
}
db, ok := dbService.List[name[0]]
if !ok {
faygo.Panicf("[gorm] the database engine `%s` is not configured", name[0])
}
return db
}
// DB is similar to MustDB, but safe.
func DB(name ...string) (*gorm.DB, bool) {
if len(name) == 0 {
return dbService.Default, true
}
engine, ok := dbService.List[name[0]]
return engine, ok
}
// List gets the list of database engines
func List() map[string]*gorm.DB {
return dbService.List
}
// MustConfig gets the configuration information for the specified database,
// or returns the default if no name is specified.
func MustConfig(name ...string) DBConfig {
if len(name) == 0 {
return *defaultConfig
}
config, ok := dbConfigs[name[0]]
if !ok {
faygo.Panicf("[gorm] the database engine `%s` is not configured", name[0])
}
return *config
}
// Config is similar to MustConfig, but safe.
func Config(name ...string) (DBConfig, bool) {
if len(name) == 0 {
return *defaultConfig, true
}
config, ok := dbConfigs[name[0]]
if !ok {
return DBConfig{}, false
}
return *config, true
}
// Callback uses the `default` database for non-transactional operations.
func Callback(fn func(*gorm.DB) error, session ...*gorm.DB) error {
if fn == nil {
return nil
}
var sess *gorm.DB
if len(session) > 0 {
sess = session[0]
}
if sess == nil {
sess = MustDB().New()
// defer sess.Close()
}
return fn(sess)
}
// CallbackByName uses the specified database for non-transactional operations.
func CallbackByName(dbName string, fn func(*gorm.DB) error, session ...*gorm.DB) error {
if fn == nil {
return nil
}
var sess *gorm.DB
if len(session) > 0 {
sess = session[0]
}
if sess == nil {
engine, ok := DB(dbName)
if !ok {
return errors.New("[gorm] the database engine `" + dbName + "` is not configured")
}
sess = engine.New()
// defer sess.Close()
}
return fn(sess)
}
// TransactCallback uses the default database for transactional operations.
func TransactCallback(fn func(*gorm.DB) error, session ...*gorm.DB) (err error) {
if fn == nil {
return
}
var sess *gorm.DB
if len(session) > 0 {
sess = session[0]
}
if sess == nil {
sess = MustDB().New().Begin()
defer func() {
if err != nil {
sess.Rollback()
} else {
sess.Commit()
}
// sess.Close()
}()
}
err = fn(sess)
return
}
// TransactCallbackByName uses the `specified` database for transactional operations.
func TransactCallbackByName(dbName string, fn func(*gorm.DB) error, session ...*gorm.DB) (err error) {
if fn == nil {
return
}
var sess *gorm.DB
if len(session) > 0 {
sess = session[0]
}
if sess == nil {
engine, ok := DB(dbName)
if !ok {
return errors.New("[gorm] the database engine `" + dbName + "` is not configured")
}
sess = engine.New().Begin()
defer func() {
if err != nil {
sess.Rollback()
} else {
sess.Commit()
}
// sess.Close()
}()
}
err = fn(sess)
return
}