From cbd13339939f64cbaf25867aa768b77af6828d3b Mon Sep 17 00:00:00 2001 From: Sonia Zorba <sonia.zorba@inaf.it> Date: Thu, 8 Jul 2021 12:30:54 +0200 Subject: [PATCH] Improved job phase triggers --- 03-other-functions.sql | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/03-other-functions.sql b/03-other-functions.sql index 450138b..e3ba587 100644 --- a/03-other-functions.sql +++ b/03-other-functions.sql @@ -73,25 +73,41 @@ $func$ LANGUAGE sql; -- Trigger function that automatically updates start time and end time of jobs at phase update. -- This could be performed by business logic of each application that handles jobs but relying directly on the database ensures a better uniformity. -CREATE OR REPLACE FUNCTION job_phase_updated() RETURNS TRIGGER +CREATE OR REPLACE FUNCTION job_phase_inserted() RETURNS TRIGGER AS $func$ BEGIN IF new.phase = 'EXECUTING' THEN new.start_time := NOW(); - ELSIF new.phase = 'COMPLETED' OR new.phase = 'ERROR' OR new.phase = 'ABORTED' THEN + ELSIF new.phase = 'COMPLETED' OR new.phase = 'ERROR' THEN + new.start_time := NOW(); new.end_time := NOW(); END IF; RETURN new; END; $func$ LANGUAGE plpgsql; -CREATE TRIGGER job_update - BEFORE UPDATE OF phase ON job - FOR EACH ROW - EXECUTE PROCEDURE job_phase_updated(); +CREATE OR REPLACE FUNCTION job_phase_updated() RETURNS TRIGGER +AS +$func$ +BEGIN + IF new.phase != old.phase THEN + IF new.phase = 'EXECUTING' THEN + new.start_time := NOW(); + ELSIF new.phase = 'COMPLETED' OR new.phase = 'ERROR' OR new.phase = 'ABORTED' THEN + new.end_time := NOW(); + END IF; + END IF; + RETURN new; +END; +$func$ LANGUAGE plpgsql; CREATE TRIGGER job_insert BEFORE INSERT ON job FOR EACH ROW + EXECUTE PROCEDURE job_phase_inserted(); + +CREATE TRIGGER job_update + BEFORE UPDATE OF phase ON job + FOR EACH ROW EXECUTE PROCEDURE job_phase_updated(); -- GitLab