@haathie/pgmb 0.2.17 → 0.2.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haathie/pgmb",
3
- "version": "0.2.17",
3
+ "version": "0.2.18",
4
4
  "description": "PG message broker, with a type-safe typescript client with built-in webhook & SSE support.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org",
@@ -0,0 +1,54 @@
1
+ SET search_path TO pgmb;
2
+ -- Trigger that pushes changes to the events table
3
+ CREATE OR REPLACE FUNCTION push_table_event()
4
+ RETURNS TRIGGER AS $$
5
+ DECLARE
6
+ start_num BIGINT = create_random_bigint();
7
+ BEGIN
8
+ IF TG_OP = 'INSERT' THEN
9
+ INSERT INTO events(id, topic, payload)
10
+ SELECT
11
+ create_event_id(clock_timestamp(), rand := start_num + row_number() OVER ()),
12
+ create_topic(TG_TABLE_SCHEMA, TG_TABLE_NAME, TG_OP),
13
+ jsonb_strip_nulls(s.data)
14
+ FROM NEW n
15
+ CROSS JOIN LATERAL
16
+ serialise_record_for_event(TG_RELID, TG_OP, n) AS s(data, emit)
17
+ WHERE s.emit;
18
+ ELSIF TG_OP = 'DELETE' THEN
19
+ INSERT INTO events(id, topic, payload)
20
+ SELECT
21
+ create_event_id(clock_timestamp(), rand := start_num + row_number() OVER ()),
22
+ create_topic(TG_TABLE_SCHEMA, TG_TABLE_NAME, TG_OP),
23
+ jsonb_strip_nulls(to_jsonb(s.data))
24
+ FROM OLD o
25
+ CROSS JOIN LATERAL
26
+ serialise_record_for_event(TG_RELID, TG_OP, o) AS s(data, emit)
27
+ WHERE s.emit;
28
+ ELSIF TG_OP = 'UPDATE' THEN
29
+ -- For updates, we can send both old and new data
30
+ INSERT INTO events(id, topic, payload, metadata)
31
+ SELECT
32
+ create_event_id(clock_timestamp(), rand := start_num + n.rn),
33
+ create_topic(TG_TABLE_SCHEMA, TG_TABLE_NAME, TG_OP),
34
+ jsonb_diff(n.data, o.data),
35
+ jsonb_build_object('old', jsonb_strip_nulls(o.data))
36
+ FROM (
37
+ SELECT s.data, s.emit, row_number() OVER () AS rn
38
+ FROM NEW n
39
+ CROSS JOIN LATERAL
40
+ serialise_record_for_event(TG_RELID, TG_OP, n) AS s(data, emit)
41
+ ) AS n
42
+ INNER JOIN (
43
+ SELECT s.data, row_number() OVER () AS rn FROM OLD o
44
+ CROSS JOIN LATERAL
45
+ serialise_record_for_event(TG_RELID, TG_OP, o) AS s(data, emit)
46
+ ) AS o ON n.rn = o.rn
47
+ -- ignore rows where data didn't change
48
+ WHERE jsonb_diff(n.data, o.data) is not null AND n.emit;
49
+ END IF;
50
+
51
+ RETURN NULL;
52
+ END
53
+ $$ LANGUAGE plpgsql SECURITY DEFINER VOLATILE PARALLEL UNSAFE
54
+ SET search_path TO pgmb;
@@ -4,6 +4,8 @@ ALTER TYPE config_type ADD VALUE 'use_pg_cron';
4
4
  ALTER TYPE config_type ADD VALUE 'pg_cron_poll_for_events_cron';
5
5
  ALTER TYPE config_type ADD VALUE 'pg_cron_partition_maintenance_cron';
6
6
 
7
+ COMMIT; -- prevents unsafe enum use
8
+
7
9
  INSERT INTO config(id, value) VALUES
8
10
  ('pg_cron_poll_for_events_cron', '1 second'),
9
11
  -- every 30 minutes