Skip to content

Commit 14a0c19

Browse files
lunnyGuillermo Prandi
and
Guillermo Prandi
committed
fix bug when buffersize with iterate (go-xorm#941)
Merge branch 'master' into lunny/fix_buffer_iterate Exclude schema from index name (#1505) Merge branch 'master' into fix-schema-idx SetExpr support more go types (#1499) Improve tests SetExpr support more go types fix vet fix drone lint remove go1.10 test on drone Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499 fix vet fix drone lint remove go1.10 test on drone Exclude schema from the index name Co-authored-by: Guillermo Prandi <[email protected]> Co-authored-by: Lunny Xiao <[email protected]> Reviewed-on: https://gitea.com/xorm/xorm/pulls/1505 fix test fix bug fix bug when buffersize with iterate SetExpr support more go types (#1499) Improve tests SetExpr support more go types fix vet fix drone lint remove go1.10 test on drone Reviewed-on: https://gitea.com/xorm/xorm/pulls/1499 fix vet fix drone lint remove go1.10 test on drone Fix update with Alias (go-xorm#1455) Co-authored-by: Guillermo Prandi <[email protected]> Reviewed-on: https://gitea.com/xorm/xorm/pulls/941
1 parent bd20ffb commit 14a0c19

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

session_iterate.go

+15-12
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
package xorm
66

7-
import "reflect"
7+
import (
8+
"reflect"
9+
)
810

911
// IterFunc only use by Iterate
1012
type IterFunc func(idx int, bean interface{}) error
@@ -60,10 +62,6 @@ func (session *Session) BufferSize(size int) *Session {
6062
}
6163

6264
func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error {
63-
if session.isAutoClose {
64-
defer session.Close()
65-
}
66-
6765
var bufferSize = session.statement.bufferSize
6866
var limit = session.statement.LimitN
6967
if limit > 0 && bufferSize > limit {
@@ -73,9 +71,14 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error {
7371
v := rValue(bean)
7472
sliceType := reflect.SliceOf(v.Type())
7573
var idx = 0
76-
for {
74+
session.autoResetStatement = false
75+
defer func() {
76+
session.autoResetStatement = true
77+
}()
78+
79+
for bufferSize > 0 {
7780
slice := reflect.New(sliceType)
78-
if err := session.Limit(bufferSize, start).find(slice.Interface(), bean); err != nil {
81+
if err := session.NoCache().Limit(bufferSize, start).find(slice.Interface(), bean); err != nil {
7982
return err
8083
}
8184

@@ -86,13 +89,13 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error {
8689
idx++
8790
}
8891

89-
start = start + slice.Elem().Len()
90-
if limit > 0 && idx+bufferSize > limit {
91-
bufferSize = limit - idx
92+
if bufferSize > slice.Elem().Len() {
93+
break
9294
}
9395

94-
if bufferSize <= 0 || slice.Elem().Len() < bufferSize || idx == limit {
95-
break
96+
start = start + slice.Elem().Len()
97+
if limit > 0 && start+bufferSize > limit {
98+
bufferSize = limit - start
9699
}
97100
}
98101

session_iterate_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,15 @@ func TestBufferIterate(t *testing.T) {
8989
})
9090
assert.NoError(t, err)
9191
assert.EqualValues(t, 7, cnt)
92+
93+
cnt = 0
94+
err = testEngine.Where("id <= 10").BufferSize(2).Iterate(new(UserBufferIterate), func(i int, bean interface{}) error {
95+
user := bean.(*UserBufferIterate)
96+
assert.EqualValues(t, cnt+1, user.Id)
97+
assert.EqualValues(t, true, user.IsMan)
98+
cnt++
99+
return nil
100+
})
101+
assert.NoError(t, err)
102+
assert.EqualValues(t, 10, cnt)
92103
}

0 commit comments

Comments
 (0)