29 lines
843 B
PL/PgSQL
29 lines
843 B
PL/PgSQL
CREATE TABLE jobs (
|
|
id UUID PRIMARY KEY,
|
|
job_type TEXT NOT NULL,
|
|
payload JSONB NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'queued',
|
|
attempts INTEGER NOT NULL DEFAULT 0,
|
|
run_after TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
last_error TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
CONSTRAINT jobs_status_check CHECK (status IN ('queued', 'processing', 'succeeded', 'failed'))
|
|
);
|
|
|
|
CREATE INDEX idx_jobs_status_run_after ON jobs (status, run_after);
|
|
CREATE INDEX idx_jobs_job_type ON jobs (job_type);
|
|
|
|
CREATE OR REPLACE FUNCTION touch_jobs_updated_at()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = now();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER trg_jobs_updated_at
|
|
BEFORE UPDATE ON jobs
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION touch_jobs_updated_at();
|