gorm/field.go

57 lines
1.1 KiB
Go
Raw Normal View History

2013-11-14 17:26:02 +04:00
package gorm
import (
"database/sql"
"errors"
2013-11-15 07:36:27 +04:00
"reflect"
2013-11-14 17:26:02 +04:00
)
type Field struct {
2015-02-15 18:01:09 +03:00
*StructField
2015-02-16 07:04:46 +03:00
IsBlank bool
Field reflect.Value
2014-01-26 15:34:06 +04:00
}
2014-09-02 15:03:01 +04:00
func (field *Field) Set(value interface{}) (err error) {
if !field.Field.IsValid() {
return errors.New("field value not valid")
2014-09-02 15:03:01 +04:00
}
if !field.Field.CanAddr() {
return errors.New("field value not addressable")
}
if rvalue, ok := value.(reflect.Value); ok {
value = rvalue.Interface()
2014-09-02 15:03:01 +04:00
}
if scanner, ok := field.Field.Addr().Interface().(sql.Scanner); ok {
scanner.Scan(value)
} else if reflect.TypeOf(value).ConvertibleTo(field.Field.Type()) {
field.Field.Set(reflect.ValueOf(value).Convert(field.Field.Type()))
} else {
return errors.New("could not convert argument")
}
field.IsBlank = isBlank(field.Field)
2014-09-02 15:03:01 +04:00
return
}
2015-02-15 18:01:09 +03:00
type relationship struct {
JoinTable string
ForeignKey string
ForeignType string
AssociationForeignKey string
Kind string
}
// FIXME
func (r relationship) ForeignDBName() string {
return ToSnake(r.ForeignKey)
}
func (r relationship) AssociationForeignDBName(name string) string {
return ToSnake(r.AssociationForeignKey)
}