From 2498a032f0b049b4beaa94ec059fe0fad4c98f68 Mon Sep 17 00:00:00 2001 From: Nash Tsai Date: Thu, 2 Jan 2014 12:19:30 +0800 Subject: [PATCH] uncomment row2bean cascade handling --- session.go | 60 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/session.go b/session.go index 84e57f7f..a9bd4470 100644 --- a/session.go +++ b/session.go @@ -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: hasAssigned = true 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 case reflect.Struct: @@ -1481,36 +1484,35 @@ func (session *Session) row2Bean(rows *sql.Rows, fields []string, fieldsCount in hasAssigned = true 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: // !nashtsai! TODO merge duplicated codes above //typeStr := fieldType.String()