diff options
Diffstat (limited to 'vendor/github.com/go-xorm/xorm/session_get.go')
-rw-r--r-- | vendor/github.com/go-xorm/xorm/session_get.go | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/vendor/github.com/go-xorm/xorm/session_get.go b/vendor/github.com/go-xorm/xorm/session_get.go index f32bf481..c7c03d90 100644 --- a/vendor/github.com/go-xorm/xorm/session_get.go +++ b/vendor/github.com/go-xorm/xorm/session_get.go @@ -20,7 +20,16 @@ func (session *Session) Get(bean interface{}) (bool, error) { defer session.Close() } - session.Statement.setRefValue(rValue(bean)) + beanValue := reflect.ValueOf(bean) + if beanValue.Kind() != reflect.Ptr { + return false, errors.New("needs a pointer") + } + + if beanValue.Elem().Kind() == reflect.Struct { + if err := session.Statement.setRefValue(beanValue.Elem()); err != nil { + return false, err + } + } var sqlStr string var args []interface{} @@ -36,7 +45,7 @@ func (session *Session) Get(bean interface{}) (bool, error) { args = session.Statement.RawParams } - if session.canCache() { + if session.canCache() && beanValue.Elem().Kind() == reflect.Struct { if cacher := session.Engine.getCacher2(session.Statement.RefTable); cacher != nil && !session.Statement.unscoped { has, err := session.cacheGet(bean, sqlStr, args...) @@ -46,13 +55,14 @@ 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) { + session.queryPreprocess(&sqlStr, args...) + var rawRows *core.Rows var err error - session.queryPreprocess(&sqlStr, args...) if session.IsAutoCommit { _, rawRows, err = session.innerQuery(sqlStr, args...) } else { @@ -65,10 +75,26 @@ func (session *Session) nocacheGet(bean interface{}, sqlStr string, args ...inte defer rawRows.Close() if rawRows.Next() { - fields, err := rawRows.Columns() - if err == nil { - err = session.row2Bean(rawRows, fields, len(fields), bean) + switch beanKind { + case reflect.Struct: + fields, err := rawRows.Columns() + if err != nil { + // WARN: Alougth rawRows return true, but get fields failed + return true, err + } + dataStruct := rValue(bean) + if err := session.Statement.setRefValue(dataStruct); err != nil { + return false, err + } + _, err = session.row2Bean(rawRows, fields, len(fields), bean, &dataStruct, session.Statement.RefTable) + case reflect.Slice: + err = rawRows.ScanSlice(bean) + case reflect.Map: + err = rawRows.ScanMap(bean) + default: + err = rawRows.Scan(bean) } + return true, err } return false, nil @@ -145,20 +171,8 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf } cacheBean := cacher.GetBean(tableName, sid) 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 - has, err = session.nocacheGet(cacheBean, sqlStr, args...) + has, err = session.nocacheGet(reflect.Struct, cacheBean, sqlStr, args...) if err != nil || !has { return has, err } |