Ask Get parameter is pointer and prepare for Get non-struct

This commit is contained in:
Lunny Xiao 2017-02-21 11:06:40 +08:00
parent 1bc93ba022
commit c8ac6bb65c
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
1 changed files with 31 additions and 18 deletions

View File

@ -20,7 +20,19 @@ func (session *Session) Get(bean interface{}) (bool, error) {
defer session.Close() defer session.Close()
} }
session.Statement.setRefValue(rValue(bean)) beanValue := reflect.ValueOf(bean)
if beanValue.Kind() != reflect.Ptr {
return false, errors.New("needs a pointer to a struct")
}
// FIXME: remove this after support non-struct Get
if beanValue.Elem().Kind() != reflect.Struct {
return false, errors.New("needs a pointer to a struct")
}
if beanValue.Elem().Kind() == reflect.Struct {
session.Statement.setRefValue(beanValue.Elem())
}
var sqlStr string var sqlStr string
var args []interface{} var args []interface{}
@ -46,10 +58,10 @@ func (session *Session) Get(bean interface{}) (bool, error) {
} }
} }
return session.nocacheGet(bean, sqlStr, args...) return session.nocacheGet(beanValue.Elem().Kind(), bean, sqlStr, args...)
} }
func (session *Session) nocacheGet(bean interface{}, sqlStr string, args ...interface{}) (bool, error) { func (session *Session) nocacheGet(beanKind reflect.Kind, bean interface{}, sqlStr string, args ...interface{}) (bool, error) {
var rawRows *core.Rows var rawRows *core.Rows
var err error var err error
session.queryPreprocess(&sqlStr, args...) session.queryPreprocess(&sqlStr, args...)
@ -66,9 +78,22 @@ func (session *Session) nocacheGet(bean interface{}, sqlStr string, args ...inte
if rawRows.Next() { if rawRows.Next() {
fields, err := rawRows.Columns() fields, err := rawRows.Columns()
if err == nil { if err != nil {
_, err = session.row2Bean(rawRows, fields, len(fields), bean) // WARN: Alougth rawRows return true, but get fields failed
return true, err
} }
switch beanKind {
case reflect.Struct:
_, err = session.row2Bean(rawRows, fields, len(fields), bean)
case reflect.Slice:
err = rawRows.ScanSlice(bean)
case reflect.Map:
err = rawRows.ScanMap(bean)
default:
err = rawRows.Scan(bean)
}
return true, err return true, err
} }
return false, nil return false, nil
@ -145,20 +170,8 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf
} }
cacheBean := cacher.GetBean(tableName, sid) cacheBean := cacher.GetBean(tableName, sid)
if cacheBean == nil { if cacheBean == nil {
/*newSession := session.Engine.NewSession()
defer newSession.Close()
cacheBean = reflect.New(structValue.Type()).Interface()
newSession.Id(id).NoCache()
if session.Statement.AltTableName != "" {
newSession.Table(session.Statement.AltTableName)
}
if !session.Statement.UseCascade {
newSession.NoCascade()
}
has, err = newSession.Get(cacheBean)
*/
cacheBean = bean cacheBean = bean
has, err = session.nocacheGet(cacheBean, sqlStr, args...) has, err = session.nocacheGet(reflect.Struct, cacheBean, sqlStr, args...)
if err != nil || !has { if err != nil || !has {
return has, err return has, err
} }