With sqlx 0.9 honouring `-- no-transaction`, 0007 loses its movie_releases_backup stash like 0014 did, and 0021 gains the CHECK (title <> '') that #153 abandoned because the 0.8 migrator could not run a rebuild with foreign keys off. The rebuild test now enters at migration 6 so the child links ride through all three rebuilds, and a new test proves the '' -> 'TBA' backfill and the rejection of new empty titles. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
52 lines
2.2 KiB
SQL
52 lines
2.2 KiB
SQL
-- no-transaction
|
|
-- #153. `episodes.title` accepted the empty string, which TMDB sends for an
|
|
-- unaired episode it has not named yet. Empty titles leaked into §9.2's
|
|
-- search haystack, §7.4 filenames and the compat shim as if they were real
|
|
-- text. Rows already carrying `''` take the same "TBA" placeholder the TMDB
|
|
-- boundary now substitutes — #121's guarded update replaces it once TMDB
|
|
-- fills the title in — and the rebuilt table enforces non-empty with a
|
|
-- CHECK. The rebuild runs outside a transaction (#155) so
|
|
-- `PRAGMA foreign_keys = OFF` takes effect and dropping the old `episodes`
|
|
-- does not cascade into `episode_releases`.
|
|
|
|
UPDATE episodes SET title = 'TBA', updated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE title = '';
|
|
|
|
PRAGMA foreign_keys = OFF;
|
|
|
|
CREATE TABLE episodes_new (
|
|
id INTEGER PRIMARY KEY,
|
|
season_id INTEGER NOT NULL REFERENCES seasons (id) ON DELETE CASCADE,
|
|
number INTEGER NOT NULL CHECK (number >= 0),
|
|
title TEXT NOT NULL CHECK (title <> ''),
|
|
air_date TEXT,
|
|
wanted INTEGER NOT NULL DEFAULT 0 CHECK (wanted IN (0, 1)),
|
|
state TEXT NOT NULL DEFAULT 'missing'
|
|
CHECK (state IN ('missing', 'downloading', 'available', 'parked')),
|
|
search_attempts INTEGER NOT NULL DEFAULT 0,
|
|
last_searched_at TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
|
|
vanished INTEGER NOT NULL DEFAULT 0 CHECK (vanished IN (0, 1)),
|
|
UNIQUE (season_id, number)
|
|
) STRICT;
|
|
|
|
INSERT INTO episodes_new (
|
|
id, season_id, number, title, air_date, wanted, state, search_attempts,
|
|
last_searched_at, created_at, updated_at, vanished
|
|
)
|
|
SELECT
|
|
id, season_id, number, title, air_date, wanted, state, search_attempts,
|
|
last_searched_at, created_at, updated_at, vanished
|
|
FROM episodes;
|
|
|
|
DROP TABLE episodes;
|
|
ALTER TABLE episodes_new RENAME TO episodes;
|
|
|
|
CREATE INDEX episodes_pending_search
|
|
ON episodes (last_searched_at)
|
|
WHERE wanted = 1 AND state = 'missing';
|
|
|
|
CREATE INDEX episodes_state ON episodes (state);
|
|
|
|
PRAGMA foreign_keys = ON;
|