Remove shared sync pool for Scanner compatibility

This commit is contained in:
Jinzhu 2022-04-11 21:37:02 +08:00
parent 5c9ef9a843
commit 41bef26f13
3 changed files with 6 additions and 73 deletions

View File

@ -932,7 +932,6 @@ func (field *Field) setupValuerAndSetter() {
} }
func (field *Field) setupNewValuePool() { func (field *Field) setupNewValuePool() {
var fieldValue = reflect.New(field.FieldType).Interface()
if field.Serializer != nil { if field.Serializer != nil {
field.NewValuePool = &sync.Pool{ field.NewValuePool = &sync.Pool{
New: func() interface{} { New: func() interface{} {
@ -942,31 +941,9 @@ func (field *Field) setupNewValuePool() {
} }
}, },
} }
} else if _, ok := fieldValue.(sql.Scanner); !ok {
field.setupDefaultNewValuePool()
} }
if field.NewValuePool == nil { if field.NewValuePool == nil {
field.NewValuePool = poolInitializer(reflect.PtrTo(field.IndirectFieldType)) field.NewValuePool = poolInitializer(reflect.PtrTo(field.IndirectFieldType))
} }
} }
func (field *Field) setupDefaultNewValuePool() {
// set default NewValuePool
switch field.IndirectFieldType.Kind() {
case reflect.String:
field.NewValuePool = stringPool
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
field.NewValuePool = intPool
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
field.NewValuePool = uintPool
case reflect.Float32, reflect.Float64:
field.NewValuePool = floatPool
case reflect.Bool:
field.NewValuePool = boolPool
default:
if field.IndirectFieldType == TimeReflectType {
field.NewValuePool = timePool
}
}
}

View File

@ -3,54 +3,11 @@ package schema
import ( import (
"reflect" "reflect"
"sync" "sync"
"time"
) )
// sync pools // sync pools
var ( var (
normalPool sync.Map normalPool sync.Map
stringPool = &sync.Pool{
New: func() interface{} {
var v string
ptrV := &v
return &ptrV
},
}
intPool = &sync.Pool{
New: func() interface{} {
var v int64
ptrV := &v
return &ptrV
},
}
uintPool = &sync.Pool{
New: func() interface{} {
var v uint64
ptrV := &v
return &ptrV
},
}
floatPool = &sync.Pool{
New: func() interface{} {
var v float64
ptrV := &v
return &ptrV
},
}
boolPool = &sync.Pool{
New: func() interface{} {
var v bool
ptrV := &v
return &ptrV
},
}
timePool = &sync.Pool{
New: func() interface{} {
var v time.Time
ptrV := &v
return &ptrV
},
}
poolInitializer = func(reflectType reflect.Type) FieldNewValuePool { poolInitializer = func(reflectType reflect.Type) FieldNewValuePool {
v, _ := normalPool.LoadOrStore(reflectType, &sync.Pool{ v, _ := normalPool.LoadOrStore(reflectType, &sync.Pool{
New: func() interface{} { New: func() interface{} {

View File

@ -5,15 +5,14 @@ go 1.14
require ( require (
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
github.com/google/uuid v1.3.0 github.com/google/uuid v1.3.0
github.com/jackc/pgx/v4 v4.15.0 // indirect
github.com/jinzhu/now v1.1.5 github.com/jinzhu/now v1.1.5
github.com/lib/pq v1.10.4 github.com/lib/pq v1.10.5
github.com/mattn/go-sqlite3 v1.14.12 // indirect github.com/mattn/go-sqlite3 v1.14.12 // indirect
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 // indirect
gorm.io/driver/mysql v1.3.2 gorm.io/driver/mysql v1.3.3
gorm.io/driver/postgres v1.3.1 gorm.io/driver/postgres v1.3.4
gorm.io/driver/sqlite v1.3.1 gorm.io/driver/sqlite v1.3.1
gorm.io/driver/sqlserver v1.3.1 gorm.io/driver/sqlserver v1.3.2
gorm.io/gorm v1.23.3 gorm.io/gorm v1.23.3
) )