diff --git a/03-other-functions.sql b/03-other-functions.sql index 450138b5fe285e59b57f9c99c2d31148f35e85f4..e3ba587efe30fe6b9caaff5fe1a7070f80ef2bad 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();