2026-06-26 21:31:14 +08:00

113 lines
2.2 KiB
Go

package mysql
import (
"context"
"encoding/json"
"slices"
"strings"
)
func (r *Repository) countResourceRows(ctx context.Context, table string, where string, args ...any) (int64, error) {
var total int64
if err := r.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM `+table+` `+where, args...).Scan(&total); err != nil {
return 0, err
}
return total, nil
}
func normalizePage(page int32, pageSize int32) (int32, int32) {
return normalizePageWithMax(page, pageSize, 100)
}
func normalizePageWithMax(page int32, pageSize int32, maxPageSize int32) (int32, int32) {
if page < 1 {
page = 1
}
if pageSize < 1 {
pageSize = 20
}
if maxPageSize <= 0 {
maxPageSize = 100
}
if pageSize > maxPageSize {
pageSize = maxPageSize
}
return page, pageSize
}
func resourceOffset(page int32, pageSize int32) int32 {
return (page - 1) * pageSize
}
func placeholders(count int) string {
if count <= 0 {
return ""
}
items := make([]string, count)
for index := range items {
items[index] = "?"
}
return strings.Join(items, ",")
}
func int64AnyArgs(values []int64) []any {
args := make([]any, 0, len(values))
for _, value := range values {
args = append(args, value)
}
return args
}
func stringAnyArgs(values []string) []any {
args := make([]any, 0, len(values))
for _, value := range values {
args = append(args, value)
}
return args
}
func compactPositiveInt64s(values []int64) []int64 {
seen := make(map[int64]struct{}, len(values))
out := make([]int64, 0, len(values))
for _, value := range values {
if value <= 0 {
continue
}
if _, exists := seen[value]; exists {
continue
}
seen[value] = struct{}{}
out = append(out, value)
}
return out
}
func parseStringArray(value string) []string {
var out []string
if err := json.Unmarshal([]byte(value), &out); err != nil {
return nil
}
return normalizeStringList(out)
}
func normalizeRegionIDs(values []int64) []int64 {
if len(values) == 0 {
return []int64{0}
}
seen := make(map[int64]struct{}, len(values))
out := make([]int64, 0, len(values))
for _, value := range values {
if value < 0 {
out = append(out, value)
continue
}
if _, ok := seen[value]; ok {
continue
}
seen[value] = struct{}{}
out = append(out, value)
}
slices.Sort(out)
return out
}