debian-forge-composer/internal/jobqueue/dbjobqueue/schemas/001_jobs.sql
Lars Karlitski 9c2c92f729 jobqueue: Introduce jobqueue backed by a postgres database
Co-authored-by: sanne <sanne.raymaekers@gmail.com>
2021-07-28 21:52:31 +01:00

57 lines
1.5 KiB
SQL

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE jobs(
id uuid PRIMARY KEY,
token uuid,
type varchar NOT NULL,
args jsonb,
result jsonb,
queued_at timestamp NOT NULL,
started_at timestamp,
finished_at timestamp,
canceled boolean NOT NULL DEFAULT FALSE,
CONSTRAINT not_finished_when_not_started
CHECK (finished_at IS NULL OR started_at IS NOT NULL),
CONSTRAINT not_finished_when_canceled
CHECK (CANCELED = FALSE OR finished_at IS NULL),
CONSTRAINT chronologic_started_at
CHECK (started_at IS NULL OR queued_at <= started_at),
CONSTRAINT chronologic_finished_at
CHECK (finished_at IS NULL OR started_at <= finished_at),
CONSTRAINT token_is_never_uuid_nil
CHECK (token IS NULL OR token != uuid_nil()),
CONSTRAINT token_is_set_when_started
CHECK (started_at IS NULL OR token IS NOT NULL)
);
CREATE TABLE job_dependencies(
job_id uuid REFERENCES jobs(id),
dependency_id uuid REFERENCES jobs(id)
);
CREATE TABLE heartbeats(
token uuid PRIMARY KEY,
id uuid REFERENCES jobs(id),
heartbeat timestamp NOT NULL,
CONSTRAINT token_is_never_uuid_nil
CHECK (token != uuid_nil())
);
CREATE VIEW ready_jobs AS
SELECT *
FROM jobs
WHERE started_at IS NULL
AND canceled = FALSE
AND id NOT IN (
SELECT job_id
FROM job_dependencies JOIN jobs ON dependency_id = id
WHERE finished_at IS NULL
)
ORDER BY queued_at ASC