From 2f9f03eda996b57cde16e3f23270c7688515e6fc Mon Sep 17 00:00:00 2001 From: Arnaud Poncet-Montanges Date: Fri, 25 Oct 2024 09:48:20 +0200 Subject: [PATCH] Add modification_last_modified functions Add modification_last_modified functions --- datamodel/app/create_app.py | 3 + .../app/functions/modification_functions.sql | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 datamodel/app/functions/modification_functions.sql diff --git a/datamodel/app/create_app.py b/datamodel/app/create_app.py index 46dc33b3..05175d49 100755 --- a/datamodel/app/create_app.py +++ b/datamodel/app/create_app.py @@ -59,7 +59,10 @@ def create_app( run_sql("CREATE SCHEMA tdh_app;", pg_service) + # Create application functions + run_sql_file("functions/oid_functions.sql", pg_service, variables) + run_sql_file("functions/modification_functions.sql", pg_service) run_sql_file("functions/organisation_functions.sql", pg_service, variables) # to do add symbology_function and geometry_funcions for TEKSI Distance heating diff --git a/datamodel/app/functions/modification_functions.sql b/datamodel/app/functions/modification_functions.sql new file mode 100644 index 00000000..85bfe092 --- /dev/null +++ b/datamodel/app/functions/modification_functions.sql @@ -0,0 +1,72 @@ +------ LAST MODIFIED ----- +CREATE FUNCTION tdh_app.modification_last_modified() RETURNS trigger AS $$ +BEGIN + NEW.last_modification := TIMEOFDAY(); + + RETURN NEW; +END; +$$ LANGUAGE PLPGSQL; + +CREATE FUNCTION tdh_app.modification_last_modified_parent() RETURNS trigger AS $$ +DECLARE + table_name TEXT; +BEGIN + table_name = TG_ARGV[0]; + + EXECUTE ' + UPDATE ' || table_name || ' + SET last_modification = TIMEOFDAY()::timestamp + WHERE obj_id = ''' || NEW.obj_id || ''' +'; + RETURN NEW; +END; +$$ LANGUAGE PLPGSQL; + +CREATE OR REPLACE FUNCTION tdh_app.alter_modification_triggers(action_name text) RETURNS VOID AS +$DO$ +DECLARE + schdf text; + tbldf text; + trig text; +BEGIN +IF NOT (action_name ILIKE ANY(ARRAY['ENABLE','DISABLE'])) THEN + RAISE NOTICE '% not a valid input',action_name; + RETURN; +ELSE + FOR schdf,tbldf, trig IN + SELECT + c.relnamespace ::regnamespace::text, + c.relname, + t.tgname + FROM pg_trigger t + INNER JOIN pg_class c on t.tgrelid=c.oid + INNER JOIN pg_proc p on t.tgfoid=p.oid + WHERE p.proname LIKE 'modification_%' + AND p.pronamespace::regnamespace::text = 'tdh_app' + LOOP + EXECUTE FORMAT('ALTER TABLE %I.%I %s TRIGGER %I',schdf,tbldf,upper(action_name),trig); + END LOOP; + + RETURN; +END IF; +END; +$DO$ +LANGUAGE plpgsql SECURITY DEFINER; + +CREATE OR REPLACE FUNCTION tdh_app.check_modification_enabled() RETURNS BOOL AS +$DO$ +DECLARE _disabled_count numeric; +BEGIN + SELECT count(*) into _disabled_count + FROM pg_trigger t + INNER JOIN pg_class c on t.tgrelid=c.oid + INNER JOIN pg_proc p on t.tgfoid=p.oid + WHERE + p.proname LIKE 'modification_%' + AND p.pronamespace::regnamespace::text = 'tdh_app' + + AND t.tgenabled = 'D'; + RETURN _disabled_count=0; +END; +$DO$ +LANGUAGE plpgsql SECURITY DEFINER;