-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathinit.go
More file actions
135 lines (111 loc) · 3.47 KB
/
init.go
File metadata and controls
135 lines (111 loc) · 3.47 KB
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
package spellsql
import (
"database/sql"
"errors"
"fmt"
"reflect"
"strings"
"sync"
)
// ====================================== spellsql =============================================
const (
// sql 操作数字
none uint8 = iota
INSERT
DELETE
SELECT
UPDATE
// sql LIKE 语句
ALK // 全模糊 如: xxx LIKE "%xxx%"
RLK // 右模糊 如: xxx LIKE "xxx%"
LLK // 左模糊 如: xxx LIKE "%xxx"
// sql join 语句
LJI // 左连接
RJI // 右连接
)
var (
sqlSyncPool = sync.Pool{New: func() interface{} { return new(SqlStrObj) }} // 考虑到性能问题, 这里用 pool
)
// ====================================== orm =============================================
const (
defaultTableTag = "json"
defaultBatchSelectSize = 10 // 批量查询默认条数
NULL = "NULL"
)
const (
_ uint8 = iota
// 查询时, 用于标记查询的 dest type
structFlag // struct
sliceFlag // 切片
mapFlag // map
oneFieldFlag // 单字段
// 标记是否需要对字段进行序列化处理
sureMarshal
sureUnmarshal
)
var (
cacheTableName2ColInfoMap = NewLRU(lruSize) // 缓存表的字段元信息, key: tableName, value: tableColInfo
cacheStructType2StructFieldMap = NewLRU(lruSize) // 缓存结构体 reflect.Type 对应的 field 信息, key: struct 的 reflect.Type, value: map[colName]structField
// 常用就缓存下
cacheTabObj = sync.Pool{New: func() interface{} { return new(Table) }}
cacheNullString = sync.Pool{New: func() interface{} { return new(sql.NullString) }}
cacheNullInt64 = sync.Pool{New: func() interface{} { return new(sql.NullInt64) }}
// null 类型
nullInt64Type = reflect.TypeOf(sql.NullInt64{})
nullFloat64Type = reflect.TypeOf(sql.NullFloat64{})
// 标记每次使用完后, 是否释放, 因为几乎都是共用同一个适配器, 减少初始化, 如果要释放的话将这里
isFreeTmerFlag = false
getTmerOnce sync.Once
getTmerFn = func() TableMetaer { return Mysql() } // 获取表初始化表元信息, 默认 mysql
// error
structTagErr = fmt.Errorf("you should sure struct is ok, eg: %s", "type User struct {\n"+
" Name string `json:\"name\"`\n"+
"}")
tableNameIsUnknownErr = errors.New("table name is unknown")
nullRowErr = errors.New("row is null")
findOneDestTypeErr = errors.New("dest should is struct/oneField/map")
findAllDestTypeErr = errors.New("dest should is struct/oneField/map slice")
getField2ColInfoMapErr = "%q GetField2ColInfoMap initArgs is not ok"
)
// FreeTmerFlag 是否每次调用 orm 完后需要释放 tmer
// 如果都是适配相同的数据库, 则可以设置 false, 避免每次都需要初始化适配器
// 反之应该设置为 true
func FreeTmerFlag(is bool) {
isFreeTmerFlag = is
}
// GlobalTmer 设置全局 tmer, 如果要局部使用, 请使用 Tmer
func GlobalTmer(f func() TableMetaer) {
getTmerOnce.Do(func() {
getTmerFn = f
})
}
// ====================================== other =============================================
// 公共部分
var (
tmpBuf = sync.Pool{New: func() interface{} { return new(strings.Builder) }}
)
// log 处理
var (
sLog Logger
logOnce sync.Once
)
func init() {
logOnce.Do(func() {
sLog = NewLogger()
})
}
func getTmpBuf(size ...int) *strings.Builder {
obj := tmpBuf.Get().(*strings.Builder)
if len(size) > 0 {
obj.Grow(size[0])
}
return obj
}
func putTmpBuf(obj *strings.Builder) {
obj.Reset()
tmpBuf.Put(obj)
}
// SetLogger 设置 logger
func SetLogger(logger Logger) {
sLog = logger
}