@haathie/pgmb 0.2.0

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.
@@ -0,0 +1,154 @@
1
+ /* @name assertGroup */
2
+ INSERT INTO pgmb.subscription_groups (id)
3
+ VALUES (:id!)
4
+ ON CONFLICT DO NOTHING;
5
+
6
+ /* @name assertSubscription */
7
+ INSERT INTO pgmb.subscriptions
8
+ AS s(group_id, conditions_sql, params, expiry_interval)
9
+ VALUES (
10
+ :groupId!,
11
+ COALESCE(:conditionsSql, 'TRUE'),
12
+ COALESCE(:params::jsonb, '{}'),
13
+ :expiryInterval::interval
14
+ )
15
+ ON CONFLICT (identity) DO UPDATE
16
+ SET
17
+ -- set expiry_interval to the new value only if it's greater than the existing one
18
+ -- or if the new value is NULL (indicating no expiration)
19
+ expiry_interval = CASE
20
+ WHEN EXCLUDED.expiry_interval IS NULL OR s.expiry_interval IS NULL
21
+ THEN NULL
22
+ ELSE
23
+ GREATEST(s.expiry_interval, EXCLUDED.expiry_interval)
24
+ END,
25
+ last_active_at = NOW()
26
+ RETURNING id AS "id!";
27
+
28
+ /*
29
+ @name deleteSubscriptions
30
+ @param ids -> (...)
31
+ */
32
+ DELETE FROM pgmb.subscriptions
33
+ WHERE id IN :ids!;
34
+
35
+ /*
36
+ @name markSubscriptionsActive
37
+ */
38
+ UPDATE pgmb.subscriptions
39
+ SET
40
+ last_active_at = NOW()
41
+ WHERE id IN (SELECT * FROM unnest(:ids!::pgmb.subscription_id[]));
42
+
43
+ /* @name pollForEvents */
44
+ SELECT count AS "count!" FROM pgmb.poll_for_events() AS count;
45
+
46
+ /* @name readNextEvents */
47
+ SELECT
48
+ id AS "id!",
49
+ topic AS "topic!",
50
+ payload AS "payload!",
51
+ metadata AS "metadata!",
52
+ subscription_ids::text[] AS "subscriptionIds!",
53
+ next_cursor AS "nextCursor!"
54
+ FROM pgmb.read_next_events(:groupId!, :cursor, :chunkSize!);
55
+
56
+ /* @name readNextEventsText */
57
+ SELECT
58
+ id AS "id!",
59
+ topic AS "topic!",
60
+ payload::text AS "payload!"
61
+ FROM pgmb.read_next_events(:groupId!, :cursor, :chunkSize!);
62
+
63
+ /* @name replayEvents */
64
+ SELECT
65
+ id AS "id!",
66
+ topic AS "topic!",
67
+ payload AS "payload!",
68
+ metadata AS "metadata!"
69
+ FROM pgmb.replay_events(
70
+ :groupId!,
71
+ :subscriptionId!,
72
+ :fromEventId!::pgmb.event_id,
73
+ :maxEvents!
74
+ );
75
+
76
+ /* @name setGroupCursor */
77
+ SELECT pgmb.set_group_cursor(
78
+ :groupId!,
79
+ :cursor!::pgmb.event_id,
80
+ :releaseLock::boolean
81
+ ) AS "success!";
82
+
83
+ /* @name releaseGroupLock */
84
+ SELECT pgmb.release_group_lock(:groupId!) AS "success!";
85
+
86
+ /* @name writeEvents */
87
+ INSERT INTO pgmb.events (topic, payload, metadata)
88
+ SELECT
89
+ topic,
90
+ payload,
91
+ metadata
92
+ FROM unnest(
93
+ :topics!::TEXT[],
94
+ :payloads!::JSONB[],
95
+ :metadatas!::JSONB[]
96
+ ) AS t(topic, payload, metadata)
97
+ RETURNING id AS "id!";
98
+
99
+ /* @name writeScheduledEvents */
100
+ INSERT INTO pgmb.events (id, topic, payload, metadata)
101
+ SELECT
102
+ pgmb.create_event_id(COALESCE(ts, clock_timestamp()), pgmb.create_random_bigint()),
103
+ topic,
104
+ payload,
105
+ metadata
106
+ FROM unnest(
107
+ :ts!::TIMESTAMPTZ[],
108
+ :topics!::TEXT[],
109
+ :payloads!::JSONB[],
110
+ :metadatas!::JSONB[]
111
+ ) AS t(ts, topic, payload, metadata)
112
+ RETURNING id AS "id!";
113
+
114
+ /* @name scheduleEventRetry */
115
+ INSERT INTO pgmb.events (id, topic, payload, subscription_id)
116
+ SELECT
117
+ pgmb.create_event_id(
118
+ NOW() + (:delayInterval!::INTERVAL),
119
+ pgmb.create_random_bigint()
120
+ ),
121
+ 'pgmb-retry',
122
+ jsonb_build_object(
123
+ 'ids',
124
+ :ids!::pgmb.event_id[],
125
+ 'retryNumber',
126
+ :retryNumber!::int,
127
+ 'handlerName',
128
+ :handlerName!::text
129
+ ),
130
+ :subscriptionId!::pgmb.subscription_id
131
+ RETURNING id AS "id!";
132
+
133
+ /* @name findEvents */
134
+ SELECT
135
+ id AS "id!",
136
+ topic AS "topic!",
137
+ payload AS "payload!",
138
+ metadata AS "metadata!"
139
+ FROM pgmb.events
140
+ WHERE id = ANY(:ids!::pgmb.event_id[]);
141
+
142
+ /* @name removeExpiredSubscriptions */
143
+ WITH deleted AS (
144
+ DELETE FROM pgmb.subscriptions
145
+ WHERE group_id = :groupId!
146
+ AND expiry_interval IS NOT NULL
147
+ AND pgmb.add_interval_imm(last_active_at, expiry_interval) < NOW()
148
+ AND id NOT IN (select * from unnest(:activeIds!::pgmb.subscription_id[]))
149
+ RETURNING id
150
+ )
151
+ SELECT COUNT(*) AS "deleted!" FROM deleted;
152
+
153
+ /* @name maintainEventsTable */
154
+ SELECT pgmb.maintain_events_table();