fix: prevent interface type array from causing runtime errors
This commit is contained in:
parent
a9d27293de
commit
b5d069300c
21
callbacks.go
21
callbacks.go
@ -121,6 +121,27 @@ func (p *processor) Execute(db *DB) *DB {
|
|||||||
|
|
||||||
stmt.ReflectValue = stmt.ReflectValue.Elem()
|
stmt.ReflectValue = stmt.ReflectValue.Elem()
|
||||||
}
|
}
|
||||||
|
if (stmt.ReflectValue.Kind() == reflect.Slice || stmt.ReflectValue.Kind() == reflect.Array) &&
|
||||||
|
(stmt.ReflectValue.Len() > 0 || stmt.ReflectValue.Index(0).Kind() == reflect.Interface) {
|
||||||
|
len := stmt.ReflectValue.Len()
|
||||||
|
firstElem := stmt.ReflectValue.Index(0)
|
||||||
|
for firstElem.Kind() == reflect.Interface || firstElem.Kind() == reflect.Ptr {
|
||||||
|
firstElem = firstElem.Elem()
|
||||||
|
}
|
||||||
|
elemType := firstElem.Type()
|
||||||
|
sliceType := reflect.SliceOf(elemType)
|
||||||
|
structArrayReflectValue := reflect.MakeSlice(sliceType, 0, len)
|
||||||
|
|
||||||
|
for i := 0; i < len; i++ {
|
||||||
|
elem := stmt.ReflectValue.Index(i)
|
||||||
|
for elem.Kind() == reflect.Interface || elem.Kind() == reflect.Ptr {
|
||||||
|
elem = elem.Elem()
|
||||||
|
}
|
||||||
|
structArrayReflectValue = reflect.Append(structArrayReflectValue, elem)
|
||||||
|
}
|
||||||
|
stmt.ReflectValue = structArrayReflectValue
|
||||||
|
fmt.Println(stmt.ReflectValue.Type())
|
||||||
|
}
|
||||||
if !stmt.ReflectValue.IsValid() {
|
if !stmt.ReflectValue.IsValid() {
|
||||||
db.AddError(ErrInvalidValue)
|
db.AddError(ErrInvalidValue)
|
||||||
}
|
}
|
||||||
|
@ -138,6 +138,14 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
|||||||
modelType = modelType.Elem()
|
modelType = modelType.Elem()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if modelType.Kind() == reflect.Interface {
|
||||||
|
if value.Len() > 0 {
|
||||||
|
modelType = reflect.Indirect(value.Index(0)).Elem().Type()
|
||||||
|
}
|
||||||
|
if modelType.Kind() == reflect.Ptr {
|
||||||
|
modelType = modelType.Elem()
|
||||||
|
}
|
||||||
|
}
|
||||||
if modelType.Kind() != reflect.Struct {
|
if modelType.Kind() != reflect.Struct {
|
||||||
if modelType.PkgPath() == "" {
|
if modelType.PkgPath() == "" {
|
||||||
return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
|
return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user