@pgpm/database-jobs 0.26.0 → 0.26.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Makefile CHANGED
@@ -1,5 +1,5 @@
1
1
  EXTENSION = pgpm-database-jobs
2
- DATA = sql/pgpm-database-jobs--0.22.0.sql
2
+ DATA = sql/pgpm-database-jobs--0.26.0.sql
3
3
 
4
4
  PG_CONFIG = pg_config
5
5
  PGXS := $(shell $(PG_CONFIG) --pgxs)
@@ -13,7 +13,8 @@ CREATE FUNCTION app_jobs.add_job (
13
13
  queue_name text DEFAULT NULL,
14
14
  run_at timestamptz DEFAULT now(),
15
15
  max_attempts integer DEFAULT 25,
16
- priority integer DEFAULT 0
16
+ priority integer DEFAULT 0,
17
+ entity_id uuid DEFAULT NULL
17
18
  )
18
19
  RETURNS app_jobs.jobs
19
20
  AS $$
@@ -31,6 +32,7 @@ BEGIN
31
32
  INSERT INTO app_jobs.jobs (
32
33
  database_id,
33
34
  actor_id,
35
+ entity_id,
34
36
  task_identifier,
35
37
  payload,
36
38
  queue_name,
@@ -41,6 +43,7 @@ BEGIN
41
43
  ) VALUES (
42
44
  v_database_id,
43
45
  v_actor_id,
46
+ add_job.entity_id,
44
47
  identifier,
45
48
  coalesce(payload, '{}'::json),
46
49
  queue_name,
@@ -84,6 +87,7 @@ BEGIN
84
87
  INSERT INTO app_jobs.jobs (
85
88
  database_id,
86
89
  actor_id,
90
+ entity_id,
87
91
  task_identifier,
88
92
  payload,
89
93
  queue_name,
@@ -93,6 +97,7 @@ BEGIN
93
97
  ) VALUES (
94
98
  v_database_id,
95
99
  v_actor_id,
100
+ add_job.entity_id,
96
101
  identifier,
97
102
  payload,
98
103
  queue_name,
@@ -14,7 +14,8 @@ CREATE FUNCTION app_jobs.add_scheduled_job(
14
14
  job_key text DEFAULT NULL,
15
15
  queue_name text DEFAULT NULL,
16
16
  max_attempts integer DEFAULT 25,
17
- priority integer DEFAULT 0
17
+ priority integer DEFAULT 0,
18
+ entity_id uuid DEFAULT NULL
18
19
  )
19
20
  RETURNS app_jobs.scheduled_jobs
20
21
  AS $$
@@ -32,6 +33,7 @@ BEGIN
32
33
  INSERT INTO app_jobs.scheduled_jobs (
33
34
  database_id,
34
35
  actor_id,
36
+ entity_id,
35
37
  task_identifier,
36
38
  payload,
37
39
  queue_name,
@@ -42,6 +44,7 @@ BEGIN
42
44
  ) VALUES (
43
45
  v_database_id,
44
46
  v_actor_id,
47
+ add_scheduled_job.entity_id,
45
48
  identifier,
46
49
  coalesce(payload, '{}'::json),
47
50
  queue_name,
@@ -81,6 +84,7 @@ BEGIN
81
84
  INSERT INTO app_jobs.scheduled_jobs (
82
85
  database_id,
83
86
  actor_id,
87
+ entity_id,
84
88
  task_identifier,
85
89
  payload,
86
90
  queue_name,
@@ -90,6 +94,7 @@ BEGIN
90
94
  ) VALUES (
91
95
  v_database_id,
92
96
  v_actor_id,
97
+ add_scheduled_job.entity_id,
93
98
  identifier,
94
99
  payload,
95
100
  queue_name,
@@ -42,6 +42,7 @@ BEGIN
42
42
  INSERT INTO app_jobs.jobs (
43
43
  database_id,
44
44
  actor_id,
45
+ entity_id,
45
46
  queue_name,
46
47
  task_identifier,
47
48
  payload,
@@ -51,6 +52,7 @@ BEGIN
51
52
  ) SELECT
52
53
  database_id,
53
54
  actor_id,
55
+ entity_id,
54
56
  queue_name,
55
57
  task_identifier,
56
58
  payload,
@@ -6,6 +6,7 @@ CREATE TABLE app_jobs.jobs (
6
6
  id bigserial PRIMARY KEY,
7
7
  database_id uuid,
8
8
  actor_id uuid,
9
+ entity_id uuid,
9
10
  queue_name text DEFAULT NULL,
10
11
  task_identifier text NOT NULL,
11
12
  payload json DEFAULT '{}' ::json NOT NULL,
@@ -30,6 +31,7 @@ COMMENT ON TABLE app_jobs.jobs IS 'Background job queue: each row is a pending o
30
31
  COMMENT ON COLUMN app_jobs.jobs.id IS 'Auto-incrementing job identifier';
31
32
  COMMENT ON COLUMN app_jobs.jobs.database_id IS 'Database this job belongs to (nullable for system-level jobs without tenant context)';
32
33
  COMMENT ON COLUMN app_jobs.jobs.actor_id IS 'User who triggered this job, read from JWT claims at enqueue time';
34
+ COMMENT ON COLUMN app_jobs.jobs.entity_id IS 'Entity (org/team) this job is scoped to for billing; NULL means platform-level (resolved via database_id → owner_id)';
33
35
  COMMENT ON COLUMN app_jobs.jobs.queue_name IS 'Name of the queue this job belongs to; used for worker routing and concurrency control';
34
36
  COMMENT ON COLUMN app_jobs.jobs.task_identifier IS 'Identifier for the task type (maps to a worker handler function)';
35
37
  COMMENT ON COLUMN app_jobs.jobs.payload IS 'JSON payload of arguments passed to the task handler';
@@ -6,6 +6,7 @@ CREATE TABLE app_jobs.scheduled_jobs (
6
6
  id bigserial PRIMARY KEY,
7
7
  database_id uuid,
8
8
  actor_id uuid,
9
+ entity_id uuid,
9
10
  queue_name text DEFAULT NULL,
10
11
  task_identifier text NOT NULL,
11
12
  payload json DEFAULT '{}' ::json NOT NULL,
@@ -29,6 +30,7 @@ COMMENT ON TABLE app_jobs.scheduled_jobs IS 'Recurring/cron-style job definition
29
30
  COMMENT ON COLUMN app_jobs.scheduled_jobs.id IS 'Auto-incrementing scheduled job identifier';
30
31
  COMMENT ON COLUMN app_jobs.scheduled_jobs.database_id IS 'Database this scheduled job belongs to (nullable for system-level schedules without tenant context)';
31
32
  COMMENT ON COLUMN app_jobs.scheduled_jobs.actor_id IS 'User who created this scheduled job, read from JWT claims at creation time';
33
+ COMMENT ON COLUMN app_jobs.scheduled_jobs.entity_id IS 'Entity (org/team) this scheduled job is scoped to for billing; NULL means platform-level (resolved via database_id → owner_id)';
32
34
  COMMENT ON COLUMN app_jobs.scheduled_jobs.queue_name IS 'Name of the queue spawned jobs are placed into';
33
35
  COMMENT ON COLUMN app_jobs.scheduled_jobs.task_identifier IS 'Task type identifier for spawned jobs';
34
36
  COMMENT ON COLUMN app_jobs.scheduled_jobs.payload IS 'JSON payload passed to each spawned job';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pgpm/database-jobs",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "description": "Database-specific job handling and queue management",
5
5
  "author": "Dan Lynch <pyramation@gmail.com>",
6
6
  "contributors": [
@@ -35,5 +35,5 @@
35
35
  "bugs": {
36
36
  "url": "https://github.com/constructive-io/pgpm-modules/issues"
37
37
  },
38
- "gitHead": "3badf1e5e2fc71deae9e194b779599d17ab28a0d"
38
+ "gitHead": "e1f2e9bec1c91d0751ebe49e9193459191d3c464"
39
39
  }
@@ -1,6 +1,6 @@
1
1
  # pgpm-database-jobs extension
2
2
  comment = 'pgpm-database-jobs extension'
3
- default_version = '0.22.0'
3
+ default_version = '0.26.0'
4
4
  module_pathname = '$libdir/pgpm-database-jobs'
5
5
  requires = 'plpgsql,pgcrypto,pgpm-verify,pgpm-jwt-claims'
6
6
  relocatable = false
@@ -53,7 +53,9 @@ $EOFCODE$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
53
53
 
54
54
  COMMENT ON FUNCTION app_jobs.tg_add_job_with_row IS 'Useful shortcut to create a job on insert or update. Pass the task name as the trigger argument, and the record data will automatically be available on the JSON payload.';
55
55
 
56
- CREATE FUNCTION app_jobs.json_build_object_apply(arguments text[]) RETURNS pg_catalog.json AS $EOFCODE$
56
+ CREATE FUNCTION app_jobs.json_build_object_apply(
57
+ arguments text[]
58
+ ) RETURNS pg_catalog.json AS $EOFCODE$
57
59
  DECLARE
58
60
  arg text;
59
61
  _sql text;
@@ -116,6 +118,7 @@ CREATE TABLE app_jobs.scheduled_jobs (
116
118
  id bigserial PRIMARY KEY,
117
119
  database_id uuid,
118
120
  actor_id uuid,
121
+ entity_id uuid,
119
122
  queue_name text DEFAULT NULL,
120
123
  task_identifier text NOT NULL,
121
124
  payload pg_catalog.json DEFAULT '{}'::json NOT NULL,
@@ -143,6 +146,8 @@ COMMENT ON COLUMN app_jobs.scheduled_jobs.database_id IS 'Database this schedule
143
146
 
144
147
  COMMENT ON COLUMN app_jobs.scheduled_jobs.actor_id IS 'User who created this scheduled job, read from JWT claims at creation time';
145
148
 
149
+ COMMENT ON COLUMN app_jobs.scheduled_jobs.entity_id IS 'Entity (org/team) this scheduled job is scoped to for billing; NULL means platform-level (resolved via database_id → owner_id)';
150
+
146
151
  COMMENT ON COLUMN app_jobs.scheduled_jobs.queue_name IS 'Name of the queue spawned jobs are placed into';
147
152
 
148
153
  COMMENT ON COLUMN app_jobs.scheduled_jobs.task_identifier IS 'Task type identifier for spawned jobs';
@@ -189,6 +194,7 @@ CREATE TABLE app_jobs.jobs (
189
194
  id bigserial PRIMARY KEY,
190
195
  database_id uuid,
191
196
  actor_id uuid,
197
+ entity_id uuid,
192
198
  queue_name text DEFAULT NULL,
193
199
  task_identifier text NOT NULL,
194
200
  payload pg_catalog.json DEFAULT '{}'::json NOT NULL,
@@ -218,6 +224,8 @@ COMMENT ON COLUMN app_jobs.jobs.database_id IS 'Database this job belongs to (nu
218
224
 
219
225
  COMMENT ON COLUMN app_jobs.jobs.actor_id IS 'User who triggered this job, read from JWT claims at enqueue time';
220
226
 
227
+ COMMENT ON COLUMN app_jobs.jobs.entity_id IS 'Entity (org/team) this job is scoped to for billing; NULL means platform-level (resolved via database_id → owner_id)';
228
+
221
229
  COMMENT ON COLUMN app_jobs.jobs.queue_name IS 'Name of the queue this job belongs to; used for worker routing and concurrency control';
222
230
 
223
231
  COMMENT ON COLUMN app_jobs.jobs.task_identifier IS 'Identifier for the task type (maps to a worker handler function)';
@@ -366,7 +374,10 @@ CREATE INDEX job_queues_locked_by_idx ON app_jobs.job_queues (locked_by);
366
374
 
367
375
  GRANT SELECT, INSERT, UPDATE, DELETE ON app_jobs.job_queues TO administrator;
368
376
 
369
- CREATE FUNCTION app_jobs.run_scheduled_job(id bigint, job_expiry interval DEFAULT '1 hours') RETURNS app_jobs.jobs AS $EOFCODE$
377
+ CREATE FUNCTION app_jobs.run_scheduled_job(
378
+ id bigint,
379
+ job_expiry interval DEFAULT '1 hours'
380
+ ) RETURNS app_jobs.jobs AS $EOFCODE$
370
381
  DECLARE
371
382
  j app_jobs.jobs;
372
383
  last_id bigint;
@@ -402,6 +413,7 @@ BEGIN
402
413
  INSERT INTO app_jobs.jobs (
403
414
  database_id,
404
415
  actor_id,
416
+ entity_id,
405
417
  queue_name,
406
418
  task_identifier,
407
419
  payload,
@@ -411,6 +423,7 @@ BEGIN
411
423
  ) SELECT
412
424
  database_id,
413
425
  actor_id,
426
+ entity_id,
414
427
  queue_name,
415
428
  task_identifier,
416
429
  payload,
@@ -435,7 +448,13 @@ BEGIN
435
448
  END;
436
449
  $EOFCODE$ LANGUAGE plpgsql VOLATILE;
437
450
 
438
- CREATE FUNCTION app_jobs.reschedule_jobs(job_ids bigint[], run_at timestamptz DEFAULT NULL, priority int DEFAULT NULL, attempts int DEFAULT NULL, max_attempts int DEFAULT NULL) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
451
+ CREATE FUNCTION app_jobs.reschedule_jobs(
452
+ job_ids bigint[],
453
+ run_at timestamptz DEFAULT NULL,
454
+ priority int DEFAULT NULL,
455
+ attempts int DEFAULT NULL,
456
+ max_attempts int DEFAULT NULL
457
+ ) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
439
458
  UPDATE
440
459
  app_jobs.jobs
441
460
  SET
@@ -451,7 +470,10 @@ CREATE FUNCTION app_jobs.reschedule_jobs(job_ids bigint[], run_at timestamptz DE
451
470
  *;
452
471
  $EOFCODE$;
453
472
 
454
- CREATE FUNCTION app_jobs.release_scheduled_jobs(worker_id text, ids bigint[] DEFAULT NULL) RETURNS void AS $EOFCODE$
473
+ CREATE FUNCTION app_jobs.release_scheduled_jobs(
474
+ worker_id text,
475
+ ids bigint[] DEFAULT NULL
476
+ ) RETURNS void AS $EOFCODE$
455
477
  DECLARE
456
478
  BEGIN
457
479
  -- clear the scheduled job
@@ -467,7 +489,9 @@ BEGIN
467
489
  END;
468
490
  $EOFCODE$ LANGUAGE plpgsql VOLATILE;
469
491
 
470
- CREATE FUNCTION app_jobs.release_jobs(worker_id text) RETURNS void AS $EOFCODE$
492
+ CREATE FUNCTION app_jobs.release_jobs(
493
+ worker_id text
494
+ ) RETURNS void AS $EOFCODE$
471
495
  DECLARE
472
496
  BEGIN
473
497
  -- clear the job
@@ -490,7 +514,10 @@ BEGIN
490
514
  END;
491
515
  $EOFCODE$ LANGUAGE plpgsql VOLATILE;
492
516
 
493
- CREATE FUNCTION app_jobs.permanently_fail_jobs(job_ids bigint[], error_message text DEFAULT NULL) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
517
+ CREATE FUNCTION app_jobs.permanently_fail_jobs(
518
+ job_ids bigint[],
519
+ error_message text DEFAULT NULL
520
+ ) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
494
521
  UPDATE
495
522
  app_jobs.jobs
496
523
  SET
@@ -504,7 +531,10 @@ CREATE FUNCTION app_jobs.permanently_fail_jobs(job_ids bigint[], error_message t
504
531
  *;
505
532
  $EOFCODE$;
506
533
 
507
- CREATE FUNCTION app_jobs.get_scheduled_job(worker_id text, task_identifiers text[] DEFAULT NULL) RETURNS app_jobs.scheduled_jobs LANGUAGE plpgsql AS $EOFCODE$
534
+ CREATE FUNCTION app_jobs.get_scheduled_job(
535
+ worker_id text,
536
+ task_identifiers text[] DEFAULT NULL
537
+ ) RETURNS app_jobs.scheduled_jobs LANGUAGE plpgsql AS $EOFCODE$
508
538
  DECLARE
509
539
  v_job_id bigint;
510
540
  v_row app_jobs.scheduled_jobs;
@@ -556,7 +586,11 @@ BEGIN
556
586
  END;
557
587
  $EOFCODE$;
558
588
 
559
- CREATE FUNCTION app_jobs.get_job(worker_id text, task_identifiers text[] DEFAULT NULL, job_expiry interval DEFAULT '4 hours') RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
589
+ CREATE FUNCTION app_jobs.get_job(
590
+ worker_id text,
591
+ task_identifiers text[] DEFAULT NULL,
592
+ job_expiry interval DEFAULT '4 hours'
593
+ ) RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
560
594
  DECLARE
561
595
  v_job_id bigint;
562
596
  v_queue_name text;
@@ -611,7 +645,11 @@ BEGIN
611
645
  END;
612
646
  $EOFCODE$;
613
647
 
614
- CREATE FUNCTION app_jobs.fail_job(worker_id text, job_id bigint, error_message text) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
648
+ CREATE FUNCTION app_jobs.fail_job(
649
+ worker_id text,
650
+ job_id bigint,
651
+ error_message text
652
+ ) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
615
653
  DECLARE
616
654
  v_row app_jobs.jobs;
617
655
  BEGIN
@@ -641,7 +679,9 @@ BEGIN
641
679
  END;
642
680
  $EOFCODE$;
643
681
 
644
- CREATE FUNCTION app_jobs.complete_jobs(job_ids bigint[]) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
682
+ CREATE FUNCTION app_jobs.complete_jobs(
683
+ job_ids bigint[]
684
+ ) RETURNS SETOF app_jobs.jobs LANGUAGE sql AS $EOFCODE$
645
685
  DELETE FROM app_jobs.jobs
646
686
  WHERE id = ANY (job_ids)
647
687
  AND (locked_by IS NULL
@@ -650,7 +690,10 @@ CREATE FUNCTION app_jobs.complete_jobs(job_ids bigint[]) RETURNS SETOF app_jobs.
650
690
  *;
651
691
  $EOFCODE$;
652
692
 
653
- CREATE FUNCTION app_jobs.complete_job(worker_id text, job_id bigint) RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
693
+ CREATE FUNCTION app_jobs.complete_job(
694
+ worker_id text,
695
+ job_id bigint
696
+ ) RETURNS app_jobs.jobs LANGUAGE plpgsql AS $EOFCODE$
654
697
  DECLARE
655
698
  v_row app_jobs.jobs;
656
699
  BEGIN
@@ -672,7 +715,16 @@ BEGIN
672
715
  END;
673
716
  $EOFCODE$;
674
717
 
675
- CREATE FUNCTION app_jobs.add_scheduled_job(identifier text, payload pg_catalog.json DEFAULT '{}'::json, schedule_info pg_catalog.json DEFAULT '{}'::json, job_key text DEFAULT NULL, queue_name text DEFAULT NULL, max_attempts int DEFAULT 25, priority int DEFAULT 0) RETURNS app_jobs.scheduled_jobs AS $EOFCODE$
718
+ CREATE FUNCTION app_jobs.add_scheduled_job(
719
+ identifier text,
720
+ payload pg_catalog.json DEFAULT '{}'::json,
721
+ schedule_info pg_catalog.json DEFAULT '{}'::json,
722
+ job_key text DEFAULT NULL,
723
+ queue_name text DEFAULT NULL,
724
+ max_attempts int DEFAULT 25,
725
+ priority int DEFAULT 0,
726
+ entity_id uuid DEFAULT NULL
727
+ ) RETURNS app_jobs.scheduled_jobs AS $EOFCODE$
676
728
  DECLARE
677
729
  v_job app_jobs.scheduled_jobs;
678
730
  v_database_id uuid;
@@ -687,6 +739,7 @@ BEGIN
687
739
  INSERT INTO app_jobs.scheduled_jobs (
688
740
  database_id,
689
741
  actor_id,
742
+ entity_id,
690
743
  task_identifier,
691
744
  payload,
692
745
  queue_name,
@@ -697,6 +750,7 @@ BEGIN
697
750
  ) VALUES (
698
751
  v_database_id,
699
752
  v_actor_id,
753
+ add_scheduled_job.entity_id,
700
754
  identifier,
701
755
  coalesce(payload, '{}'::json),
702
756
  queue_name,
@@ -736,6 +790,7 @@ BEGIN
736
790
  INSERT INTO app_jobs.scheduled_jobs (
737
791
  database_id,
738
792
  actor_id,
793
+ entity_id,
739
794
  task_identifier,
740
795
  payload,
741
796
  queue_name,
@@ -745,6 +800,7 @@ BEGIN
745
800
  ) VALUES (
746
801
  v_database_id,
747
802
  v_actor_id,
803
+ add_scheduled_job.entity_id,
748
804
  identifier,
749
805
  payload,
750
806
  queue_name,
@@ -756,7 +812,16 @@ BEGIN
756
812
  END;
757
813
  $EOFCODE$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
758
814
 
759
- CREATE FUNCTION app_jobs.add_job(identifier text, payload pg_catalog.json DEFAULT '{}'::json, job_key text DEFAULT NULL, queue_name text DEFAULT NULL, run_at timestamptz DEFAULT now(), max_attempts int DEFAULT 25, priority int DEFAULT 0) RETURNS app_jobs.jobs AS $EOFCODE$
815
+ CREATE FUNCTION app_jobs.add_job(
816
+ identifier text,
817
+ payload pg_catalog.json DEFAULT '{}'::json,
818
+ job_key text DEFAULT NULL,
819
+ queue_name text DEFAULT NULL,
820
+ run_at timestamptz DEFAULT now(),
821
+ max_attempts int DEFAULT 25,
822
+ priority int DEFAULT 0,
823
+ entity_id uuid DEFAULT NULL
824
+ ) RETURNS app_jobs.jobs AS $EOFCODE$
760
825
  DECLARE
761
826
  v_job app_jobs.jobs;
762
827
  v_database_id uuid;
@@ -771,6 +836,7 @@ BEGIN
771
836
  INSERT INTO app_jobs.jobs (
772
837
  database_id,
773
838
  actor_id,
839
+ entity_id,
774
840
  task_identifier,
775
841
  payload,
776
842
  queue_name,
@@ -781,6 +847,7 @@ BEGIN
781
847
  ) VALUES (
782
848
  v_database_id,
783
849
  v_actor_id,
850
+ add_job.entity_id,
784
851
  identifier,
785
852
  coalesce(payload, '{}'::json),
786
853
  queue_name,
@@ -824,6 +891,7 @@ BEGIN
824
891
  INSERT INTO app_jobs.jobs (
825
892
  database_id,
826
893
  actor_id,
894
+ entity_id,
827
895
  task_identifier,
828
896
  payload,
829
897
  queue_name,
@@ -833,6 +901,7 @@ BEGIN
833
901
  ) VALUES (
834
902
  v_database_id,
835
903
  v_actor_id,
904
+ add_job.entity_id,
836
905
  identifier,
837
906
  payload,
838
907
  queue_name,
@@ -846,7 +915,9 @@ BEGIN
846
915
  END;
847
916
  $EOFCODE$ LANGUAGE plpgsql VOLATILE SECURITY DEFINER;
848
917
 
849
- CREATE FUNCTION app_jobs.remove_job(job_key text) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
918
+ CREATE FUNCTION app_jobs.remove_job(
919
+ job_key text
920
+ ) RETURNS app_jobs.jobs LANGUAGE plpgsql STRICT AS $EOFCODE$
850
921
  DECLARE
851
922
  v_job app_jobs.jobs;
852
923
  BEGIN
@@ -871,7 +942,9 @@ BEGIN
871
942
  END;
872
943
  $EOFCODE$;
873
944
 
874
- CREATE FUNCTION app_jobs.force_unlock_workers(worker_ids text[]) RETURNS void LANGUAGE sql VOLATILE AS $EOFCODE$
945
+ CREATE FUNCTION app_jobs.force_unlock_workers(
946
+ worker_ids text[]
947
+ ) RETURNS void LANGUAGE sql VOLATILE AS $EOFCODE$
875
948
  UPDATE app_jobs.jobs
876
949
  SET locked_at = NULL, locked_by = NULL
877
950
  WHERE locked_by = ANY (worker_ids);