gitea源码

iterate.go 861B

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