code.gitea.io/gitea@v1.22.3/models/db/iterate.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package db 5 6 import ( 7 "context" 8 9 "code.gitea.io/gitea/modules/setting" 10 11 "xorm.io/builder" 12 ) 13 14 // Iterate iterate all the Bean object 15 func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx context.Context, bean *Bean) error) error { 16 var start int 17 batchSize := setting.Database.IterateBufferSize 18 sess := GetEngine(ctx) 19 for { 20 select { 21 case <-ctx.Done(): 22 return ctx.Err() 23 default: 24 beans := make([]*Bean, 0, batchSize) 25 if cond != nil { 26 sess = sess.Where(cond) 27 } 28 if err := sess.Limit(batchSize, start).Find(&beans); err != nil { 29 return err 30 } 31 if len(beans) == 0 { 32 return nil 33 } 34 start += len(beans) 35 36 for _, bean := range beans { 37 if err := f(ctx, bean); err != nil { 38 return err 39 } 40 } 41 } 42 } 43 }