@@ -338,7 +338,7 @@ LANGUAGE plpgsql set search_path FROM CURRENT;
338
338
CREATE FUNCTION _possible_args () RETURNS jsonb AS
339
339
$BODY$
340
340
BEGIN
341
- RETURN json_build_object (
341
+ RETURN jsonb_build_object (
342
342
' node' , ' node name (default: master)' ,
343
343
' name' , ' job name' ,
344
344
' comments' , ' some comments on job' ,
@@ -396,34 +396,43 @@ END
396
396
$BODY$
397
397
LANGUAGE plpgsql set search_path FROM CURRENT;
398
398
399
- CREATE FUNCTION _get_cron_from_attrs (params jsonb) RETURNS jsonb AS
399
+ CREATE FUNCTION _get_cron_from_attrs (params jsonb, prev jsonb ) RETURNS jsonb AS
400
400
$BODY$
401
401
DECLARE
402
402
dates text [];
403
403
cron jsonb;
404
+ rule jsonb;
404
405
clean_cron jsonb;
405
406
N integer ;
406
407
name text ;
408
+ updatePrev boolean ;
407
409
BEGIN
408
410
411
+ updatePrev := true;
412
+
413
+ IF NOT params?' cron' AND NOT params?' rule' AND NOT params?' date' AND NOT params?' dates' THEN
414
+ RAISE EXCEPTION ' There is no information about job' ' s schedule'
415
+ USING HINT = ' Use ' ' cron' ' - cron string, ' ' rule' ' - json to set schedule rules or ' ' date' ' and ' ' dates' ' to set exact date(s)' ;
416
+ END IF;
417
+
409
418
IF params?' cron' THEN
410
419
EXECUTE ' SELECT cron2jsontext($1::cstring)::jsonb'
411
420
INTO cron
412
421
USING params- >> ' cron' ;
413
- ELSIF params?' rule' THEN
414
- cron := params- > ' rule' ;
415
- ELSIF NOT params?' date' AND NOT params?' dates' THEN
416
- RAISE EXCEPTION ' There is no information about job' ' s schedule'
417
- USING HINT = ' Use ' ' cron' ' - cron string, ' ' rule' ' - json to set schedule rules or ' ' date' ' and ' ' dates' ' to set exact date(s)' ;
418
422
END IF;
419
423
420
- IF cron IS NOT NULL THEN
421
- IF cron?' date' THEN
422
- dates := _get_array_from_jsonb(dates, cron- > ' date' );
423
- END IF;
424
- IF cron?' dates' THEN
425
- dates := _get_array_from_jsonb(dates, cron- > ' dates' );
426
- END IF;
424
+ IF params?' rule' THEN
425
+ rule := params- > ' rule' ;
426
+ updatePrev := false;
427
+ END IF;
428
+
429
+ cron := coalesce(cron, ' {}' ::jsonb) || coalesce(rule, ' {}' ::jsonb);
430
+
431
+ IF cron?' date' THEN
432
+ dates := _get_array_from_jsonb(dates, cron- > ' date' );
433
+ END IF;
434
+ IF cron?' dates' THEN
435
+ dates := _get_array_from_jsonb(dates, cron- > ' dates' );
427
436
END IF;
428
437
429
438
IF params?' date' THEN
@@ -437,9 +446,13 @@ BEGIN
437
446
IF N > 0 THEN
438
447
EXECUTE ' SELECT array_agg(lll) FROM (SELECT distinct(date_trunc(' ' min' ' , unnest::timestamp with time zone)) as lll FROM unnest($1) ORDER BY date_trunc(' ' min' ' , unnest::timestamp with time zone)) as Z'
439
448
INTO dates USING dates;
440
- cron := COALESCE( cron, ' {} ' ::jsonb) || json_build_object (' dates' , array_to_json(dates))::jsonb ;
449
+ cron := cron || jsonb_build_object (' dates' , array_to_json(dates));
441
450
END IF;
442
-
451
+
452
+ IF updatePrev AND prev IS NOT NULL THEN
453
+ cron := prev || cron;
454
+ END IF;
455
+
443
456
clean_cron := ' {}' ::jsonb;
444
457
FOR name IN SELECT * FROM unnest(' {dates, crontab, onstart, days, hours, wdays, months, minutes}' ::text [])
445
458
LOOP
@@ -564,7 +577,7 @@ BEGIN
564
577
RAISE WARNING ' You used excess keys in params: %.' , array_to_string(excess, ' , ' );
565
578
END IF;
566
579
567
- cron := _get_cron_from_attrs(params);
580
+ cron := _get_cron_from_attrs(params, NULL );
568
581
commands := _get_commands_from_attrs(params);
569
582
executor := _get_executor_from_attrs(params);
570
583
node := ' master' ;
@@ -635,7 +648,7 @@ LANGUAGE plpgsql
635
648
CREATE FUNCTION create_job (cron text , command text , node text DEFAULT NULL ) RETURNS integer AS
636
649
$BODY$
637
650
BEGIN
638
- RETURN create_job(json_build_object (' cron' , cron, ' command' , command, ' node' , node)::jsonb );
651
+ RETURN create_job(jsonb_build_object (' cron' , cron, ' command' , command, ' node' , node));
639
652
END
640
653
$BODY$
641
654
LANGUAGE plpgsql
@@ -644,7 +657,7 @@ LANGUAGE plpgsql
644
657
CREATE FUNCTION create_job (dt timestamp with time zone , command text , node text DEFAULT NULL ) RETURNS integer AS
645
658
$BODY$
646
659
BEGIN
647
- RETURN create_job(json_build_object (' date' , dt::text , ' command' , command, ' node' , node)::jsonb );
660
+ RETURN create_job(jsonb_build_object (' date' , dt::text , ' command' , command, ' node' , node));
648
661
END
649
662
$BODY$
650
663
LANGUAGE plpgsql
@@ -653,7 +666,7 @@ LANGUAGE plpgsql
653
666
CREATE FUNCTION create_job (dts timestamp with time zone [], command text , node text DEFAULT NULL ) RETURNS integer AS
654
667
$BODY$
655
668
BEGIN
656
- RETURN create_job(json_build_object (' dates' , array_to_json(dts), ' command' , command, ' node' , node)::jsonb );
669
+ RETURN create_job(jsonb_build_object (' dates' , array_to_json(dts), ' command' , command, ' node' , node));
657
670
END
658
671
$BODY$
659
672
LANGUAGE plpgsql
@@ -662,7 +675,7 @@ LANGUAGE plpgsql
662
675
CREATE FUNCTION create_job (cron text , commands text [], node text DEFAULT NULL ) RETURNS integer AS
663
676
$BODY$
664
677
BEGIN
665
- RETURN create_job(json_build_object (' cron' , cron, ' commands' , array_to_json(commands), ' node' , node)::jsonb );
678
+ RETURN create_job(jsonb_build_object (' cron' , cron, ' commands' , array_to_json(commands), ' node' , node));
666
679
END
667
680
$BODY$
668
681
LANGUAGE plpgsql
@@ -671,7 +684,7 @@ LANGUAGE plpgsql
671
684
CREATE FUNCTION create_job (dt timestamp with time zone , commands text [], node text DEFAULT NULL ) RETURNS integer AS
672
685
$BODY$
673
686
BEGIN
674
- RETURN create_job(json_build_object (' date' , dt::text , ' commands' , array_to_json(commands), ' node' , node)::jsonb );
687
+ RETURN create_job(jsonb_build_object (' date' , dt::text , ' commands' , array_to_json(commands), ' node' , node));
675
688
END
676
689
$BODY$
677
690
LANGUAGE plpgsql
@@ -680,7 +693,7 @@ LANGUAGE plpgsql
680
693
CREATE FUNCTION create_job (dts timestamp with time zone [], commands text [], node text DEFAULT NULL ) RETURNS integer AS
681
694
$BODY$
682
695
BEGIN
683
- RETURN create_job(json_build_object (' dates' , array_to_json(dts), ' commands' , array_to_json(commands), ' node' , node)::jsonb );
696
+ RETURN create_job(jsonb_build_object (' dates' , array_to_json(dts), ' commands' , array_to_json(commands), ' node' , node));
684
697
END
685
698
$BODY$
686
699
LANGUAGE plpgsql
@@ -711,7 +724,7 @@ BEGIN
711
724
712
725
IF attrs?' cron' OR attrs?' date' OR attrs?' dates' OR attrs?' rule' THEN
713
726
cmd := cmd || ' rule = ' ||
714
- quote_literal(_get_cron_from_attrs(attrs)) || ' ::jsonb, ' ;
727
+ quote_literal(_get_cron_from_attrs(attrs, job . rule )) || ' ::jsonb, ' ;
715
728
END IF;
716
729
717
730
IF attrs?' command' OR attrs?' commands' THEN
@@ -796,14 +809,27 @@ $BODY$
796
809
LANGUAGE plpgsql
797
810
SECURITY DEFINER set search_path FROM CURRENT;
798
811
812
+ CREATE FUNCTION set_job_attribute (jobId integer , name text , value jsonb) RETURNS boolean AS
813
+ $BODY$
814
+ BEGIN
815
+ IF name <> ' rule' THEN
816
+ RAISE EXCEPTION ' key % cannot have a jsonb value. Only "rule" allowed' , name;
817
+ END IF;
818
+
819
+ RETURN set_job_attributes(jobId, jsonb_build_object(name, value));
820
+ END
821
+ $BODY$
822
+ LANGUAGE plpgsql
823
+ SECURITY DEFINER set search_path FROM CURRENT;
824
+
799
825
CREATE FUNCTION set_job_attribute (jobId integer , name text , value anyarray) RETURNS boolean AS
800
826
$BODY$
801
827
BEGIN
802
828
IF name <> ' dates' AND name <> ' commands' THEN
803
829
RAISE EXCEPTION ' key % cannot have an array value. Only dates, commands allowed' , name;
804
830
END IF;
805
831
806
- RETURN set_job_attributes(jobId, json_build_object (name, array_to_json(value))::jsonb );
832
+ RETURN set_job_attributes(jobId, jsonb_build_object (name, array_to_json(value)));
807
833
END
808
834
$BODY$
809
835
LANGUAGE plpgsql
@@ -815,9 +841,11 @@ DECLARE
815
841
attrs jsonb;
816
842
BEGIN
817
843
IF name = ' dates' OR name = ' commands' THEN
818
- attrs := json_build_object(name, array_to_json(value::text []));
844
+ attrs := jsonb_build_object(name, array_to_json(value::text []));
845
+ ELSIF name = ' rule' THEN
846
+ attrs := jsonb_build_object(' rule' , value::jsonb);
819
847
ELSE
820
- attrs := json_build_object (name, value);
848
+ attrs := jsonb_build_object (name, value);
821
849
END IF;
822
850
RETURN set_job_attributes(jobId, attrs);
823
851
END
0 commit comments