You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
897 B
51 lines
897 B
3 years ago
|
CREATE TABLE targets (
|
||
|
level_1 TEXT,
|
||
|
level_2 TEXT,
|
||
|
channel_name TEXT,
|
||
|
UNIQUE (level_1, level_2)
|
||
|
);
|
||
|
|
||
|
CREATE TABLE commands (
|
||
|
id SERIAL PRIMARY KEY,
|
||
|
level_1 TEXT,
|
||
|
level_2 TEXT,
|
||
|
payload TEXT,
|
||
|
channel_name TEXT,
|
||
|
channel_failure BOOLEAN
|
||
|
);
|
||
|
|
||
|
CREATE OR REPLACE FUNCTION notify_channel()
|
||
|
RETURNS TRIGGER
|
||
|
LANGUAGE PLPGSQL
|
||
|
AS
|
||
|
$$
|
||
|
DECLARE
|
||
|
target_channel TEXT;
|
||
|
BEGIN
|
||
|
SELECT channel_name
|
||
|
INTO target_channel
|
||
|
FROM targets
|
||
|
WHERE level_1 = NEW.level_1
|
||
|
AND level_2 = NEW.level_2;
|
||
|
|
||
|
if found then
|
||
|
SELECT pg_notify(target_channel, NEW.playload);
|
||
|
UPDATE commands
|
||
|
SET channel_name = channel_name, channel_failure = false
|
||
|
WHERE id = NEW.id;
|
||
|
else
|
||
|
UPDATE commands
|
||
|
SET channel_failure = true
|
||
|
WHERE id = NEW.id;
|
||
|
end if;
|
||
|
|
||
|
RETURN NEW;
|
||
|
END;
|
||
|
$$;
|
||
|
|
||
|
CREATE TRIGGER notify_channel
|
||
|
AFTER INSERT
|
||
|
ON commands
|
||
|
FOR EACH ROW
|
||
|
EXECUTE PROCEDURE notify_channel();
|