-
Notifications
You must be signed in to change notification settings - Fork 2
/
spellsql_handle.go
111 lines (98 loc) · 2.9 KB
/
spellsql_handle.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
package spellsql
// SetUpdateValue update 语句中, 设置字段值
func (s *SqlStrObj) SetUpdateValue(fieldName string, arg interface{}) *SqlStrObj {
s.initValues()
s.writeSqlStr2Buf(&s.valuesBuf, " "+fieldName+" = ?", arg)
return s
}
// ValueIsEmpty insert/update 中 value 是否为空
func (s *SqlStrObj) ValueIsEmpty() bool {
return s.ValueStrLen() == 0
}
// ValueStrLen valueBuf 长度
func (s *SqlStrObj) ValueStrLen() int {
return s.valuesBuf.Len()
}
// SetUpdateValueArgs 支持占位符
// 如: SetUpdateValueArgs("username = ?, age = ?d", "test", "20")
// => username = "test", age = 20
func (s *SqlStrObj) SetUpdateValueArgs(sqlStr string, arg ...interface{}) *SqlStrObj {
s.initValues()
s.writeSqlStr2Buf(&s.valuesBuf, " "+sqlStr, arg...)
return s
}
// SetInsertValues 批量插入拼接, 如: xxx VALUES (xxx, xxx), (xxx, xxx)
func (s *SqlStrObj) SetInsertValues(args ...interface{}) *SqlStrObj {
s.initValues()
l := len(args)
sqlStr := "("
if l > 0 {
sqlStr += "?"
}
for i := 1; i < l; i++ {
sqlStr += ", ?"
}
sqlStr += ")"
s.writeSqlStr2Buf(&s.valuesBuf, " "+sqlStr, args...)
return s
}
// SetInsertValuesArgs 支持占位符, 如 SetInsertValuesArg("(?, ?, ?d)", "test", "12345", "123456") 或 SetInsertValuesArg("?, ?, ?d", "test", "12345", "123456")
// => ("test", "123456", 123456)
// 批量插入拼接, 如: xxx VALUES (xxx, xxx), (xxx, xxx)
func (s *SqlStrObj) SetInsertValuesArgs(sqlStr string, args ...interface{}) *SqlStrObj {
s.initValues()
if !s.needAddBracket { // 防止重复处理
if IndexForBF(true, sqlStr, "(") == -1 && IndexForBF(false, sqlStr, ")") == -1 {
s.needAddBracket = true
}
}
if s.needAddBracket {
sqlStr = "(" + sqlStr + ")"
}
s.writeSqlStr2Buf(&s.valuesBuf, " "+sqlStr, args...)
return s
}
// initValues 初始化 valueBuf
func (s *SqlStrObj) initValues() {
isAddComma := true // 本次默认加逗号
if s.is(INSERT) && !s.hasValuesStr {
s.valuesBuf.WriteString(" VALUES")
s.hasValuesStr = true
isAddComma = false
}
if s.is(UPDATE) {
if !s.hasSetStr {
s.valuesBuf.WriteString(" SET")
s.hasSetStr = true
isAddComma = false
}
if s.needAddComma {
// 第一次添加的时候, 判断是否需要添加逗号
s.valuesBuf.WriteString(",")
s.needAddComma = false
isAddComma = false
}
}
if isAddComma {
// fast past
// 说明已经设过值了, 这里在前面加个逗号
if s.ValueStrLen() > 0 {
s.valuesBuf.WriteString(",")
return
}
if s.is(INSERT) {
// slow path
// 如果初始化时或已经merge后 sqlStr已经这样了: xxx VALUES (xxx), 我们通过判断 VALUE 的下标是否为最后几个字符, 如果是的话就
// 不处理, 反之加逗号
valueIndex := getTargetIndex(s.buf.String(), "VALUE")
if valueIndex == -1 {
return
}
lastIndex := s.SqlStrLen() - 1
// 需要跳过本身长度
if lastIndex-(valueIndex+5) > 5 {
s.valuesBuf.WriteString(",")
}
}
}
}