fmt.Errorf adjust and Optimize for-break
This commit is contained in:
		
							parent
							
								
									942a65f5e4
								
							
						
					
					
						commit
						52d2d75685
					
				@ -26,7 +26,7 @@ func (db *DB) Association(column string) *Association {
 | 
			
		||||
		association.Relationship = db.Statement.Schema.Relationships.Relations[column]
 | 
			
		||||
 | 
			
		||||
		if association.Relationship == nil {
 | 
			
		||||
			association.Error = fmt.Errorf("%w: %v", ErrUnsupportedRelation, column)
 | 
			
		||||
			association.Error = fmt.Errorf("%w: %s", ErrUnsupportedRelation, column)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		db.Statement.ReflectValue = reflect.ValueOf(db.Statement.Model)
 | 
			
		||||
@ -355,7 +355,7 @@ func (association *Association) saveAssociation(clear bool, values ...interface{
 | 
			
		||||
				} else if ev.Type().Elem().AssignableTo(elemType) {
 | 
			
		||||
					fieldValue = reflect.Append(fieldValue, ev.Elem())
 | 
			
		||||
				} else {
 | 
			
		||||
					association.Error = fmt.Errorf("unsupported data type: %v for relation %v", ev.Type(), association.Relationship.Name)
 | 
			
		||||
					association.Error = fmt.Errorf("unsupported data type: %v for relation %s", ev.Type(), association.Relationship.Name)
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if elemType.Kind() == reflect.Struct {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								callbacks.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								callbacks.go
									
									
									
									
									
								
							@ -212,7 +212,7 @@ func (c *callback) Register(name string, fn func(*DB)) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *callback) Remove(name string) error {
 | 
			
		||||
	c.processor.db.Logger.Warn(context.Background(), "removing callback `%v` from %v\n", name, utils.FileWithLineNum())
 | 
			
		||||
	c.processor.db.Logger.Warn(context.Background(), "removing callback `%s` from %s\n", name, utils.FileWithLineNum())
 | 
			
		||||
	c.name = name
 | 
			
		||||
	c.remove = true
 | 
			
		||||
	c.processor.callbacks = append(c.processor.callbacks, c)
 | 
			
		||||
@ -220,7 +220,7 @@ func (c *callback) Remove(name string) error {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *callback) Replace(name string, fn func(*DB)) error {
 | 
			
		||||
	c.processor.db.Logger.Info(context.Background(), "replacing callback `%v` from %v\n", name, utils.FileWithLineNum())
 | 
			
		||||
	c.processor.db.Logger.Info(context.Background(), "replacing callback `%s` from %s\n", name, utils.FileWithLineNum())
 | 
			
		||||
	c.name = name
 | 
			
		||||
	c.handler = fn
 | 
			
		||||
	c.replace = true
 | 
			
		||||
@ -250,7 +250,7 @@ func sortCallbacks(cs []*callback) (fns []func(*DB), err error) {
 | 
			
		||||
	for _, c := range cs {
 | 
			
		||||
		// show warning message the callback name already exists
 | 
			
		||||
		if idx := getRIndex(names, c.name); idx > -1 && !c.replace && !c.remove && !cs[idx].remove {
 | 
			
		||||
			c.processor.db.Logger.Warn(context.Background(), "duplicated callback `%v` from %v\n", c.name, utils.FileWithLineNum())
 | 
			
		||||
			c.processor.db.Logger.Warn(context.Background(), "duplicated callback `%s` from %s\n", c.name, utils.FileWithLineNum())
 | 
			
		||||
		}
 | 
			
		||||
		names = append(names, c.name)
 | 
			
		||||
	}
 | 
			
		||||
@ -266,7 +266,7 @@ func sortCallbacks(cs []*callback) (fns []func(*DB), err error) {
 | 
			
		||||
					// if before callback already sorted, append current callback just after it
 | 
			
		||||
					sorted = append(sorted[:sortedIdx], append([]string{c.name}, sorted[sortedIdx:]...)...)
 | 
			
		||||
				} else if curIdx > sortedIdx {
 | 
			
		||||
					return fmt.Errorf("conflicting callback %v with before %v", c.name, c.before)
 | 
			
		||||
					return fmt.Errorf("conflicting callback %s with before %s", c.name, c.before)
 | 
			
		||||
				}
 | 
			
		||||
			} else if idx := getRIndex(names, c.before); idx != -1 {
 | 
			
		||||
				// if before callback exists
 | 
			
		||||
@ -284,7 +284,7 @@ func sortCallbacks(cs []*callback) (fns []func(*DB), err error) {
 | 
			
		||||
					// if after callback sorted, append current callback to last
 | 
			
		||||
					sorted = append(sorted, c.name)
 | 
			
		||||
				} else if curIdx < sortedIdx {
 | 
			
		||||
					return fmt.Errorf("conflicting callback %v with before %v", c.name, c.after)
 | 
			
		||||
					return fmt.Errorf("conflicting callback %s with before %s", c.name, c.after)
 | 
			
		||||
				}
 | 
			
		||||
			} else if idx := getRIndex(names, c.after); idx != -1 {
 | 
			
		||||
				// if after callback exists but haven't sorted
 | 
			
		||||
 | 
			
		||||
@ -190,16 +190,17 @@ func (db *DB) FindInBatches(dest interface{}, batchSize int, fc func(tx *DB, bat
 | 
			
		||||
 | 
			
		||||
		if tx.Error != nil || int(result.RowsAffected) < batchSize {
 | 
			
		||||
			break
 | 
			
		||||
		} else {
 | 
			
		||||
			resultsValue := reflect.Indirect(reflect.ValueOf(dest))
 | 
			
		||||
			if result.Statement.Schema.PrioritizedPrimaryField == nil {
 | 
			
		||||
				tx.AddError(ErrPrimaryKeyRequired)
 | 
			
		||||
				break
 | 
			
		||||
			} else {
 | 
			
		||||
				primaryValue, _ := result.Statement.Schema.PrioritizedPrimaryField.ValueOf(resultsValue.Index(resultsValue.Len() - 1))
 | 
			
		||||
				queryDB = tx.Clauses(clause.Gt{Column: clause.Column{Table: clause.CurrentTable, Name: clause.PrimaryKey}, Value: primaryValue})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Optimize for-break
 | 
			
		||||
		resultsValue := reflect.Indirect(reflect.ValueOf(dest))
 | 
			
		||||
		if result.Statement.Schema.PrioritizedPrimaryField == nil {
 | 
			
		||||
			tx.AddError(ErrPrimaryKeyRequired)
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		primaryValue, _ := result.Statement.Schema.PrioritizedPrimaryField.ValueOf(resultsValue.Index(resultsValue.Len() - 1))
 | 
			
		||||
		queryDB = tx.Clauses(clause.Gt{Column: clause.Column{Table: clause.CurrentTable, Name: clause.PrimaryKey}, Value: primaryValue})
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tx.RowsAffected = rowsAffected
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								gorm.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								gorm.go
									
									
									
									
									
								
							@ -409,7 +409,7 @@ func (db *DB) SetupJoinTable(model interface{}, field string, joinTable interfac
 | 
			
		||||
				}
 | 
			
		||||
				ref.ForeignKey = f
 | 
			
		||||
			} else {
 | 
			
		||||
				return fmt.Errorf("missing field %v for join table", ref.ForeignKey.DBName)
 | 
			
		||||
				return fmt.Errorf("missing field %s for join table", ref.ForeignKey.DBName)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -422,7 +422,7 @@ func (db *DB) SetupJoinTable(model interface{}, field string, joinTable interfac
 | 
			
		||||
 | 
			
		||||
		relation.JoinTable = joinSchema
 | 
			
		||||
	} else {
 | 
			
		||||
		return fmt.Errorf("failed to found relation: %v", field)
 | 
			
		||||
		return fmt.Errorf("failed to found relation: %s", field)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
 | 
			
		||||
@ -198,28 +198,28 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
 | 
			
		||||
		field.DataType = Bool
 | 
			
		||||
		if field.HasDefaultValue && !skipParseDefaultValue {
 | 
			
		||||
			if field.DefaultValueInterface, err = strconv.ParseBool(field.DefaultValue); err != nil {
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %v as default value for bool, got error: %v", field.DefaultValue, err)
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %s as default value for bool, got error: %v", field.DefaultValue, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
 | 
			
		||||
		field.DataType = Int
 | 
			
		||||
		if field.HasDefaultValue && !skipParseDefaultValue {
 | 
			
		||||
			if field.DefaultValueInterface, err = strconv.ParseInt(field.DefaultValue, 0, 64); err != nil {
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %v as default value for int, got error: %v", field.DefaultValue, err)
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %s as default value for int, got error: %v", field.DefaultValue, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
 | 
			
		||||
		field.DataType = Uint
 | 
			
		||||
		if field.HasDefaultValue && !skipParseDefaultValue {
 | 
			
		||||
			if field.DefaultValueInterface, err = strconv.ParseUint(field.DefaultValue, 0, 64); err != nil {
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %v as default value for uint, got error: %v", field.DefaultValue, err)
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %s as default value for uint, got error: %v", field.DefaultValue, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Float32, reflect.Float64:
 | 
			
		||||
		field.DataType = Float
 | 
			
		||||
		if field.HasDefaultValue && !skipParseDefaultValue {
 | 
			
		||||
			if field.DefaultValueInterface, err = strconv.ParseFloat(field.DefaultValue, 64); err != nil {
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %v as default value for float, got error: %v", field.DefaultValue, err)
 | 
			
		||||
				schema.err = fmt.Errorf("failed to parse %s as default value for float, got error: %v", field.DefaultValue, err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.String:
 | 
			
		||||
@ -227,7 +227,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
 | 
			
		||||
 | 
			
		||||
		if field.HasDefaultValue && !skipParseDefaultValue {
 | 
			
		||||
			field.DefaultValue = strings.Trim(field.DefaultValue, "'")
 | 
			
		||||
			field.DefaultValue = strings.Trim(field.DefaultValue, "\"")
 | 
			
		||||
			field.DefaultValue = strings.Trim(field.DefaultValue, `\"`)
 | 
			
		||||
			field.DefaultValueInterface = field.DefaultValue
 | 
			
		||||
		}
 | 
			
		||||
	case reflect.Struct:
 | 
			
		||||
@ -392,7 +392,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			schema.err = fmt.Errorf("invalid embedded struct for %v's field %v, should be struct, but got %v", field.Schema.Name, field.Name, field.FieldType)
 | 
			
		||||
			schema.err = fmt.Errorf("invalid embedded struct for %s's field %s, should be struct, but got %v", field.Schema.Name, field.Name, field.FieldType)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -736,7 +736,7 @@ func (field *Field) setupValuerAndSetter() {
 | 
			
		||||
					if t, err := now.Parse(data); err == nil {
 | 
			
		||||
						field.ReflectValueOf(value).Set(reflect.ValueOf(t))
 | 
			
		||||
					} else {
 | 
			
		||||
						return fmt.Errorf("failed to set string %v to time.Time field %v, failed to parse it as time, got error %v", v, field.Name, err)
 | 
			
		||||
						return fmt.Errorf("failed to set string %v to time.Time field %s, failed to parse it as time, got error %v", v, field.Name, err)
 | 
			
		||||
					}
 | 
			
		||||
				default:
 | 
			
		||||
					return fallbackSetter(value, v, field.Set)
 | 
			
		||||
@ -765,7 +765,7 @@ func (field *Field) setupValuerAndSetter() {
 | 
			
		||||
						}
 | 
			
		||||
						fieldValue.Elem().Set(reflect.ValueOf(t))
 | 
			
		||||
					} else {
 | 
			
		||||
						return fmt.Errorf("failed to set string %v to time.Time field %v, failed to parse it as time, got error %v", v, field.Name, err)
 | 
			
		||||
						return fmt.Errorf("failed to set string %v to time.Time field %s, failed to parse it as time, got error %v", v, field.Name, err)
 | 
			
		||||
					}
 | 
			
		||||
				default:
 | 
			
		||||
					return fallbackSetter(value, v, field.Set)
 | 
			
		||||
 | 
			
		||||
@ -74,7 +74,9 @@ func (ns NamingStrategy) IndexName(table, column string) string {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ns NamingStrategy) formatName(prefix, table, name string) string {
 | 
			
		||||
	formattedName := strings.Replace(fmt.Sprintf("%v_%v_%v", prefix, table, name), ".", "_", -1)
 | 
			
		||||
	formattedName := strings.Replace(strings.Join([]string{
 | 
			
		||||
		prefix, table, name,
 | 
			
		||||
	}, "_"), ".", "_", -1)
 | 
			
		||||
 | 
			
		||||
	if utf8.RuneCountInString(formattedName) > 64 {
 | 
			
		||||
		h := sha1.New()
 | 
			
		||||
 | 
			
		||||
@ -85,7 +85,7 @@ func (schema *Schema) parseRelation(field *Field) *Relationship {
 | 
			
		||||
		case reflect.Slice:
 | 
			
		||||
			schema.guessRelation(relation, field, guessHas)
 | 
			
		||||
		default:
 | 
			
		||||
			schema.err = fmt.Errorf("unsupported data type %v for %v on field %v", relation.FieldSchema, schema, field.Name)
 | 
			
		||||
			schema.err = fmt.Errorf("unsupported data type %v for %v on field %s", relation.FieldSchema, schema, field.Name)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -143,11 +143,11 @@ func (schema *Schema) buildPolymorphicRelation(relation *Relationship, field *Fi
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if relation.Polymorphic.PolymorphicType == nil {
 | 
			
		||||
		schema.err = fmt.Errorf("invalid polymorphic type %v for %v on field %v, missing field %v", relation.FieldSchema, schema, field.Name, polymorphic+"Type")
 | 
			
		||||
		schema.err = fmt.Errorf("invalid polymorphic type %v for %v on field %s, missing field %s", relation.FieldSchema, schema, field.Name, polymorphic+"Type")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if relation.Polymorphic.PolymorphicID == nil {
 | 
			
		||||
		schema.err = fmt.Errorf("invalid polymorphic type %v for %v on field %v, missing field %v", relation.FieldSchema, schema, field.Name, polymorphic+"ID")
 | 
			
		||||
		schema.err = fmt.Errorf("invalid polymorphic type %v for %v on field %s, missing field %s", relation.FieldSchema, schema, field.Name, polymorphic+"ID")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if schema.err == nil {
 | 
			
		||||
@ -159,7 +159,7 @@ func (schema *Schema) buildPolymorphicRelation(relation *Relationship, field *Fi
 | 
			
		||||
		primaryKeyField := schema.PrioritizedPrimaryField
 | 
			
		||||
		if len(relation.foreignKeys) > 0 {
 | 
			
		||||
			if primaryKeyField = schema.LookUpField(relation.foreignKeys[0]); primaryKeyField == nil || len(relation.foreignKeys) > 1 {
 | 
			
		||||
				schema.err = fmt.Errorf("invalid polymorphic foreign keys %+v for %v on field %v", relation.foreignKeys, schema, field.Name)
 | 
			
		||||
				schema.err = fmt.Errorf("invalid polymorphic foreign keys %+v for %v on field %s", relation.foreignKeys, schema, field.Name)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -203,7 +203,7 @@ func (schema *Schema) buildMany2ManyRelation(relation *Relationship, field *Fiel
 | 
			
		||||
			if field := schema.LookUpField(foreignKey); field != nil {
 | 
			
		||||
				ownForeignFields = append(ownForeignFields, field)
 | 
			
		||||
			} else {
 | 
			
		||||
				schema.err = fmt.Errorf("invalid foreign key: %v", foreignKey)
 | 
			
		||||
				schema.err = fmt.Errorf("invalid foreign key: %s", foreignKey)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -215,7 +215,7 @@ func (schema *Schema) buildMany2ManyRelation(relation *Relationship, field *Fiel
 | 
			
		||||
			if field := relation.FieldSchema.LookUpField(foreignKey); field != nil {
 | 
			
		||||
				refForeignFields = append(refForeignFields, field)
 | 
			
		||||
			} else {
 | 
			
		||||
				schema.err = fmt.Errorf("invalid foreign key: %v", foreignKey)
 | 
			
		||||
				schema.err = fmt.Errorf("invalid foreign key: %s", foreignKey)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -379,7 +379,7 @@ func (schema *Schema) guessRelation(relation *Relationship, field *Field, cgl gu
 | 
			
		||||
			schema.guessRelation(relation, field, guessEmbeddedHas)
 | 
			
		||||
		// case guessEmbeddedHas:
 | 
			
		||||
		default:
 | 
			
		||||
			schema.err = fmt.Errorf("invalid field found for struct %v's field %v: define a valid foreign key for relations or implement the Valuer/Scanner interface", schema, field.Name)
 | 
			
		||||
			schema.err = fmt.Errorf("invalid field found for struct %v's field %s: define a valid foreign key for relations or implement the Valuer/Scanner interface", schema, field.Name)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -86,7 +86,7 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
 | 
			
		||||
		if modelType.PkgPath() == "" {
 | 
			
		||||
			return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
 | 
			
		||||
		}
 | 
			
		||||
		return nil, fmt.Errorf("%w: %v.%v", ErrUnsupportedDataType, modelType.PkgPath(), modelType.Name())
 | 
			
		||||
		return nil, fmt.Errorf("%w: %s.%s", ErrUnsupportedDataType, modelType.PkgPath(), modelType.Name())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if v, ok := cacheStore.Load(modelType); ok {
 | 
			
		||||
@ -275,7 +275,7 @@ func getOrParse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, e
 | 
			
		||||
		if modelType.PkgPath() == "" {
 | 
			
		||||
			return nil, fmt.Errorf("%w: %+v", ErrUnsupportedDataType, dest)
 | 
			
		||||
		}
 | 
			
		||||
		return nil, fmt.Errorf("%w: %v.%v", ErrUnsupportedDataType, modelType.PkgPath(), modelType.Name())
 | 
			
		||||
		return nil, fmt.Errorf("%w: %s.%s", ErrUnsupportedDataType, modelType.PkgPath(), modelType.Name())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if v, ok := cacheStore.Load(modelType); ok {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user