Fix possible concurrency problem for serializer
This commit is contained in:
		
							parent
							
								
									e9f25c73ee
								
							
						
					
					
						commit
						1643a36260
					
				| @ -916,6 +916,8 @@ func (field *Field) setupValuerAndSetter() { | ||||
| 			sameElemType = field.FieldType == reflect.ValueOf(field.Serializer).Type().Elem() | ||||
| 		} | ||||
| 
 | ||||
| 		serializerValue := reflect.Indirect(reflect.ValueOf(field.Serializer)) | ||||
| 		serializerType := serializerValue.Type() | ||||
| 		field.Set = func(ctx context.Context, value reflect.Value, v interface{}) (err error) { | ||||
| 			if s, ok := v.(*serializer); ok { | ||||
| 				if s.fieldValue != nil { | ||||
| @ -923,11 +925,12 @@ func (field *Field) setupValuerAndSetter() { | ||||
| 				} else if err = s.Serializer.Scan(ctx, field, value, s.value); err == nil { | ||||
| 					if sameElemType { | ||||
| 						field.ReflectValueOf(ctx, value).Set(reflect.ValueOf(s.Serializer).Elem()) | ||||
| 						s.Serializer = reflect.New(reflect.Indirect(reflect.ValueOf(field.Serializer)).Type()).Interface().(SerializerInterface) | ||||
| 					} else if sameType { | ||||
| 						field.ReflectValueOf(ctx, value).Set(reflect.ValueOf(s.Serializer)) | ||||
| 						s.Serializer = reflect.New(reflect.Indirect(reflect.ValueOf(field.Serializer)).Type()).Interface().(SerializerInterface) | ||||
| 					} | ||||
| 					si := reflect.New(serializerType) | ||||
| 					si.Elem().Set(serializerValue) | ||||
| 					s.Serializer = si.Interface().(SerializerInterface) | ||||
| 				} | ||||
| 			} else { | ||||
| 				err = oldFieldSetter(ctx, value, v) | ||||
| @ -939,11 +942,15 @@ func (field *Field) setupValuerAndSetter() { | ||||
| 
 | ||||
| func (field *Field) setupNewValuePool() { | ||||
| 	if field.Serializer != nil { | ||||
| 		serializerValue := reflect.Indirect(reflect.ValueOf(field.Serializer)) | ||||
| 		serializerType := serializerValue.Type() | ||||
| 		field.NewValuePool = &sync.Pool{ | ||||
| 			New: func() interface{} { | ||||
| 				si := reflect.New(serializerType) | ||||
| 				si.Elem().Set(serializerValue) | ||||
| 				return &serializer{ | ||||
| 					Field:      field, | ||||
| 					Serializer: field.Serializer, | ||||
| 					Serializer: si.Interface().(SerializerInterface), | ||||
| 				} | ||||
| 			}, | ||||
| 		} | ||||
|  | ||||
| @ -9,11 +9,12 @@ require ( | ||||
| 	github.com/lib/pq v1.10.7 | ||||
| 	github.com/mattn/go-sqlite3 v1.14.16 // indirect | ||||
| 	github.com/microsoft/go-mssqldb v0.20.0 // indirect | ||||
| 	golang.org/x/crypto v0.7.0 // indirect | ||||
| 	gorm.io/driver/mysql v1.4.7 | ||||
| 	gorm.io/driver/postgres v1.4.8 | ||||
| 	gorm.io/driver/sqlite v1.4.4 | ||||
| 	gorm.io/driver/sqlserver v1.4.2 | ||||
| 	gorm.io/gorm v1.24.5 | ||||
| 	gorm.io/gorm v1.24.6 | ||||
| ) | ||||
| 
 | ||||
| replace gorm.io/gorm => ../ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu