From 337ae5314152bc631f19598694aeef139fb6fce7 Mon Sep 17 00:00:00 2001 From: "Karl O. Pinc kop@karlpinc.com" Date: Thu, 2 Oct 2025 22:13:46 +0000 Subject: [PATCH] Enforce rule that a follow must have a related FOLLOW_OBSERVERS row --- db/schemas/lib/triggers/create/follows.m4 | 44 +++++++++++++++++++++++ db/schemas/lib/triggers/drop/follows.m4 | 1 + 2 files changed, 45 insertions(+) diff --git a/db/schemas/lib/triggers/create/follows.m4 b/db/schemas/lib/triggers/create/follows.m4 index 1c476a0..19c7100 100644 --- a/db/schemas/lib/triggers/create/follows.m4 +++ b/db/schemas/lib/triggers/create/follows.m4 @@ -103,8 +103,52 @@ CREATE OR REPLACE FUNCTION follows_func () $$; +RAISE INFO 'follows_commit_func'; +CREATE OR REPLACE FUNCTION follows_commit_func () + RETURNS trigger + LANGUAGE plpgsql + sdb_function_set_search_path + AS $$ + BEGIN + -- Function for follows insert trigger fired on transaction commit + -- + -- AGPL_notice(` --', `2025', + `The Meme Factory, Inc., www.karlpinc.com') + + -- A row must exist on FOLLOW_OBSERVERS + PERFORM 1 + FROM follow_observers + WHERE follow_observers.fid = NEW.fid; + IF NOT FOUND THEN + RAISE EXCEPTION integrity_constraint_violation USING + MESSAGE = 'Error on INSERT of FOLLOWS' + , DETAIL = 'A row on FOLLOWS must have a related row on' + || ' FOLLOW_OBSERVERS' + || ': Key (FID) = (' + || NEW.fid + || '), Value (Focal) = (' + || NEW.focal + || '), Value (Date) = (' + || NEW.Date + || '), Value (Community) = (' + || NEW.community + || ')'; + END IF; + + RETURN NULL; + END; +$$; + RAISE INFO 'follows_trigger'; CREATE TRIGGER follows_trigger AFTER INSERT OR UPDATE ON follows FOR EACH ROW EXECUTE PROCEDURE follows_func(); + +RAISE INFO 'follows_commit_trigger'; +CREATE CONSTRAINT TRIGGER follows_commit_trigger + AFTER INSERT + ON follows + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW + EXECUTE PROCEDURE follows_commit_func(); diff --git a/db/schemas/lib/triggers/drop/follows.m4 b/db/schemas/lib/triggers/drop/follows.m4 index 3017808..06ecd58 100644 --- a/db/schemas/lib/triggers/drop/follows.m4 +++ b/db/schemas/lib/triggers/drop/follows.m4 @@ -21,3 +21,4 @@ dnl m4 includes include(`copyright.m4')dnl DROP FUNCTION IF EXISTS follows_func() CASCADE; +DROP FUNCTION IF EXISTS follows_commit_func() CASCADE; -- 2.34.1