@@ -17,12 +17,13 @@ import (
1717 "database/sql/driver"
1818 "errors"
1919 "fmt"
20+ "log"
21+ "os"
2022 "reflect"
2123 "regexp"
2224 "strings"
25+ "sync"
2326 "time"
24- "log"
25- "os"
2627)
2728
2829// Oracle String (empty string is null)
@@ -283,9 +284,10 @@ type bindPlan struct {
283284 versField string
284285 autoIncrIdx int
285286 autoIncrFieldName string
287+ once sync.Once
286288}
287289
288- func (plan bindPlan ) createBindInstance (elem reflect.Value , conv TypeConverter ) (bindInstance , error ) {
290+ func (plan * bindPlan ) createBindInstance (elem reflect.Value , conv TypeConverter ) (bindInstance , error ) {
289291 bi := bindInstance {query : plan .query , autoIncrIdx : plan .autoIncrIdx , autoIncrFieldName : plan .autoIncrFieldName , versField : plan .versField }
290292 if plan .versField != "" {
291293 bi .existingVersion = elem .FieldByName (plan .versField ).Int ()
@@ -339,8 +341,8 @@ type bindInstance struct {
339341}
340342
341343func (t * TableMap ) bindInsert (elem reflect.Value ) (bindInstance , error ) {
342- plan := t .insertPlan
343- if plan .query == "" {
344+ plan := & t .insertPlan
345+ plan .once . Do ( func () {
344346 plan .autoIncrIdx = - 1
345347
346348 s := bytes.Buffer {}
@@ -390,15 +392,14 @@ func (t *TableMap) bindInsert(elem reflect.Value) (bindInstance, error) {
390392 s .WriteString (t .dbmap .Dialect .QuerySuffix ())
391393
392394 plan .query = s .String ()
393- t .insertPlan = plan
394- }
395+ })
395396
396397 return plan .createBindInstance (elem , t .dbmap .TypeConverter )
397398}
398399
399400func (t * TableMap ) bindUpdate (elem reflect.Value ) (bindInstance , error ) {
400- plan := t .updatePlan
401- if plan .query == "" {
401+ plan := & t .updatePlan
402+ plan .once . Do ( func () {
402403
403404 s := bytes.Buffer {}
404405 s .WriteString (fmt .Sprintf ("update %s set " , t .dbmap .Dialect .QuotedTableForQuery (t .SchemaName , t .TableName )))
@@ -448,15 +449,14 @@ func (t *TableMap) bindUpdate(elem reflect.Value) (bindInstance, error) {
448449 s .WriteString (t .dbmap .Dialect .QuerySuffix ())
449450
450451 plan .query = s .String ()
451- t .updatePlan = plan
452- }
452+ })
453453
454454 return plan .createBindInstance (elem , t .dbmap .TypeConverter )
455455}
456456
457457func (t * TableMap ) bindDelete (elem reflect.Value ) (bindInstance , error ) {
458- plan := t .deletePlan
459- if plan .query == "" {
458+ plan := & t .deletePlan
459+ plan .once . Do ( func () {
460460
461461 s := bytes.Buffer {}
462462 s .WriteString (fmt .Sprintf ("delete from %s" , t .dbmap .Dialect .QuotedTableForQuery (t .SchemaName , t .TableName )))
@@ -494,15 +494,14 @@ func (t *TableMap) bindDelete(elem reflect.Value) (bindInstance, error) {
494494 s .WriteString (t .dbmap .Dialect .QuerySuffix ())
495495
496496 plan .query = s .String ()
497- t .deletePlan = plan
498- }
497+ })
499498
500499 return plan .createBindInstance (elem , t .dbmap .TypeConverter )
501500}
502501
503- func (t * TableMap ) bindGet () bindPlan {
504- plan := t .getPlan
505- if plan .query == "" {
502+ func (t * TableMap ) bindGet () * bindPlan {
503+ plan := & t .getPlan
504+ plan .once . Do ( func () {
506505
507506 s := bytes.Buffer {}
508507 s .WriteString ("select " )
@@ -535,8 +534,7 @@ func (t *TableMap) bindGet() bindPlan {
535534 s .WriteString (t .dbmap .Dialect .QuerySuffix ())
536535
537536 plan .query = s .String ()
538- t .getPlan = plan
539- }
537+ })
540538
541539 return plan
542540}
0 commit comments