@@ -7,21 +7,20 @@ package template
7
7
8
8
import (
9
9
"fmt"
10
- "strconv "
10
+ "github.com/xfali/gobatis/parsing/sqlparser "
11
11
"strings"
12
12
"text/template"
13
13
"time"
14
14
)
15
15
16
16
const (
17
- argPlaceHolder = "_xfali_Arg_Holder"
18
- argPlaceHolderLen = 17
17
+ argPlaceHolder = "_xfali_Arg_Holder"
18
+ argPlaceHolderLen = 17
19
19
argPlaceHolderFormat = "%s%08d"
20
20
)
21
21
22
22
type Dynamic interface {
23
23
getFuncMap () template.FuncMap
24
- getParam () []interface {}
25
24
format (string ) (string , []interface {})
26
25
}
27
26
@@ -71,217 +70,14 @@ func (d *DummyDynamic) format(s string) (string, []interface{}) {
71
70
return s , nil
72
71
}
73
72
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 {
279
74
index int
280
75
keys [] string
281
76
paramMap map [string ]interface {}
77
+ holder sqlparser.Holder
282
78
}
283
79
284
- func (d * Oci8Dynamic ) getFuncMap () template.FuncMap {
80
+ func (d * CommonDynamic ) getFuncMap () template.FuncMap {
285
81
return template.FuncMap {
286
82
"set" : d .UpdateSet ,
287
83
"where" : d .Where ,
@@ -291,7 +87,7 @@ func (d *Oci8Dynamic) getFuncMap() template.FuncMap {
291
87
}
292
88
}
293
89
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 {
295
91
if ! IsTrue (b ) {
296
92
return origin
297
93
}
@@ -321,7 +117,7 @@ func (d *Oci8Dynamic) UpdateSet(b interface{}, columnDesc string, value interfac
321
117
return buf .String ()
322
118
}
323
119
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 {
325
121
if ! IsTrue (b ) {
326
122
return origin
327
123
}
@@ -352,23 +148,23 @@ func (d *Oci8Dynamic) Where(b interface{}, cond, columnDesc string, value interf
352
148
return buf .String ()
353
149
}
354
150
355
- func (d * Oci8Dynamic ) getParam () []interface {} {
151
+ func (d * CommonDynamic ) getParam () []interface {} {
356
152
return nil
357
153
}
358
154
359
- func (d * Oci8Dynamic ) Param (p interface {}) string {
155
+ func (d * CommonDynamic ) Param (p interface {}) string {
360
156
d .index ++
361
157
key := getPlaceHolderKey (d .index )
362
158
d .paramMap [key ] = p
363
159
d .keys = append (d .keys , key )
364
160
return key
365
161
}
366
162
367
- func (d * Oci8Dynamic ) format (s string ) (string , []interface {}) {
163
+ func (d * CommonDynamic ) format (s string ) (string , []interface {}) {
368
164
i , index := 0 , 1
369
165
var params []interface {}
370
166
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 )
372
168
if i > 0 {
373
169
params = append (params , d .paramMap [k ])
374
170
index ++
@@ -377,16 +173,14 @@ func (d *Oci8Dynamic) format(s string) (string, []interface{}) {
377
173
return s , params
378
174
}
379
175
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
-
387
176
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
+ }
390
184
}
391
185
return gDummyDynamic
392
186
}
0 commit comments