This commit is contained in:
Lunny Xiao 2014-07-09 21:48:48 +08:00
parent f7a32eed68
commit 244c0989f2
1 changed files with 50 additions and 19 deletions

View File

@ -40,6 +40,7 @@ type Session struct {
afterClosures []func(interface{})
stmtCache map[uint32]*core.Stmt //key: hash.Hash32 of (queryStr, len(queryStr))
cascadeDeep int
}
// Method Init reset the session as the init status.
@ -896,7 +897,7 @@ func (session *Session) Iterate(bean interface{}, fun IterFunc) error {
rows, err := session.Rows(bean)
if err != nil {
return err
} else {
}
defer rows.Close()
//b := reflect.New(iterator.beanType).Interface()
i := 0
@ -913,8 +914,6 @@ func (session *Session) Iterate(bean interface{}, fun IterFunc) error {
i++
}
return err
}
return nil
}
func (session *Session) doPrepare(sqlStr string) (stmt *core.Stmt, err error) {
@ -2452,6 +2451,38 @@ func (session *Session) bytes2Value(col *core.Column, fieldValue *reflect.Value,
}
fieldValue.Set(reflect.ValueOf(&x))
default:
if fieldType.Elem().Kind() == reflect.Struct {
if session.Statement.UseCascade {
structInter := reflect.New(fieldType.Elem())
fmt.Println(structInter, fieldType.Elem())
table := session.Engine.autoMapType(structInter.Elem())
if table != nil {
x, err := strconv.ParseInt(string(data), 10, 64)
if err != nil {
return fmt.Errorf("arg %v as int: %s", key, err.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
newsession := session.Engine.NewSession()
defer newsession.Close()
has, err := newsession.Id(x).Get(structInter.Interface())
if err != nil {
return err
}
if has {
v = structInter.Interface()
fieldValue.Set(reflect.ValueOf(v))
} else {
return errors.New("cascade obj is not exist!")
}
}
}
} else {
return fmt.Errorf("unsupported struct type in Scan: %s", fieldValue.Type().String())
}
}
return fmt.Errorf("unsupported type in Scan: %s", reflect.TypeOf(v).String())
}
default: