Skip to content

Commit 6a667da

Browse files
authored
Merge pull request #315 from sourcegraph/v1
backport: Initialise plans using sync.Once
2 parents c87af80 + cfc99f6 commit 6a667da

2 files changed

Lines changed: 20 additions & 21 deletions

File tree

.travis.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
language: go
22
go:
3-
- 1.1
3+
- 1.3
4+
- 1.4
45
- tip
56

67
services:

gorp.go

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

341343
func (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

399400
func (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

457457
func (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

Comments
 (0)