Files
kandev/apps/backend/internal/task/repository/sqlite/base_queries.go
T

62 lines
2.1 KiB
Go

// Package sqlite provides SQLite-based repository implementations.
package sqlite
import "strings"
// sqlLimitClause is the SQL fragment appended to dynamic queries when a row
// limit is requested. Shared across plan.go, document.go, and message.go.
const sqlLimitClause = " LIMIT ?"
// sqliteMaxHostParams is the safe upper bound on placeholders in a single
// statement. SQLite's compile-time default (SQLITE_MAX_VARIABLE_NUMBER) is
// 999 on older builds and 32766 on newer ones; we chunk well below the
// lower bound so batched IN-clause queries stay portable across builds.
const sqliteMaxHostParams = 500
// worktree repo status values on task_environment_repos. Mirrors the worktree
// package's StatusActive/StatusMerged/StatusDeleted lifecycle.
const (
worktreeRepoStatusActive = "active"
worktreeRepoStatusMerged = "merged"
worktreeRepoStatusDeleted = "deleted"
)
// buildInPlaceholders returns a comma-separated "?,?,?" placeholder string and
// the matching args slice for an IN (...) clause over the given string IDs.
// Caller is responsible for splitting overly large input via chunkIDs.
func buildInPlaceholders(ids []string) (string, []interface{}) {
if len(ids) == 0 {
return "", nil
}
placeholders := strings.Repeat("?,", len(ids))
placeholders = placeholders[:len(placeholders)-1]
args := make([]interface{}, len(ids))
for i, id := range ids {
args[i] = id
}
return placeholders, args
}
// chunkIDs splits ids into sub-slices of at most size entries. Useful when
// callers want to keep IN-clause queries below sqliteMaxHostParams. An empty
// input returns an empty outer slice (NOT a single nil chunk) so callers can
// range over the result safely — a single-nil-chunk would produce an empty
// `IN ()` clause and a SQL syntax error when fed to buildInPlaceholders.
func chunkIDs(ids []string, size int) [][]string {
if len(ids) == 0 {
return nil
}
if size <= 0 || len(ids) <= size {
return [][]string{ids}
}
chunks := make([][]string, 0, (len(ids)+size-1)/size)
for i := 0; i < len(ids); i += size {
end := i + size
if end > len(ids) {
end = len(ids)
}
chunks = append(chunks, ids[i:end])
}
return chunks
}