Add queue tables

A table with `queue_table` set works as a job queue that many workers can
pull from at once. Claims use SELECT ... FOR UPDATE SKIP LOCKED over the
idx_queue_claim index order, so each job goes to one worker and only the
claimed rows are locked.

- Schema: adds the queue_* columns and the idx_queue_claim /
  idx_queue_lease indexes. Declaring these names yourself is an error.
- `queue_table` accepts `true` or { max_attempts, lease_ms, keep_completed }
- BunMariaDB.queue: push, claim, ack, fail, extend, cancel
- Statuses: pending, processing, done, failed, cancelled
- Leases use the database clock. Expired leases are reclaimed (or
  dead-lettered on the last attempt) and old lock tokens stop working.
- insert/update can't set queue state fields. update/delete skip claimed
  jobs.

Tests: allow the test container's self-signed certificate, and give the
queue test its own client so it doesn't reuse one closed by db.test.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-18 15:43:22 +01:00
co-authored by Claude Opus 5.5
parent 688f4bcb58
commit 7c470e0225
16 changed files with 1091 additions and 4 deletions
+2 -1
View File
@@ -36,7 +36,8 @@ describe.skipIf(!TEST_DB)("MariaDB integration", () => {
appendDefaults = (await import("../src/utils/append-default-fields-to-db-schema")).default;
schemaLib = await import("../src/lib/schema/run-schema-query");
global.CONFIG = { db_name: TEST_DB! };
// The test container uses a self-signed certificate
global.CONFIG = { db_name: TEST_DB!, ssl_reject_unauthorized: false };
global.DB_SCHEMA = schema;
setMariaDBClient({ config: global.CONFIG });