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
	 KEHyeon
						KEHyeon