Skip to content

Commit 6e44b0b

Browse files
committed
统一template自定义函数,减少不同数据库之间差异性代码
1 parent 3b19afb commit 6e44b0b

File tree

2 files changed

+43
-238
lines changed

2 files changed

+43
-238
lines changed

parsing/sqlparser/parse.go

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func ParseWithParamMap(driverName, sql string, params map[string]interface{}) (*
138138
firstIndex, lastIndex := -1, -1
139139
var c string
140140
var index int = 0
141-
holder := selectHolder(driverName)
141+
holder := SelectMarker(driverName)
142142

143143
for {
144144
firstIndex = strings.Index(subStr, "{")
@@ -180,31 +180,42 @@ func ParseWithParamMap(driverName, sql string, params map[string]interface{}) (*
180180
return &ret, nil
181181
}
182182

183-
type holder func(int) string
183+
type Holder func(int) string
184184

185-
var gHolderMap = map[string]holder{
186-
"mysql": mysqlHolder, //mysql
187-
"postgres": postgresHolder, //postgresql
188-
"oci8": oci8Holder, //oracle
189-
"adodb": mysqlHolder, //sqlserver
185+
var gHolderMap = map[string]Holder{
186+
"mysql": MysqlMarker, //mysql
187+
"postgres": PostgresMarker, //postgresql
188+
"oci8": Oci8Marker, //oracle
189+
"adodb": MysqlMarker, //sqlserver
190190
}
191191

192-
func selectHolder(driverName string) holder {
193-
if v, ok := gHolderMap[driverName]; ok {
192+
func RegisterParamMarker(driverName string, h Holder) bool {
193+
_, ok := GetMarker(driverName)
194+
gHolderMap[driverName] = h
195+
return ok
196+
}
197+
198+
func SelectMarker(driverName string) Holder {
199+
if v, ok := GetMarker(driverName); ok {
194200
return v
195201
}
196-
return mysqlHolder
202+
return MysqlMarker
203+
}
204+
205+
func GetMarker(driverName string) (Holder, bool) {
206+
v, ok := gHolderMap[driverName]
207+
return v, ok
197208
}
198209

199-
func mysqlHolder(int) string {
210+
func MysqlMarker(int) string {
200211
return "?"
201212
}
202213

203-
func postgresHolder(i int) string {
214+
func PostgresMarker(i int) string {
204215
return "$" + strconv.Itoa(i)
205216
}
206217

207-
func oci8Holder(i int) string {
218+
func Oci8Marker(i int) string {
208219
return ":" + strconv.Itoa(i)
209220
}
210221

parsing/template/dynamic.go

Lines changed: 19 additions & 225 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,20 @@ package template
77

88
import (
99
"fmt"
10-
"strconv"
10+
"github.com/xfali/gobatis/parsing/sqlparser"
1111
"strings"
1212
"text/template"
1313
"time"
1414
)
1515

1616
const (
17-
argPlaceHolder = "_xfali_Arg_Holder"
18-
argPlaceHolderLen = 17
17+
argPlaceHolder = "_xfali_Arg_Holder"
18+
argPlaceHolderLen = 17
1919
argPlaceHolderFormat = "%s%08d"
2020
)
2121

2222
type Dynamic interface {
2323
getFuncMap() template.FuncMap
24-
getParam() []interface{}
2524
format(string) (string, []interface{})
2625
}
2726

@@ -71,217 +70,14 @@ func (d *DummyDynamic) format(s string) (string, []interface{}) {
7170
return s, nil
7271
}
7372

74-
type MysqlDynamic struct {
75-
index int
76-
keys []string
77-
paramMap map[string]interface{}
78-
}
79-
80-
func (d *MysqlDynamic) getFuncMap() template.FuncMap {
81-
return template.FuncMap{
82-
"set": d.mysqlUpdateSet,
83-
"where": d.mysqlWhere,
84-
"arg": d.Param,
85-
86-
"add": commonAdd,
87-
}
88-
}
89-
90-
func (d *MysqlDynamic) getParam() []interface{} {
91-
return nil
92-
}
93-
94-
func (d *MysqlDynamic) mysqlUpdateSet(b interface{}, columnDesc string, value interface{}, origin string) string {
95-
if !IsTrue(b) {
96-
return origin
97-
}
98-
99-
buf := strings.Builder{}
100-
if origin == "" {
101-
buf.WriteString(" SET ")
102-
} else {
103-
origin = strings.TrimSpace(origin)
104-
buf.WriteString(origin)
105-
if origin[:len(origin)-1] != "," {
106-
buf.WriteString(",")
107-
}
108-
}
109-
buf.WriteString(columnDesc)
110-
if s, ok := value.(string); ok {
111-
if _, ok := d.paramMap[s]; ok {
112-
buf.WriteString(s)
113-
} else {
114-
buf.WriteString(`'`)
115-
buf.WriteString(s)
116-
buf.WriteString(`'`)
117-
}
118-
} else {
119-
buf.WriteString(fmt.Sprint(value))
120-
}
121-
return buf.String()
122-
}
123-
124-
func (d *MysqlDynamic) mysqlWhere(b interface{}, cond, columnDesc string, value interface{}, origin string) string {
125-
if !IsTrue(b) {
126-
return origin
127-
}
128-
129-
buf := strings.Builder{}
130-
if origin == "" {
131-
buf.WriteString(" WHERE ")
132-
cond = ""
133-
} else {
134-
buf.WriteString(strings.TrimSpace(origin))
135-
buf.WriteString(" ")
136-
buf.WriteString(cond)
137-
buf.WriteString(" ")
138-
}
139-
140-
buf.WriteString(columnDesc)
141-
if s, ok := value.(string); ok {
142-
if _, ok := d.paramMap[s]; ok {
143-
buf.WriteString(s)
144-
} else {
145-
buf.WriteString(`'`)
146-
buf.WriteString(s)
147-
buf.WriteString(`'`)
148-
}
149-
} else {
150-
buf.WriteString(fmt.Sprint(value))
151-
}
152-
return buf.String()
153-
}
154-
155-
func (d *MysqlDynamic) Param(p interface{}) string {
156-
d.index++
157-
key := getPlaceHolderKey(d.index)
158-
d.paramMap[key] = p
159-
d.keys = append(d.keys, key)
160-
return key
161-
}
162-
163-
func (d *MysqlDynamic) format(s string) (string, []interface{}) {
164-
i := 0
165-
var params []interface{}
166-
for _, k := range d.keys {
167-
s, i = replace(s, k, "?", -1)
168-
if i > 0 {
169-
params = append(params, d.paramMap[k])
170-
}
171-
}
172-
return s, params
173-
}
174-
175-
type PostgresDynamic struct {
176-
index int
177-
keys [] string
178-
paramMap map[string]interface{}
179-
}
180-
181-
func (d *PostgresDynamic) getFuncMap() template.FuncMap {
182-
return template.FuncMap{
183-
"set": d.postgresUpdateSet,
184-
"where": d.postgresWhere,
185-
"arg": d.Param,
186-
187-
"add": commonAdd,
188-
}
189-
}
190-
191-
func (d *PostgresDynamic) postgresUpdateSet(b interface{}, columnDesc string, value interface{}, origin string) string {
192-
if !IsTrue(b) {
193-
return origin
194-
}
195-
196-
buf := strings.Builder{}
197-
if origin == "" {
198-
buf.WriteString(" SET ")
199-
} else {
200-
origin = strings.TrimSpace(origin)
201-
buf.WriteString(origin)
202-
if origin[:len(origin)-1] != "," {
203-
buf.WriteString(",")
204-
}
205-
}
206-
buf.WriteString(columnDesc)
207-
if s, ok := value.(string); ok {
208-
if _, ok := d.paramMap[s]; ok {
209-
buf.WriteString(s)
210-
} else {
211-
buf.WriteString(`'`)
212-
buf.WriteString(s)
213-
buf.WriteString(`'`)
214-
}
215-
} else {
216-
buf.WriteString(fmt.Sprint(value))
217-
}
218-
return buf.String()
219-
}
220-
221-
func (d *PostgresDynamic) postgresWhere(b interface{}, cond, columnDesc string, value interface{}, origin string) string {
222-
if !IsTrue(b) {
223-
return origin
224-
}
225-
226-
buf := strings.Builder{}
227-
if origin == "" {
228-
buf.WriteString(" WHERE ")
229-
cond = ""
230-
} else {
231-
buf.WriteString(strings.TrimSpace(origin))
232-
buf.WriteString(" ")
233-
buf.WriteString(cond)
234-
buf.WriteString(" ")
235-
}
236-
237-
buf.WriteString(columnDesc)
238-
if s, ok := value.(string); ok {
239-
if _, ok := d.paramMap[s]; ok {
240-
buf.WriteString(s)
241-
} else {
242-
buf.WriteString(`'`)
243-
buf.WriteString(s)
244-
buf.WriteString(`'`)
245-
}
246-
} else {
247-
buf.WriteString(fmt.Sprint(value))
248-
}
249-
return buf.String()
250-
}
251-
252-
func (d *PostgresDynamic) getParam() []interface{} {
253-
return nil
254-
}
255-
256-
func (d *PostgresDynamic) Param(p interface{}) string {
257-
d.index++
258-
key := getPlaceHolderKey(d.index)
259-
d.paramMap[key] = p
260-
d.keys = append(d.keys, key)
261-
return key
262-
}
263-
264-
func (d *PostgresDynamic) format(s string) (string, []interface{}) {
265-
i, index := 0, 1
266-
var params []interface{}
267-
for _, k := range d.keys {
268-
s, i = replace(s, k, "$"+strconv.Itoa(index), -1)
269-
if i > 0 {
270-
params = append(params, d.paramMap[k])
271-
index++
272-
}
273-
}
274-
return s, params
275-
}
276-
277-
//oracle
278-
type Oci8Dynamic struct {
73+
type CommonDynamic struct {
27974
index int
28075
keys [] string
28176
paramMap map[string]interface{}
77+
holder sqlparser.Holder
28278
}
28379

284-
func (d *Oci8Dynamic) getFuncMap() template.FuncMap {
80+
func (d *CommonDynamic) getFuncMap() template.FuncMap {
28581
return template.FuncMap{
28682
"set": d.UpdateSet,
28783
"where": d.Where,
@@ -291,7 +87,7 @@ func (d *Oci8Dynamic) getFuncMap() template.FuncMap {
29187
}
29288
}
29389

294-
func (d *Oci8Dynamic) UpdateSet(b interface{}, columnDesc string, value interface{}, origin string) string {
90+
func (d *CommonDynamic) UpdateSet(b interface{}, columnDesc string, value interface{}, origin string) string {
29591
if !IsTrue(b) {
29692
return origin
29793
}
@@ -321,7 +117,7 @@ func (d *Oci8Dynamic) UpdateSet(b interface{}, columnDesc string, value interfac
321117
return buf.String()
322118
}
323119

324-
func (d *Oci8Dynamic) Where(b interface{}, cond, columnDesc string, value interface{}, origin string) string {
120+
func (d *CommonDynamic) Where(b interface{}, cond, columnDesc string, value interface{}, origin string) string {
325121
if !IsTrue(b) {
326122
return origin
327123
}
@@ -352,23 +148,23 @@ func (d *Oci8Dynamic) Where(b interface{}, cond, columnDesc string, value interf
352148
return buf.String()
353149
}
354150

355-
func (d *Oci8Dynamic) getParam() []interface{} {
151+
func (d *CommonDynamic) getParam() []interface{} {
356152
return nil
357153
}
358154

359-
func (d *Oci8Dynamic) Param(p interface{}) string {
155+
func (d *CommonDynamic) Param(p interface{}) string {
360156
d.index++
361157
key := getPlaceHolderKey(d.index)
362158
d.paramMap[key] = p
363159
d.keys = append(d.keys, key)
364160
return key
365161
}
366162

367-
func (d *Oci8Dynamic) format(s string) (string, []interface{}) {
163+
func (d *CommonDynamic) format(s string) (string, []interface{}) {
368164
i, index := 0, 1
369165
var params []interface{}
370166
for _, k := range d.keys {
371-
s, i = replace(s, k, ":"+strconv.Itoa(index), -1)
167+
s, i = replace(s, k, d.holder(index), -1)
372168
if i > 0 {
373169
params = append(params, d.paramMap[k])
374170
index++
@@ -377,16 +173,14 @@ func (d *Oci8Dynamic) format(s string) (string, []interface{}) {
377173
return s, params
378174
}
379175

380-
var dynamicMap = map[string]Dynamic{
381-
"mysql": &MysqlDynamic{paramMap: map[string]interface{}{}},
382-
"adodb": &MysqlDynamic{paramMap: map[string]interface{}{}},
383-
"postgres": &PostgresDynamic{paramMap: map[string]interface{}{}},
384-
"oci8": &MysqlDynamic{paramMap: map[string]interface{}{}},
385-
}
386-
387176
func selectDynamic(driverName string) Dynamic {
388-
if v, ok := dynamicMap[driverName]; ok {
389-
return v
177+
if h, ok := sqlparser.GetMarker(driverName); ok {
178+
return &CommonDynamic{
179+
index: 0,
180+
keys: nil,
181+
paramMap: map[string]interface{}{},
182+
holder: h,
183+
}
390184
}
391185
return gDummyDynamic
392186
}

0 commit comments

Comments
 (0)