prostgles-server 4.0.44 → 4.0.46

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.
Files changed (52) hide show
  1. package/dist/DboBuilder/TableHandler.d.ts.map +1 -1
  2. package/dist/DboBuilder/TableHandler.js +4 -0
  3. package/dist/DboBuilder/TableHandler.js.map +1 -1
  4. package/dist/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
  5. package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js +1 -0
  6. package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js.map +1 -1
  7. package/dist/DboBuilder.d.ts.map +1 -1
  8. package/dist/DboBuilder.js.map +1 -1
  9. package/dist/PostgresNotifListenManager.d.ts.map +1 -1
  10. package/dist/PostgresNotifListenManager.js +1 -1
  11. package/dist/PostgresNotifListenManager.js.map +1 -1
  12. package/dist/PubSubManager/PubSubManager.d.ts +2 -1
  13. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  14. package/dist/PubSubManager/PubSubManager.js +86 -84
  15. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  16. package/dist/PubSubManager/getInitQuery.d.ts.map +1 -1
  17. package/dist/PubSubManager/getInitQuery.js +3 -5
  18. package/dist/PubSubManager/getInitQuery.js.map +1 -1
  19. package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
  20. package/dist/PubSubManager/initPubSubManager.js +37 -35
  21. package/dist/PubSubManager/initPubSubManager.js.map +1 -1
  22. package/dist/PublishParser.d.ts.map +1 -1
  23. package/dist/PublishParser.js +1 -0
  24. package/dist/PublishParser.js.map +1 -1
  25. package/lib/DboBuilder/TableHandler.d.ts.map +1 -1
  26. package/lib/DboBuilder/TableHandler.js +4 -0
  27. package/lib/DboBuilder/TableHandler.ts +4 -1
  28. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
  29. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.js +1 -0
  30. package/lib/DboBuilder/getTablesForSchemaPostgresSQL.ts +2 -0
  31. package/lib/DboBuilder.d.ts.map +1 -1
  32. package/lib/DboBuilder.ts +0 -1
  33. package/lib/PostgresNotifListenManager.d.ts.map +1 -1
  34. package/lib/PostgresNotifListenManager.js +1 -1
  35. package/lib/PostgresNotifListenManager.ts +2 -1
  36. package/lib/PubSubManager/PubSubManager.d.ts +2 -1
  37. package/lib/PubSubManager/PubSubManager.d.ts.map +1 -1
  38. package/lib/PubSubManager/PubSubManager.js +86 -84
  39. package/lib/PubSubManager/PubSubManager.ts +103 -101
  40. package/lib/PubSubManager/getInitQuery.d.ts.map +1 -1
  41. package/lib/PubSubManager/getInitQuery.js +3 -5
  42. package/lib/PubSubManager/getInitQuery.ts +3 -5
  43. package/lib/PubSubManager/initPubSubManager.d.ts.map +1 -1
  44. package/lib/PubSubManager/initPubSubManager.js +37 -35
  45. package/lib/PubSubManager/initPubSubManager.ts +41 -36
  46. package/lib/PublishParser.d.ts.map +1 -1
  47. package/lib/PublishParser.js +1 -0
  48. package/lib/PublishParser.ts +1 -0
  49. package/lib/SchemaWatchManager.ts +1 -1
  50. package/package.json +1 -1
  51. package/tests/client/PID.txt +1 -1
  52. package/tests/server/package-lock.json +1 -1
@@ -143,6 +143,7 @@ class PubSubManager {
143
143
  return true;
144
144
  };
145
145
  appChecking = false;
146
+ checkedListenerTableCond;
146
147
  init = initPubSubManager_1.initPubSubManager.bind(this);
147
148
  static SCHEMA_ALTERING_QUERIES = ['CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE VIEW', 'DROP VIEW', 'ALTER VIEW', 'CREATE TABLE AS', 'SELECT INTO'];
148
149
  static EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID = "prostgles internal query that should be excluded from schema watch ";
