You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

iterate.go 777B

1234567891011121314151617181920212223242526272829303132333435363738
  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 iterate 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. beans := make([]*Bean, 0, batchSize)
  16. if cond != nil {
  17. sess = sess.Where(cond)
  18. }
  19. if err := sess.Limit(batchSize, start).Find(&beans); err != nil {
  20. return err
  21. }
  22. if len(beans) == 0 {
  23. return nil
  24. }
  25. start += len(beans)
  26. for _, bean := range beans {
  27. if err := f(ctx, bean); err != nil {
  28. return err
  29. }
  30. }
  31. }
  32. }