113 lines
2.2 KiB
Go
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
|
|
}
|