Prevent panic for fields that implement the sql.Scanner interface but are not structs.

Example:

type NamedInt int64
func (i *NamedInt) Scan(src interface{}) error {
        v := reflect.ValueOf(src)
        if v.Kind() != reflect.Int64 {
                return errors.New("Cannot scan NamedInt from " + v.String())
        }
        *i = NamedInt(v.Int())
        return nil
}

The model:

type Model struct {
	NamedInt NamedInt `sql:"type:bigint"`
}

Currently, the NamedInt field causes gorm to panic. This change allows it to work as expected.
This commit is contained in:
Timothy Stranex 2014-03-15 21:55:40 +02:00
parent dc2f27401e
commit 27a03477f4
2 changed files with 12 additions and 1 deletions

View File

@ -22,6 +22,16 @@ type IgnoredEmbedStruct struct {
Name string Name string
} }
type NamedInt int64
func (i *NamedInt) Scan(src interface{}) error {
v := reflect.ValueOf(src)
if v.Kind() != reflect.Int64 {
return errors.New("Cannot scan NamedInt from " + v.String())
}
*i = NamedInt(v.Int())
return nil
}
type User struct { type User struct {
Id int64 // Id: Primary key Id int64 // Id: Primary key
Age int64 Age int64
@ -42,6 +52,7 @@ type User struct {
PasswordHash []byte PasswordHash []byte
IgnoreMe int64 `sql:"-"` IgnoreMe int64 `sql:"-"`
IgnoreStringSlice []string `sql:"-"` IgnoreStringSlice []string `sql:"-"`
NamedInt NamedInt `sql:"type:bigint"`
} }
type CreditCard struct { type CreditCard struct {

View File

@ -309,7 +309,7 @@ func (scope *Scope) sqlTagForField(field *Field) (tag string) {
value := field.Value value := field.Value
reflectValue := reflect.ValueOf(value) reflectValue := reflect.ValueOf(value)
if field.IsScanner() { if field.IsScanner() && reflectValue.Kind() == reflect.Struct {
value = reflectValue.Field(0).Interface() value = reflectValue.Field(0).Interface()
} }