Use AfterLoad instead of AfterSet on Structs (#2628)
* use AfterLoad instead of AfterSet on Structs * fix the comments on AfterLoad * fix the comments on action AfterLoad
This commit is contained in:
parent
1ad902d529
commit
a8717e5e3a
35 changed files with 334 additions and 315 deletions
50
vendor/github.com/go-xorm/xorm/session_iterate.go
generated
vendored
50
vendor/github.com/go-xorm/xorm/session_iterate.go
generated
vendored
|
@ -23,6 +23,10 @@ func (session *Session) Iterate(bean interface{}, fun IterFunc) error {
|
|||
defer session.Close()
|
||||
}
|
||||
|
||||
if session.statement.bufferSize > 0 {
|
||||
return session.bufferIterate(bean, fun)
|
||||
}
|
||||
|
||||
rows, err := session.Rows(bean)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -44,3 +48,49 @@ func (session *Session) Iterate(bean interface{}, fun IterFunc) error {
|
|||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// BufferSize sets the buffersize for iterate
|
||||
func (session *Session) BufferSize(size int) *Session {
|
||||
session.statement.bufferSize = size
|
||||
return 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 {
|
||||
bufferSize = limit
|
||||
}
|
||||
var start = session.statement.Start
|
||||
v := rValue(bean)
|
||||
sliceType := reflect.SliceOf(v.Type())
|
||||
var idx = 0
|
||||
for {
|
||||
slice := reflect.New(sliceType)
|
||||
if err := session.Limit(bufferSize, start).find(slice.Interface(), bean); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i := 0; i < slice.Elem().Len(); i++ {
|
||||
if err := fun(idx, slice.Elem().Index(i).Addr().Interface()); err != nil {
|
||||
return err
|
||||
}
|
||||
idx++
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue