-
Notifications
You must be signed in to change notification settings - Fork 1
/
db_client_config.go
127 lines (109 loc) · 3.82 KB
/
db_client_config.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
package sqlmer
import (
"context"
"database/sql"
"reflect"
"time"
"github.com/bunnier/sqlmer/sqlen"
)
type DbClientConfig struct {
context context.Context // 上下文对象,用于默认的超时、优雅关闭等控制。
connTimeout time.Duration // 数据库连接超时时间。
execTimeout time.Duration // 语句执行超时时间。
withPingCheck bool // 用于指定是否在 DbClient 初始化时候进行 ping 操作。
Driver string // 数据库驱动名称。
Dsn string // 连接字符串。
Db *sql.DB // 数据库对象。
bindArgsFunc BindSqlArgsFunc // 用于处理 sql 语句和所给的参数。
getScanTypeFunc sqlen.GetScanTypeFunc // 用于根据列信息获取用于 Scan 的类型。
unifyDataTypeFunc sqlen.UnifyDataTypeFn // 用于统一不同驱动在 Go 中的映射类型。
}
// NewDbClientConfig 创建一个数据库连接配置。
func NewDbClientConfig(options ...DbClientOption) (*DbClientConfig, error) {
config := &DbClientConfig{
context: context.Background(),
connTimeout: time.Second * 30,
execTimeout: time.Second * 30,
withPingCheck: false,
Driver: "",
Dsn: "",
Db: nil,
bindArgsFunc: func(s string, i ...any) (string, []any, error) {
return s, i, nil
},
getScanTypeFunc: func(columnType *sql.ColumnType) reflect.Type {
return columnType.ScanType()
},
unifyDataTypeFunc: func(columnType *sql.ColumnType, dest *any) {},
}
var err error
for _, option := range options {
if err = option(config); err != nil {
return nil, err
}
}
return config, nil
}
// DbClientOption 是 DbClientConfig 的可选配置。
type DbClientOption func(config *DbClientConfig) error
// WithExecTimeout 用于为 DbClientConfig 设置默认的执行超时时间。
func WithExecTimeout(timeout time.Duration) DbClientOption {
return func(config *DbClientConfig) error {
config.execTimeout = timeout
return nil
}
}
// WithConnTimeout 用于为 DbClientConfig 设置获取数据库连接的超时时间。
func WithConnTimeout(timeout time.Duration) DbClientOption {
return func(config *DbClientConfig) error {
config.connTimeout = timeout
return nil
}
}
// WithDb 用于用现有的 sql.DB 初始化 DbClientOption。
func WithDb(db *sql.DB, driver string, dsn string) DbClientOption {
return func(config *DbClientConfig) error {
config.Db = db
config.Dsn = dsn
config.Driver = driver
return nil
}
}
// WithDsn 用于用现有的 sql.DB 初始化 DbClientOption。
func WithDsn(driver string, dsn string) DbClientOption {
return func(config *DbClientConfig) error {
config.Dsn = dsn
config.Driver = driver
return nil
}
}
// WithPingCheck 用于选择是否在初始化 DbClient 时候进行 ping 操作(默认为 false)。
func WithPingCheck(withPingCheck bool) DbClientOption {
return func(config *DbClientConfig) error {
config.withPingCheck = withPingCheck
return nil
}
}
// WithUnifyDataTypeFunc 用于为 DbClient 注入驱动相关的类型转换逻辑。
func WithUnifyDataTypeFunc(unifyDataType sqlen.UnifyDataTypeFn) DbClientOption {
return func(config *DbClientConfig) error {
config.unifyDataTypeFunc = unifyDataType
return nil
}
}
// BindSqlArgsFunc 定义用于预处理 sql 语句与参数的函数。
type BindSqlArgsFunc func(string, ...any) (string, []any, error)
// WithBindArgsFunc 用于为 DbClientConfig 设置处理参数的函数。
func WithBindArgsFunc(argsFunc BindSqlArgsFunc) DbClientOption {
return func(config *DbClientConfig) error {
config.bindArgsFunc = argsFunc
return nil
}
}
// WithBindArgsFunc 用于为 DbClientConfig 设置根据列信息获取 Scan 类型的函数。
func WithGetScanTypeFunc(scanFunc sqlen.GetScanTypeFunc) DbClientOption {
return func(config *DbClientConfig) error {
config.getScanTypeFunc = scanFunc
return nil
}
}