a3897df0ab
Issue #155 removed the sqlx 0.8 rebuild workarounds by editing migrations 0007, 0014 and 0021 in place. Editing an applied migration changes its checksum, and `migrate()` refuses to run when one no longer matches what `_sqlx_migrations` recorded, so the daemon exited on startup against any database that had already applied them — production included. The sqlx 0.9 bump is the fix and survives: a new migration can carry `-- no-transaction` so `PRAGMA foreign_keys = OFF` holds and a table rebuild stops cascade-deleting its children. Only the retroactive cleanup of migrations that already ran is reverted, along with #153's `CHECK (title <> '')`, which rode on the 0021 edit and needs a migration of its own rather than a rewrite of history. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
74 lines
2.8 KiB
SQL
74 lines
2.8 KiB
SQL
-- #73. movies.state used missing|grabbed|imported, predating arr-core's
|
|
-- canonical MediaState vocabulary (missing|downloading|available) that
|
|
-- series/episodes (0005) already follow.
|
|
--
|
|
-- SQLite can't ALTER a CHECK constraint, so this rebuilds the table -- which
|
|
-- means dropping the old copy. `movie_releases` references it with
|
|
-- ON DELETE CASCADE, so the drop would take its rows down too; stash them
|
|
-- first and restore them once the new `movies` exists with the same ids.
|
|
|
|
CREATE TABLE movie_releases_backup AS SELECT * FROM movie_releases;
|
|
|
|
CREATE TABLE movies_new (
|
|
id INTEGER PRIMARY KEY,
|
|
tmdb_id INTEGER NOT NULL UNIQUE,
|
|
title TEXT NOT NULL,
|
|
year INTEGER,
|
|
original_language TEXT,
|
|
root_id INTEGER NOT NULL REFERENCES roots (id),
|
|
wanted INTEGER NOT NULL DEFAULT 1 CHECK (wanted IN (0, 1)),
|
|
overrides TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(overrides)),
|
|
state TEXT NOT NULL DEFAULT 'missing'
|
|
CHECK (state IN ('missing', 'downloading', 'available')),
|
|
blocked INTEGER NOT NULL DEFAULT 0 CHECK (blocked IN (0, 1)),
|
|
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'))
|
|
) STRICT;
|
|
|
|
INSERT INTO movies_new (
|
|
id, tmdb_id, title, year, original_language, root_id, wanted, overrides,
|
|
state, blocked, search_attempts, last_searched_at, created_at, updated_at
|
|
)
|
|
SELECT
|
|
id, tmdb_id, title, year, original_language, root_id, wanted, overrides,
|
|
CASE state
|
|
WHEN 'grabbed' THEN 'downloading'
|
|
WHEN 'imported' THEN 'available'
|
|
ELSE state
|
|
END,
|
|
blocked, search_attempts, last_searched_at, created_at, updated_at
|
|
FROM movies;
|
|
|
|
DROP TABLE movies;
|
|
|
|
ALTER TABLE movies_new RENAME TO movies;
|
|
|
|
CREATE INDEX movies_pending_search
|
|
ON movies (last_searched_at)
|
|
WHERE wanted = 1 AND blocked = 0;
|
|
|
|
CREATE INDEX movies_state ON movies (state);
|
|
CREATE INDEX movies_root ON movies (root_id);
|
|
|
|
-- Dropping `movies` drops the triggers defined on it too (0005); recreate
|
|
-- the movie-root invariant they enforced.
|
|
CREATE TRIGGER movies_require_movie_root
|
|
BEFORE INSERT ON movies
|
|
WHEN EXISTS (SELECT 1 FROM roots WHERE id = NEW.root_id AND kind != 'movie')
|
|
BEGIN
|
|
SELECT RAISE(ABORT, 'movies require a movie root');
|
|
END;
|
|
|
|
CREATE TRIGGER movies_require_movie_root_on_update
|
|
BEFORE UPDATE OF root_id ON movies
|
|
WHEN EXISTS (SELECT 1 FROM roots WHERE id = NEW.root_id AND kind != 'movie')
|
|
BEGIN
|
|
SELECT RAISE(ABORT, 'movies require a movie root');
|
|
END;
|
|
|
|
INSERT INTO movie_releases SELECT * FROM movie_releases_backup;
|
|
|
|
DROP TABLE movie_releases_backup;
|