diff --git a/03-other-functions.sql b/03-other-functions.sql index 42b9105a4807332d056ff77b75fc220969b5f588..1646ec89f064d9300db2db72c46dea31932babb4 100644 --- a/03-other-functions.sql +++ b/03-other-functions.sql @@ -69,3 +69,24 @@ SELECT '/' || string_agg(name, '/') FROM ( ) SELECT name FROM paths ORDER BY LEVEL DESC ) AS names $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 +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 + 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();