Skip to content

Commit

Permalink
fix relationship.go maybe nil panic
Browse files Browse the repository at this point in the history
  • Loading branch information
demoManito committed Sep 26, 2022
1 parent 328f301 commit 118cf28
Showing 1 changed file with 50 additions and 40 deletions.
90 changes: 50 additions & 40 deletions schema/relationship.go
Expand Up @@ -152,36 +152,42 @@ func (schema *Schema) buildPolymorphicRelation(relation *Relationship, field *Fi
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 {
relation.References = append(relation.References, &Reference{
PrimaryValue: relation.Polymorphic.Value,
ForeignKey: relation.Polymorphic.PolymorphicType,
})
relation.Type = has

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 %s", relation.foreignKeys, schema, field.Name)
}
}
if schema.err != nil {
return
}

// use same data type for foreign keys
if copyableDataType(primaryKeyField.DataType) {
relation.Polymorphic.PolymorphicID.DataType = primaryKeyField.DataType
}
relation.Polymorphic.PolymorphicID.GORMDataType = primaryKeyField.GORMDataType
if relation.Polymorphic.PolymorphicID.Size == 0 {
relation.Polymorphic.PolymorphicID.Size = primaryKeyField.Size
relation.References = append(relation.References, &Reference{
PrimaryValue: relation.Polymorphic.Value,
ForeignKey: relation.Polymorphic.PolymorphicType,
})

primaryKeyField := schema.PrioritizedPrimaryField
if len(relation.foreignKeys) > 0 {
primaryKeyField = schema.LookUpField(relation.foreignKeys[0])
if primaryKeyField == nil || len(relation.foreignKeys) > 1 {
schema.err = fmt.Errorf("invalid polymorphic foreign keys %+v for %v on field %s", relation.foreignKeys, schema, field.Name)
}
}
if primaryKeyField == nil {
return
}

relation.References = append(relation.References, &Reference{
PrimaryKey: primaryKeyField,
ForeignKey: relation.Polymorphic.PolymorphicID,
OwnPrimaryKey: true,
})
// use same data type for foreign keys
if copyableDataType(primaryKeyField.DataType) {
relation.Polymorphic.PolymorphicID.DataType = primaryKeyField.DataType
}
relation.Polymorphic.PolymorphicID.GORMDataType = primaryKeyField.GORMDataType
if relation.Polymorphic.PolymorphicID.Size == 0 {
relation.Polymorphic.PolymorphicID.Size = primaryKeyField.Size
}

relation.Type = has
relation.References = append(relation.References, &Reference{
PrimaryKey: primaryKeyField,
ForeignKey: relation.Polymorphic.PolymorphicID,
OwnPrimaryKey: true,
})
}

func (schema *Schema) buildMany2ManyRelation(relation *Relationship, field *Field, many2many string) {
Expand Down Expand Up @@ -429,7 +435,6 @@ func (schema *Schema) guessRelation(relation *Relationship, field *Field, cgl gu
}
}
} else {
var primaryFields []*Field
var primarySchemaName = primarySchema.Name
if primarySchemaName == "" {
primarySchemaName = relation.FieldSchema.Name
Expand Down Expand Up @@ -466,32 +471,37 @@ func (schema *Schema) guessRelation(relation *Relationship, field *Field, cgl gu
}
}

if len(foreignFields) == 0 {
switch {
case len(foreignFields) == 0 || len(primaryFields) == 0:
reguessOrErr()
return
} else if len(relation.primaryKeys) > 0 {
case len(relation.primaryKeys) > 0:
for idx, primaryKey := range relation.primaryKeys {
if f := primarySchema.LookUpField(primaryKey); f != nil {
if len(primaryFields) < idx+1 {
primaryFields = append(primaryFields, f)
} else if f != primaryFields[idx] {
reguessOrErr()
return
}
} else {
f := primarySchema.LookUpField(primaryKey)
if f == nil {
reguessOrErr()
return
}
if len(primaryFields) < idx+1 {
primaryFields = append(primaryFields, f)
continue
}
if f != primaryFields[idx] {
reguessOrErr()
return
}
}
} else if len(primaryFields) == 0 {
default:
if len(foreignFields) == 1 && primarySchema.PrioritizedPrimaryField != nil {
primaryFields = append(primaryFields, primarySchema.PrioritizedPrimaryField)
} else if len(primarySchema.PrimaryFields) == len(foreignFields) {
break
}
if len(primarySchema.PrimaryFields) == len(foreignFields) {
primaryFields = append(primaryFields, primarySchema.PrimaryFields...)
} else {
reguessOrErr()
return
break
}
reguessOrErr()
return
}

// build references
Expand Down

0 comments on commit 118cf28

Please sign in to comment.