prostgles-server 4.2.487 → 4.2.488

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.
@@ -1 +1 @@
1
- {"version":3,"file":"getDataWatchFunctionQuery.d.ts","sourceRoot":"","sources":["../../../lib/PubSubManager/init/getDataWatchFunctionQuery.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,iCAAiC,UAAkB,CAAC;AACjE,eAAO,MAAM,yBAAyB,GAAI,WAAW,OAAO,GAAG,SAAS,WA6KvE,CAAC;AA6JF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
1
+ {"version":3,"file":"getDataWatchFunctionQuery.d.ts","sourceRoot":"","sources":["../../../lib/PubSubManager/init/getDataWatchFunctionQuery.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,eAAO,MAAM,iCAAiC,UAAkB,CAAC;AACjE,eAAO,MAAM,yBAAyB,GAAI,WAAW,OAAO,GAAG,SAAS,WAoGvE,CAAC;AAwPF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
@@ -14,8 +14,7 @@ const getDataWatchFunctionQuery = (debugMode) => {
14
14
 
15
15
  CREATE OR REPLACE FUNCTION ${getPubSubManagerInitQuery_1.DB_OBJ_NAMES.data_watch_func}() RETURNS TRIGGER
16
16
  AS $$
17
-
18
- DECLARE t_ids TEXT[];
17
+
19
18
  DECLARE c_ids INTEGER[];
20
19
  DECLARE err_c_ids INTEGER[];
21
20
  DECLARE condition_checks_union_query TEXT := '';
@@ -32,125 +31,53 @@ const getDataWatchFunctionQuery = (debugMode) => {
32
31
  DECLARE escaped_table TEXT;
33
32
 
34
33
  DECLARE _columns_info JSONB := NULL;
35
-
36
- DECLARE changed_columns _TEXT := NULL;
34
+ DECLARE changed_columns_by_trigger_id JSONB := NULL;
35
+ DECLARE changed_columns _TEXT := NULL;
37
36
 
38
37
  BEGIN
39
38
 
40
39
  escaped_table := concat_ws('.', CASE WHEN TG_TABLE_SCHEMA <> CURRENT_SCHEMA THEN format('%I', TG_TABLE_SCHEMA) END, format('%I', TG_TABLE_NAME));
41
40
 
42
- ${CHANGED_COLUMNS_CHECK}
43
-
44
- SELECT string_agg(
45
- format(
46
- $c$
47
- SELECT CASE WHEN EXISTS(
48
- SELECT 1
49
- FROM %s
50
- WHERE %s
51
- ) THEN %s::text END AS t_id
52
- $c$,
53
- table_name,
54
- condition,
55
- id
56
- ),
57
- E' UNION \n '
58
- )
59
- INTO condition_checks_union_query
60
- FROM prostgles.v_triggers
61
- WHERE table_name = escaped_table;
62
-
63
-
64
- /* condition_checks_union_query = 'old_table union new_table' or any one of the tables */
65
- IF condition_checks_union_query IS NOT NULL THEN
66
-
67
- SELECT
68
- format(
69
- E'WITH %I AS (\n %s \n) ',
70
- TG_TABLE_NAME,
71
- concat_ws(
72
- E' UNION ALL \n ',
73
- CASE WHEN (TG_OP = 'DELETE' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM old_table ' END,
74
- CASE WHEN (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM new_table ' END
75
- )
76
- )
77
- ||
78
- COALESCE((
79
- SELECT ', ' || string_agg(format(E' %s AS ( \n %s \n ) ', related_view_name, related_view_def), ', ')
80
- FROM (
81
- SELECT DISTINCT related_view_name, related_view_def
82
- FROM prostgles.v_triggers
83
- WHERE table_name = escaped_table
84
- AND related_view_name IS NOT NULL
85
- AND related_view_def IS NOT NULL
86
- ) t
87
- ), '')
88
- ||
89
- format(
90
- $c$
91
- SELECT ARRAY_AGG(DISTINCT t.t_id)
92
- FROM (
93
- %s
94
- ) t
95
- $c$,
96
- condition_checks_union_query
97
- )
98
- INTO query;
99
-
100
- BEGIN
101
- EXECUTE query INTO t_ids;
102
-
103
- EXCEPTION WHEN OTHERS THEN
104
-
105
- has_errors := TRUE;
106
-
107
- GET STACKED DIAGNOSTICS
108
- err_text = MESSAGE_TEXT,
109
- err_detail = PG_EXCEPTION_DETAIL,
110
- err_hint = PG_EXCEPTION_HINT;
111
-
112
- END;
113
-
114
- --RAISE NOTICE 'has_errors: % ', has_errors;
115
- --RAISE NOTICE 'condition_checks_union_query: % , cids: %', condition_checks_union_query, c_ids;
116
-
117
- IF (t_ids IS NOT NULL OR has_errors) THEN
118
-
119
- FOR v_trigger IN
120
- SELECT app_id, string_agg(c_id::text, ',') as cids
121
- FROM prostgles.v_triggers
122
- WHERE id = ANY(t_ids)
123
- OR has_errors
124
- GROUP BY app_id
125
- LOOP
126
-
127
- PERFORM pg_notify(
128
- ${(0, PubSubManagerUtils_1.asValue)(PubSubManagerUtils_1.NOTIF_CHANNEL.preffix)} || v_trigger.app_id ,
129
- LEFT(concat_ws(
130
- ${(0, PubSubManagerUtils_1.asValue)(PubSubManagerUtils_1.DELIMITER)},
131
-
132
- ${(0, PubSubManagerUtils_1.asValue)(PubSubManagerUtils_1.NOTIF_TYPE.data)},
133
- COALESCE(escaped_table, 'MISSING'),
134
- COALESCE(TG_OP, 'MISSING'),
135
- CASE WHEN has_errors
136
- THEN concat_ws('; ', 'error', err_text, err_detail, err_hint, 'query: ' || query )
137
- ELSE COALESCE(v_trigger.cids, '')
138
- END,
139
- COALESCE(changed_columns::TEXT, '')
140
- ${debugMode ? ", COALESCE(current_query(), 'current_query ??'), ' ', query" : ""}
141
- ), 7999/4) -- Some chars are 2bytes -> 'Ω'
142
- );
143
- END LOOP;
144
-
145
-
146
- IF has_errors THEN
147
-
148
- DELETE FROM prostgles.app_triggers;
149
- RAISE NOTICE 'trigger dropped due to exception: % % %', err_text, err_detail, err_hint;
150
-
151
- END IF;
152
-
153
- END IF;
41
+ ${CHANGED_COLUMNS_FOR_EACH_TRIGGER_CHECK}
42
+
43
+ ${EACH_TRIGGER_CHECK_ALL_COLUMNS}
44
+
45
+ IF (c_ids IS NOT NULL OR has_errors) THEN
46
+
47
+ FOR v_trigger IN
48
+ SELECT app_id, string_agg(c_id::text, ',') as cids
49
+ FROM prostgles.v_triggers
50
+ WHERE c_id = ANY(c_ids)
51
+ OR has_errors
52
+ GROUP BY app_id
53
+ LOOP
54
+
55
+ PERFORM pg_notify(
56
+ ${(0, PubSubManagerUtils_1.asValue)(PubSubManagerUtils_1.NOTIF_CHANNEL.preffix)} || v_trigger.app_id ,
57
+ LEFT(concat_ws(
58
+ ${(0, PubSubManagerUtils_1.asValue)(PubSubManagerUtils_1.DELIMITER)},
59
+
60
+ ${(0, PubSubManagerUtils_1.asValue)(PubSubManagerUtils_1.NOTIF_TYPE.data)},
61
+ COALESCE(escaped_table, 'MISSING'),
62
+ COALESCE(TG_OP, 'MISSING'),
63
+ CASE WHEN has_errors
64
+ THEN concat_ws('; ', 'error', err_text, err_detail, err_hint, 'query: ' || query )
65
+ ELSE COALESCE(v_trigger.cids, '')
66
+ END,
67
+ COALESCE(changed_columns_by_trigger_id::TEXT, '')
68
+ ${debugMode ? ", COALESCE(current_query(), 'current_query ??'), ' ', query" : ""}
69
+ ), 7999/4) -- Some chars are 2bytes -> 'Ω'
70
+ );
71
+ END LOOP;
72
+
73
+
74
+ IF has_errors THEN
75
+
76
+ DELETE FROM prostgles.app_triggers;
77
+ RAISE NOTICE 'trigger dropped due to exception: % % %', err_text, err_detail, err_hint;
78
+
79
+ END IF;
80
+
154
81
  END IF;
155
82
 
156
83
  ${(0, orphanTriggerCheck_1.getAppCheckQuery)()}
@@ -178,10 +105,7 @@ const getDataWatchFunctionQuery = (debugMode) => {
178
105
  return dataWatchFunctionQuery;
179
106
  };
180
107
  exports.getDataWatchFunctionQuery = getDataWatchFunctionQuery;
181
- /**
182
- * TODO: check columns for specific t_id trigger conditions
183
- */
184
- const CHANGED_COLUMNS_CHECK = `
108
+ const CHANGED_COLUMNS_FOR_EACH_TRIGGER_CHECK = `
185
109
  -- Determine changed columns for UPDATE operations
186
110
  IF TG_OP = 'UPDATE' THEN
187
111
 
@@ -193,32 +117,35 @@ IF TG_OP = 'UPDATE' THEN
193
117
  AND columns_info IS NULL
194
118
  ) THEN
195
119
 
196
- SELECT columns_info
197
- INTO _columns_info
198
- FROM prostgles.v_triggers
199
- WHERE table_name = escaped_table
200
- AND columns_info IS NOT NULL;
201
-
202
- IF _columns_info IS NOT NULL THEN
120
+ changed_columns_by_trigger_id := COALESCE(changed_columns_by_trigger_id, '{}');
121
+
122
+ FOR v_trigger IN
123
+ SELECT *
124
+ FROM prostgles.v_triggers
125
+ WHERE table_name = escaped_table
126
+ AND columns_info IS NOT NULL
127
+ LOOP
128
+
203
129
  query := format(
204
130
  $c$
205
131
  WITH changed AS (
206
132
  SELECT column_name
207
- FROM jsonb_object_keys(%L) as column_name
133
+ FROM jsonb_object_keys(%1$L) as column_name
208
134
  WHERE EXISTS (
209
135
  SELECT 1
210
- FROM old_table o
211
- LEFT JOIN new_table n
212
- ON %s
213
- WHERE %s
136
+ FROM (SELECT * FROM old_table WHERE %4$s ) o
137
+ LEFT JOIN (SELECT * FROM new_table WHERE %4$s ) n
138
+ ON %2$s
139
+ WHERE %3$s
214
140
  )
215
141
  )
216
142
  SELECT array_agg(column_name)
217
143
  FROM changed;
218
144
  $c$,
219
- _columns_info->'tracked_columns',
220
- _columns_info->>'join_condition',
221
- _columns_info->>'where_statement'
145
+ v_trigger.columns_info->'tracked_columns',
146
+ v_trigger.columns_info->>'join_condition',
147
+ v_trigger.columns_info->>'where_statement',
148
+ v_trigger.condition
222
149
  );
223
150
 
224
151
  BEGIN
@@ -232,17 +159,107 @@ IF TG_OP = 'UPDATE' THEN
232
159
  err_detail = PG_EXCEPTION_DETAIL,
233
160
  err_hint = PG_EXCEPTION_HINT;
234
161
  END;
235
-
162
+
236
163
  /* It is possible to get no changes */
237
- changed_columns := COALESCE(changed_columns, '{}');
238
-
239
- END IF;
164
+ IF changed_columns IS NOT NULL THEN
165
+
166
+ changed_columns := COALESCE(changed_columns, '{}');
167
+ changed_columns_by_trigger_id := jsonb_set(
168
+ changed_columns_by_trigger_id,
169
+ ARRAY[v_trigger.c_id::TEXT],
170
+ to_jsonb(changed_columns)
171
+ );
172
+ END IF;
173
+
174
+ --PERFORM pg_notify('debug', changed_columns::TEXT || v_trigger.c_id::TEXT || changed_columns_by_trigger_id::TEXT );
175
+
176
+ END LOOP;
177
+
240
178
 
241
179
  END IF;
242
180
  END IF;
243
181
 
182
+ `;
183
+ const EACH_TRIGGER_CHECK_ALL_COLUMNS = `
184
+
185
+ SELECT string_agg(
186
+ format(
187
+ $c$
188
+ SELECT CASE WHEN EXISTS(
189
+ SELECT 1
190
+ FROM %s
191
+ WHERE %s
192
+ ) THEN %s::text END AS c_id
193
+ $c$,
194
+ table_name,
195
+ condition,
196
+ c_id
197
+ ),
198
+ E' UNION \n '
199
+ )
200
+ INTO condition_checks_union_query
201
+ FROM prostgles.v_triggers
202
+ WHERE table_name = escaped_table;
203
+
204
+
205
+ /* condition_checks_union_query = 'old_table union new_table' or any one of the tables */
206
+ IF condition_checks_union_query IS NOT NULL THEN
207
+
208
+ SELECT
209
+ format(
210
+ E'WITH %I AS (\n %s \n) ',
211
+ TG_TABLE_NAME,
212
+ concat_ws(
213
+ E' UNION ALL \n ',
214
+ CASE WHEN (TG_OP = 'DELETE' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM old_table ' END,
215
+ CASE WHEN (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM new_table ' END
216
+ )
217
+ )
218
+ ||
219
+ COALESCE((
220
+ SELECT ', ' || string_agg(format(E' %s AS ( \n %s \n ) ', related_view_name, related_view_def), ', ')
221
+ FROM (
222
+ SELECT DISTINCT related_view_name, related_view_def
223
+ FROM prostgles.v_triggers
224
+ WHERE table_name = escaped_table
225
+ AND related_view_name IS NOT NULL
226
+ AND related_view_def IS NOT NULL
227
+ ) t
228
+ ), '')
229
+ ||
230
+ format(
231
+ $c$
232
+ SELECT ARRAY_AGG(DISTINCT t.c_id)
233
+ FROM (
234
+ %s
235
+ ) t
236
+ $c$,
237
+ condition_checks_union_query
238
+ )
239
+ INTO query;
240
+
241
+ BEGIN
242
+ EXECUTE query INTO c_ids;
243
+
244
+ EXCEPTION WHEN OTHERS THEN
245
+
246
+ has_errors := TRUE;
247
+
248
+ GET STACKED DIAGNOSTICS
249
+ err_text = MESSAGE_TEXT,
250
+ err_detail = PG_EXCEPTION_DETAIL,
251
+ err_hint = PG_EXCEPTION_HINT;
252
+
253
+ END;
254
+
255
+ --RAISE NOTICE 'has_errors: % ', has_errors;
256
+ --RAISE NOTICE 'condition_checks_union_query: % , cids: %', condition_checks_union_query, c_ids;
257
+ END IF;
258
+
259
+
244
260
  `;
245
261
  /**
262
+ * TODO: test performance and maybe add as an alternative for cases where there are no join clauses
246
263
  * Given:
247
264
  * 1. two transition tables (old_table and new_table)
248
265
  * 2. a list of primary keys
@@ -1 +1 @@
1
- {"version":3,"file":"getDataWatchFunctionQuery.js","sourceRoot":"","sources":["../../../lib/PubSubManager/init/getDataWatchFunctionQuery.ts"],"names":[],"mappings":";;;AAAA,2EAA2D;AAC3D,8DAAyD;AACzD,8DAAsF;AAEtF;;;GAGG;AACU,QAAA,iCAAiC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC1D,MAAM,yBAAyB,GAAG,CAAC,SAA8B,EAAE,EAAE;IAC1E,MAAM,sBAAsB,GAAG;;qCAEI,wCAAY,CAAC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA2B/C,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAsFP,IAAA,4BAAO,EAAC,kCAAa,CAAC,OAAO,CAAC;;kCAE5B,IAAA,4BAAO,EAAC,8BAAS,CAAC;;kCAElB,IAAA,4BAAO,EAAC,+BAAU,CAAC,IAAI,CAAC;;;;;;;;kCAQxB,SAAS,CAAC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;kBAgB9F,IAAA,qCAAgB,GAAE;;;;;;;8BAON,wCAAY,CAAC,eAAe;;GAEvD,CAAC;IAEF,2GAA2G;IAC3G,MAAM,UAAU,GAAG,sBAAsB;SACtC,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,IACE,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YACxC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAC/C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,yJAAyJ,IAAI,EAAE,CAChK,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,sBAAsB,CAAC;AAChC,CAAC,CAAC;AA7KW,QAAA,yBAAyB,6BA6KpC;AAEF;;GAEG;AACH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4D7B,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EhC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
1
+ {"version":3,"file":"getDataWatchFunctionQuery.js","sourceRoot":"","sources":["../../../lib/PubSubManager/init/getDataWatchFunctionQuery.ts"],"names":[],"mappings":";;;AAAA,2EAA2D;AAC3D,8DAAyD;AACzD,8DAAsF;AAEtF;;;GAGG;AACU,QAAA,iCAAiC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC1D,MAAM,yBAAyB,GAAG,CAAC,SAA8B,EAAE,EAAE;IAC1E,MAAM,sBAAsB,GAAG;;qCAEI,wCAAY,CAAC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;kBA0B/C,sCAAsC;;kBAEtC,8BAA8B;;;;;;;;;;;;;0BAatB,IAAA,4BAAO,EAAC,kCAAa,CAAC,OAAO,CAAC;;4BAE5B,IAAA,4BAAO,EAAC,8BAAS,CAAC;;4BAElB,IAAA,4BAAO,EAAC,+BAAU,CAAC,IAAI,CAAC;;;;;;;;4BAQxB,SAAS,CAAC,CAAC,CAAC,6DAA6D,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;kBAexF,IAAA,qCAAgB,GAAE;;;;;;;8BAON,wCAAY,CAAC,eAAe;;GAEvD,CAAC;IAEF,2GAA2G;IAC3G,MAAM,UAAU,GAAG,sBAAsB;SACtC,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACpB,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,IACE,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YACxC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAC/C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,yJAAyJ,IAAI,EAAE,CAChK,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,sBAAsB,CAAC;AAChC,CAAC,CAAC;AApGW,QAAA,yBAAyB,6BAoGpC;AAEF,MAAM,sCAAsC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0E9C,CAAC;AAEF,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6EtC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EhC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
@@ -1 +1 @@
1
- {"version":3,"file":"notifListener.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,iBAyLjF"}
1
+ {"version":3,"file":"notifListener.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIrD,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,iBA0LjF"}
@@ -60,9 +60,7 @@ async function notifListener(data) {
60
60
  throw "notifListener: dataArr length < 3";
61
61
  }
62
62
  const [_, table_name, op_name, condition_ids_str, raw_changed_columns_str = ""] = dataArr;
63
- const changedColumns = !raw_changed_columns_str ? undefined
64
- : raw_changed_columns_str === "{}" ? []
65
- : raw_changed_columns_str.slice(1, -1).split(",");
63
+ const changedColumnsByTriggerId = !raw_changed_columns_str ? undefined : JSON.parse(raw_changed_columns_str);
66
64
  const conditionIds = condition_ids_str?.split(",").map((v) => +v);
67
65
  if (!table_name) {
68
66
  throw "table_name undef";
@@ -95,7 +93,8 @@ async function notifListener(data) {
95
93
  if (orphanedTableConditions.length) {
96
94
  void this.deleteOrphanedTriggers(new Set(table_name));
97
95
  }
98
- firedTableConditions.map(({ subs, syncs }) => {
96
+ firedTableConditions.map(({ idx, subs, syncs }) => {
97
+ const changedColumns = changedColumnsByTriggerId && (changedColumnsByTriggerId[idx] ?? []);
99
98
  (0, PubSubManagerUtils_1.log)("notifListener", subs.map((s) => s.channel_name), syncs.map((s) => s.channel_name));
100
99
  syncs.map((s) => {
101
100
  void this.syncData(s, undefined, "trigger");
@@ -1 +1 @@
1
- {"version":3,"file":"notifListener.js","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notifListener.js","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,7 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
12
12
 
13
13
  CREATE OR REPLACE FUNCTION ${DB_OBJ_NAMES.data_watch_func}() RETURNS TRIGGER
14
14
  AS $$
15
-
16
- DECLARE t_ids TEXT[];
15
+
17
16
  DECLARE c_ids INTEGER[];
18
17
  DECLARE err_c_ids INTEGER[];
19
18
  DECLARE condition_checks_union_query TEXT := '';
@@ -30,125 +29,53 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
30
29
  DECLARE escaped_table TEXT;
31
30
 
32
31
  DECLARE _columns_info JSONB := NULL;
33
-
34
- DECLARE changed_columns _TEXT := NULL;
32
+ DECLARE changed_columns_by_trigger_id JSONB := NULL;
33
+ DECLARE changed_columns _TEXT := NULL;
35
34
 
36
35
  BEGIN
37
36
 
38
37
  escaped_table := concat_ws('.', CASE WHEN TG_TABLE_SCHEMA <> CURRENT_SCHEMA THEN format('%I', TG_TABLE_SCHEMA) END, format('%I', TG_TABLE_NAME));
39
38
 
40
- ${CHANGED_COLUMNS_CHECK}
41
-
42
- SELECT string_agg(
43
- format(
44
- $c$
45
- SELECT CASE WHEN EXISTS(
46
- SELECT 1
47
- FROM %s
48
- WHERE %s
49
- ) THEN %s::text END AS t_id
50
- $c$,
51
- table_name,
52
- condition,
53
- id
54
- ),
55
- E' UNION \n '
56
- )
57
- INTO condition_checks_union_query
58
- FROM prostgles.v_triggers
59
- WHERE table_name = escaped_table;
60
-
61
-
62
- /* condition_checks_union_query = 'old_table union new_table' or any one of the tables */
63
- IF condition_checks_union_query IS NOT NULL THEN
64
-
65
- SELECT
66
- format(
67
- E'WITH %I AS (\n %s \n) ',
68
- TG_TABLE_NAME,
69
- concat_ws(
70
- E' UNION ALL \n ',
71
- CASE WHEN (TG_OP = 'DELETE' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM old_table ' END,
72
- CASE WHEN (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM new_table ' END
73
- )
74
- )
75
- ||
76
- COALESCE((
77
- SELECT ', ' || string_agg(format(E' %s AS ( \n %s \n ) ', related_view_name, related_view_def), ', ')
78
- FROM (
79
- SELECT DISTINCT related_view_name, related_view_def
80
- FROM prostgles.v_triggers
81
- WHERE table_name = escaped_table
82
- AND related_view_name IS NOT NULL
83
- AND related_view_def IS NOT NULL
84
- ) t
85
- ), '')
86
- ||
87
- format(
88
- $c$
89
- SELECT ARRAY_AGG(DISTINCT t.t_id)
90
- FROM (
91
- %s
92
- ) t
93
- $c$,
94
- condition_checks_union_query
95
- )
96
- INTO query;
97
-
98
- BEGIN
99
- EXECUTE query INTO t_ids;
100
-
101
- EXCEPTION WHEN OTHERS THEN
102
-
103
- has_errors := TRUE;
104
-
105
- GET STACKED DIAGNOSTICS
106
- err_text = MESSAGE_TEXT,
107
- err_detail = PG_EXCEPTION_DETAIL,
108
- err_hint = PG_EXCEPTION_HINT;
109
-
110
- END;
111
-
112
- --RAISE NOTICE 'has_errors: % ', has_errors;
113
- --RAISE NOTICE 'condition_checks_union_query: % , cids: %', condition_checks_union_query, c_ids;
114
-
115
- IF (t_ids IS NOT NULL OR has_errors) THEN
116
-
117
- FOR v_trigger IN
118
- SELECT app_id, string_agg(c_id::text, ',') as cids
119
- FROM prostgles.v_triggers
120
- WHERE id = ANY(t_ids)
121
- OR has_errors
122
- GROUP BY app_id
123
- LOOP
124
-
125
- PERFORM pg_notify(
126
- ${asValue(NOTIF_CHANNEL.preffix)} || v_trigger.app_id ,
127
- LEFT(concat_ws(
128
- ${asValue(DELIMITER)},
129
-
130
- ${asValue(NOTIF_TYPE.data)},
131
- COALESCE(escaped_table, 'MISSING'),
132
- COALESCE(TG_OP, 'MISSING'),
133
- CASE WHEN has_errors
134
- THEN concat_ws('; ', 'error', err_text, err_detail, err_hint, 'query: ' || query )
135
- ELSE COALESCE(v_trigger.cids, '')
136
- END,
137
- COALESCE(changed_columns::TEXT, '')
138
- ${debugMode ? ", COALESCE(current_query(), 'current_query ??'), ' ', query" : ""}
139
- ), 7999/4) -- Some chars are 2bytes -> 'Ω'
140
- );
141
- END LOOP;
142
-
143
-
144
- IF has_errors THEN
145
-
146
- DELETE FROM prostgles.app_triggers;
147
- RAISE NOTICE 'trigger dropped due to exception: % % %', err_text, err_detail, err_hint;
148
-
149
- END IF;
150
-
151
- END IF;
39
+ ${CHANGED_COLUMNS_FOR_EACH_TRIGGER_CHECK}
40
+
41
+ ${EACH_TRIGGER_CHECK_ALL_COLUMNS}
42
+
43
+ IF (c_ids IS NOT NULL OR has_errors) THEN
44
+
45
+ FOR v_trigger IN
46
+ SELECT app_id, string_agg(c_id::text, ',') as cids
47
+ FROM prostgles.v_triggers
48
+ WHERE c_id = ANY(c_ids)
49
+ OR has_errors
50
+ GROUP BY app_id
51
+ LOOP
52
+
53
+ PERFORM pg_notify(
54
+ ${asValue(NOTIF_CHANNEL.preffix)} || v_trigger.app_id ,
55
+ LEFT(concat_ws(
56
+ ${asValue(DELIMITER)},
57
+
58
+ ${asValue(NOTIF_TYPE.data)},
59
+ COALESCE(escaped_table, 'MISSING'),
60
+ COALESCE(TG_OP, 'MISSING'),
61
+ CASE WHEN has_errors
62
+ THEN concat_ws('; ', 'error', err_text, err_detail, err_hint, 'query: ' || query )
63
+ ELSE COALESCE(v_trigger.cids, '')
64
+ END,
65
+ COALESCE(changed_columns_by_trigger_id::TEXT, '')
66
+ ${debugMode ? ", COALESCE(current_query(), 'current_query ??'), ' ', query" : ""}
67
+ ), 7999/4) -- Some chars are 2bytes -> 'Ω'
68
+ );
69
+ END LOOP;
70
+
71
+
72
+ IF has_errors THEN
73
+
74
+ DELETE FROM prostgles.app_triggers;
75
+ RAISE NOTICE 'trigger dropped due to exception: % % %', err_text, err_detail, err_hint;
76
+
77
+ END IF;
78
+
152
79
  END IF;
153
80
 
154
81
  ${getAppCheckQuery()}
@@ -182,10 +109,7 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
182
109
  return dataWatchFunctionQuery;
183
110
  };
184
111
 
185
- /**
186
- * TODO: check columns for specific t_id trigger conditions
187
- */
188
- const CHANGED_COLUMNS_CHECK = `
112
+ const CHANGED_COLUMNS_FOR_EACH_TRIGGER_CHECK = `
189
113
  -- Determine changed columns for UPDATE operations
190
114
  IF TG_OP = 'UPDATE' THEN
191
115
 
@@ -197,32 +121,35 @@ IF TG_OP = 'UPDATE' THEN
197
121
  AND columns_info IS NULL
198
122
  ) THEN
199
123
 
200
- SELECT columns_info
201
- INTO _columns_info
202
- FROM prostgles.v_triggers
203
- WHERE table_name = escaped_table
204
- AND columns_info IS NOT NULL;
205
-
206
- IF _columns_info IS NOT NULL THEN
124
+ changed_columns_by_trigger_id := COALESCE(changed_columns_by_trigger_id, '{}');
125
+
126
+ FOR v_trigger IN
127
+ SELECT *
128
+ FROM prostgles.v_triggers
129
+ WHERE table_name = escaped_table
130
+ AND columns_info IS NOT NULL
131
+ LOOP
132
+
207
133
  query := format(
208
134
  $c$
209
135
  WITH changed AS (
210
136
  SELECT column_name
211
- FROM jsonb_object_keys(%L) as column_name
137
+ FROM jsonb_object_keys(%1$L) as column_name
212
138
  WHERE EXISTS (
213
139
  SELECT 1
214
- FROM old_table o
215
- LEFT JOIN new_table n
216
- ON %s
217
- WHERE %s
140
+ FROM (SELECT * FROM old_table WHERE %4$s ) o
141
+ LEFT JOIN (SELECT * FROM new_table WHERE %4$s ) n
142
+ ON %2$s
143
+ WHERE %3$s
218
144
  )
219
145
  )
220
146
  SELECT array_agg(column_name)
221
147
  FROM changed;
222
148
  $c$,
223
- _columns_info->'tracked_columns',
224
- _columns_info->>'join_condition',
225
- _columns_info->>'where_statement'
149
+ v_trigger.columns_info->'tracked_columns',
150
+ v_trigger.columns_info->>'join_condition',
151
+ v_trigger.columns_info->>'where_statement',
152
+ v_trigger.condition
226
153
  );
227
154
 
228
155
  BEGIN
@@ -236,18 +163,109 @@ IF TG_OP = 'UPDATE' THEN
236
163
  err_detail = PG_EXCEPTION_DETAIL,
237
164
  err_hint = PG_EXCEPTION_HINT;
238
165
  END;
239
-
166
+
240
167
  /* It is possible to get no changes */
241
- changed_columns := COALESCE(changed_columns, '{}');
242
-
243
- END IF;
168
+ IF changed_columns IS NOT NULL THEN
169
+
170
+ changed_columns := COALESCE(changed_columns, '{}');
171
+ changed_columns_by_trigger_id := jsonb_set(
172
+ changed_columns_by_trigger_id,
173
+ ARRAY[v_trigger.c_id::TEXT],
174
+ to_jsonb(changed_columns)
175
+ );
176
+ END IF;
177
+
178
+ --PERFORM pg_notify('debug', changed_columns::TEXT || v_trigger.c_id::TEXT || changed_columns_by_trigger_id::TEXT );
179
+
180
+ END LOOP;
181
+
244
182
 
245
183
  END IF;
246
184
  END IF;
247
185
 
186
+ `;
187
+
188
+ const EACH_TRIGGER_CHECK_ALL_COLUMNS = `
189
+
190
+ SELECT string_agg(
191
+ format(
192
+ $c$
193
+ SELECT CASE WHEN EXISTS(
194
+ SELECT 1
195
+ FROM %s
196
+ WHERE %s
197
+ ) THEN %s::text END AS c_id
198
+ $c$,
199
+ table_name,
200
+ condition,
201
+ c_id
202
+ ),
203
+ E' UNION \n '
204
+ )
205
+ INTO condition_checks_union_query
206
+ FROM prostgles.v_triggers
207
+ WHERE table_name = escaped_table;
208
+
209
+
210
+ /* condition_checks_union_query = 'old_table union new_table' or any one of the tables */
211
+ IF condition_checks_union_query IS NOT NULL THEN
212
+
213
+ SELECT
214
+ format(
215
+ E'WITH %I AS (\n %s \n) ',
216
+ TG_TABLE_NAME,
217
+ concat_ws(
218
+ E' UNION ALL \n ',
219
+ CASE WHEN (TG_OP = 'DELETE' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM old_table ' END,
220
+ CASE WHEN (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN ' SELECT * FROM new_table ' END
221
+ )
222
+ )
223
+ ||
224
+ COALESCE((
225
+ SELECT ', ' || string_agg(format(E' %s AS ( \n %s \n ) ', related_view_name, related_view_def), ', ')
226
+ FROM (
227
+ SELECT DISTINCT related_view_name, related_view_def
228
+ FROM prostgles.v_triggers
229
+ WHERE table_name = escaped_table
230
+ AND related_view_name IS NOT NULL
231
+ AND related_view_def IS NOT NULL
232
+ ) t
233
+ ), '')
234
+ ||
235
+ format(
236
+ $c$
237
+ SELECT ARRAY_AGG(DISTINCT t.c_id)
238
+ FROM (
239
+ %s
240
+ ) t
241
+ $c$,
242
+ condition_checks_union_query
243
+ )
244
+ INTO query;
245
+
246
+ BEGIN
247
+ EXECUTE query INTO c_ids;
248
+
249
+ EXCEPTION WHEN OTHERS THEN
250
+
251
+ has_errors := TRUE;
252
+
253
+ GET STACKED DIAGNOSTICS
254
+ err_text = MESSAGE_TEXT,
255
+ err_detail = PG_EXCEPTION_DETAIL,
256
+ err_hint = PG_EXCEPTION_HINT;
257
+
258
+ END;
259
+
260
+ --RAISE NOTICE 'has_errors: % ', has_errors;
261
+ --RAISE NOTICE 'condition_checks_union_query: % , cids: %', condition_checks_union_query, c_ids;
262
+ END IF;
263
+
264
+
248
265
  `;
249
266
 
250
267
  /**
268
+ * TODO: test performance and maybe add as an alternative for cases where there are no join clauses
251
269
  * Given:
252
270
  * 1. two transition tables (old_table and new_table)
253
271
  * 2. a list of primary keys
@@ -69,10 +69,10 @@ export async function notifListener(this: PubSubManager, data: { payload: string
69
69
  }
70
70
 
71
71
  const [_, table_name, op_name, condition_ids_str, raw_changed_columns_str = ""] = dataArr;
72
- const changedColumns =
73
- !raw_changed_columns_str ? undefined
74
- : raw_changed_columns_str === "{}" ? []
75
- : raw_changed_columns_str.slice(1, -1).split(",");
72
+ const changedColumnsByTriggerId =
73
+ !raw_changed_columns_str ? undefined : (
74
+ (JSON.parse(raw_changed_columns_str) as Record<string, string[]>)
75
+ );
76
76
  const conditionIds = condition_ids_str?.split(",").map((v) => +v);
77
77
 
78
78
  if (!table_name) {
@@ -111,7 +111,8 @@ export async function notifListener(this: PubSubManager, data: { payload: string
111
111
  void this.deleteOrphanedTriggers(new Set(table_name));
112
112
  }
113
113
 
114
- firedTableConditions.map(({ subs, syncs }) => {
114
+ firedTableConditions.map(({ idx, subs, syncs }) => {
115
+ const changedColumns = changedColumnsByTriggerId && (changedColumnsByTriggerId[idx] ?? []);
115
116
  log(
116
117
  "notifListener",
117
118
  subs.map((s) => s.channel_name),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prostgles-server",
3
- "version": "4.2.487",
3
+ "version": "4.2.488",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",