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  }