@@ -155,106 +156,107 @@ class PubSubManager {
155
156
  }
156
157
  try {
157
158
  await this.db.any(`
158
- BEGIN;-- ISOLATION LEVEL SERIALIZABLE;
159
-
160
- /** ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
161
- * Drop stale triggers
162
- * */
163
- DO
164
- $do$
165
- DECLARE trg RECORD;
166
- q TEXT;
167
- ev_trg_needed BOOLEAN := FALSE;
168
- ev_trg_exists BOOLEAN := FALSE;
169
- is_super_user BOOLEAN := FALSE;
170
- BEGIN
171
- --SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
172
-
173
- LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
174
- EXECUTE format(
175
- $q$
159
+ BEGIN;-- ISOLATION LEVEL SERIALIZABLE;
160
+
161
+ /**
162
+ * ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
163
+ * Drop stale triggers
164
+ * */
165
+ DO
166
+ $do$
167
+ DECLARE trg RECORD;
168
+ q TEXT;
169
+ ev_trg_needed BOOLEAN := FALSE;
170
+ ev_trg_exists BOOLEAN := FALSE;
171
+ is_super_user BOOLEAN := FALSE;
172
+ BEGIN
173
+ --SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
174
+
175
+ LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
176
+ EXECUTE format(
177
+ $q$
176
178
 
177
- CREATE TEMP TABLE %1$I AS --ON COMMIT DROP AS
178
- SELECT * FROM prostgles.app_triggers;
179
+ CREATE TEMP TABLE %1$I AS --ON COMMIT DROP AS
180
+ SELECT * FROM prostgles.app_triggers;
179
181
 
180
- DELETE FROM prostgles.app_triggers;
182
+ DELETE FROM prostgles.app_triggers;
181
183
 
182
- INSERT INTO prostgles.app_triggers
183
- SELECT * FROM %1$I;
184
+ INSERT INTO prostgles.app_triggers
185
+ SELECT * FROM %1$I;
184
186
 
185
- DROP TABLE IF EXISTS %1$I;
186
- $q$,
187
- ${(0, exports.asValue)('triggers_' + this.appID)}
188
- );
189
-
190
- is_super_user := EXISTS (select 1 from pg_user where usename = CURRENT_USER AND usesuper IS TRUE);
187
+ DROP TABLE IF EXISTS %1$I;
188
+ $q$,
189
+ ${(0, exports.asValue)('triggers_' + this.appID)}
190
+ );
191
191
 
192
- /**
193
- * Delete stale app records
194
- * */
195
- DELETE FROM prostgles.apps
196
- WHERE last_check < NOW() - 8 * check_frequency_ms * interval '1 millisecond';
192
+ is_super_user := EXISTS (select 1 from pg_user where usename = CURRENT_USER AND usesuper IS TRUE);
197
193
 
198
- DELETE FROM prostgles.app_triggers
199
- WHERE app_id NOT IN (SELECT id FROM prostgles.apps);
200
-
201
- /* DROP the old buggy schema watch trigger */
202
- IF EXISTS (
203
- SELECT 1 FROM pg_catalog.pg_event_trigger
204
- WHERE evtname = 'prostgles_schema_watch_trigger'
205
- ) AND is_super_user IS TRUE
206
- THEN
207
- DROP EVENT TRIGGER IF EXISTS prostgles_schema_watch_trigger;
208
- END IF;
194
+ /**
195
+ * Delete stale app records, this will delete related triggers
196
+ * */
197
+ DELETE FROM prostgles.apps
198
+ WHERE last_check < NOW() - 8 * check_frequency_ms * interval '1 millisecond';
209
199
 
210
- ev_trg_needed := EXISTS (SELECT 1 FROM prostgles.apps WHERE watching_schema IS TRUE);
211
- ev_trg_exists := EXISTS (
212
- SELECT 1 FROM pg_catalog.pg_event_trigger
213
- WHERE evtname = ${(0, exports.asValue)(getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger)}
214
- );
200
+ DELETE FROM prostgles.app_triggers
201
+ WHERE app_id NOT IN (SELECT id FROM prostgles.apps);
202
+
203
+ /* DROP the old buggy schema watch trigger */
204
+ IF EXISTS (
205
+ SELECT 1 FROM pg_catalog.pg_event_trigger
206
+ WHERE evtname = 'prostgles_schema_watch_trigger'
207
+ ) AND is_super_user IS TRUE
208
+ THEN
209
+ DROP EVENT TRIGGER IF EXISTS prostgles_schema_watch_trigger;
210
+ END IF;
215
211
 
216
- -- RAISE NOTICE ' ev_trg_needed %, ev_trg_exists %', ev_trg_needed, ev_trg_exists;
212
+ ev_trg_needed := EXISTS (SELECT 1 FROM prostgles.apps WHERE watching_schema IS TRUE);
213
+ ev_trg_exists := EXISTS (
214
+ SELECT 1 FROM pg_catalog.pg_event_trigger
215
+ WHERE evtname = ${(0, exports.asValue)(getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger)}
216
+ );
217
217
 
218
- /**
219
- * DROP stale event trigger
220
- * */
221
- IF is_super_user IS TRUE AND ev_trg_needed IS FALSE AND ev_trg_exists IS TRUE THEN
218
+ -- RAISE NOTICE ' ev_trg_needed %, ev_trg_exists %', ev_trg_needed, ev_trg_exists;
222
219
 
223
- SELECT format(
224
- $$ DROP EVENT TRIGGER IF EXISTS %I ; $$
225
- , ${(0, exports.asValue)(getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger)}
226
- )
227
- INTO q;
220
+ /**
221
+ * DROP stale event trigger
222
+ * */
223
+ IF is_super_user IS TRUE AND ev_trg_needed IS FALSE AND ev_trg_exists IS TRUE THEN
228
224
 
229
- --RAISE NOTICE ' DROP EVENT TRIGGER %', q;
225
+ SELECT format(
226
+ $$ DROP EVENT TRIGGER IF EXISTS %I ; $$
227
+ , ${(0, exports.asValue)(getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger)}
228
+ )
229
+ INTO q;
230
230
 
231
- EXECUTE q;
231
+ --RAISE NOTICE ' DROP EVENT TRIGGER %', q;
232
232
 
233
- /**
234
- * CREATE event trigger
235
- * */
236
- ELSIF
237
- is_super_user IS TRUE
238
- AND ev_trg_needed IS TRUE
239
- AND ev_trg_exists IS FALSE
240
- THEN
233
+ EXECUTE q;
241
234
 
242
- DROP EVENT TRIGGER IF EXISTS ${getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger};
243
- CREATE EVENT TRIGGER ${getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger} ON ddl_command_end
244
- WHEN TAG IN ('COMMENT', 'CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE VIEW', 'DROP VIEW', 'ALTER VIEW', 'CREATE TABLE AS', 'SELECT INTO')
245
- --WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE TRIGGER', 'DROP TRIGGER')
246
- EXECUTE PROCEDURE ${getInitQuery_1.DB_OBJ_NAMES.schema_watch_func}();
235
+ /**
236
+ * CREATE event trigger
237
+ * */
238
+ ELSIF
239
+ is_super_user IS TRUE
240
+ AND ev_trg_needed IS TRUE
241
+ AND ev_trg_exists IS FALSE
242
+ THEN
247
243
 
248
- --RAISE NOTICE ' CREATED EVENT TRIGGER %', q;
249
- END IF;
250
-
251
-
252
- END
253
- $do$;
254
-
244
+ DROP EVENT TRIGGER IF EXISTS ${getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger};
245
+ CREATE EVENT TRIGGER ${getInitQuery_1.DB_OBJ_NAMES.schema_watch_trigger} ON ddl_command_end
246
+ WHEN TAG IN ('COMMENT', 'CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE VIEW', 'DROP VIEW', 'ALTER VIEW', 'CREATE TABLE AS', 'SELECT INTO')
247
+ --WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE TRIGGER', 'DROP TRIGGER')
248
+ EXECUTE PROCEDURE ${getInitQuery_1.DB_OBJ_NAMES.schema_watch_func}();
255
249
 
256
- COMMIT;
257
- `).catch(e => {
250
+ --RAISE NOTICE ' CREATED EVENT TRIGGER %', q;
251
+ END IF;
252
+
253
+
254
+ END
255
+ $do$;
256
+
257
+
258
+ COMMIT;
259
+ `).catch(e => {
258
260
  console.error("prepareTriggers failed: ", e);
259
261
  throw e;
260
262
  });
@@ -185,7 +185,7 @@ export class PubSubManager {
185
185
  schema: "schema_has_changed"
186
186
  }
187
187
  NOTIF_CHANNEL = {
188
- preffix: 'prostgles_',
188
+ preffix: 'prostgles_' as const,
189
189
  getFull: (appID?: string) => {
190
190
  const finalAppId = appID ?? this.appID;
191
191
  if (!finalAppId) throw "No appID";
@@ -253,6 +253,7 @@ export class PubSubManager {
253
253
  }
254
254
 
255
255
  appChecking = false;
256
+ checkedListenerTableCond?: string[];
256
257
  init = initPubSubManager.bind(this);
257
258
 
258
259
 
@@ -269,106 +270,107 @@ export class PubSubManager {
269
270
  try {
270
271
 
271
272
  await this.db.any(`
272
- BEGIN;-- ISOLATION LEVEL SERIALIZABLE;
273
-
274
- /** ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
275
- * Drop stale triggers
276
- * */
277
- DO
278
- $do$
279
- DECLARE trg RECORD;
280
- q TEXT;
281
- ev_trg_needed BOOLEAN := FALSE;
282
- ev_trg_exists BOOLEAN := FALSE;
283
- is_super_user BOOLEAN := FALSE;
284
- BEGIN
285
- --SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
286
-
287
- LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
288
- EXECUTE format(
289
- $q$
290
-
291
- CREATE TEMP TABLE %1$I AS --ON COMMIT DROP AS
292
- SELECT * FROM prostgles.app_triggers;
293
-
294
- DELETE FROM prostgles.app_triggers;
295
-
296
- INSERT INTO prostgles.app_triggers
297
- SELECT * FROM %1$I;
298
-
299
- DROP TABLE IF EXISTS %1$I;
300
- $q$,
301
- ${asValue('triggers_' + this.appID)}
302
- );
303
-
304
- is_super_user := EXISTS (select 1 from pg_user where usename = CURRENT_USER AND usesuper IS TRUE);
305
-
306
- /**
307
- * Delete stale app records
308
- * */
309
- DELETE FROM prostgles.apps
310
- WHERE last_check < NOW() - 8 * check_frequency_ms * interval '1 millisecond';
311
-
312
- DELETE FROM prostgles.app_triggers
313
- WHERE app_id NOT IN (SELECT id FROM prostgles.apps);
314
-
315
- /* DROP the old buggy schema watch trigger */
316
- IF EXISTS (
317
- SELECT 1 FROM pg_catalog.pg_event_trigger
318
- WHERE evtname = 'prostgles_schema_watch_trigger'
319
- ) AND is_super_user IS TRUE
320
- THEN
321
- DROP EVENT TRIGGER IF EXISTS prostgles_schema_watch_trigger;
322
- END IF;
323
-
324
- ev_trg_needed := EXISTS (SELECT 1 FROM prostgles.apps WHERE watching_schema IS TRUE);
325
- ev_trg_exists := EXISTS (
326
- SELECT 1 FROM pg_catalog.pg_event_trigger
327
- WHERE evtname = ${asValue(DB_OBJ_NAMES.schema_watch_trigger)}
328
- );
329
-
330
- -- RAISE NOTICE ' ev_trg_needed %, ev_trg_exists %', ev_trg_needed, ev_trg_exists;
331
-
332
- /**
333
- * DROP stale event trigger
334
- * */
335
- IF is_super_user IS TRUE AND ev_trg_needed IS FALSE AND ev_trg_exists IS TRUE THEN
336
-
337
- SELECT format(
338
- $$ DROP EVENT TRIGGER IF EXISTS %I ; $$
339
- , ${asValue(DB_OBJ_NAMES.schema_watch_trigger)}
340
- )
341
- INTO q;
342
-
343
- --RAISE NOTICE ' DROP EVENT TRIGGER %', q;
344
-
345
- EXECUTE q;
346
-
347
- /**
348
- * CREATE event trigger
349
- * */
350
- ELSIF
351
- is_super_user IS TRUE
352
- AND ev_trg_needed IS TRUE
353
- AND ev_trg_exists IS FALSE
354
- THEN
355
-
356
- DROP EVENT TRIGGER IF EXISTS ${DB_OBJ_NAMES.schema_watch_trigger};
357
- CREATE EVENT TRIGGER ${DB_OBJ_NAMES.schema_watch_trigger} ON ddl_command_end
358
- WHEN TAG IN ('COMMENT', 'CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE VIEW', 'DROP VIEW', 'ALTER VIEW', 'CREATE TABLE AS', 'SELECT INTO')
359
- --WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE TRIGGER', 'DROP TRIGGER')
360
- EXECUTE PROCEDURE ${DB_OBJ_NAMES.schema_watch_func}();
361
-
362
- --RAISE NOTICE ' CREATED EVENT TRIGGER %', q;
363
- END IF;
364
-
365
-
366
- END
367
- $do$;
368
-
369
-
370
- COMMIT;
371
- `).catch(e => {
273
+ BEGIN;-- ISOLATION LEVEL SERIALIZABLE;
274
+
275
+ /**
276
+ * ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
277
+ * Drop stale triggers
278
+ * */
279
+ DO
280
+ $do$
281
+ DECLARE trg RECORD;
282
+ q TEXT;
283
+ ev_trg_needed BOOLEAN := FALSE;
284
+ ev_trg_exists BOOLEAN := FALSE;
285
+ is_super_user BOOLEAN := FALSE;
286
+ BEGIN
287
+ --SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
288
+
289
+ LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
290
+ EXECUTE format(
291
+ $q$
292
+
293
+ CREATE TEMP TABLE %1$I AS --ON COMMIT DROP AS
294
+ SELECT * FROM prostgles.app_triggers;
295
+
296
+ DELETE FROM prostgles.app_triggers;
297
+
298
+ INSERT INTO prostgles.app_triggers
299
+ SELECT * FROM %1$I;
300
+
301
+ DROP TABLE IF EXISTS %1$I;
302
+ $q$,
303
+ ${asValue('triggers_' + this.appID)}
304
+ );
305
+
306
+ is_super_user := EXISTS (select 1 from pg_user where usename = CURRENT_USER AND usesuper IS TRUE);
307
+
308
+ /**
309
+ * Delete stale app records, this will delete related triggers
310
+ * */
311
+ DELETE FROM prostgles.apps
312
+ WHERE last_check < NOW() - 8 * check_frequency_ms * interval '1 millisecond';
313
+
314
+ DELETE FROM prostgles.app_triggers
315
+ WHERE app_id NOT IN (SELECT id FROM prostgles.apps);
316
+
317
+ /* DROP the old buggy schema watch trigger */
318
+ IF EXISTS (
319
+ SELECT 1 FROM pg_catalog.pg_event_trigger
320
+ WHERE evtname = 'prostgles_schema_watch_trigger'
321
+ ) AND is_super_user IS TRUE
322
+ THEN
323
+ DROP EVENT TRIGGER IF EXISTS prostgles_schema_watch_trigger;
324
+ END IF;
325
+
326
+ ev_trg_needed := EXISTS (SELECT 1 FROM prostgles.apps WHERE watching_schema IS TRUE);
327
+ ev_trg_exists := EXISTS (
328
+ SELECT 1 FROM pg_catalog.pg_event_trigger
329
+ WHERE evtname = ${asValue(DB_OBJ_NAMES.schema_watch_trigger)}
330
+ );
331
+
332
+ -- RAISE NOTICE ' ev_trg_needed %, ev_trg_exists %', ev_trg_needed, ev_trg_exists;
333
+
334
+ /**
335
+ * DROP stale event trigger
336
+ * */
337
+ IF is_super_user IS TRUE AND ev_trg_needed IS FALSE AND ev_trg_exists IS TRUE THEN
338
+
339
+ SELECT format(
340
+ $$ DROP EVENT TRIGGER IF EXISTS %I ; $$
341
+ , ${asValue(DB_OBJ_NAMES.schema_watch_trigger)}
342
+ )
343
+ INTO q;
344
+
345
+ --RAISE NOTICE ' DROP EVENT TRIGGER %', q;
346
+
347
+ EXECUTE q;
348
+
349
+ /**
350
+ * CREATE event trigger
351
+ * */
352
+ ELSIF
353
+ is_super_user IS TRUE
354
+ AND ev_trg_needed IS TRUE
355
+ AND ev_trg_exists IS FALSE
356
+ THEN
357
+
358
+ DROP EVENT TRIGGER IF EXISTS ${DB_OBJ_NAMES.schema_watch_trigger};
359
+ CREATE EVENT TRIGGER ${DB_OBJ_NAMES.schema_watch_trigger} ON ddl_command_end
360
+ WHEN TAG IN ('COMMENT', 'CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE VIEW', 'DROP VIEW', 'ALTER VIEW', 'CREATE TABLE AS', 'SELECT INTO')
361
+ --WHEN TAG IN ('CREATE TABLE', 'ALTER TABLE', 'DROP TABLE', 'CREATE TRIGGER', 'DROP TRIGGER')
362
+ EXECUTE PROCEDURE ${DB_OBJ_NAMES.schema_watch_func}();
363
+
364
+ --RAISE NOTICE ' CREATED EVENT TRIGGER %', q;
365
+ END IF;
366
+
367
+
368
+ END
369
+ $do$;
370
+
371
+
372
+ COMMIT;
373
+ `).catch(e => {
372
374
  console.error("prepareTriggers failed: ", e);
373
375
  throw e;
374
376
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getInitQuery.d.ts","sourceRoot":"","sources":["getInitQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9D,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,eAAO,MAAM,YAAY,SAAwB,aAAa,KAAG,QAAQ,MAAM,CA+gB9E,CAAA"}
1
+ {"version":3,"file":"getInitQuery.d.ts","sourceRoot":"","sources":["getInitQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9D,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,eAAO,MAAM,YAAY,SAAwB,aAAa,KAAG,QAAQ,MAAM,CA6gB9E,CAAA"}
@@ -131,7 +131,6 @@ BEGIN
131
131
  added TIMESTAMP DEFAULT NOW(),
132
132
  application_name TEXT,
133
133
  last_check TIMESTAMP NOT NULL DEFAULT NOW(),
134
- last_check_ended TIMESTAMP NOT NULL DEFAULT NOW(),
135
134
  watching_schema BOOLEAN DEFAULT FALSE,
136
135
  check_frequency_ms INTEGER NOT NULL
137
136
  );
@@ -150,7 +149,7 @@ BEGIN
150
149
 
151
150
  inserted TIMESTAMP NOT NULL DEFAULT NOW(),
152
151
  last_used TIMESTAMP NOT NULL DEFAULT NOW(),
153
- PRIMARY KEY (app_id, table_name, condition) /* This unqique index limits the condition column value to be less than 'SELECT current_setting('block_size'); */
152
+ PRIMARY KEY (app_id, table_name, condition) /* This unique index limits the condition column value to be less than 'SELECT current_setting('block_size'); */
154
153
  );
155
154
  COMMENT ON TABLE prostgles.app_triggers IS 'Tables and conditions that are currently subscribed/synced';
156
155
 
@@ -292,7 +291,6 @@ BEGIN
292
291
  RAISE NOTICE 'trigger dropped due to exception: % % %', err_text, err_detail, err_hint;
293
292
 
294
293
  END IF;
295
-
296
294
 
297
295
  END IF;
298
296
  END IF;
@@ -503,12 +501,12 @@ BEGIN
503
501
  SELECT LEFT(COALESCE(current_query(), ''), 5000)
504
502
  INTO curr_query;
505
503
 
506
- FOR arw IN
504
+ FOR app IN
507
505
  SELECT * FROM prostgles.apps WHERE watching_schema IS TRUE
508
506
 
509
507
  LOOP
510
508
  PERFORM pg_notify(
511
- ${(0, PubSubManager_1.asValue)(this.NOTIF_CHANNEL.preffix)} || arw.id,
509
+ ${(0, PubSubManager_1.asValue)(this.NOTIF_CHANNEL.preffix)} || app.id,
512
510
  concat_ws(
513
511
  ${(0, PubSubManager_1.asValue)(PubSubManager_1.PubSubManager.DELIMITER)},
514
512
  ${(0, PubSubManager_1.asValue)(this.NOTIF_TYPE.schema)}, tg_tag , TG_event, curr_query
@@ -133,7 +133,6 @@ BEGIN
133
133
  added TIMESTAMP DEFAULT NOW(),
134
134
  application_name TEXT,
135
135
  last_check TIMESTAMP NOT NULL DEFAULT NOW(),
136
- last_check_ended TIMESTAMP NOT NULL DEFAULT NOW(),
137
136
  watching_schema BOOLEAN DEFAULT FALSE,
138
137
  check_frequency_ms INTEGER NOT NULL
139
138
  );
@@ -152,7 +151,7 @@ BEGIN
152
151
 
153
152
  inserted TIMESTAMP NOT NULL DEFAULT NOW(),
154
153
  last_used TIMESTAMP NOT NULL DEFAULT NOW(),
155
- PRIMARY KEY (app_id, table_name, condition) /* This unqique index limits the condition column value to be less than 'SELECT current_setting('block_size'); */
154
+ PRIMARY KEY (app_id, table_name, condition) /* This unique index limits the condition column value to be less than 'SELECT current_setting('block_size'); */
156
155
  );
157
156
  COMMENT ON TABLE prostgles.app_triggers IS 'Tables and conditions that are currently subscribed/synced';
158
157
 
@@ -294,7 +293,6 @@ BEGIN
294
293
  RAISE NOTICE 'trigger dropped due to exception: % % %', err_text, err_detail, err_hint;
295
294
 
296
295
  END IF;
297
-
298
296
 
299
297
  END IF;
300
298
  END IF;
@@ -505,12 +503,12 @@ BEGIN
505
503
  SELECT LEFT(COALESCE(current_query(), ''), 5000)
506
504
  INTO curr_query;
507
505
 
508
- FOR arw IN
506
+ FOR app IN
509
507
  SELECT * FROM prostgles.apps WHERE watching_schema IS TRUE
510
508
 
511
509
  LOOP
512
510
  PERFORM pg_notify(
513
- ${asValue(this.NOTIF_CHANNEL.preffix)} || arw.id,
511
+ ${asValue(this.NOTIF_CHANNEL.preffix)} || app.id,
514
512
  concat_ws(
515
513
  ${asValue(PubSubManager.DELIMITER)},
516
514
  ${asValue(this.NOTIF_TYPE.schema)}, tg_tag , TG_event, curr_query
@@ -1 +1 @@
1
- {"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["initPubSubManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAI9D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAwH/F"}
1
+ {"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["initPubSubManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAI9D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA6H/F"}
@@ -19,11 +19,42 @@ async function initPubSubManager() {
19
19
  this.appID = raw.id;
20
20
  if (!this.appCheck) {
21
21
  this.appCheck = setInterval(async () => {
22
- let appQ = "";
22
+ let checkForStaleTriggers = "";
23
23
  try { // drop owned by api
24
24
  this.appChecking = true;
25
25
  const listeners = this.getActiveListeners();
26
- appQ = `
26
+ const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
27
+ let dataTriggerCheckQuery = "";
28
+ if (this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()) {
29
+ this.checkedListenerTableCond = checkedListenerTableCond;
30
+ dataTriggerCheckQuery = `
31
+ /* Delete unused triggers. Might deadlock */
32
+ IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
33
+
34
+ THEN
35
+
36
+ /* TODO: Fixed deadlocks */
37
+ --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
38
+
39
+ /* UPDATE currently used triggers */
40
+ ${!listeners.length ? "" : `
41
+ UPDATE prostgles.app_triggers
42
+ SET last_used = CASE WHEN (table_name, condition) IN (
43
+ ${listeners.map(l => ` ( ${(0, PubSubManager_1.asValue)(l.table_name)}, ${(0, PubSubManager_1.asValue)(l.condition)} ) `).join(", ")}
44
+ ) THEN NOW() ELSE last_used END
45
+ WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appID)};
46
+ `}
47
+
48
+ /* DELETE stale triggers for current app. Other triggers will be deleted on app startup */
49
+ DELETE FROM prostgles.app_triggers
50
+ WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appID)}
51
+ AND last_used < NOW() - 4 * ${(0, PubSubManager_1.asValue)(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
52
+
53
+ END IF;
54
+
55
+ `;
56
+ }
57
+ checkForStaleTriggers = `
27
58
  DO $$
28
59
  BEGIN
29
60
 
@@ -41,46 +72,17 @@ async function initPubSubManager() {
41
72
  )
42
73
  THEN
43
74
 
75
+ /* Last check used to remove disconnected apps */
44
76
  UPDATE prostgles.apps
45
77
  SET last_check = NOW()
46
78
  WHERE id = ${(0, PubSubManager_1.asValue)(this.appID)};
47
79
 
48
-
49
-
50
- /* Delete unused triggers. Might deadlock */
51
- IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
52
-
53
- THEN
54
-
55
- /* TODO: Fixed deadlocks */
56
- --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
57
-
58
- /* UPDATE currently used triggers */
59
- ${!listeners.length ? "" : `
60
- UPDATE prostgles.app_triggers
61
- SET last_used = CASE WHEN (table_name, condition) IN (
62
- ${listeners.map(l => ` ( ${(0, PubSubManager_1.asValue)(l.table_name)}, ${(0, PubSubManager_1.asValue)(l.condition)} ) `).join(", ")}
63
- ) THEN NOW() ELSE last_used END
64
- WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appID)};
65
- `}
66
-
67
- /* DELETE stale triggers for current app. Other triggers will be deleted on app startup */
68
- DELETE FROM prostgles.app_triggers
69
- WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appID)}
70
- AND last_used < NOW() - 4 * ${(0, PubSubManager_1.asValue)(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
71
-
72
- END IF;
73
-
74
- UPDATE prostgles.apps
75
- SET last_check_ended = NOW()
76
- WHERE id = ${(0, PubSubManager_1.asValue)(this.appID)};
77
-
78
-
80
+ ${dataTriggerCheckQuery}
79
81
  END IF;
80
82
 
81
83
  END $$;
82
84
  `;
83
- await this.db.any(appQ);
85
+ await this.db.any(checkForStaleTriggers);
84
86
  tries = 5;
85
87
  (0, PubSubManager_1.log)("updated last_check");
86
88
  }
@@ -97,7 +99,7 @@ async function initPubSubManager() {
97
99
  if (tries <= 0 || e?.code === "3D000") { // && e.message.includes(this.db.$cn.database)
98
100
  clearInterval(this.appCheck);
99
101
  }
100
- console.error("appCheck FAILED: \n", e, appQ);
102
+ console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
101
103
  }
102
104
  this.appChecking = false;
103
105
  }, 0.8 * this.appCheckFrequencyMS);