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.
50 lines
897 B
50 lines
897 B
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();
|
|
|