/
configuration.go
114 lines (106 loc) · 3.14 KB
/
configuration.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
package orm
import (
"fmt"
"github.com/cheivin/di"
"github.com/cheivin/dio-core"
"github.com/cheivin/dio-plugin/gorm/dao"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"strings"
)
const (
defaultPrefix = "gorm."
multiPrefix = "gorm.multi."
enableMulti = defaultPrefix + "enable-multi"
)
type configuration struct {
log core.Log
opts []gorm.Option
defaultDBProperty DBProperty
defaultPoolProperty PoolProperty
defaultLogProperty LogProperty
}
func (c *configuration) BeanName() string {
return "gormConfiguration"
}
func (c *configuration) BeanConstruct(container di.DI) {
// 系统日志
bean, _ := container.GetByType(&c.log)
c.log = bean.(core.Log)
// 配置信息
if options, ok := container.GetByType(gormOptions{}); ok {
c.opts = options.(*gormOptions).Options
}
// db连接信息
c.defaultDBProperty = container.LoadProperties(defaultPrefix, DBProperty{}).(DBProperty)
// 连接池信息
c.defaultPoolProperty = container.LoadProperties(defaultPrefix, PoolProperty{}).(PoolProperty)
// 日志信息
c.defaultLogProperty = container.LoadProperties(defaultPrefix, LogProperty{}).(LogProperty)
var tags []string
if val := container.GetProperty(enableMulti); val != nil {
tags = strings.Split(val.(string), ",")
}
if len(tags) == 0 {
db := c.generateDB(c.defaultDBProperty, c.defaultPoolProperty, c.defaultLogProperty)
// 注册db
baseDao := dao.New(db)
container.RegisterNamedBean("gorm", db)
container.RegisterBean(baseDao)
c.log.Info(container.Context(), "Gorm library loaded")
return
}
for _, tag := range tags {
prefix := multiPrefix + tag + "."
// db连接信息
dbProperty := container.LoadProperties(prefix, DBProperty{}).(DBProperty)
dbProperty.Merge(c.defaultDBProperty)
// 连接池信息
poolProperty := container.LoadProperties(prefix, PoolProperty{}).(PoolProperty)
poolProperty.Merge(c.defaultPoolProperty)
// 日志信息
logProperty := container.LoadProperties(prefix, LogProperty{}).(LogProperty)
logProperty.Merge(c.defaultLogProperty)
db := c.generateDB(dbProperty, poolProperty, logProperty)
// 注册db
baseDao := dao.New(db)
// 设置注册的beanName
beanName := tag
if dbProperty.DaoName != "" {
beanName = dbProperty.DaoName
}
container.RegisterNamedBean(beanName, baseDao)
c.log.Info(container.Context(), "Gorm library loaded dao named "+beanName+" for db "+tag)
}
}
func (c *configuration) generateDB(dbProperty DBProperty, pool PoolProperty, logProperty LogProperty) *gorm.DB {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", []interface{}{
dbProperty.Username,
dbProperty.Password,
dbProperty.Host,
dbProperty.Port,
dbProperty.Database,
dbProperty.Parameters,
}...)
// 配置数据库
db, err := gorm.Open(mysql.Open(dsn), c.opts...)
if err != nil {
panic(err)
}
sqlDB, err := db.DB()
if err != nil {
panic(err)
}
// 配置连接池
if pool.MaxLifeTime > 0 {
sqlDB.SetConnMaxLifetime(pool.MaxLifeTime)
}
if pool.MaxIdleTime > 0 {
sqlDB.SetConnMaxIdleTime(pool.MaxIdleTime)
}
sqlDB.SetMaxIdleConns(pool.MaxIdle)
sqlDB.SetMaxOpenConns(pool.MaxOpen)
// 配置日志
db.Logger = newLogger(c.log, logProperty)
return db
}