CREATE TABLE show_live_states ( show_id TEXT PRIMARY KEY REFERENCES shows(id) ON DELETE CASCADE, revision INTEGER NOT NULL DEFAULT 0 CHECK (revision >= 0), current_usage_id TEXT REFERENCES piece_usages(id) ON DELETE SET NULL, started_at_utc TEXT, ended_at_utc TEXT, presentation_usage_id TEXT REFERENCES piece_usages(id) ON DELETE SET NULL, presentation_revision INTEGER NOT NULL DEFAULT 0 CHECK (presentation_revision >= 0), updated_at_utc TEXT NOT NULL ); CREATE TABLE live_usage_runs ( id TEXT PRIMARY KEY, show_id TEXT NOT NULL REFERENCES shows(id) ON DELETE CASCADE, usage_id TEXT NOT NULL REFERENCES piece_usages(id) ON DELETE CASCADE, started_at_utc TEXT NOT NULL, ended_at_utc TEXT, CHECK (ended_at_utc IS NULL OR ended_at_utc >= started_at_utc) ); CREATE UNIQUE INDEX idx_one_active_live_run_per_show ON live_usage_runs(show_id) WHERE ended_at_utc IS NULL; CREATE INDEX idx_live_runs_usage ON live_usage_runs(usage_id, started_at_utc); CREATE TABLE live_commands ( show_id TEXT NOT NULL REFERENCES shows(id) ON DELETE CASCADE, command_id TEXT NOT NULL, action TEXT NOT NULL, result_revision INTEGER NOT NULL CHECK (result_revision >= 0), created_at_utc TEXT NOT NULL, PRIMARY KEY (show_id, command_id) ); CREATE TABLE presentation_access_tokens ( id TEXT PRIMARY KEY, show_id TEXT NOT NULL REFERENCES shows(id) ON DELETE CASCADE, token_hash TEXT NOT NULL UNIQUE, created_at_utc TEXT NOT NULL, revoked_at_utc TEXT ); CREATE INDEX idx_presentation_tokens_show ON presentation_access_tokens(show_id, revoked_at_utc); UPDATE piece_usages SET status = 'open' WHERE status = 'current';