aboutsummaryrefslogtreecommitdiffstats
path: root/models/db/iterate.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/db/iterate.go')
-rw-r--r--models/db/iterate.go33
1 files changed, 19 insertions, 14 deletions
diff --git a/models/db/iterate.go b/models/db/iterate.go
index fc8c78d83e..e1caefa72b 100644
--- a/models/db/iterate.go
+++ b/models/db/iterate.go
@@ -17,22 +17,27 @@ func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx contex
batchSize := setting.Database.IterateBufferSize
sess := GetEngine(ctx)
for {
- beans := make([]*Bean, 0, batchSize)
- if cond != nil {
- sess = sess.Where(cond)
- }
- if err := sess.Limit(batchSize, start).Find(&beans); err != nil {
- return err
- }
- if len(beans) == 0 {
- return nil
- }
- start += len(beans)
-
- for _, bean := range beans {
- if err := f(ctx, bean); err != nil {
+ select {
+ case <-ctx.Done():
+ return ctx.Err()
+ default:
+ beans := make([]*Bean, 0, batchSize)
+ if cond != nil {
+ sess = sess.Where(cond)
+ }
+ if err := sess.Limit(batchSize, start).Find(&beans); err != nil {
return err
}
+ if len(beans) == 0 {
+ return nil
+ }
+ start += len(beans)
+
+ for _, bean := range beans {
+ if err := f(ctx, bean); err != nil {
+ return err
+ }
+ }
}
}
}