57 lines
1.5 KiB
SQL
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
|