prostgles-server 4.2.63 → 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 +21 -11
- package/dist/PubSubManager/getInitQuery.js.map +1 -1
- package/lib/PubSubManager/getInitQuery.ts +21 -11
- package/package.json +1 -1
- package/tests/isomorphicQueries.spec.ts +34 -23
- 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
|
|
|
@@ -354,12 +357,18 @@ BEGIN
|
|
|
354
357
|
SELECT DISTINCT table_name
|
|
355
358
|
FROM old_table ot
|
|
356
359
|
WHERE NOT EXISTS (
|
|
357
|
-
SELECT 1
|
|
360
|
+
SELECT 1
|
|
361
|
+
FROM prostgles.app_triggers t
|
|
358
362
|
WHERE t.table_name = ot.table_name
|
|
359
363
|
)
|
|
360
364
|
AND EXISTS (
|
|
361
|
-
SELECT trigger_name
|
|
362
|
-
|
|
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
|
+
)
|
|
363
372
|
)
|
|
364
373
|
LOOP
|
|
365
374
|
|
|
@@ -368,7 +377,7 @@ BEGIN
|
|
|
368
377
|
trg_name := concat_ws('_', 'prostgles_triggers', trw.table_name, op);
|
|
369
378
|
|
|
370
379
|
--EXECUTE format(' DROP TRIGGER IF EXISTS %I ON %s ;' , trg_name, trw.table_name);
|
|
371
|
-
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;',
|
|
380
|
+
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;', trw.table_name, trg_name);
|
|
372
381
|
END LOOP;
|
|
373
382
|
|
|
374
383
|
END LOOP;
|
|
@@ -395,13 +404,14 @@ BEGIN
|
|
|
395
404
|
AND t.inserted < nt.inserted -- exclude current record (this is an after trigger). Turn into before trigger?
|
|
396
405
|
)
|
|
397
406
|
|
|
398
|
-
/* Table is valid
|
|
407
|
+
/* Table is valid
|
|
399
408
|
AND EXISTS (
|
|
400
409
|
SELECT 1
|
|
401
410
|
FROM information_schema.tables
|
|
402
411
|
WHERE table_schema = 'public'
|
|
403
412
|
AND table_name = nt.table_name
|
|
404
413
|
)
|
|
414
|
+
*/
|
|
405
415
|
LOOP
|
|
406
416
|
|
|
407
417
|
IF (
|
|
@@ -445,7 +455,7 @@ BEGIN
|
|
|
445
455
|
$q$
|
|
446
456
|
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
447
457
|
CREATE TRIGGER %1$I
|
|
448
|
-
AFTER DELETE ON %2$
|
|
458
|
+
AFTER DELETE ON %2$s
|
|
449
459
|
REFERENCING OLD TABLE AS old_table
|
|
450
460
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
451
461
|
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
@@ -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
|
|
|
@@ -356,12 +359,18 @@ BEGIN
|
|
|
356
359
|
SELECT DISTINCT table_name
|
|
357
360
|
FROM old_table ot
|
|
358
361
|
WHERE NOT EXISTS (
|
|
359
|
-
SELECT 1
|
|
362
|
+
SELECT 1
|
|
363
|
+
FROM prostgles.app_triggers t
|
|
360
364
|
WHERE t.table_name = ot.table_name
|
|
361
365
|
)
|
|
362
366
|
AND EXISTS (
|
|
363
|
-
SELECT trigger_name
|
|
364
|
-
|
|
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
|
+
)
|
|
365
374
|
)
|
|
366
375
|
LOOP
|
|
367
376
|
|
|
@@ -370,7 +379,7 @@ BEGIN
|
|
|
370
379
|
trg_name := concat_ws('_', 'prostgles_triggers', trw.table_name, op);
|
|
371
380
|
|
|
372
381
|
--EXECUTE format(' DROP TRIGGER IF EXISTS %I ON %s ;' , trg_name, trw.table_name);
|
|
373
|
-
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;',
|
|
382
|
+
EXECUTE format(' ALTER TABLE %s DISABLE TRIGGER %I ;', trw.table_name, trg_name);
|
|
374
383
|
END LOOP;
|
|
375
384
|
|
|
376
385
|
END LOOP;
|
|
@@ -397,13 +406,14 @@ BEGIN
|
|
|
397
406
|
AND t.inserted < nt.inserted -- exclude current record (this is an after trigger). Turn into before trigger?
|
|
398
407
|
)
|
|
399
408
|
|
|
400
|
-
/* Table is valid
|
|
409
|
+
/* Table is valid
|
|
401
410
|
AND EXISTS (
|
|
402
411
|
SELECT 1
|
|
403
412
|
FROM information_schema.tables
|
|
404
413
|
WHERE table_schema = 'public'
|
|
405
414
|
AND table_name = nt.table_name
|
|
406
415
|
)
|
|
416
|
+
*/
|
|
407
417
|
LOOP
|
|
408
418
|
|
|
409
419
|
IF (
|
|
@@ -447,7 +457,7 @@ BEGIN
|
|
|
447
457
|
$q$
|
|
448
458
|
DROP TRIGGER IF EXISTS %1$I ON %2$s;
|
|
449
459
|
CREATE TRIGGER %1$I
|
|
450
|
-
AFTER DELETE ON %2$
|
|
460
|
+
AFTER DELETE ON %2$s
|
|
451
461
|
REFERENCING OLD TABLE AS old_table
|
|
452
462
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
453
463
|
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
package/package.json
CHANGED
|
@@ -991,21 +991,28 @@ export const isomorphicQueries = async (db: DBOFullyTyped | DBHandlerClient, log
|
|
|
991
991
|
assert.deepStrictEqual(exists1, exists2)
|
|
992
992
|
});
|
|
993
993
|
|
|
994
|
-
await test("subscribe to escaped table name", async () => {
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
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
|
+
// });
|
|
1009
1016
|
|
|
1010
1017
|
await test("Reverse join with agg", async () => {
|
|
1011
1018
|
const inserted = await db.tr1.insert!({ tr2: { t1: "a", t2: "b" } }, { returning: "*" });
|
|
@@ -1024,15 +1031,19 @@ export const isomorphicQueries = async (db: DBOFullyTyped | DBHandlerClient, log
|
|
|
1024
1031
|
});
|
|
1025
1032
|
|
|
1026
1033
|
await test("Related table subscribe", async () => {
|
|
1027
|
-
const sub = await db.tr1.subscribe!(
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
+
const sub = await db.tr1.subscribe!(
|
|
1035
|
+
{},
|
|
1036
|
+
{
|
|
1037
|
+
select: {
|
|
1038
|
+
"*": 1,
|
|
1039
|
+
tr2: "*",
|
|
1040
|
+
tr3: "*",
|
|
1041
|
+
}
|
|
1042
|
+
},
|
|
1043
|
+
_rows => {
|
|
1034
1044
|
|
|
1035
|
-
|
|
1045
|
+
}
|
|
1046
|
+
);
|
|
1036
1047
|
|
|
1037
1048
|
await sub.unsubscribe();
|
|
1038
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;
|