Ask Get parameter is pointer and prepare for Get non-struct
This commit is contained in:
parent
1bc93ba022
commit
c8ac6bb65c
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue