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.
- package/dist/DboBuilder/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler.js +4 -0
- package/dist/DboBuilder/TableHandler.js.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js +1 -0
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js.map +1 -1
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js.map +1 -1
- package/dist/PostgresNotifListenManager.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.js +1 -1
- package/dist/PostgresNotifListenManager.js.map +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts +2 -1
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +86 -84
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/dist/PubSubManager/getInitQuery.d.ts.map +1 -1
- package/dist/PubSubManager/getInitQuery.js +3 -5
- package/dist/PubSubManager/getInitQuery.js.map +1 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +37 -35
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/dist/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser.js +1 -0
- package/dist/PublishParser.js.map +1 -1
- package/lib/DboBuilder/TableHandler.d.ts.map +1 -1
- package/lib/DboBuilder/TableHandler.js +4 -0
- package/lib/DboBuilder/TableHandler.ts +4 -1
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.js +1 -0
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.ts +2 -0
- package/lib/DboBuilder.d.ts.map +1 -1
- package/lib/DboBuilder.ts +0 -1
- package/lib/PostgresNotifListenManager.d.ts.map +1 -1
- package/lib/PostgresNotifListenManager.js +1 -1
- package/lib/PostgresNotifListenManager.ts +2 -1
- package/lib/PubSubManager/PubSubManager.d.ts +2 -1
- package/lib/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/lib/PubSubManager/PubSubManager.js +86 -84
- package/lib/PubSubManager/PubSubManager.ts +103 -101
- package/lib/PubSubManager/getInitQuery.d.ts.map +1 -1
- package/lib/PubSubManager/getInitQuery.js +3 -5
- package/lib/PubSubManager/getInitQuery.ts +3 -5
- package/lib/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/lib/PubSubManager/initPubSubManager.js +37 -35
- package/lib/PubSubManager/initPubSubManager.ts +41 -36
- package/lib/PublishParser.d.ts.map +1 -1
- package/lib/PublishParser.js +1 -0
- package/lib/PublishParser.ts +1 -0
- package/lib/SchemaWatchManager.ts +1 -1
- package/package.json +1 -1
- package/tests/client/PID.txt +1 -1
- 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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
+
CREATE TEMP TABLE %1$I AS --ON COMMIT DROP AS
|
|
180
|
+
SELECT * FROM prostgles.app_triggers;
|
|
179
181
|
|
|
180
|
-
|
|
182
|
+
DELETE FROM prostgles.app_triggers;
|
|
181
183
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
+
INSERT INTO prostgles.app_triggers
|
|
185
|
+
SELECT * FROM %1$I;
|
|
184
186
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
-
|
|
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
|
-
|
|
224
|
-
|
|
225
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
257
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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,
|
|
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
|
|
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
|
|
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)} ||
|
|
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
|
|
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
|
|
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)} ||
|
|
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,
|
|
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
|
|
22
|
+
let checkForStaleTriggers = "";
|
|
23
23
|
try { // drop owned by api
|
|
24
24
|
this.appChecking = true;
|
|
25
25
|
const listeners = this.getActiveListeners();
|
|
26
|
-
|
|
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(
|
|
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,
|
|
102
|
+
console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
101
103
|
}
|
|
102
104
|
this.appChecking = false;
|
|
103
105
|
}, 0.8 * this.appCheckFrequencyMS);
|