-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunctions.sql
More file actions
69 lines (61 loc) · 1.63 KB
/
Copy pathfunctions.sql
File metadata and controls
69 lines (61 loc) · 1.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
-- queue implementation (data is deleted after read)
CREATE OR REPLACE FUNCTION create_queue(queue_name text) RETURNS void AS
$BODY$
DECLARE
queue_table_name text := 'queue_' || queue_name;
BEGIN
EXECUTE format('
CREATE TABLE IF NOT EXISTS %s (
value text,
id bigserial PRIMARY KEY)'
, queue_table_name);
EXECUTE format('
DROP TRIGGER IF EXISTS %s_trigger ON %s'
, queue_table_name, queue_table_name);
EXECUTE format('
CREATE TRIGGER %s_trigger
AFTER INSERT
ON %s
FOR EACH ROW
EXECUTE PROCEDURE generic_queue_notify()'
, queue_table_name, queue_table_name);
END;
$BODY$
LANGUAGE 'plpgsql';
-- used by queue tables to perform the notification
CREATE OR REPLACE FUNCTION generic_queue_notify() RETURNS trigger AS
$BODY$
BEGIN
PERFORM pg_notify(TG_TABLE_NAME, '');
RETURN new;
END;
$BODY$
LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION drop_queue(queue_name text) RETURNS void AS
$BODY$
DECLARE
queue_table_name text := 'queue_' || queue_name;
BEGIN
EXECUTE format('DROP TABLE IF EXISTS %s', queue_table_name);
END;
$BODY$
LANGUAGE 'plpgsql';
CREATE OR REPLACE FUNCTION read_queue_entry(queue_name text) RETURNS SETOF text AS
$BODY$
DECLARE
queue_table_name text := 'queue_' || queue_name;
BEGIN
RETURN QUERY EXECUTE format('
DELETE FROM %s
WHERE id = (
SELECT id
FROM %s
ORDER BY id
FOR UPDATE SKIP LOCKED
LIMIT 1
)
RETURNING value'
, queue_table_name, queue_table_name);
END;
$BODY$
LANGUAGE 'plpgsql';