Типы maintenance_policy, методы store.Backend и реализации для PostgreSQL и in-memory. Co-authored-by: Cursor <[email protected]>
90 lines
3.3 KiB
Go
90 lines
3.3 KiB
Go
package store
|
|
|
|
import (
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// Vacuum strategy values for maintenance_policy.vacuum_strategy.
|
|
const (
|
|
VacuumStrategyNone = "none"
|
|
VacuumStrategyVacuum = "vacuum"
|
|
VacuumStrategyAnalyze = "analyze"
|
|
VacuumStrategyVacuumAnalyze = "vacuum_analyze"
|
|
VacuumStrategyReindex = "reindex"
|
|
)
|
|
|
|
// MaintenancePolicy is an instance-scoped PostgreSQL maintenance policy (control plane DB).
|
|
type MaintenancePolicy struct {
|
|
ID string `json:"id,omitempty"`
|
|
Name string `json:"name"`
|
|
TableName string `json:"table_name"`
|
|
Condition string `json:"condition"`
|
|
RetentionPeriodSec *int `json:"retention_period_sec,omitempty"`
|
|
MaxRows *int `json:"max_rows,omitempty"`
|
|
VacuumStrategy string `json:"vacuum_strategy"`
|
|
Schedule string `json:"schedule"`
|
|
Enabled bool `json:"enabled"`
|
|
DryRunEnabled bool `json:"dry_run_enabled"`
|
|
LastRunAt *time.Time `json:"last_run_at,omitempty"`
|
|
LastStatus string `json:"last_status,omitempty"`
|
|
LastError string `json:"last_error,omitempty"`
|
|
CreatedAt time.Time `json:"created_at,omitempty"`
|
|
UpdatedAt time.Time `json:"updated_at,omitempty"`
|
|
}
|
|
|
|
// MaintenancePolicyPatch is a partial update for maintenance_policy.
|
|
type MaintenancePolicyPatch struct {
|
|
Name *string `json:"name,omitempty"`
|
|
TableName *string `json:"table_name,omitempty"`
|
|
Condition *string `json:"condition,omitempty"`
|
|
RetentionPeriodSec *int `json:"retention_period_sec,omitempty"`
|
|
MaxRows *int `json:"max_rows,omitempty"`
|
|
VacuumStrategy *string `json:"vacuum_strategy,omitempty"`
|
|
Schedule *string `json:"schedule,omitempty"`
|
|
Enabled *bool `json:"enabled,omitempty"`
|
|
DryRunEnabled *bool `json:"dry_run_enabled,omitempty"`
|
|
}
|
|
|
|
// MaintenancePolicyConfigAudit is a configuration change log entry.
|
|
type MaintenancePolicyConfigAudit struct {
|
|
ID string `json:"id"`
|
|
PolicyID string `json:"policy_id,omitempty"`
|
|
ActorPrefix string `json:"actor_prefix"`
|
|
Action string `json:"action"`
|
|
Before map[string]any `json:"before,omitempty"`
|
|
After map[string]any `json:"after,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// ValidVacuumStrategy reports whether s is an allowed vacuum_strategy value.
|
|
func ValidVacuumStrategy(s string) bool {
|
|
switch strings.TrimSpace(s) {
|
|
case VacuumStrategyNone, VacuumStrategyVacuum, VacuumStrategyAnalyze,
|
|
VacuumStrategyVacuumAnalyze, VacuumStrategyReindex:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
// NormalizeMaintenancePolicyCondition returns a safe default WHERE fragment.
|
|
func NormalizeMaintenancePolicyCondition(condition string) string {
|
|
c := strings.TrimSpace(condition)
|
|
if c == "" {
|
|
return "true"
|
|
}
|
|
return c
|
|
}
|
|
|
|
// ValidateMaintenancePolicyInput checks required fields for create/update payloads.
|
|
func ValidateMaintenancePolicyInput(name, tableName, vacuumStrategy, schedule string) error {
|
|
if strings.TrimSpace(name) == "" || strings.TrimSpace(tableName) == "" || strings.TrimSpace(schedule) == "" {
|
|
return ErrInvalidInput
|
|
}
|
|
if !ValidVacuumStrategy(vacuumStrategy) {
|
|
return ErrInvalidInput
|
|
}
|
|
return nil
|
|
}
|