uncomment row2bean cascade handling

This commit is contained in:
Nash Tsai 2014-01-02 12:19:30 +08:00
parent 0d15b3549c
commit 2498a032f0
1 changed files with 31 additions and 29 deletions

View File

@ -1473,6 +1473,9 @@ func (session *Session) row2Bean(rows *sql.Rows, fields []string, fieldsCount in
case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
hasAssigned = true hasAssigned = true
fieldValue.SetUint(vv.Uint()) fieldValue.SetUint(vv.Uint())
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
hasAssigned = true
fieldValue.SetUint(uint64(vv.Int()))
} }
//Currently only support Time type //Currently only support Time type
case reflect.Struct: case reflect.Struct:
@ -1481,36 +1484,35 @@ func (session *Session) row2Bean(rows *sql.Rows, fields []string, fieldsCount in
hasAssigned = true hasAssigned = true
fieldValue.Set(rawValue) fieldValue.Set(rawValue)
} }
} else if session.Statement.UseCascade {
table := session.Engine.autoMapType(fieldValue.Type())
if table != nil {
var x int64
if rawValueType.Kind() == reflect.Int64 {
x = vv.Int()
}
if x != 0 {
// !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
// property to be fetched lazily
structInter := reflect.New(fieldValue.Type())
newsession := session.Engine.NewSession()
defer newsession.Close()
has, err := newsession.Id(x).Get(structInter.Interface())
if err != nil {
return err
}
if has {
v := structInter.Elem().Interface()
fieldValue.Set(reflect.ValueOf(v))
} else {
return errors.New("cascade obj is not exist!")
}
}
} else {
session.Engine.LogError("unsupported struct type in Scan: ", fieldValue.Type().String())
}
} }
// else if session.Statement.UseCascade { // TODO
// table := session.Engine.autoMapType(fieldValue.Type())
// if table != nil {
// x, err := strconv.ParseInt(string(data), 10, 64)
// if err != nil {
// return errors.New("arg " + key + " as int: " + er1r.Error())
// }
// if x != 0 {
// // !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
// // property to be fetched lazily
// structInter := reflect.New(fieldValue.Type())
// newsession := session.Engine.NewSession()
// defer newsession.Close()
// has, err := newsession.Id(x).Get(structInter.Interface())
// if err != nil {
// return err
// }
// if has {
// v = structInter.Elem().Interface()
// fieldValue.Set(reflect.ValueOf(v))
// } else {
// return errors.New("cascade obj is not exist!")
// }
// }
// } else {
// session.Engine.LogError("unsupported struct type in Scan: ", fieldValue.Type().String())
// }
// }
case reflect.Ptr: case reflect.Ptr:
// !nashtsai! TODO merge duplicated codes above // !nashtsai! TODO merge duplicated codes above
//typeStr := fieldType.String() //typeStr := fieldType.String()