From e4d7f1b8e2736f805e45b10a70523e0d1e8bfd07 Mon Sep 17 00:00:00 2001 From: Aaron L Date: Wed, 31 Aug 2016 00:47:35 -0700 Subject: [PATCH] Second optimization pass --- boil/reflect.go | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/boil/reflect.go b/boil/reflect.go index 39bf627..4e54fdc 100644 --- a/boil/reflect.go +++ b/boil/reflect.go @@ -6,6 +6,7 @@ import ( "reflect" "strconv" "strings" + "sync" "github.com/pkg/errors" "github.com/vattle/sqlboiler/strmangle" @@ -249,6 +250,9 @@ func bindChecks(obj interface{}) (structType reflect.Type, sliceType reflect.Typ return structType, sliceType, singular, nil } +var mut sync.RWMutex +var mappingThings = map[string][]uint64{} + func bind(rows *sql.Rows, obj interface{}, structType, sliceType reflect.Type, singular bool, titleCases map[string]string) error { cols, err := rows.Columns() if err != nil { @@ -261,9 +265,30 @@ func bind(rows *sql.Rows, obj interface{}, structType, sliceType reflect.Type, s } var mapping []uint64 - mapping, err = bindMapping(structType, titleCases, cols) - if err != nil { - return err + var ok bool + + buf := strmangle.GetBuffer() + + buf.WriteString(structType.String()) + for _, s := range cols { + buf.WriteString(s) + } + mapKey := buf.String() + strmangle.PutBuffer(buf) + + mut.RLock() + mapping, ok = mappingThings[mapKey] + mut.RUnlock() + + if !ok { + mapping, err = bindMapping(structType, titleCases, cols) + if err != nil { + return err + } + + mut.Lock() + mappingThings[mapKey] = mapping + mut.Unlock() } foundOne := false