From 5a040502f80a115d8b903aade365b37559582ffd Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Fri, 11 May 2018 16:44:05 +0800 Subject: [PATCH 1/3] fix bug when buffersize with iterate --- session_iterate.go | 9 +++++---- session_iterate_test.go | 11 +++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/session_iterate.go b/session_iterate.go index ca996c28..1e484d85 100644 --- a/session_iterate.go +++ b/session_iterate.go @@ -60,10 +60,6 @@ func (session *Session) BufferSize(size int) *Session { } func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error { - if session.isAutoClose { - defer session.Close() - } - var bufferSize = session.statement.bufferSize var limit = session.statement.LimitN if limit > 0 && bufferSize > limit { @@ -73,6 +69,11 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error { v := rValue(bean) sliceType := reflect.SliceOf(v.Type()) var idx = 0 + session.autoResetStatement = false + defer func() { + session.autoResetStatement = true + }() + for { slice := reflect.New(sliceType) if err := session.Limit(bufferSize, start).find(slice.Interface(), bean); err != nil { diff --git a/session_iterate_test.go b/session_iterate_test.go index 9a7ec25f..bb0c59c4 100644 --- a/session_iterate_test.go +++ b/session_iterate_test.go @@ -89,4 +89,15 @@ func TestBufferIterate(t *testing.T) { }) assert.NoError(t, err) assert.EqualValues(t, 7, cnt) + + cnt = 0 + err = testEngine.Where("id <= 10").BufferSize(2).Iterate(new(UserBufferIterate), func(i int, bean interface{}) error { + user := bean.(*UserBufferIterate) + assert.EqualValues(t, cnt+1, user.Id) + assert.EqualValues(t, true, user.IsMan) + cnt++ + return nil + }) + assert.NoError(t, err) + assert.EqualValues(t, 10, cnt) } -- 2.40.1 From 6ff3fb928984ddaaab5f9d2831297d926e5ec4a4 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 24 Oct 2019 17:10:34 +0800 Subject: [PATCH 2/3] fix bug --- session_iterate.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/session_iterate.go b/session_iterate.go index 1e484d85..b47150a8 100644 --- a/session_iterate.go +++ b/session_iterate.go @@ -87,14 +87,14 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error { idx++ } + if slice.Elem().Len() == 0 || idx == limit { + break + } + start = start + slice.Elem().Len() if limit > 0 && idx+bufferSize > limit { bufferSize = limit - idx } - - if bufferSize <= 0 || slice.Elem().Len() < bufferSize || idx == limit { - break - } } return nil -- 2.40.1 From a5ac0dfdf3ba9e8ed11485f65ef4252f28dbcf0e Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 12 Nov 2019 13:59:01 +0800 Subject: [PATCH 3/3] fix test --- session_iterate.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/session_iterate.go b/session_iterate.go index b47150a8..a1642bb3 100644 --- a/session_iterate.go +++ b/session_iterate.go @@ -4,7 +4,9 @@ package xorm -import "reflect" +import ( + "reflect" +) // IterFunc only use by Iterate type IterFunc func(idx int, bean interface{}) error @@ -74,9 +76,9 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error { session.autoResetStatement = true }() - for { + for bufferSize > 0 { slice := reflect.New(sliceType) - if err := session.Limit(bufferSize, start).find(slice.Interface(), bean); err != nil { + if err := session.NoCache().Limit(bufferSize, start).find(slice.Interface(), bean); err != nil { return err } @@ -87,13 +89,13 @@ func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error { idx++ } - if slice.Elem().Len() == 0 || idx == limit { + if bufferSize > slice.Elem().Len() { break } start = start + slice.Elem().Len() - if limit > 0 && idx+bufferSize > limit { - bufferSize = limit - idx + if limit > 0 && start+bufferSize > limit { + bufferSize = limit - start } } -- 2.40.1