From 2498a032f0b049b4beaa94ec059fe0fad4c98f68 Mon Sep 17 00:00:00 2001 From: Nash Tsai Date: Thu, 2 Jan 2014 12:19:30 +0800 Subject: [PATCH 1/4] 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() From bf3f8ffc2f7818dbef9d131ef19cbe8e4e0ed1ee Mon Sep 17 00:00:00 2001 From: Nash Tsai Date: Thu, 2 Jan 2014 12:48:49 +0800 Subject: [PATCH 2/4] tidy up naming --- base_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base_test.go b/base_test.go index 84770168..66631160 100644 --- a/base_test.go +++ b/base_test.go @@ -359,7 +359,7 @@ func updateSameMapper(engine *Engine, t *testing.T) { } } -func testdelete(engine *Engine, t *testing.T) { +func testDelete(engine *Engine, t *testing.T) { user := Userinfo{Uid: 1} cnt, err := engine.Delete(&user) if err != nil { @@ -3788,8 +3788,8 @@ func testAll(engine *Engine, t *testing.T) { insertTwoTable(engine, t) fmt.Println("-------------- update --------------") update(engine, t) - fmt.Println("-------------- testdelete --------------") - testdelete(engine, t) + fmt.Println("-------------- testDelete --------------") + testDelete(engine, t) fmt.Println("-------------- get --------------") get(engine, t) fmt.Println("-------------- cascadeGet --------------") From e95b3bc80771c393576bfd5d5726e40560d2fae7 Mon Sep 17 00:00:00 2001 From: Nash Tsai Date: Thu, 2 Jan 2014 12:49:02 +0800 Subject: [PATCH 3/4] fixed time struct conversion error --- session.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/session.go b/session.go index a9bd4470..1a5474ec 100644 --- a/session.go +++ b/session.go @@ -1477,12 +1477,12 @@ func (session *Session) row2Bean(rows *sql.Rows, fields []string, fieldsCount in hasAssigned = true fieldValue.SetUint(uint64(vv.Int())) } - //Currently only support Time type case reflect.Struct: if fieldType == reflect.TypeOf(c_TIME_DEFAULT) { if rawValueType == reflect.TypeOf(c_TIME_DEFAULT) { hasAssigned = true - fieldValue.Set(rawValue) + session.Engine.LogDebug("fieldValue:", fieldValue, "|rawValue:", rawValue, "|vv:", vv) + fieldValue.Set(vv) } } else if session.Statement.UseCascade { table := session.Engine.autoMapType(fieldValue.Type()) @@ -1533,7 +1533,8 @@ func (session *Session) row2Bean(rows *sql.Rows, fields []string, fieldsCount in case reflect.TypeOf(&c_TIME_DEFAULT): if rawValueType == reflect.TypeOf(c_TIME_DEFAULT) { hasAssigned = true - fieldValue.Set(reflect.ValueOf(&rawValue)) + var x time.Time = rawValue.Interface().(time.Time) + fieldValue.Set(reflect.ValueOf(&x)) } case reflect.TypeOf(&c_FLOAT64_DEFAULT): if rawValueType.Kind() == reflect.Float64 { From 4a507f758c9e883c108fbbbaad18dc87d1597a83 Mon Sep 17 00:00:00 2001 From: Nash Tsai Date: Thu, 2 Jan 2014 12:53:16 +0800 Subject: [PATCH 4/4] removed debuglog --- session.go | 1 - 1 file changed, 1 deletion(-) diff --git a/session.go b/session.go index 1a5474ec..7623009b 100644 --- a/session.go +++ b/session.go @@ -1481,7 +1481,6 @@ func (session *Session) row2Bean(rows *sql.Rows, fields []string, fieldsCount in if fieldType == reflect.TypeOf(c_TIME_DEFAULT) { if rawValueType == reflect.TypeOf(c_TIME_DEFAULT) { hasAssigned = true - session.Engine.LogDebug("fieldValue:", fieldValue, "|rawValue:", rawValue, "|vv:", vv) fieldValue.Set(vv) } } else if session.Statement.UseCascade {