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()
|
||||
}
|
||||
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() {
|
||||
db.AddError(ErrInvalidValue)
|
||||
}
|
||||
|
@ -138,6 +138,14 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam
|
||||
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.PkgPath() == "" {
|
||||
return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
|
||||
|
Loading…
x
Reference in New Issue
Block a user