aboutsummaryrefslogtreecommitdiffstats
path: root/modules/indexer/internal/paginator.go
diff options
context:
space:
mode:
Diffstat (limited to 'modules/indexer/internal/paginator.go')
-rw-r--r--modules/indexer/internal/paginator.go41
1 files changed, 41 insertions, 0 deletions
diff --git a/modules/indexer/internal/paginator.go b/modules/indexer/internal/paginator.go
new file mode 100644
index 0000000000..de0a33c06f
--- /dev/null
+++ b/modules/indexer/internal/paginator.go
@@ -0,0 +1,41 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package internal
+
+import (
+ "math"
+
+ "code.gitea.io/gitea/models/db"
+)
+
+// ParsePaginator parses a db.Paginator into a skip and limit
+func ParsePaginator(paginator db.Paginator, max ...int) (int, int) {
+ // Use a very large number to indicate no limit
+ unlimited := math.MaxInt32
+ if len(max) > 0 {
+ // Some indexer engines have a limit on the page size, respect that
+ unlimited = max[0]
+ }
+
+ if paginator == nil || paginator.IsListAll() {
+ return 0, unlimited
+ }
+
+ // Warning: Do not use GetSkipTake() for *db.ListOptions
+ // Its implementation could reset the page size with setting.API.MaxResponseItems
+ if listOptions, ok := paginator.(*db.ListOptions); ok {
+ if listOptions.Page >= 0 && listOptions.PageSize > 0 {
+ var start int
+ if listOptions.Page == 0 {
+ start = 0
+ } else {
+ start = (listOptions.Page - 1) * listOptions.PageSize
+ }
+ return start, listOptions.PageSize
+ }
+ return 0, unlimited
+ }
+
+ return paginator.GetSkipTake()
+}