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