prostgles-server 3.0.99 → 3.0.101

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 (51) hide show
  1. package/dist/AuthHandler.js +6 -6
  2. package/dist/AuthHandler.js.map +1 -1
  3. package/dist/DboBuilder/ViewHandler.js +0 -1
  4. package/dist/DboBuilder/ViewHandler.js.map +1 -1
  5. package/dist/DboBuilder/subscribe.d.ts.map +1 -1
  6. package/dist/DboBuilder/subscribe.js +0 -17
  7. package/dist/DboBuilder/subscribe.js.map +1 -1
  8. package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts +1 -1
  9. package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -1
  10. package/dist/JSONBValidation/validate_jsonb_schema_sql.js +8 -2
  11. package/dist/JSONBValidation/validate_jsonb_schema_sql.js.map +1 -1
  12. package/dist/PubSubManager/PubSubManager.d.ts +4 -7
  13. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  14. package/dist/PubSubManager/PubSubManager.js +13 -19
  15. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  16. package/dist/PubSubManager/getInitQuery.d.ts +9 -0
  17. package/dist/PubSubManager/getInitQuery.d.ts.map +1 -0
  18. package/dist/PubSubManager/getInitQuery.js +537 -0
  19. package/dist/PubSubManager/getInitQuery.js.map +1 -0
  20. package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
  21. package/dist/PubSubManager/initPubSubManager.js +46 -577
  22. package/dist/PubSubManager/initPubSubManager.js.map +1 -1
  23. package/dist/SchemaWatch.js +1 -0
  24. package/dist/SchemaWatch.js.map +1 -1
  25. package/lib/AuthHandler.js +6 -6
  26. package/lib/AuthHandler.ts +7 -7
  27. package/lib/DboBuilder/ViewHandler.js +0 -1
  28. package/lib/DboBuilder/ViewHandler.ts +1 -1
  29. package/lib/DboBuilder/subscribe.d.ts.map +1 -1
  30. package/lib/DboBuilder/subscribe.js +0 -17
  31. package/lib/DboBuilder/subscribe.ts +0 -25
  32. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts +1 -1
  33. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -1
  34. package/lib/JSONBValidation/validate_jsonb_schema_sql.js +8 -2
  35. package/lib/JSONBValidation/validate_jsonb_schema_sql.ts +8 -2
  36. package/lib/PubSubManager/PubSubManager.d.ts +4 -7
  37. package/lib/PubSubManager/PubSubManager.d.ts.map +1 -1
  38. package/lib/PubSubManager/PubSubManager.js +16 -19
  39. package/lib/PubSubManager/PubSubManager.ts +18 -20
  40. package/lib/PubSubManager/getInitQuery.d.ts +9 -0
  41. package/lib/PubSubManager/getInitQuery.d.ts.map +1 -0
  42. package/lib/PubSubManager/getInitQuery.js +536 -0
  43. package/lib/PubSubManager/getInitQuery.ts +538 -0
  44. package/lib/PubSubManager/initPubSubManager.d.ts.map +1 -1
  45. package/lib/PubSubManager/initPubSubManager.js +46 -577
  46. package/lib/PubSubManager/initPubSubManager.ts +48 -585
  47. package/lib/SchemaWatch.js +1 -0
  48. package/lib/SchemaWatch.ts +1 -1
  49. package/package.json +3 -3
  50. package/tests/client/PID.txt +1 -1
  51. package/tests/server/package-lock.json +1 -1
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getInitQuery = exports.DB_OBJ_NAMES = void 0;
4
+ const PubSubManager_1 = require("./PubSubManager");
5
+ const { version } = require("../../package.json");
6
+ exports.DB_OBJ_NAMES = {
7
+ trigger_add_remove_func: "prostgles.trigger_add_remove_func",
8
+ data_watch_func: "prostgles.prostgles_trigger_function",
9
+ schema_watch_func: "prostgles.schema_watch_func",
10
+ schema_watch_trigger: "prostgles_schema_watch_trigger_new"
11
+ };
12
+ const getInitQuery = async function () {
13
+ const getQuery = async (withoutHash = false) => {
14
+ const { schema_md5 = "none" } = withoutHash ? {} : await this.db.oneOrNone("SELECT md5($1) as schema_md5", [await getQuery(true)]);
15
+ return `
16
+
17
+ BEGIN; -- ISOLATION LEVEL SERIALIZABLE;-- TRANSACTION ISOLATION LEVEL SERIALIZABLE;
18
+
19
+ --SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
20
+
21
+ /*
22
+ * ${PubSubManager_1.PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
23
+ */
24
+
25
+ DO
26
+ $do$
27
+ BEGIN
28
+
29
+ /* Reduce deadlocks */
30
+ PERFORM pg_sleep(random());
31
+
32
+ /* Drop older version. */
33
+ IF EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'prostgles') THEN
34
+
35
+ /* The seemingly useless IF nesting is done to prevent pg evaluating the entire condition and throw a 'schema_md5 column does not exist' */
36
+ IF
37
+ /* Cannot check schema version */
38
+ NOT EXISTS(
39
+ SELECT 1
40
+ FROM information_schema.columns
41
+ WHERE table_schema = 'prostgles'
42
+ AND table_name = 'versions'
43
+ AND column_name = 'schema_md5'
44
+ )
45
+ THEN
46
+ DROP SCHEMA IF EXISTS prostgles CASCADE;
47
+ ELSIF
48
+ /* There is no newer schema */
49
+ NOT EXISTS(
50
+ SELECT 1
51
+ FROM prostgles.versions
52
+ WHERE schema_md5 <> ${(0, PubSubManager_1.asValue)(schema_md5)}
53
+ AND version >= ${(0, PubSubManager_1.asValue)(version)}
54
+ )
55
+ THEN
56
+ DROP SCHEMA IF EXISTS prostgles CASCADE;
57
+
58
+ END IF;
59
+
60
+ END IF;
61
+
62
+
63
+ IF NOT EXISTS (
64
+ SELECT 1
65
+ FROM information_schema.schemata
66
+ WHERE schema_name = 'prostgles'
67
+ )
68
+ THEN
69
+
70
+ CREATE SCHEMA IF NOT EXISTS prostgles;
71
+ COMMENT ON SCHEMA prostgles IS 'Used by prostgles-server to enable data/schema change tracking through subscribe/sync/watchSchema';
72
+
73
+ CREATE TABLE IF NOT EXISTS prostgles.versions(
74
+ version TEXT PRIMARY KEY,
75
+ schema_md5 TEXT NOT NULL
76
+ );
77
+ COMMENT ON TABLE prostgles.versions IS 'Stores the prostgles schema creation query hash and package version number to identify when a newer schema needs to be re-created';
78
+
79
+ INSERT INTO prostgles.versions(version, schema_md5)
80
+ VALUES(${(0, PubSubManager_1.asValue)(version)}, ${(0, PubSubManager_1.asValue)(schema_md5)})
81
+ ON CONFLICT DO NOTHING;
82
+
83
+
84
+ CREATE OR REPLACE FUNCTION prostgles.random_string(length INTEGER DEFAULT 33) RETURNS TEXT AS $$
85
+ DECLARE
86
+ chars TEXT[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
87
+ result TEXT := '';
88
+ i INTEGER := 0;
89
+ BEGIN
90
+
91
+ IF length < 0 THEN
92
+ RAISE exception 'Given length cannot be less than 0';
93
+ END IF;
94
+
95
+ FOR i IN 1..length LOOP
96
+ result := result || chars[1+random()*(array_length(chars, 1)-1)];
97
+ END LOOP;
98
+
99
+ RETURN result;
100
+
101
+ END;
102
+ $$ language plpgsql;
103
+ COMMENT ON FUNCTION prostgles.random_string IS 'UUIDs without installing pgcrypto';
104
+
105
+
106
+ CREATE OR REPLACE FUNCTION prostgles.debug(VARIADIC args TEXT[]) RETURNS VOID AS $$
107
+ BEGIN
108
+
109
+ --PERFORM pg_notify('debug', concat_ws(' ', args));
110
+ IF
111
+ NOT EXISTS (
112
+ SELECT 1
113
+ FROM information_schema.tables
114
+ WHERE table_schema = 'prostgles'
115
+ AND table_name = 'debug'
116
+ )
117
+ THEN
118
+ CREATE TABLE IF NOT EXISTS prostgles.debug(m TEXT);
119
+ END IF;
120
+
121
+ INSERT INTO prostgles.debug(m) VALUES(concat_ws(' ', args));
122
+
123
+ END;
124
+ $$ LANGUAGE plpgsql;
125
+ COMMENT ON FUNCTION prostgles.debug IS 'Used for internal debugging';
126
+
127
+
128
+ CREATE TABLE IF NOT EXISTS prostgles.apps (
129
+ id TEXT PRIMARY KEY DEFAULT prostgles.random_string(),
130
+ added TIMESTAMP DEFAULT NOW(),
131
+ application_name TEXT,
132
+ last_check TIMESTAMP NOT NULL DEFAULT NOW(),
133
+ last_check_ended TIMESTAMP NOT NULL DEFAULT NOW(),
134
+ watching_schema BOOLEAN DEFAULT FALSE,
135
+ check_frequency_ms INTEGER NOT NULL
136
+ );
137
+ COMMENT ON TABLE prostgles.apps IS 'Keep track of prostgles server apps connected to db to combine common triggers. Heartbeat used due to no logout triggers in postgres';
138
+
139
+ CREATE TABLE IF NOT EXISTS prostgles.app_triggers (
140
+ app_id TEXT NOT NULL,
141
+ table_name TEXT NOT NULL,
142
+ condition TEXT NOT NULL,
143
+
144
+ /* The view from the root subscription, found in the condition.
145
+ We need this because old_table/new_table data is not reflected in the view inside the AFTER trigger
146
+ */
147
+ related_view_name TEXT,
148
+ related_view_def TEXT, /* view definition */
149
+
150
+ inserted TIMESTAMP NOT NULL DEFAULT NOW(),
151
+ last_used TIMESTAMP NOT NULL DEFAULT NOW(),
152
+ PRIMARY KEY (app_id, table_name, condition) /* This unqique index limits the condition column value to be less than 'SELECT current_setting('block_size'); */
153
+ );
154
+ COMMENT ON TABLE prostgles.app_triggers IS 'Tables and conditions that are currently subscribed/synced';
155
+
156
+
157
+ CREATE OR REPLACE VIEW prostgles.v_triggers AS
158
+ SELECT *
159
+ , (ROW_NUMBER() OVER( ORDER BY table_name, condition ))::text AS id
160
+ , ROW_NUMBER() OVER(PARTITION BY app_id, table_name ORDER BY table_name, condition ) - 1 AS c_id
161
+ FROM prostgles.app_triggers;
162
+ COMMENT ON VIEW prostgles.v_triggers IS 'Augment trigger table with natural IDs and per app IDs';
163
+
164
+
165
+ CREATE OR REPLACE FUNCTION ${exports.DB_OBJ_NAMES.data_watch_func}() RETURNS TRIGGER
166
+ AS $$
167
+
168
+ DECLARE t_ids TEXT[];
169
+ DECLARE c_ids INTEGER[];
170
+ DECLARE err_c_ids INTEGER[];
171
+ DECLARE unions TEXT := '';
172
+ DECLARE query TEXT := '';
173
+ DECLARE nrw RECORD;
174
+ DECLARE erw RECORD;
175
+ DECLARE has_errors BOOLEAN := FALSE;
176
+
177
+ DECLARE err_text TEXT;
178
+ DECLARE err_detail TEXT;
179
+ DECLARE err_hint TEXT;
180
+
181
+ DECLARE view_def_query TEXT := '';
182
+
183
+ BEGIN
184
+
185
+ -- PERFORM pg_notify('debug', concat_ws(' ', 'TABLE', TG_TABLE_NAME, TG_OP));
186
+
187
+ SELECT string_agg(
188
+ format(
189
+ $c$
190
+ SELECT CASE WHEN EXISTS(
191
+ SELECT 1 FROM %I WHERE %s
192
+ ) THEN %s::text END AS t_ids
193
+ $c$,
194
+ table_name,
195
+ condition,
196
+ id
197
+ ),
198
+ E' UNION \n '
199
+ )
200
+ INTO unions
201
+ FROM prostgles.v_triggers
202
+ WHERE table_name = TG_TABLE_NAME;
203
+
204
+
205
+ /* unions = 'old_table union new_table' or any one of the tables */
206
+ IF unions 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' %I 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 = TG_TABLE_NAME
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.t_ids)
233
+ FROM (
234
+ %s
235
+ ) t
236
+ $c$, unions
237
+ )
238
+ INTO query;
239
+
240
+ BEGIN
241
+ EXECUTE query INTO t_ids;
242
+
243
+ --RAISE NOTICE 'trigger fired ok';
244
+
245
+ EXCEPTION WHEN OTHERS THEN
246
+
247
+ has_errors := TRUE;
248
+
249
+ GET STACKED DIAGNOSTICS
250
+ err_text = MESSAGE_TEXT,
251
+ err_detail = PG_EXCEPTION_DETAIL,
252
+ err_hint = PG_EXCEPTION_HINT;
253
+
254
+
255
+ END;
256
+
257
+ --RAISE NOTICE 'has_errors: % ', has_errors;
258
+ --RAISE NOTICE 'unions: % , cids: %', unions, c_ids;
259
+
260
+ IF (t_ids IS NOT NULL OR has_errors) THEN
261
+
262
+ FOR nrw IN
263
+ SELECT app_id, string_agg(c_id::text, ',') as cids
264
+ FROM prostgles.v_triggers
265
+ WHERE id = ANY(t_ids)
266
+ OR has_errors
267
+ GROUP BY app_id
268
+ LOOP
269
+
270
+ PERFORM pg_notify(
271
+ ${(0, PubSubManager_1.asValue)(this.NOTIF_CHANNEL.preffix)} || nrw.app_id ,
272
+ concat_ws(
273
+ ${(0, PubSubManager_1.asValue)(PubSubManager_1.PubSubManager.DELIMITER)},
274
+
275
+ ${(0, PubSubManager_1.asValue)(this.NOTIF_TYPE.data)},
276
+ COALESCE(TG_TABLE_NAME, 'MISSING'),
277
+ COALESCE(TG_OP, 'MISSING'),
278
+ CASE WHEN has_errors
279
+ THEN concat_ws('; ', 'error', err_text, err_detail, err_hint, 'query: ' || query )
280
+ ELSE COALESCE(nrw.cids, '')
281
+ END
282
+ ${this.dboBuilder.prostgles.opts.DEBUG_MODE ? (", (select json_agg(t)::TEXT FROM (SELECT * from old_table) t), query") : ""}
283
+ )
284
+ );
285
+ END LOOP;
286
+
287
+
288
+ IF has_errors THEN
289
+
290
+ DELETE FROM prostgles.app_triggers;
291
+ RAISE NOTICE 'trigger dropped due to exception: % % %', err_text, err_detail, err_hint;
292
+
293
+ END IF;
294
+
295
+
296
+ END IF;
297
+ END IF;
298
+
299
+
300
+ RETURN NULL;
301
+
302
+ /*
303
+ EXCEPTION WHEN OTHERS THEN
304
+ DELETE FROM prostgles.app_triggers; -- delete all or will need to loop through all conditions to find issue;
305
+ RAISE NOTICE 'trigger dropped due to exception';
306
+ ${"--EXCEPTION_WHEN_COLUMN_WAS_RENAMED_THEN_DROP_TRIGGER"};
307
+
308
+
309
+
310
+ RETURN NULL;
311
+ */
312
+ END;
313
+
314
+ --COMMIT;
315
+ $$ LANGUAGE plpgsql;
316
+ COMMENT ON FUNCTION ${exports.DB_OBJ_NAMES.data_watch_func} IS 'Prostgles internal function used to notify when data in the table changed';
317
+
318
+
319
+
320
+ CREATE OR REPLACE FUNCTION ${exports.DB_OBJ_NAMES.trigger_add_remove_func}() RETURNS TRIGGER
321
+ AS $$
322
+
323
+ DECLARE operations TEXT[] := ARRAY['insert', 'update', 'delete'];
324
+ DECLARE op TEXT;
325
+ DECLARE query TEXT;
326
+ DECLARE trw RECORD;
327
+
328
+ BEGIN
329
+
330
+
331
+ --RAISE NOTICE 'prostgles.app_triggers % ', TG_OP;
332
+
333
+ /* If no other listeners on table then DROP triggers */
334
+ IF TG_OP = 'DELETE' THEN
335
+
336
+ --RAISE NOTICE 'DELETE trigger_add_remove_func table: % ', ' ' || COALESCE((SELECT concat_ws(' ', string_agg(table_name, ' & '), count(*), min(inserted) ) FROM prostgles.app_triggers) , ' 0 ');
337
+ --RAISE NOTICE 'DELETE trigger_add_remove_func old_table: % ', '' || COALESCE((SELECT concat_ws(' ', string_agg(table_name, ' & '), count(*), min(inserted) ) FROM old_table), ' 0 ');
338
+
339
+
340
+ /* Drop actual triggers if needed */
341
+ FOR trw IN
342
+ SELECT DISTINCT table_name FROM old_table ot
343
+ WHERE NOT EXISTS (
344
+ SELECT 1 FROM prostgles.app_triggers t
345
+ WHERE t.table_name = ot.table_name
346
+ )
347
+ LOOP
348
+
349
+ FOREACH op IN ARRAY operations
350
+ LOOP
351
+ --RAISE NOTICE ' DROP DATA TRIGGER FOR: % ', trw.table_name;
352
+ EXECUTE format(' DROP TRIGGER IF EXISTS %I ON %I ;' , 'prostgles_triggers_' || trw.table_name || '_' || op, trw.table_name);
353
+ END LOOP;
354
+
355
+ END LOOP;
356
+
357
+ /* If newly added listeners on table then CREATE triggers */
358
+ ELSIF TG_OP = 'INSERT' THEN
359
+
360
+
361
+ --RAISE NOTICE 'INSERT trigger_add_remove_func table: % ', ' ' || COALESCE((SELECT concat_ws(' ', string_agg(table_name, ' & '), count(*), min(inserted) ) FROM prostgles.triggers) , ' 0 ');
362
+ --RAISE NOTICE 'INSERT trigger_add_remove_func new_table: % ', '' || COALESCE((SELECT concat_ws(' ', string_agg(table_name, ' & '), count(*), min(inserted) ) FROM new_table), ' 0 ');
363
+
364
+ /* Loop through newly added tables */
365
+ FOR trw IN
366
+
367
+ SELECT DISTINCT table_name
368
+ FROM new_table nt
369
+
370
+ /* Table did not exist prior to this insert */
371
+ WHERE NOT EXISTS (
372
+ SELECT 1
373
+ FROM prostgles.app_triggers t
374
+ WHERE t.table_name = nt.table_name
375
+ AND t.inserted < nt.inserted -- exclude current record (this is an after trigger). Turn into before trigger?
376
+ )
377
+
378
+ /* Table is valid */
379
+ AND EXISTS (
380
+ SELECT 1
381
+ FROM information_schema.tables
382
+ WHERE table_schema = 'public'
383
+ AND table_name = nt.table_name
384
+ )
385
+ LOOP
386
+
387
+ /*
388
+ RAISE NOTICE ' CREATE DATA TRIGGER FOR: % TABLE EXISTS?', trw.table_name, SELECT EXISTS (
389
+ SELECT 1
390
+ FROM information_schema.tables
391
+ WHERE table_schema = 'public'
392
+ AND table_name = nt.table_name
393
+ );
394
+ */
395
+
396
+ query := format(
397
+ $q$
398
+ DROP TRIGGER IF EXISTS %1$I ON %2$I;
399
+ CREATE TRIGGER %1$I
400
+ AFTER INSERT ON %2$I
401
+ REFERENCING NEW TABLE AS new_table
402
+ FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
403
+ COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
404
+ $q$,
405
+ 'prostgles_triggers_' || trw.table_name || '_insert', trw.table_name
406
+ ) || format(
407
+ $q$
408
+ DROP TRIGGER IF EXISTS %1$I ON %2$I;
409
+ CREATE TRIGGER %1$I
410
+ AFTER UPDATE ON %2$I
411
+ REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
412
+ FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
413
+ COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
414
+ $q$,
415
+ 'prostgles_triggers_' || trw.table_name || '_update', trw.table_name
416
+ ) || format(
417
+ $q$
418
+ DROP TRIGGER IF EXISTS %1$I ON %2$I;
419
+ CREATE TRIGGER %1$I
420
+ AFTER DELETE ON %2$I
421
+ REFERENCING OLD TABLE AS old_table
422
+ FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
423
+ COMMENT ON TRIGGER %1$I ON %2$I IS 'Prostgles internal trigger used to notify when data in the table changed';
424
+ $q$,
425
+ 'prostgles_triggers_' || trw.table_name || '_delete', trw.table_name
426
+ );
427
+
428
+ --RAISE NOTICE ' % ', query;
429
+
430
+
431
+ query := format(
432
+ $q$
433
+ DO $e$
434
+ BEGIN
435
+
436
+ IF EXISTS (
437
+ SELECT 1
438
+ FROM information_schema.tables
439
+ WHERE table_schema = 'public'
440
+ AND table_name = %L
441
+ ) THEN
442
+
443
+ %s
444
+
445
+ END IF;
446
+
447
+ END $e$;
448
+ $q$,
449
+ trw.table_name,
450
+ query
451
+ ) ;
452
+
453
+
454
+ EXECUTE query;
455
+
456
+ END LOOP;
457
+
458
+ END IF;
459
+
460
+
461
+ RETURN NULL;
462
+ END;
463
+
464
+ $$ LANGUAGE plpgsql;
465
+ COMMENT ON FUNCTION ${exports.DB_OBJ_NAMES.trigger_add_remove_func} IS 'Used to add/remove table watch triggers concurrently ';
466
+
467
+ DROP TRIGGER IF EXISTS prostgles_triggers_insert ON prostgles.app_triggers;
468
+ CREATE TRIGGER prostgles_triggers_insert
469
+ AFTER INSERT ON prostgles.app_triggers
470
+ REFERENCING NEW TABLE AS new_table
471
+ FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.trigger_add_remove_func}();
472
+
473
+ DROP TRIGGER IF EXISTS prostgles_triggers_delete ON prostgles.app_triggers;
474
+ CREATE TRIGGER prostgles_triggers_delete
475
+ AFTER DELETE ON prostgles.app_triggers
476
+ REFERENCING OLD TABLE AS old_table
477
+ FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.trigger_add_remove_func}();
478
+
479
+
480
+ CREATE OR REPLACE FUNCTION ${exports.DB_OBJ_NAMES.schema_watch_func}() RETURNS event_trigger AS $$
481
+
482
+ DECLARE curr_query TEXT := '';
483
+ DECLARE arw RECORD;
484
+
485
+ BEGIN
486
+
487
+ --RAISE NOTICE 'SCHEMA_WATCH: %', tg_tag;
488
+
489
+ /*
490
+ This event trigger will outlive a prostgles app instance.
491
+ Must ensure it only fires if an app instance is running
492
+ */
493
+ IF
494
+ EXISTS (
495
+ SELECT 1
496
+ FROM information_schema.tables
497
+ WHERE table_schema = 'prostgles'
498
+ AND table_name = 'apps'
499
+ )
500
+ THEN
501
+
502
+ SELECT LEFT(COALESCE(current_query(), ''), 5000)
503
+ INTO curr_query;
504
+
505
+ FOR arw IN
506
+ SELECT * FROM prostgles.apps WHERE watching_schema IS TRUE
507
+
508
+ LOOP
509
+ PERFORM pg_notify(
510
+ ${(0, PubSubManager_1.asValue)(this.NOTIF_CHANNEL.preffix)} || arw.id,
511
+ concat_ws(
512
+ ${(0, PubSubManager_1.asValue)(PubSubManager_1.PubSubManager.DELIMITER)},
513
+ ${(0, PubSubManager_1.asValue)(this.NOTIF_TYPE.schema)}, tg_tag , TG_event, curr_query
514
+ )
515
+ );
516
+ END LOOP;
517
+
518
+ END IF;
519
+
520
+ END;
521
+ $$ LANGUAGE plpgsql;
522
+ COMMENT ON FUNCTION ${exports.DB_OBJ_NAMES.schema_watch_func} IS 'Prostgles internal function used to notify when schema has changed';
523
+
524
+ END IF;
525
+
526
+ END
527
+ $do$;
528
+
529
+
530
+ COMMIT;
531
+ `;
532
+ };
533
+ const res = getQuery();
534
+ return res;
535
+ };
536
+ exports.getInitQuery = getInitQuery;
537
+ //# sourceMappingURL=getInitQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getInitQuery.ts"],"names":[],"mappings":";;;AACA,mDAA8D;AAC9D,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA8BpB,IAAA,uBAAO,EAAC,UAAU,CAAC;2BACxB,IAAA,uBAAO,EAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2B1B,IAAA,uBAAO,EAAC,OAAO,CAAC,KAAK,IAAA,uBAAO,EAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAqFpB,oBAAY,CAAC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCA0GjC,IAAA,uBAAO,EAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;;kCAEjC,IAAA,uBAAO,EAAC,6BAAa,CAAC,SAAS,CAAC;;kCAEhC,IAAA,uBAAO,EAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;;;;;;kCAO7B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAA,CAAC,CAAC,CAAC,sEAAsE,CAAC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;kBAwBxI,uDAAuD;;;;;;;;;;8BAU3C,oBAAY,CAAC,eAAe;;;;qCAIrB,oBAAY,CAAC,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAkFF,oBAAY,CAAC,eAAe;;;;;;;;;;uEAU5B,oBAAY,CAAC,eAAe;;;;;;;;;;uEAU5B,oBAAY,CAAC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BA2CrE,oBAAY,CAAC,uBAAuB;;;;;;+CAMnB,oBAAY,CAAC,uBAAuB;;;;;;+CAMpC,oBAAY,CAAC,uBAAuB;;;qCAG9C,oBAAY,CAAC,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA8BzC,IAAA,uBAAO,EAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;;4BAEjC,IAAA,uBAAO,EAAC,6BAAa,CAAC,SAAS,CAAC;4BAChC,IAAA,uBAAO,EAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;;;;;;;;8BAS7B,oBAAY,CAAC,iBAAiB;;;;;;;;;CAS3D,CAAA;IAAA,CAAC,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;IAEvB,OAAO,GAAG,CAAC;AACb,CAAC,CAAA;AA9gBY,QAAA,YAAY,gBA8gBxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM9D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA4oB/F"}
1
+ {"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/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,CAqH/F"}