-- M7 #381: scan-run lifecycle queries. -- name: InsertScanRun :one -- Creates a new scan_runs row with started_at=now(). Stages are filled in -- as each completes via UpdateScanRunStage; finished_at is set by FinishScanRun. INSERT INTO scan_runs DEFAULT VALUES RETURNING id, started_at; -- name: UpdateScanRunLibrary :exec -- Persists the file-walk stage's tallies. Idempotent — overwrites prior -- value if the orchestrator re-runs the stage on retry. UPDATE scan_runs SET library = $2 WHERE id = $1; -- name: UpdateScanRunMbidBackfill :exec UPDATE scan_runs SET mbid_backfill = $2 WHERE id = $1; -- name: UpdateScanRunCoverEnrich :exec UPDATE scan_runs SET cover_enrich = $2 WHERE id = $1; -- name: FinishScanRun :exec -- Closes the row. error_message is non-empty only when a fatal error -- aborted the chain before normal completion. UPDATE scan_runs SET finished_at = now(), error_message = NULLIF($2::text, '') WHERE id = $1; -- name: GetLatestScanRun :one -- Powers GET /api/admin/scan/status. Returns NoRows when no scan has -- ever run; the API layer maps that to a 200 with empty payload. SELECT id, started_at, finished_at, library, mbid_backfill, cover_enrich, artist_art_enrich, error_message FROM scan_runs ORDER BY started_at DESC LIMIT 1; -- name: UpdateScanRunArtistArtEnrich :exec -- M7 cover-sources: persists the artist-art enrich stage tally JSON. UPDATE scan_runs SET artist_art_enrich = $2 WHERE id = $1; -- name: GetInFlightScanRun :one -- Used by POST /api/admin/scan/run to 409 when a scan is already running. -- "In flight" = finished_at IS NULL. SELECT id, started_at FROM scan_runs WHERE finished_at IS NULL ORDER BY started_at DESC LIMIT 1;