prostgles-server 4.2.62 → 4.2.64
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/PubSubManager/getInitQuery.d.ts.map +1 -1
- package/dist/PubSubManager/getInitQuery.js +84 -76
- package/dist/PubSubManager/getInitQuery.js.map +1 -1
- package/lib/PubSubManager/getInitQuery.ts +84 -76
- package/package.json +1 -1
- package/tests/isomorphicQueries.spec.ts +37 -10
- package/tests/server/DBoGenerated.d.ts +10 -0
- package/tests/server/package-lock.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getInitQuery.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGpF,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,eAAO,MAAM,YAAY,SAAwB,aAAa,KAAG,QAAQ,MAAM,
|
|
1
|
+
{"version":3,"file":"getInitQuery.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGpF,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,eAAO,MAAM,YAAY,SAAwB,aAAa,KAAG,QAAQ,MAAM,CAkkB9E,CAAA"}
|
|
@@ -201,13 +201,15 @@ BEGIN
|
|
|
201
201
|
|
|
202
202
|
BEGIN
|
|
203
203
|
|
|
204
|
-
--
|
|
204
|
+
--PERFORM pg_notify('debug', concat_ws(' ', 'TABLE', TG_TABLE_NAME, TG_OP));
|
|
205
205
|
|
|
206
206
|
SELECT string_agg(
|
|
207
207
|
format(
|
|
208
208
|
$c$
|
|
209
209
|
SELECT CASE WHEN EXISTS(
|
|
210
|
-
SELECT 1
|
|
210
|
+
SELECT 1
|
|
211
|
+
FROM %s
|
|
212
|
+
WHERE %s
|
|
211
213
|
) THEN %s::text END AS t_ids
|
|
212
214
|
$c$,
|
|
213
215
|
table_name,
|
|
@@ -218,7 +220,7 @@ BEGIN
|
|
|
218
220
|
)
|
|
219
221
|
INTO unions
|
|
220
222
|
FROM prostgles.v_triggers
|
|
221
|
-
WHERE table_name = TG_TABLE_NAME;
|
|
223
|
+
WHERE table_name = format(TG_TABLE_NAME, '%I');
|
|
222
224
|
|
|
223
225
|
|
|
224
226
|
/* unions = 'old_table union new_table' or any one of the tables */
|
|
@@ -240,7 +242,7 @@ BEGIN
|
|
|
240
242
|
FROM (
|
|
241
243
|
SELECT DISTINCT related_view_name, related_view_def
|
|
242
244
|
FROM prostgles.v_triggers
|
|
243
|
-
WHERE table_name = TG_TABLE_NAME
|
|
245
|
+
WHERE table_name = format(TG_TABLE_NAME, '%I')
|
|
244
246
|
AND related_view_name IS NOT NULL
|
|
245
247
|
AND related_view_def IS NOT NULL
|
|
246
248
|
) t
|
|
@@ -252,7 +254,8 @@ BEGIN
|
|
|
252
254
|
FROM (
|
|
253
255
|
%s
|
|
254
256
|
) t
|
|
255
|
-
$c$,
|
|
257
|
+
$c$,
|
|
258
|
+
unions
|
|
256
259
|
)
|
|
257
260
|
INTO query;
|
|
258
261
|
|
|
@@ -316,17 +319,7 @@ BEGIN
|
|
|
316
319
|
|
|
317
320
|
|
|
318
321
|
RETURN NULL;
|
|
319
|
-
|
|
320
|
-
/*
|
|
321
|
-
EXCEPTION WHEN OTHERS THEN
|
|
322
|
-
DELETE FROM prostgles.app_triggers; -- delete all or will need to loop through all conditions to find issue;
|
|
323
|
-
RAISE NOTICE 'trigger dropped due to exception';
|
|
324
|
-
${"--EXCEPTION_WHEN_COLUMN_WAS_RENAMED_THEN_DROP_TRIGGER"};
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
RETURN NULL;
|
|
329
|
-
*/
|
|
322
|
+
|
|
330
323
|
END;
|
|
331
324
|
|
|
332
325
|
--COMMIT;
|
|
@@ -339,6 +332,7 @@ BEGIN
|
|
|
339
332
|
DECLARE operations TEXT[] := ARRAY['insert', 'update', 'delete'];
|
|
340
333
|
DECLARE op TEXT;
|
|
341
334
|
DECLARE query TEXT;
|
|
335
|
+
DECLARE trg_name TEXT;
|
|
342
336
|
DECLARE trw RECORD;
|
|
343
337
|
DECLARE app RECORD;
|
|
344
338
|
DECLARE start_time BIGINT;
|
|
@@ -350,7 +344,7 @@ BEGIN
|
|
|
350
344
|
|
|
351
345
|
--RAISE NOTICE 'prostgles.app_triggers % ', TG_OP;
|
|
352
346
|
|
|
353
|
-
/* If no other listeners (app_triggers) left on table then
|
|
347
|
+
/* If no other listeners (app_triggers) left on table then DISABLE actual table data watch triggers */
|
|
354
348
|
IF TG_OP = 'DELETE' THEN
|
|
355
349
|
|
|
356
350
|
--RAISE NOTICE 'DELETE trigger_add_remove_func table: % ', ' ' || COALESCE((SELECT concat_ws(' ', string_agg(table_name, ' & '), count(*), min(inserted) ) FROM prostgles.app_triggers) , ' 0 ');
|
|
@@ -358,19 +352,32 @@ BEGIN
|
|
|
358
352
|
|
|
359
353
|
select count(*) from old_table into changed_triggers_count;
|
|
360
354
|
|
|
361
|
-
/*
|
|
355
|
+
/* Disable actual triggers if needed */
|
|
362
356
|
FOR trw IN
|
|
363
|
-
SELECT DISTINCT table_name
|
|
357
|
+
SELECT DISTINCT table_name
|
|
358
|
+
FROM old_table ot
|
|
364
359
|
WHERE NOT EXISTS (
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
360
|
+
SELECT 1
|
|
361
|
+
FROM prostgles.app_triggers t
|
|
362
|
+
WHERE t.table_name = ot.table_name
|
|
363
|
+
)
|
|
364
|
+
AND EXISTS (
|
|
365
|
+
SELECT trigger_name
|
|
366
|
+
FROM information_schema.triggers
|
|
367
|
+
WHERE trigger_name IN (
|
|
368
|
+
concat_ws('_', 'prostgles_triggers', table_name, 'insert'),
|
|
369
|
+
concat_ws('_', 'prostgles_triggers', table_name, 'update'),
|
|
370
|
+
concat_ws('_', 'prostgles_triggers', table_name, 'delete')
|
|
371
|
+
)
|
|
372
|
+
)
|
|
368
373
|
LOOP
|
|
369
374
|
|
|
370
375
|
FOREACH op IN ARRAY operations
|
|
371
376
|
LOOP
|
|
372
|
-
|
|
373
|
-
|
|
377
|
+
trg_name := concat_ws('_', 'prostgles_triggers', trw.table_name, op);
|
|
378
|
+
|
|
379
|
+
--EXECUTE format(' DROP TRIGGER IF EXISTS %I ON %s ;' , trg_name, trw.table_name);
|
|
380
|
+
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;', trw.table_name, trg_name);
|
|
374
381
|
END LOOP;
|
|
375
382
|
|
|
376
383
|
END LOOP;
|
|
@@ -397,55 +404,66 @@ BEGIN
|
|
|
397
404
|
AND t.inserted < nt.inserted -- exclude current record (this is an after trigger). Turn into before trigger?
|
|
398
405
|
)
|
|
399
406
|
|
|
400
|
-
/* Table is valid
|
|
407
|
+
/* Table is valid
|
|
401
408
|
AND EXISTS (
|
|
402
409
|
SELECT 1
|
|
403
410
|
FROM information_schema.tables
|
|
404
411
|
WHERE table_schema = 'public'
|
|
405
412
|
AND table_name = nt.table_name
|
|
406
413
|
)
|
|
407
|
-
LOOP
|
|
408
|
-
|
|
409
|
-
/*
|
|
410
|
-
RAISE NOTICE ' CREATE DATA TRIGGER FOR: % TABLE EXISTS?', trw.table_name, SELECT EXISTS (
|
|
411
|
-
SELECT 1
|
|
412
|
-
FROM information_schema.tables
|
|
413
|
-
WHERE table_schema = 'public'
|
|
414
|
-
AND table_name = nt.table_name
|
|
415
|
-
);
|
|
416
414
|
*/
|
|
415
|
+
LOOP
|
|
416
|
+
|
|
417
|
+
IF (
|
|
418
|
+
SELECT COUNT(*)
|
|
419
|
+
FROM information_schema.triggers
|
|
420
|
+
WHERE trigger_name IN (
|
|
421
|
+
'prostgles_triggers_' || trw.table_name || '_insert',
|
|
422
|
+
'prostgles_triggers_' || trw.table_name || '_update',
|
|
423
|
+
'prostgles_triggers_' || trw.table_name || '_delete'
|
|
424
|
+
)
|
|
425
|
+
) = 3 AND false
|
|
426
|
+
THEN
|
|
427
|
+
query := concat_ws(E'\n',
|
|
428
|
+
format(' ALTER TABLE %s ENABLE TRIGGER %I ;', trw.table_name, 'prostgles_triggers_' || trw.table_name || '_insert'),
|
|
429
|
+
format(' ALTER TABLE %s ENABLE TRIGGER %I ;', trw.table_name, 'prostgles_triggers_' || trw.table_name || '_update'),
|
|
430
|
+
format(' ALTER TABLE %s ENABLE TRIGGER %I ;', trw.table_name, 'prostgles_triggers_' || trw.table_name || '_delete')
|
|
431
|
+
);
|
|
432
|
+
ELSE
|
|
433
|
+
|
|
434
|
+
query := format(
|
|
435
|
+
$q$
|
|
436
|
+
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
437
|
+
CREATE TRIGGER %1$I
|
|
438
|
+
AFTER INSERT ON %2$s
|
|
439
|
+
REFERENCING NEW TABLE AS new_table
|
|
440
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
441
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
442
|
+
$q$,
|
|
443
|
+
'prostgles_triggers_' || trw.table_name || '_insert', trw.table_name
|
|
444
|
+
) || format(
|
|
445
|
+
$q$
|
|
446
|
+
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
447
|
+
CREATE TRIGGER %1$I
|
|
448
|
+
AFTER UPDATE ON %2$s
|
|
449
|
+
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
|
|
450
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
451
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
452
|
+
$q$,
|
|
453
|
+
'prostgles_triggers_' || trw.table_name || '_update', trw.table_name
|
|
454
|
+
) || format(
|
|
455
|
+
$q$
|
|
456
|
+
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
457
|
+
CREATE TRIGGER %1$I
|
|
458
|
+
AFTER DELETE ON %2$s
|
|
459
|
+
REFERENCING OLD TABLE AS old_table
|
|
460
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
461
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
462
|
+
$q$,
|
|
463
|
+
'prostgles_triggers_' || trw.table_name || '_delete', trw.table_name
|
|
464
|
+
);
|
|
465
|
+
END IF;
|
|
417
466
|
|
|
418
|
-
query := format(
|
|
419
|
-
$q$
|
|
420
|
-
DROP TRIGGER IF EXISTS %1$I ON %2$I;
|
|
421
|
-
CREATE TRIGGER %1$I
|
|
422
|
-
AFTER INSERT ON %2$I
|
|
423
|
-
REFERENCING NEW TABLE AS new_table
|
|
424
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
425
|
-
COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
426
|
-
$q$,
|
|
427
|
-
'prostgles_triggers_' || trw.table_name || '_insert', trw.table_name
|
|
428
|
-
) || format(
|
|
429
|
-
$q$
|
|
430
|
-
DROP TRIGGER IF EXISTS %1$I ON %2$I;
|
|
431
|
-
CREATE TRIGGER %1$I
|
|
432
|
-
AFTER UPDATE ON %2$I
|
|
433
|
-
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
|
|
434
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
435
|
-
COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
436
|
-
$q$,
|
|
437
|
-
'prostgles_triggers_' || trw.table_name || '_update', trw.table_name
|
|
438
|
-
) || format(
|
|
439
|
-
$q$
|
|
440
|
-
DROP TRIGGER IF EXISTS %1$I ON %2$I;
|
|
441
|
-
CREATE TRIGGER %1$I
|
|
442
|
-
AFTER DELETE ON %2$I
|
|
443
|
-
REFERENCING OLD TABLE AS old_table
|
|
444
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
445
|
-
COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
446
|
-
$q$,
|
|
447
|
-
'prostgles_triggers_' || trw.table_name || '_delete', trw.table_name
|
|
448
|
-
);
|
|
449
467
|
|
|
450
468
|
--RAISE NOTICE ' % ', query;
|
|
451
469
|
|
|
@@ -455,20 +473,10 @@ BEGIN
|
|
|
455
473
|
DO $e$
|
|
456
474
|
BEGIN
|
|
457
475
|
/* ${PubSubManager_1.PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */
|
|
458
|
-
|
|
459
|
-
SELECT 1
|
|
460
|
-
FROM information_schema.tables
|
|
461
|
-
WHERE table_schema = 'public'
|
|
462
|
-
AND table_name = %L
|
|
463
|
-
) THEN
|
|
464
|
-
|
|
465
|
-
%s
|
|
466
|
-
|
|
467
|
-
END IF;
|
|
476
|
+
%s
|
|
468
477
|
|
|
469
478
|
END $e$;
|
|
470
479
|
$q$,
|
|
471
|
-
trw.table_name,
|
|
472
480
|
query
|
|
473
481
|
) ;
|
|
474
482
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":";;;AACA,mDAAoF;AACpF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAErC,QAAA,YAAY,GAAG;IAC1B,uBAAuB,EAAE,mCAAmC;IAC5D,eAAe,EAAE,sCAAsC;IACvD,iBAAiB,EAAE,6BAA6B;IAChD,oBAAoB,EAAE,oCAAoC;CAClD,CAAC;AAEJ,MAAM,YAAY,GAAG,KAAK;IAE/B,MAAM,QAAQ,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAmB,EAAE;QAC9D,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,WAAW,CAAA,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,8BAA8B,EAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAElI,OAAO;;;;;;;IAOP,6BAAa,CAAC,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEA+BkB,IAAA,uBAAO,EAAC,OAAO,CAAC;yEACb,IAAA,uBAAO,EAAC,OAAO,CAAC;+BAC1D,IAAA,uBAAO,EAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4BjC,IAAA,uBAAO,EAAC,OAAO,CAAC,KAAK,IAAA,uBAAO,EAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAsGpB,oBAAY,CAAC,eAAe
|
|
1
|
+
{"version":3,"file":"getInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -203,13 +203,15 @@ BEGIN
|
|
|
203
203
|
|
|
204
204
|
BEGIN
|
|
205
205
|
|
|
206
|
-
--
|
|
206
|
+
--PERFORM pg_notify('debug', concat_ws(' ', 'TABLE', TG_TABLE_NAME, TG_OP));
|
|
207
207
|
|
|
208
208
|
SELECT string_agg(
|
|
209
209
|
format(
|
|
210
210
|
$c$
|
|
211
211
|
SELECT CASE WHEN EXISTS(
|
|
212
|
-
SELECT 1
|
|
212
|
+
SELECT 1
|
|
213
|
+
FROM %s
|
|
214
|
+
WHERE %s
|
|
213
215
|
) THEN %s::text END AS t_ids
|
|
214
216
|
$c$,
|
|
215
217
|
table_name,
|
|
@@ -220,7 +222,7 @@ BEGIN
|
|
|
220
222
|
)
|
|
221
223
|
INTO unions
|
|
222
224
|
FROM prostgles.v_triggers
|
|
223
|
-
WHERE table_name = TG_TABLE_NAME;
|
|
225
|
+
WHERE table_name = format(TG_TABLE_NAME, '%I');
|
|
224
226
|
|
|
225
227
|
|
|
226
228
|
/* unions = 'old_table union new_table' or any one of the tables */
|
|
@@ -242,7 +244,7 @@ BEGIN
|
|
|
242
244
|
FROM (
|
|
243
245
|
SELECT DISTINCT related_view_name, related_view_def
|
|
244
246
|
FROM prostgles.v_triggers
|
|
245
|
-
WHERE table_name = TG_TABLE_NAME
|
|
247
|
+
WHERE table_name = format(TG_TABLE_NAME, '%I')
|
|
246
248
|
AND related_view_name IS NOT NULL
|
|
247
249
|
AND related_view_def IS NOT NULL
|
|
248
250
|
) t
|
|
@@ -254,7 +256,8 @@ BEGIN
|
|
|
254
256
|
FROM (
|
|
255
257
|
%s
|
|
256
258
|
) t
|
|
257
|
-
$c$,
|
|
259
|
+
$c$,
|
|
260
|
+
unions
|
|
258
261
|
)
|
|
259
262
|
INTO query;
|
|
260
263
|
|
|
@@ -318,17 +321,7 @@ BEGIN
|
|
|
318
321
|
|
|
319
322
|
|
|
320
323
|
RETURN NULL;
|
|
321
|
-
|
|
322
|
-
/*
|
|
323
|
-
EXCEPTION WHEN OTHERS THEN
|
|
324
|
-
DELETE FROM prostgles.app_triggers; -- delete all or will need to loop through all conditions to find issue;
|
|
325
|
-
RAISE NOTICE 'trigger dropped due to exception';
|
|
326
|
-
${"--EXCEPTION_WHEN_COLUMN_WAS_RENAMED_THEN_DROP_TRIGGER"};
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
RETURN NULL;
|
|
331
|
-
*/
|
|
324
|
+
|
|
332
325
|
END;
|
|
333
326
|
|
|
334
327
|
--COMMIT;
|
|
@@ -341,6 +334,7 @@ BEGIN
|
|
|
341
334
|
DECLARE operations TEXT[] := ARRAY['insert', 'update', 'delete'];
|
|
342
335
|
DECLARE op TEXT;
|
|
343
336
|
DECLARE query TEXT;
|
|
337
|
+
DECLARE trg_name TEXT;
|
|
344
338
|
DECLARE trw RECORD;
|
|
345
339
|
DECLARE app RECORD;
|
|
346
340
|
DECLARE start_time BIGINT;
|
|
@@ -352,7 +346,7 @@ BEGIN
|
|
|
352
346
|
|
|
353
347
|
--RAISE NOTICE 'prostgles.app_triggers % ', TG_OP;
|
|
354
348
|
|
|
355
|
-
/* If no other listeners (app_triggers) left on table then
|
|
349
|
+
/* If no other listeners (app_triggers) left on table then DISABLE actual table data watch triggers */
|
|
356
350
|
IF TG_OP = 'DELETE' THEN
|
|
357
351
|
|
|
358
352
|
--RAISE NOTICE 'DELETE trigger_add_remove_func table: % ', ' ' || COALESCE((SELECT concat_ws(' ', string_agg(table_name, ' & '), count(*), min(inserted) ) FROM prostgles.app_triggers) , ' 0 ');
|
|
@@ -360,19 +354,32 @@ BEGIN
|
|
|
360
354
|
|
|
361
355
|
select count(*) from old_table into changed_triggers_count;
|
|
362
356
|
|
|
363
|
-
/*
|
|
357
|
+
/* Disable actual triggers if needed */
|
|
364
358
|
FOR trw IN
|
|
365
|
-
SELECT DISTINCT table_name
|
|
359
|
+
SELECT DISTINCT table_name
|
|
360
|
+
FROM old_table ot
|
|
366
361
|
WHERE NOT EXISTS (
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
362
|
+
SELECT 1
|
|
363
|
+
FROM prostgles.app_triggers t
|
|
364
|
+
WHERE t.table_name = ot.table_name
|
|
365
|
+
)
|
|
366
|
+
AND EXISTS (
|
|
367
|
+
SELECT trigger_name
|
|
368
|
+
FROM information_schema.triggers
|
|
369
|
+
WHERE trigger_name IN (
|
|
370
|
+
concat_ws('_', 'prostgles_triggers', table_name, 'insert'),
|
|
371
|
+
concat_ws('_', 'prostgles_triggers', table_name, 'update'),
|
|
372
|
+
concat_ws('_', 'prostgles_triggers', table_name, 'delete')
|
|
373
|
+
)
|
|
374
|
+
)
|
|
370
375
|
LOOP
|
|
371
376
|
|
|
372
377
|
FOREACH op IN ARRAY operations
|
|
373
378
|
LOOP
|
|
374
|
-
|
|
375
|
-
|
|
379
|
+
trg_name := concat_ws('_', 'prostgles_triggers', trw.table_name, op);
|
|
380
|
+
|
|
381
|
+
--EXECUTE format(' DROP TRIGGER IF EXISTS %I ON %s ;' , trg_name, trw.table_name);
|
|
382
|
+
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;', trw.table_name, trg_name);
|
|
376
383
|
END LOOP;
|
|
377
384
|
|
|
378
385
|
END LOOP;
|
|
@@ -399,55 +406,66 @@ BEGIN
|
|
|
399
406
|
AND t.inserted < nt.inserted -- exclude current record (this is an after trigger). Turn into before trigger?
|
|
400
407
|
)
|
|
401
408
|
|
|
402
|
-
/* Table is valid
|
|
409
|
+
/* Table is valid
|
|
403
410
|
AND EXISTS (
|
|
404
411
|
SELECT 1
|
|
405
412
|
FROM information_schema.tables
|
|
406
413
|
WHERE table_schema = 'public'
|
|
407
414
|
AND table_name = nt.table_name
|
|
408
415
|
)
|
|
409
|
-
LOOP
|
|
410
|
-
|
|
411
|
-
/*
|
|
412
|
-
RAISE NOTICE ' CREATE DATA TRIGGER FOR: % TABLE EXISTS?', trw.table_name, SELECT EXISTS (
|
|
413
|
-
SELECT 1
|
|
414
|
-
FROM information_schema.tables
|
|
415
|
-
WHERE table_schema = 'public'
|
|
416
|
-
AND table_name = nt.table_name
|
|
417
|
-
);
|
|
418
416
|
*/
|
|
417
|
+
LOOP
|
|
418
|
+
|
|
419
|
+
IF (
|
|
420
|
+
SELECT COUNT(*)
|
|
421
|
+
FROM information_schema.triggers
|
|
422
|
+
WHERE trigger_name IN (
|
|
423
|
+
'prostgles_triggers_' || trw.table_name || '_insert',
|
|
424
|
+
'prostgles_triggers_' || trw.table_name || '_update',
|
|
425
|
+
'prostgles_triggers_' || trw.table_name || '_delete'
|
|
426
|
+
)
|
|
427
|
+
) = 3 AND false
|
|
428
|
+
THEN
|
|
429
|
+
query := concat_ws(E'\n',
|
|
430
|
+
format(' ALTER TABLE %s ENABLE TRIGGER %I ;', trw.table_name, 'prostgles_triggers_' || trw.table_name || '_insert'),
|
|
431
|
+
format(' ALTER TABLE %s ENABLE TRIGGER %I ;', trw.table_name, 'prostgles_triggers_' || trw.table_name || '_update'),
|
|
432
|
+
format(' ALTER TABLE %s ENABLE TRIGGER %I ;', trw.table_name, 'prostgles_triggers_' || trw.table_name || '_delete')
|
|
433
|
+
);
|
|
434
|
+
ELSE
|
|
435
|
+
|
|
436
|
+
query := format(
|
|
437
|
+
$q$
|
|
438
|
+
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
439
|
+
CREATE TRIGGER %1$I
|
|
440
|
+
AFTER INSERT ON %2$s
|
|
441
|
+
REFERENCING NEW TABLE AS new_table
|
|
442
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
443
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
444
|
+
$q$,
|
|
445
|
+
'prostgles_triggers_' || trw.table_name || '_insert', trw.table_name
|
|
446
|
+
) || format(
|
|
447
|
+
$q$
|
|
448
|
+
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
449
|
+
CREATE TRIGGER %1$I
|
|
450
|
+
AFTER UPDATE ON %2$s
|
|
451
|
+
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
|
|
452
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
453
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
454
|
+
$q$,
|
|
455
|
+
'prostgles_triggers_' || trw.table_name || '_update', trw.table_name
|
|
456
|
+
) || format(
|
|
457
|
+
$q$
|
|
458
|
+
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
459
|
+
CREATE TRIGGER %1$I
|
|
460
|
+
AFTER DELETE ON %2$s
|
|
461
|
+
REFERENCING OLD TABLE AS old_table
|
|
462
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
463
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
464
|
+
$q$,
|
|
465
|
+
'prostgles_triggers_' || trw.table_name || '_delete', trw.table_name
|
|
466
|
+
);
|
|
467
|
+
END IF;
|
|
419
468
|
|
|
420
|
-
query := format(
|
|
421
|
-
$q$
|
|
422
|
-
DROP TRIGGER IF EXISTS %1$I ON %2$I;
|
|
423
|
-
CREATE TRIGGER %1$I
|
|
424
|
-
AFTER INSERT ON %2$I
|
|
425
|
-
REFERENCING NEW TABLE AS new_table
|
|
426
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
427
|
-
COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
428
|
-
$q$,
|
|
429
|
-
'prostgles_triggers_' || trw.table_name || '_insert', trw.table_name
|
|
430
|
-
) || format(
|
|
431
|
-
$q$
|
|
432
|
-
DROP TRIGGER IF EXISTS %1$I ON %2$I;
|
|
433
|
-
CREATE TRIGGER %1$I
|
|
434
|
-
AFTER UPDATE ON %2$I
|
|
435
|
-
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
|
|
436
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
437
|
-
COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
438
|
-
$q$,
|
|
439
|
-
'prostgles_triggers_' || trw.table_name || '_update', trw.table_name
|
|
440
|
-
) || format(
|
|
441
|
-
$q$
|
|
442
|
-
DROP TRIGGER IF EXISTS %1$I ON %2$I;
|
|
443
|
-
CREATE TRIGGER %1$I
|
|
444
|
-
AFTER DELETE ON %2$I
|
|
445
|
-
REFERENCING OLD TABLE AS old_table
|
|
446
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
447
|
-
COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
448
|
-
$q$,
|
|
449
|
-
'prostgles_triggers_' || trw.table_name || '_delete', trw.table_name
|
|
450
|
-
);
|
|
451
469
|
|
|
452
470
|
--RAISE NOTICE ' % ', query;
|
|
453
471
|
|
|
@@ -457,20 +475,10 @@ BEGIN
|
|
|
457
475
|
DO $e$
|
|
458
476
|
BEGIN
|
|
459
477
|
/* ${ PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */
|
|
460
|
-
|
|
461
|
-
SELECT 1
|
|
462
|
-
FROM information_schema.tables
|
|
463
|
-
WHERE table_schema = 'public'
|
|
464
|
-
AND table_name = %L
|
|
465
|
-
) THEN
|
|
466
|
-
|
|
467
|
-
%s
|
|
468
|
-
|
|
469
|
-
END IF;
|
|
478
|
+
%s
|
|
470
479
|
|
|
471
480
|
END $e$;
|
|
472
481
|
$q$,
|
|
473
|
-
trw.table_name,
|
|
474
482
|
query
|
|
475
483
|
) ;
|
|
476
484
|
|
package/package.json
CHANGED
|
@@ -474,7 +474,7 @@ export const isomorphicQueries = async (db: DBOFullyTyped | DBHandlerClient, log
|
|
|
474
474
|
|
|
475
475
|
if(item && item.name === "zz3zz3"){
|
|
476
476
|
await db.various.delete!({ name: "zz3zz3" });
|
|
477
|
-
sub.unsubscribe();
|
|
477
|
+
await sub.unsubscribe();
|
|
478
478
|
resolve(true)
|
|
479
479
|
}
|
|
480
480
|
});
|
|
@@ -989,7 +989,30 @@ export const isomorphicQueries = async (db: DBOFullyTyped | DBHandlerClient, log
|
|
|
989
989
|
}
|
|
990
990
|
}, { select: "*" });
|
|
991
991
|
assert.deepStrictEqual(exists1, exists2)
|
|
992
|
-
})
|
|
992
|
+
});
|
|
993
|
+
|
|
994
|
+
// await test("subscribe to escaped table name", async () => {
|
|
995
|
+
// await tryRunP("subscribe to escaped table name", async (resolve, reject) => {
|
|
996
|
+
// // await tout(11000);
|
|
997
|
+
// const filter = { [`"text_col0"`]: "0" }
|
|
998
|
+
// let runs = 0;
|
|
999
|
+
// const sub = await db[`"""quoted0"""`].subscribe!(filter, { }, async items => {
|
|
1000
|
+
// const item = items[0];
|
|
1001
|
+
// if(item && item[`"text_col0"`] === "0"){
|
|
1002
|
+
// if(!runs){
|
|
1003
|
+
// db[`"""quoted0"""`].update!(filter, filter);
|
|
1004
|
+
// log(JSON.stringify(items))
|
|
1005
|
+
// }
|
|
1006
|
+
// runs++;
|
|
1007
|
+
// if(runs < 2){
|
|
1008
|
+
// return;
|
|
1009
|
+
// }
|
|
1010
|
+
// await sub.unsubscribe();
|
|
1011
|
+
// resolve(true);
|
|
1012
|
+
// }
|
|
1013
|
+
// });
|
|
1014
|
+
// });
|
|
1015
|
+
// });
|
|
993
1016
|
|
|
994
1017
|
await test("Reverse join with agg", async () => {
|
|
995
1018
|
const inserted = await db.tr1.insert!({ tr2: { t1: "a", t2: "b" } }, { returning: "*" });
|
|
@@ -1008,15 +1031,19 @@ export const isomorphicQueries = async (db: DBOFullyTyped | DBHandlerClient, log
|
|
|
1008
1031
|
});
|
|
1009
1032
|
|
|
1010
1033
|
await test("Related table subscribe", async () => {
|
|
1011
|
-
const sub = await db.tr1.subscribe!(
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1034
|
+
const sub = await db.tr1.subscribe!(
|
|
1035
|
+
{},
|
|
1036
|
+
{
|
|
1037
|
+
select: {
|
|
1038
|
+
"*": 1,
|
|
1039
|
+
tr2: "*",
|
|
1040
|
+
tr3: "*",
|
|
1041
|
+
}
|
|
1042
|
+
},
|
|
1043
|
+
_rows => {
|
|
1018
1044
|
|
|
1019
|
-
|
|
1045
|
+
}
|
|
1046
|
+
);
|
|
1020
1047
|
|
|
1021
1048
|
await sub.unsubscribe();
|
|
1022
1049
|
});
|
|
@@ -505,6 +505,16 @@ export type DBSchemaGenerated = {
|
|
|
505
505
|
symbol: string;
|
|
506
506
|
};
|
|
507
507
|
};
|
|
508
|
+
unions: {
|
|
509
|
+
is_view: false;
|
|
510
|
+
select: true;
|
|
511
|
+
insert: true;
|
|
512
|
+
update: true;
|
|
513
|
+
delete: true;
|
|
514
|
+
columns: {
|
|
515
|
+
string_agg?: null | string;
|
|
516
|
+
};
|
|
517
|
+
};
|
|
508
518
|
users: {
|
|
509
519
|
is_view: false;
|
|
510
520
|
select: true;
|