This commit is contained in:
Lunny Xiao 2016-10-23 11:19:18 +08:00
parent 673f83cc1e
commit 99118594d5
1 changed files with 31 additions and 24 deletions

View File

@ -683,6 +683,7 @@ func (session *Session) canCache() bool {
if session.Statement.RefTable == nil || if session.Statement.RefTable == nil ||
session.Statement.JoinStr != "" || session.Statement.JoinStr != "" ||
session.Statement.RawSQL != "" || session.Statement.RawSQL != "" ||
!session.Statement.UseCache ||
session.Tx != nil || session.Tx != nil ||
len(session.Statement.selectStr) > 0 { len(session.Statement.selectStr) > 0 {
return false return false
@ -761,7 +762,7 @@ 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() /*newSession := session.Engine.NewSession()
defer newSession.Close() defer newSession.Close()
cacheBean = reflect.New(structValue.Type()).Interface() cacheBean = reflect.New(structValue.Type()).Interface()
newSession.Id(id).NoCache() newSession.Id(id).NoCache()
@ -772,6 +773,9 @@ func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interf
newSession.NoCascade() newSession.NoCascade()
} }
has, err = newSession.Get(cacheBean) has, err = newSession.Get(cacheBean)
*/
cacheBean = bean
has, err = session.nocacheGet(cacheBean, sqlStr, args...)
if err != nil || !has { if err != nil || !has {
return has, err return has, err
} }
@ -1028,6 +1032,30 @@ func (session *Session) doPrepare(sqlStr string) (stmt *core.Stmt, err error) {
return return
} }
func (session *Session) nocacheGet(bean interface{}, sqlStr string, args ...interface{}) (bool, error) {
var rawRows *core.Rows
var err error
session.queryPreprocess(&sqlStr, args...)
if session.IsAutoCommit {
_, rawRows, err = session.innerQuery(sqlStr, args...)
} else {
rawRows, err = session.Tx.Query(sqlStr, args...)
}
if err != nil {
return false, err
}
defer rawRows.Close()
if rawRows.Next() {
if fields, err := rawRows.Columns(); err == nil {
err = session.row2Bean(rawRows, fields, len(fields), bean)
}
return true, err
}
return false, nil
}
// Get retrieve one record from database, bean's non-empty fields // Get retrieve one record from database, bean's non-empty fields
// will be as conditions // will be as conditions
func (session *Session) Get(bean interface{}) (bool, error) { func (session *Session) Get(bean interface{}) (bool, error) {
@ -1052,9 +1080,8 @@ func (session *Session) Get(bean interface{}) (bool, error) {
args = session.Statement.RawParams args = session.Statement.RawParams
} }
if session.Statement.JoinStr == "" { if session.canCache() {
if cacher := session.Engine.getCacher2(session.Statement.RefTable); cacher != nil && if cacher := session.Engine.getCacher2(session.Statement.RefTable); cacher != nil &&
session.Statement.UseCache &&
!session.Statement.unscoped { !session.Statement.unscoped {
has, err := session.cacheGet(bean, sqlStr, args...) has, err := session.cacheGet(bean, sqlStr, args...)
if err != ErrCacheFailed { if err != ErrCacheFailed {
@ -1063,27 +1090,7 @@ func (session *Session) Get(bean interface{}) (bool, error) {
} }
} }
var rawRows *core.Rows return session.nocacheGet(bean, sqlStr, args...)
var err error
session.queryPreprocess(&sqlStr, args...)
if session.IsAutoCommit {
_, rawRows, err = session.innerQuery(sqlStr, args...)
} else {
rawRows, err = session.Tx.Query(sqlStr, args...)
}
if err != nil {
return false, err
}
defer rawRows.Close()
if rawRows.Next() {
if fields, err := rawRows.Columns(); err == nil {
err = session.row2Bean(rawRows, fields, len(fields), bean)
}
return true, err
}
return false, nil
} }
// Count counts the records. bean's non-empty fields // Count counts the records. bean's non-empty fields