aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2022-10-31 23:51:14 +0800
committerGitHub <noreply@github.com>2022-10-31 23:51:14 +0800
commit9a70a12a341b8e7773efc661693e4b7e3199a4bd (patch)
tree2e4f3e18315ef52e68d4bfea5939d5517d3ca56b /models
parent4ae3f762177a2cdb449b949501420e88462f8f95 (diff)
downloadgitea-9a70a12a341b8e7773efc661693e4b7e3199a4bd.tar.gz
gitea-9a70a12a341b8e7773efc661693e4b7e3199a4bd.zip
Merge db.Iterate and IterateObjects (#21641)
These two functions are similiar, merge them.
Diffstat (limited to 'models')
-rw-r--r--models/db/context.go10
-rw-r--r--models/db/iterate.go21
-rw-r--r--models/db/iterate_test.go44
3 files changed, 57 insertions, 18 deletions
diff --git a/models/db/context.go b/models/db/context.go
index 4fd35200cf..e90780e4e9 100644
--- a/models/db/context.go
+++ b/models/db/context.go
@@ -8,9 +8,6 @@ import (
"context"
"database/sql"
- "code.gitea.io/gitea/modules/setting"
-
- "xorm.io/builder"
"xorm.io/xorm/schemas"
)
@@ -121,13 +118,6 @@ func WithTx(f func(ctx context.Context) error, stdCtx ...context.Context) error
return sess.Commit()
}
-// Iterate iterates the databases and doing something
-func Iterate(ctx context.Context, tableBean interface{}, cond builder.Cond, fun func(idx int, bean interface{}) error) error {
- return GetEngine(ctx).Where(cond).
- BufferSize(setting.Database.IterateBufferSize).
- Iterate(tableBean, fun)
-}
-
// Insert inserts records into database
func Insert(ctx context.Context, beans ...interface{}) error {
_, err := GetEngine(ctx).Insert(beans...)
diff --git a/models/db/iterate.go b/models/db/iterate.go
index 3d4fa06eeb..cbd2feed28 100644
--- a/models/db/iterate.go
+++ b/models/db/iterate.go
@@ -8,25 +8,30 @@ import (
"context"
"code.gitea.io/gitea/modules/setting"
+
+ "xorm.io/builder"
)
-// IterateObjects iterate all the Bean object
-func IterateObjects[Object any](ctx context.Context, f func(repo *Object) error) error {
+// Iterate iterate all the Bean object
+func Iterate[Bean any](ctx context.Context, cond builder.Cond, f func(ctx context.Context, bean *Bean) error) error {
var start int
batchSize := setting.Database.IterateBufferSize
sess := GetEngine(ctx)
for {
- repos := make([]*Object, 0, batchSize)
- if err := sess.Limit(batchSize, start).Find(&repos); err != nil {
+ 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(repos) == 0 {
+ if len(beans) == 0 {
return nil
}
- start += len(repos)
+ start += len(beans)
- for _, repo := range repos {
- if err := f(repo); err != nil {
+ for _, bean := range beans {
+ if err := f(ctx, bean); err != nil {
return err
}
}
diff --git a/models/db/iterate_test.go b/models/db/iterate_test.go
new file mode 100644
index 0000000000..5d03a6e9ce
--- /dev/null
+++ b/models/db/iterate_test.go
@@ -0,0 +1,44 @@
+// Copyright 2022 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package db_test
+
+import (
+ "context"
+ "testing"
+
+ "code.gitea.io/gitea/models/db"
+ repo_model "code.gitea.io/gitea/models/repo"
+ "code.gitea.io/gitea/models/unittest"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestIterate(t *testing.T) {
+ assert.NoError(t, unittest.PrepareTestDatabase())
+ xe := unittest.GetXORMEngine()
+ assert.NoError(t, xe.Sync(&repo_model.RepoUnit{}))
+
+ var repoCnt int
+ err := db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repo *repo_model.RepoUnit) error {
+ repoCnt++
+ return nil
+ })
+ assert.NoError(t, err)
+ assert.EqualValues(t, 79, repoCnt)
+
+ err = db.Iterate(db.DefaultContext, nil, func(ctx context.Context, repoUnit *repo_model.RepoUnit) error {
+ reopUnit2 := repo_model.RepoUnit{ID: repoUnit.ID}
+ has, err := db.GetByBean(ctx, &reopUnit2)
+ if err != nil {
+ return err
+ } else if !has {
+ return db.ErrNotExist{Resource: "repo_unit", ID: repoUnit.ID}
+ }
+ assert.EqualValues(t, repoUnit.RepoID, repoUnit.RepoID)
+ assert.EqualValues(t, repoUnit.CreatedUnix, repoUnit.CreatedUnix)
+ return nil
+ })
+ assert.NoError(t, err)
+}