forked from mirror/gorm
Fix mysql tests
This commit is contained in:
parent
d05128be78
commit
6f4602af11
|
@ -101,7 +101,11 @@ func preload(db *gorm.DB, rels []*schema.Relationship, conds []interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, data := range identityMap[utils.ToStringKey(fieldValues...)] {
|
for _, data := range identityMap[utils.ToStringKey(fieldValues...)] {
|
||||||
reflectFieldValue := reflect.Indirect(rel.Field.ReflectValueOf(data))
|
reflectFieldValue := rel.Field.ReflectValueOf(data)
|
||||||
|
if reflectFieldValue.Kind() == reflect.Ptr && reflectFieldValue.IsNil() {
|
||||||
|
reflectFieldValue.Set(reflect.New(rel.Field.FieldType.Elem()))
|
||||||
|
}
|
||||||
|
reflectFieldValue = reflect.Indirect(reflectFieldValue)
|
||||||
switch reflectFieldValue.Kind() {
|
switch reflectFieldValue.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
rel.Field.Set(data, reflectResults.Index(i).Interface())
|
rel.Field.Set(data, reflectResults.Index(i).Interface())
|
||||||
|
|
|
@ -78,7 +78,7 @@ func New(writer Writer, config Config) Interface {
|
||||||
traceErrStr = RedBold + "%s " + MagentaBold + "%s\n" + Reset + Yellow + "[%.3fms] " + Blue + "[rows:%d]" + Reset + " %s"
|
traceErrStr = RedBold + "%s " + MagentaBold + "%s\n" + Reset + Yellow + "[%.3fms] " + Blue + "[rows:%d]" + Reset + " %s"
|
||||||
}
|
}
|
||||||
|
|
||||||
return logger{
|
return &logger{
|
||||||
Writer: writer,
|
Writer: writer,
|
||||||
Config: config,
|
Config: config,
|
||||||
infoStr: infoStr,
|
infoStr: infoStr,
|
||||||
|
@ -98,7 +98,7 @@ type logger struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogMode log mode
|
// LogMode log mode
|
||||||
func (l logger) LogMode(level LogLevel) Interface {
|
func (l *logger) LogMode(level LogLevel) Interface {
|
||||||
l.LogLevel = level
|
l.LogLevel = level
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
8
scan.go
8
scan.go
|
@ -87,6 +87,10 @@ func Scan(rows *sql.Rows, db *DB, initialized bool) {
|
||||||
values[idx] = field.ReflectValueOf(elem).Addr().Interface()
|
values[idx] = field.ReflectValueOf(elem).Addr().Interface()
|
||||||
} else if joinFields[idx][0] != nil {
|
} else if joinFields[idx][0] != nil {
|
||||||
relValue := joinFields[idx][0].ReflectValueOf(elem)
|
relValue := joinFields[idx][0].ReflectValueOf(elem)
|
||||||
|
if relValue.Kind() == reflect.Ptr && relValue.IsNil() {
|
||||||
|
relValue.Set(reflect.New(relValue.Type().Elem()))
|
||||||
|
}
|
||||||
|
|
||||||
values[idx] = joinFields[idx][1].ReflectValueOf(relValue).Addr().Interface()
|
values[idx] = joinFields[idx][1].ReflectValueOf(relValue).Addr().Interface()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,6 +114,10 @@ func Scan(rows *sql.Rows, db *DB, initialized bool) {
|
||||||
if rel, ok := db.Statement.Schema.Relationships.Relations[names[0]]; ok {
|
if rel, ok := db.Statement.Schema.Relationships.Relations[names[0]]; ok {
|
||||||
relValue := rel.Field.ReflectValueOf(db.Statement.ReflectValue)
|
relValue := rel.Field.ReflectValueOf(db.Statement.ReflectValue)
|
||||||
if field := rel.FieldSchema.LookUpField(strings.Join(names[1:], "__")); field != nil && field.Readable {
|
if field := rel.FieldSchema.LookUpField(strings.Join(names[1:], "__")); field != nil && field.Readable {
|
||||||
|
if relValue.Kind() == reflect.Ptr && relValue.IsNil() {
|
||||||
|
relValue.Set(reflect.New(relValue.Type().Elem()))
|
||||||
|
}
|
||||||
|
|
||||||
values[idx] = field.ReflectValueOf(relValue).Addr().Interface()
|
values[idx] = field.ReflectValueOf(relValue).Addr().Interface()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -353,9 +353,6 @@ func (field *Field) setupValuerAndSetter() {
|
||||||
if field.FieldType.Kind() == reflect.Ptr {
|
if field.FieldType.Kind() == reflect.Ptr {
|
||||||
field.ReflectValueOf = func(value reflect.Value) reflect.Value {
|
field.ReflectValueOf = func(value reflect.Value) reflect.Value {
|
||||||
fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0])
|
fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0])
|
||||||
if fieldValue.IsNil() {
|
|
||||||
fieldValue.Set(reflect.New(field.FieldType.Elem()))
|
|
||||||
}
|
|
||||||
return fieldValue
|
return fieldValue
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -406,7 +403,14 @@ func (field *Field) setupValuerAndSetter() {
|
||||||
return setter(value, v)
|
return setter(value, v)
|
||||||
}
|
}
|
||||||
} else if field.FieldType.Kind() == reflect.Ptr && reflectV.Type().ConvertibleTo(field.FieldType.Elem()) {
|
} else if field.FieldType.Kind() == reflect.Ptr && reflectV.Type().ConvertibleTo(field.FieldType.Elem()) {
|
||||||
field.ReflectValueOf(value).Elem().Set(reflectV.Convert(field.FieldType.Elem()))
|
fieldValue := field.ReflectValueOf(value)
|
||||||
|
if fieldValue.IsNil() {
|
||||||
|
if v == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fieldValue.Set(reflect.New(field.FieldType.Elem()))
|
||||||
|
}
|
||||||
|
fieldValue.Elem().Set(reflectV.Convert(field.FieldType.Elem()))
|
||||||
} else if reflectV.Kind() == reflect.Ptr {
|
} else if reflectV.Kind() == reflect.Ptr {
|
||||||
return field.Set(value, reflectV.Elem().Interface())
|
return field.Set(value, reflectV.Elem().Interface())
|
||||||
} else {
|
} else {
|
||||||
|
@ -607,12 +611,26 @@ func (field *Field) setupValuerAndSetter() {
|
||||||
field.Set = func(value reflect.Value, v interface{}) error {
|
field.Set = func(value reflect.Value, v interface{}) error {
|
||||||
switch data := v.(type) {
|
switch data := v.(type) {
|
||||||
case time.Time:
|
case time.Time:
|
||||||
field.ReflectValueOf(value).Elem().Set(reflect.ValueOf(v))
|
fieldValue := field.ReflectValueOf(value)
|
||||||
|
if fieldValue.IsNil() {
|
||||||
|
if v == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fieldValue.Set(reflect.New(field.FieldType.Elem()))
|
||||||
|
}
|
||||||
|
fieldValue.Elem().Set(reflect.ValueOf(v))
|
||||||
case *time.Time:
|
case *time.Time:
|
||||||
field.ReflectValueOf(value).Set(reflect.ValueOf(v))
|
field.ReflectValueOf(value).Set(reflect.ValueOf(v))
|
||||||
case string:
|
case string:
|
||||||
if t, err := now.Parse(data); err == nil {
|
if t, err := now.Parse(data); err == nil {
|
||||||
field.ReflectValueOf(value).Elem().Set(reflect.ValueOf(t))
|
fieldValue := field.ReflectValueOf(value)
|
||||||
|
if fieldValue.IsNil() {
|
||||||
|
if v == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fieldValue.Set(reflect.New(field.FieldType.Elem()))
|
||||||
|
}
|
||||||
|
fieldValue.Elem().Set(reflect.ValueOf(t))
|
||||||
} else {
|
} 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 %v, failed to parse it as time, got error %v", v, field.Name, err)
|
||||||
}
|
}
|
||||||
|
@ -651,7 +669,14 @@ func (field *Field) setupValuerAndSetter() {
|
||||||
if reflectV.Type().ConvertibleTo(field.FieldType) {
|
if reflectV.Type().ConvertibleTo(field.FieldType) {
|
||||||
field.ReflectValueOf(value).Set(reflectV.Convert(field.FieldType))
|
field.ReflectValueOf(value).Set(reflectV.Convert(field.FieldType))
|
||||||
} else if reflectV.Type().ConvertibleTo(field.FieldType.Elem()) {
|
} else if reflectV.Type().ConvertibleTo(field.FieldType.Elem()) {
|
||||||
field.ReflectValueOf(value).Elem().Set(reflectV.Convert(field.FieldType.Elem()))
|
fieldValue := field.ReflectValueOf(value)
|
||||||
|
if fieldValue.IsNil() {
|
||||||
|
if v == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
fieldValue.Set(reflect.New(field.FieldType.Elem()))
|
||||||
|
}
|
||||||
|
fieldValue.Elem().Set(reflectV.Convert(field.FieldType.Elem()))
|
||||||
} else if valuer, ok := v.(driver.Valuer); ok {
|
} else if valuer, ok := v.(driver.Valuer); ok {
|
||||||
if v, err = valuer.Value(); err == nil {
|
if v, err = valuer.Value(); err == nil {
|
||||||
err = field.ReflectValueOf(value).Interface().(sql.Scanner).Scan(v)
|
err = field.ReflectValueOf(value).Interface().(sql.Scanner).Scan(v)
|
||||||
|
|
Loading…
Reference in New Issue