package db import ( "context" "fmt" ) // GetSettings returns the singleton settings row. BootstrapFromConfig // guarantees it exists before any other code path can observe it, so // sql.ErrNoRows here would indicate a bootstrap bug, not a normal // condition. func (d *DB) GetSettings(ctx context.Context) (Settings, error) { var s Settings var createdAt, updatedAt string err := d.QueryRowContext(ctx, ` SELECT fip_settle_seconds, history_retention_cycles, created_at, updated_at FROM settings WHERE id=1 `).Scan(&s.FIPSettleSeconds, &s.HistoryRetentionCycles, &createdAt, &updatedAt) if err != nil { return Settings{}, err } if s.CreatedAt, err = dbToTime(createdAt); err != nil { return Settings{}, err } if s.UpdatedAt, err = dbToTime(updatedAt); err != nil { return Settings{}, err } return s, nil } // SetFIPSettleSeconds persists a new fip_settle_seconds value. Only // enforces seconds >= 0 — the cross-field rule against // lease_ttl_seconds/self_check_timeout_seconds lives in // orchestrator.Orchestrator.SetFIPSettleSeconds, which has access to the // static orchestrator config this package doesn't. func (d *DB) SetFIPSettleSeconds(ctx context.Context, seconds int) error { if seconds < 0 { return fmt.Errorf("fip_settle_seconds must be >= 0: %w", ErrValidation) } now := timeToDB(Now()) _, err := d.ExecContext(ctx, ` UPDATE settings SET fip_settle_seconds=?, updated_at=? WHERE id=1 `, seconds, now) return err } // SetHistoryRetentionCycles persists how many recent check cycles to keep // per registry address; 0 means unlimited (the default, matching behavior // before this setting existed). Does not retroactively prune anything // itself — pruning happens per-address as each check cycle finishes (see // orchestrator.aggregateAndRelease). func (d *DB) SetHistoryRetentionCycles(ctx context.Context, cycles int) error { if cycles < 0 { return fmt.Errorf("history_retention_cycles must be >= 0: %w", ErrValidation) } now := timeToDB(Now()) _, err := d.ExecContext(ctx, ` UPDATE settings SET history_retention_cycles=?, updated_at=? WHERE id=1 `, cycles, now) return err }