@@ -20,6 +20,7 @@ import (
20
20
"reflect"
21
21
"regexp"
22
22
"strings"
23
+ "sync/atomic"
23
24
"time"
24
25
)
25
26
@@ -172,21 +173,21 @@ type TableMap struct {
172
173
keys []* ColumnMap
173
174
uniqueTogether [][]string
174
175
version * ColumnMap
175
- insertPlan bindPlan
176
- updatePlan bindPlan
177
- deletePlan bindPlan
178
- getPlan bindPlan
176
+ insertPlan atomic. Value
177
+ updatePlan atomic. Value
178
+ deletePlan atomic. Value
179
+ getPlan atomic. Value
179
180
dbmap * DbMap
180
181
}
181
182
182
183
// ResetSql removes cached insert/update/select/delete SQL strings
183
184
// associated with this TableMap. Call this if you've modified
184
185
// any column names or the table name itself.
185
186
func (t * TableMap ) ResetSql () {
186
- t .insertPlan = bindPlan {}
187
- t .updatePlan = bindPlan {}
188
- t .deletePlan = bindPlan {}
189
- t .getPlan = bindPlan {}
187
+ t .insertPlan . Store (( * bindPlan )( nil ))
188
+ t .updatePlan . Store (( * bindPlan )( nil ))
189
+ t .deletePlan . Store (( * bindPlan )( nil ))
190
+ t .getPlan . Store (( * bindPlan )( nil ))
190
191
}
191
192
192
193
// SetKeys lets you specify the fields on a struct that map to primary
@@ -337,8 +338,9 @@ type bindInstance struct {
337
338
}
338
339
339
340
func (t * TableMap ) bindInsert (elem reflect.Value ) (bindInstance , error ) {
340
- plan := t .insertPlan
341
- if plan .query == "" {
341
+ plan := t .insertPlan .Load ().(* bindPlan )
342
+ if plan == nil {
343
+ plan = & bindPlan {}
342
344
plan .autoIncrIdx = - 1
343
345
344
346
s := bytes.Buffer {}
@@ -388,15 +390,16 @@ func (t *TableMap) bindInsert(elem reflect.Value) (bindInstance, error) {
388
390
s .WriteString (t .dbmap .Dialect .QuerySuffix ())
389
391
390
392
plan .query = s .String ()
391
- t .insertPlan = plan
393
+ t .insertPlan . Store ( plan )
392
394
}
393
395
394
396
return plan .createBindInstance (elem , t .dbmap .TypeConverter )
395
397
}
396
398
397
399
func (t * TableMap ) bindUpdate (elem reflect.Value ) (bindInstance , error ) {
398
- plan := t .updatePlan
399
- if plan .query == "" {
400
+ plan := t .updatePlan .Load ().(* bindPlan )
401
+ if plan == nil {
402
+ plan = & bindPlan {}
400
403
401
404
s := bytes.Buffer {}
402
405
s .WriteString (fmt .Sprintf ("update %s set " , t .dbmap .Dialect .QuotedTableForQuery (t .SchemaName , t .TableName )))
@@ -446,15 +449,16 @@ func (t *TableMap) bindUpdate(elem reflect.Value) (bindInstance, error) {
446
449
s .WriteString (t .dbmap .Dialect .QuerySuffix ())
447
450
448
451
plan .query = s .String ()
449
- t .updatePlan = plan
452
+ t .updatePlan . Store ( plan )
450
453
}
451
454
452
455
return plan .createBindInstance (elem , t .dbmap .TypeConverter )
453
456
}
454
457
455
458
func (t * TableMap ) bindDelete (elem reflect.Value ) (bindInstance , error ) {
456
- plan := t .deletePlan
457
- if plan .query == "" {
459
+ plan := t .deletePlan .Load ().(* bindPlan )
460
+ if plan == nil {
461
+ plan = & bindPlan {}
458
462
459
463
s := bytes.Buffer {}
460
464
s .WriteString (fmt .Sprintf ("delete from %s" , t .dbmap .Dialect .QuotedTableForQuery (t .SchemaName , t .TableName )))
@@ -492,15 +496,16 @@ func (t *TableMap) bindDelete(elem reflect.Value) (bindInstance, error) {
492
496
s .WriteString (t .dbmap .Dialect .QuerySuffix ())
493
497
494
498
plan .query = s .String ()
495
- t .deletePlan = plan
499
+ t .deletePlan . Store ( plan )
496
500
}
497
501
498
502
return plan .createBindInstance (elem , t .dbmap .TypeConverter )
499
503
}
500
504
501
505
func (t * TableMap ) bindGet () bindPlan {
502
- plan := t .getPlan
503
- if plan .query == "" {
506
+ plan := t .getPlan .Load ().(* bindPlan )
507
+ if plan == nil {
508
+ plan = & bindPlan {}
504
509
505
510
s := bytes.Buffer {}
506
511
s .WriteString ("select " )
@@ -533,10 +538,10 @@ func (t *TableMap) bindGet() bindPlan {
533
538
s .WriteString (t .dbmap .Dialect .QuerySuffix ())
534
539
535
540
plan .query = s .String ()
536
- t .getPlan = plan
541
+ t .getPlan . Store ( plan )
537
542
}
538
543
539
- return plan
544
+ return * plan
540
545
}
541
546
542
547
// ColumnMap represents a mapping between a Go struct field and a single
0 commit comments