aboutsummaryrefslogtreecommitdiff
path: root/vendor/github.com/go-xorm/xorm/session_get.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/go-xorm/xorm/session_get.go')
-rw-r--r--vendor/github.com/go-xorm/xorm/session_get.go56
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
}