close rows if possible (#629)
This commit is contained in:
parent
d9e6f21d60
commit
32d688fd96
7
rows.go
7
rows.go
|
@ -122,8 +122,13 @@ func (rows *Rows) Scan(bean interface{}) error {
|
||||||
if err := rows.session.Statement.setRefValue(dataStruct); err != nil {
|
if err := rows.session.Statement.setRefValue(dataStruct); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err := rows.session.row2Bean(rows.rows, rows.fields, len(rows.fields), bean, &dataStruct, rows.session.Statement.RefTable)
|
|
||||||
|
|
||||||
|
scanResults, err := rows.session.row2Slice(rows.rows, rows.fields, len(rows.fields), bean)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = rows.session.slice2Bean(scanResults, rows.fields, len(rows.fields), bean, &dataStruct, rows.session.Statement.RefTable)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
session.go
13
session.go
|
@ -299,7 +299,12 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount
|
||||||
var newValue = newElemFunc(fields)
|
var newValue = newElemFunc(fields)
|
||||||
bean := newValue.Interface()
|
bean := newValue.Interface()
|
||||||
dataStruct := rValue(bean)
|
dataStruct := rValue(bean)
|
||||||
pk, err := session.row2Bean(rows, fields, fieldsCount, bean, &dataStruct, table)
|
// handle beforeClosures
|
||||||
|
scanResults, err := session.row2Slice(rows, fields, fieldsCount, bean)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
pk, err := session.slice2Bean(scanResults, fields, fieldsCount, bean, &dataStruct, table)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -312,8 +317,7 @@ func (session *Session) rows2Beans(rows *core.Rows, fields []string, fieldsCount
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) {
|
func (session *Session) row2Slice(rows *core.Rows, fields []string, fieldsCount int, bean interface{}) ([]interface{}, error) {
|
||||||
// handle beforeClosures
|
|
||||||
for _, closure := range session.beforeClosures {
|
for _, closure := range session.beforeClosures {
|
||||||
closure(bean)
|
closure(bean)
|
||||||
}
|
}
|
||||||
|
@ -332,7 +336,10 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
|
||||||
b.BeforeSet(key, Cell(scanResults[ii].(*interface{})))
|
b.BeforeSet(key, Cell(scanResults[ii].(*interface{})))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return scanResults, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (session *Session) slice2Bean(scanResults []interface{}, fields []string, fieldsCount int, bean interface{}, dataStruct *reflect.Value, table *core.Table) (core.PK, error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if b, hasAfterSet := bean.(AfterSetProcessor); hasAfterSet {
|
if b, hasAfterSet := bean.(AfterSetProcessor); hasAfterSet {
|
||||||
for ii, key := range fields {
|
for ii, key := range fields {
|
||||||
|
|
|
@ -78,30 +78,38 @@ func (session *Session) nocacheGet(beanKind reflect.Kind, bean interface{}, sqlS
|
||||||
|
|
||||||
defer rawRows.Close()
|
defer rawRows.Close()
|
||||||
|
|
||||||
if rawRows.Next() {
|
if !rawRows.Next() {
|
||||||
switch beanKind {
|
return false, nil
|
||||||
case reflect.Struct:
|
}
|
||||||
fields, err := rawRows.Columns()
|
|
||||||
if err != nil {
|
switch beanKind {
|
||||||
// WARN: Alougth rawRows return true, but get fields failed
|
case reflect.Struct:
|
||||||
return true, err
|
fields, err := rawRows.Columns()
|
||||||
}
|
if err != nil {
|
||||||
dataStruct := rValue(bean)
|
// WARN: Alougth rawRows return true, but get fields failed
|
||||||
if err := session.Statement.setRefValue(dataStruct); err != nil {
|
return true, err
|
||||||
return false, err
|
}
|
||||||
}
|
dataStruct := rValue(bean)
|
||||||
_, err = session.row2Bean(rawRows, fields, len(fields), bean, &dataStruct, session.Statement.RefTable)
|
if err := session.Statement.setRefValue(dataStruct); err != nil {
|
||||||
case reflect.Slice:
|
return false, err
|
||||||
err = rawRows.ScanSlice(bean)
|
|
||||||
case reflect.Map:
|
|
||||||
err = rawRows.ScanMap(bean)
|
|
||||||
default:
|
|
||||||
err = rawRows.Scan(bean)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true, err
|
scanResults, err := session.row2Slice(rawRows, fields, len(fields), bean)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
rawRows.Close()
|
||||||
|
|
||||||
|
_, err = session.slice2Bean(scanResults, 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 false, nil
|
|
||||||
|
return true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interface{}) (has bool, err error) {
|
func (session *Session) cacheGet(bean interface{}, sqlStr string, args ...interface{}) (has bool, err error) {
|
||||||
|
|
Loading…
Reference in New Issue