config + store: remove dead knobs and stale schema
Three drift items surfaced in review, each dead on arrival and each worth trusting a little more at v0.1.0. config: drop MetricsPollInterval. The field was parsed from TOML (metrics_poll_interval), stored on DaemonConfig, and ignored by every consumer — only StatsPollInterval drives the background poll loop. Users setting it in config.toml saw zero effect. Removed from the TOML surface, the model constant, and the config test. daemon: delete ensureDefaultImage. No callers, body was `_ = ctx; return nil`. Dead since whatever flow used to call it got removed. store: drop packages_path from the images table. The column was carried by the baseline migration but never referenced by UpsertImage (no INSERT / UPDATE mention) or any Go model field — a ghost from a build pipeline that no longer exists. Added migration id=2 (drop_dead_image_columns) with an idempotent dropColumnIfExists helper: fresh installs run baseline (creates the column) + 2 (drops it); legacy DBs where the column was never added get a no-op. Updated the direct-INSERT SQL in TestGetImageRejectsMalformedTimestamp to drop the column reference, and added a migration test covering both install paths (fresh + legacy). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
2a7f55f028
commit
129475be20
7 changed files with 159 additions and 56 deletions
|
|
@ -24,6 +24,7 @@ type migration struct {
|
|||
// entries — installed DBs key off the id column.
|
||||
var migrations = []migration{
|
||||
{id: 1, name: "baseline", up: migrateBaseline},
|
||||
{id: 2, name: "drop_dead_image_columns", up: migrateDropDeadImageColumns},
|
||||
}
|
||||
|
||||
// runMigrations ensures schema_migrations exists, then applies every
|
||||
|
|
@ -163,6 +164,55 @@ func migrateBaseline(tx *sql.Tx) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// migrateDropDeadImageColumns removes image-table columns that the
|
||||
// store never reads or writes. `packages_path` was introduced for a
|
||||
// build pipeline that no longer exists; the baseline migration still
|
||||
// creates it for historical fidelity, and this migration drops it on
|
||||
// new installs + any upgrader that still carries it. Idempotent via
|
||||
// dropColumnIfExists so running the migration twice (or against a
|
||||
// DB where the column was already gone) is a no-op.
|
||||
func migrateDropDeadImageColumns(tx *sql.Tx) error {
|
||||
return dropColumnIfExists(tx, "images", "packages_path")
|
||||
}
|
||||
|
||||
// dropColumnIfExists is SQLite's "ALTER TABLE DROP COLUMN IF EXISTS"
|
||||
// (which the dialect lacks) as a library function. modernc.org/sqlite
|
||||
// bundles SQLite 3.42+, which supports plain DROP COLUMN — we add the
|
||||
// existence guard so the statement is idempotent across repeat runs
|
||||
// and legacy DBs that never had the column in the first place.
|
||||
func dropColumnIfExists(tx *sql.Tx, table, column string) error {
|
||||
rows, err := tx.Query(fmt.Sprintf("PRAGMA table_info(%s)", table))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer rows.Close()
|
||||
var found bool
|
||||
for rows.Next() {
|
||||
var (
|
||||
cid int
|
||||
name string
|
||||
valueType string
|
||||
notNull int
|
||||
defaultV sql.NullString
|
||||
pk int
|
||||
)
|
||||
if err := rows.Scan(&cid, &name, &valueType, ¬Null, &defaultV, &pk); err != nil {
|
||||
return err
|
||||
}
|
||||
if name == column {
|
||||
found = true
|
||||
}
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
if !found {
|
||||
return nil
|
||||
}
|
||||
_, err = tx.Exec(fmt.Sprintf("ALTER TABLE %s DROP COLUMN %s", table, column))
|
||||
return err
|
||||
}
|
||||
|
||||
// addColumnIfMissing is SQLite's "ALTER TABLE ADD COLUMN IF NOT EXISTS"
|
||||
// (which the dialect lacks) as a library function. Used inside
|
||||
// migrations when a column needs to survive a database that went
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue