fix tests

This commit is contained in:
Lunny Xiao 2021-06-16 17:05:32 +08:00
parent 23a143717c
commit 2acd543562
4 changed files with 27 additions and 9 deletions

View File

@ -450,7 +450,7 @@ func (session *Session) row2Slice(rows *core.Rows, types []*sql.ColumnType, fiel
} }
// convertAssign converts an interface src to dst reflect.Value fieldValue // convertAssign converts an interface src to dst reflect.Value fieldValue
func (session *Session) convertAssign(fieldValue *reflect.Value, columnName string, src interface{}, table *schemas.Table, pk *schemas.PK, idx int) error { func (session *Session) convertAssign(fieldValue *reflect.Value, columnName string, src interface{}, col *schemas.Column) error {
if fieldValue == nil { if fieldValue == nil {
return nil return nil
} }
@ -532,10 +532,6 @@ func (session *Session) convertAssign(fieldValue *reflect.Value, columnName stri
rawValueType := reflect.TypeOf(rawValue.Interface()) rawValueType := reflect.TypeOf(rawValue.Interface())
vv := reflect.ValueOf(rawValue.Interface()) vv := reflect.ValueOf(rawValue.Interface())
col := table.GetColumnIdx(columnName, idx)
if col.IsPrimaryKey {
*pk = append(*pk, rawValue.Interface())
}
fieldType := fieldValue.Type() fieldType := fieldValue.Type()
hasAssigned := false hasAssigned := false
@ -894,13 +890,22 @@ func (session *Session) convertAssign(fieldValue *reflect.Value, columnName stri
// !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch
// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne
// property to be fetched lazily // property to be fetched lazily
structInter := reflect.New(fieldValue.Type()) t := fieldValue.Type()
var isPtr = t.Kind() == reflect.Ptr
if isPtr {
t = t.Elem()
}
structInter := reflect.New(t)
has, err := session.ID(pk).NoCascade().get(structInter.Interface()) has, err := session.ID(pk).NoCascade().get(structInter.Interface())
if err != nil { if err != nil {
return err return err
} }
if has { if has {
fieldValue.Set(structInter.Elem()) if isPtr {
fieldValue.Set(structInter)
} else {
fieldValue.Set(structInter.Elem())
}
} else { } else {
return errors.New("cascade obj is not exist") return errors.New("cascade obj is not exist")
} }
@ -948,10 +953,15 @@ func (session *Session) slice2Bean(scanResults []interface{}, columnNames []stri
} }
continue continue
} }
col := table.GetColumnIdx(columnName, idx)
fmt.Printf("88888====== %#v \n ", scanResults[i]) fmt.Printf("88888====== %#v \n ", scanResults[i])
if err := session.convertAssign(fieldValue, columnName, scanResults[i], table, &pk, idx); err != nil { if err := session.convertAssign(fieldValue, columnName, scanResults[i], col); err != nil {
return nil, err return nil, err
} }
if col.IsPrimaryKey {
pk = append(pk, fieldValue.Interface())
}
} }
return pk, nil return pk, nil
} }

View File

@ -194,6 +194,7 @@ func (session *Session) bytes2Value(col *schemas.Column, fieldValue *reflect.Val
v = x v = x
fieldValue.Set(reflect.ValueOf(v).Convert(fieldType)) fieldValue.Set(reflect.ValueOf(v).Convert(fieldType))
} else if session.statement.UseCascade { } else if session.statement.UseCascade {
fmt.Println("====2222")
table, err := session.engine.tagParser.ParseWithCache(*fieldValue) table, err := session.engine.tagParser.ParseWithCache(*fieldValue)
if err != nil { if err != nil {
return err return err
@ -215,7 +216,7 @@ func (session *Session) bytes2Value(col *schemas.Column, fieldValue *reflect.Val
// !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch // !nashtsai! TODO for hasOne relationship, it's preferred to use join query for eager fetch
// however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne // however, also need to consider adding a 'lazy' attribute to xorm tag which allow hasOne
// property to be fetched lazily // property to be fetched lazily
structInter := reflect.New(fieldValue.Type()) structInter := reflect.New(fieldValue.Elem().Type())
has, err := session.ID(pk).NoCascade().get(structInter.Interface()) has, err := session.ID(pk).NoCascade().get(structInter.Interface())
if err != nil { if err != nil {
return err return err
@ -474,6 +475,7 @@ func (session *Session) bytes2Value(col *schemas.Column, fieldValue *reflect.Val
fieldValue.Set(reflect.ValueOf(&x)) fieldValue.Set(reflect.ValueOf(&x))
default: default:
if session.statement.UseCascade { if session.statement.UseCascade {
fmt.Println("====1111")
structInter := reflect.New(fieldType.Elem()) structInter := reflect.New(fieldType.Elem())
table, err := session.engine.tagParser.ParseWithCache(structInter.Elem()) table, err := session.engine.tagParser.ParseWithCache(structInter.Elem())
if err != nil { if err != nil {

View File

@ -179,12 +179,15 @@ func (session *Session) noCacheFind(table *schemas.Table, containerValue reflect
var newElemFunc func(fields []string) reflect.Value var newElemFunc func(fields []string) reflect.Value
elemType := containerValue.Type().Elem() elemType := containerValue.Type().Elem()
var isPointer bool var isPointer bool
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Ptr {
fmt.Printf("1===== %#v %#v \n", elemType, containerValue.Interface())
isPointer = true isPointer = true
elemType = elemType.Elem() elemType = elemType.Elem()
} }
if elemType.Kind() == reflect.Ptr { if elemType.Kind() == reflect.Ptr {
fmt.Printf("2===== %#v \n", elemType)
return errors.New("pointer to pointer is not supported") return errors.New("pointer to pointer is not supported")
} }

View File

@ -41,6 +41,8 @@ func (session *Session) get(bean interface{}) (bool, error) {
return false, session.statement.LastError return false, session.statement.LastError
} }
fmt.Printf("========11111,,, %#v \n", bean)
beanValue := reflect.ValueOf(bean) beanValue := reflect.ValueOf(bean)
if beanValue.Kind() != reflect.Ptr { if beanValue.Kind() != reflect.Ptr {
return false, errors.New("needs a pointer to a value") return false, errors.New("needs a pointer to a value")
@ -172,6 +174,7 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, table *schemas.Table,
if err != nil { if err != nil {
return true, err return true, err
} }
switch beanKind { switch beanKind {
case reflect.Struct: case reflect.Struct:
if _, ok := bean.(*time.Time); ok { if _, ok := bean.(*time.Time); ok {