ALTER TABLE services ADD COLUMN config_files text NOT NULL DEFAULT ''; ALTER TABLE services ADD COLUMN desired_ref text NOT NULL DEFAULT ''; CREATE TABLE update_jobs ( id bigserial PRIMARY KEY, service_id bigint NOT NULL REFERENCES services (id), agent_id bigint REFERENCES agents (id), from_ref text NOT NULL DEFAULT '', to_ref text NOT NULL, trigger text NOT NULL CHECK (trigger IN ('manual', 'webhook', 'poll')), requested_by text NOT NULL DEFAULT '', status text NOT NULL CHECK (status IN ('queued', 'running', 'succeeded', 'failed')), output text NOT NULL DEFAULT '', output_truncated boolean NOT NULL DEFAULT false, error text NOT NULL DEFAULT '', created_at timestamptz NOT NULL, started_at timestamptz, finished_at timestamptz ); -- One queued or running job per service. CreateJob relies on this index to -- turn a second concurrent click into ErrJobActive. CREATE UNIQUE INDEX update_jobs_one_active ON update_jobs (service_id) WHERE status IN ('queued', 'running'); CREATE INDEX update_jobs_by_service ON update_jobs (service_id, id DESC); CREATE INDEX update_jobs_active_by_agent ON update_jobs (agent_id) WHERE status IN ('queued', 'running');