prostgles-server 4.2.101 → 4.2.103
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/getPubSubManagerInitQuery.d.ts.map +1 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.js +21 -3
- package/dist/PubSubManager/getPubSubManagerInitQuery.js.map +1 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +0 -104
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/lib/PubSubManager/getPubSubManagerInitQuery.ts +21 -3
- package/lib/PubSubManager/initPubSubManager.ts +0 -124
- package/package.json +1 -1
- package/tests/server/DBoGenerated.d.ts +10 -0
- package/tests/server/package-lock.json +1 -1
- package/tests/server/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPubSubManagerInitQuery.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/getPubSubManagerInitQuery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsC,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpF,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;
|
|
1
|
+
{"version":3,"file":"getPubSubManagerInitQuery.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/getPubSubManagerInitQuery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAsC,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpF,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAmmBX;;;GAGG;AACH,eAAO,MAAM,yBAAyB,SAAwB,aAAa,KAAG,QAAQ,MAAM,GAAG,SAAS,CAoBvG,CAAA"}
|
|
@@ -147,6 +147,22 @@ BEGIN
|
|
|
147
147
|
END;
|
|
148
148
|
$$ LANGUAGE plpgsql;
|
|
149
149
|
COMMENT ON FUNCTION prostgles."user" IS 'Used for row level security';
|
|
150
|
+
|
|
151
|
+
CREATE OR REPLACE FUNCTION prostgles.user_id()
|
|
152
|
+
RETURNS UUID AS $$
|
|
153
|
+
BEGIN
|
|
154
|
+
RETURN prostgles.user('id')::UUID;
|
|
155
|
+
END;
|
|
156
|
+
$$ LANGUAGE plpgsql;
|
|
157
|
+
COMMENT ON FUNCTION prostgles.user_id IS 'Session user id';
|
|
158
|
+
|
|
159
|
+
CREATE OR REPLACE FUNCTION prostgles.user_type()
|
|
160
|
+
RETURNS TEXT AS $$
|
|
161
|
+
BEGIN
|
|
162
|
+
RETURN prostgles.user('type')::TEXT;
|
|
163
|
+
END;
|
|
164
|
+
$$ LANGUAGE plpgsql;
|
|
165
|
+
COMMENT ON FUNCTION prostgles.user_type IS 'Session user type';
|
|
150
166
|
|
|
151
167
|
CREATE TABLE IF NOT EXISTS prostgles.apps (
|
|
152
168
|
id TEXT PRIMARY KEY DEFAULT prostgles.random_string(),
|
|
@@ -443,7 +459,9 @@ BEGIN
|
|
|
443
459
|
AFTER INSERT ON %2$s
|
|
444
460
|
REFERENCING NEW TABLE AS new_table
|
|
445
461
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
446
|
-
|
|
462
|
+
/* removed to allow less privileges for a user to create subscriptions
|
|
463
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
464
|
+
*/
|
|
447
465
|
$q$,
|
|
448
466
|
'prostgles_triggers_' || trw.table_name || '_insert', trw.table_name
|
|
449
467
|
) || format(
|
|
@@ -453,7 +471,7 @@ BEGIN
|
|
|
453
471
|
AFTER UPDATE ON %2$s
|
|
454
472
|
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
|
|
455
473
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
456
|
-
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
474
|
+
--COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
457
475
|
$q$,
|
|
458
476
|
'prostgles_triggers_' || trw.table_name || '_update', trw.table_name
|
|
459
477
|
) || format(
|
|
@@ -463,7 +481,7 @@ BEGIN
|
|
|
463
481
|
AFTER DELETE ON %2$s
|
|
464
482
|
REFERENCING OLD TABLE AS old_table
|
|
465
483
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${exports.DB_OBJ_NAMES.data_watch_func}();
|
|
466
|
-
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
484
|
+
--COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
467
485
|
$q$,
|
|
468
486
|
'prostgles_triggers_' || trw.table_name || '_delete', trw.table_name
|
|
469
487
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getPubSubManagerInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getPubSubManagerInitQuery.ts"],"names":[],"mappings":";;;AACA,qDAA2C;AAC3C,mEAAoD;AACpD,mDAAoF;AACpF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAClD,6DAAwD;AAE3C,QAAA,YAAY,GAAG;IAC1B,uBAAuB,EAAE,mCAAmC;IAC5D,eAAe,EAAE,sCAAsC;IACvD,iBAAiB,EAAE,6BAA6B;IAChD,oBAAoB,EAAE,oCAAoC;IAC1D,yBAAyB,EAAE,yCAAyC;CAC5D,CAAC;AAEX,MAAM,6BAA6B,GAAG;;;;;;CAMrC,CAAC;AACF,MAAM,iCAAiC,GAAG;;;;;;CAMzC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,SAA8B,EAAE,EAAE,CAAC;;;;;;IAMrD,6BAAa,CAAC,kCAAkC;;;;;;;;;;;;;;YAcxC,6BAA6B;;;;;;;YAO7B,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4B5B,IAAA,uBAAO,EAAC,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"getPubSubManagerInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getPubSubManagerInitQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,aAAa,EAAW,MAAM,iBAAiB,CAAC;AAExE,eAAO,MAAM,4BAA4B,oEAA8E,CAAC;AAExH,eAAO,MAAM,IAAI,OAAQ,MAAM,qBAA4C,CAAC;AAE5E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,aAAa,EAAW,MAAM,iBAAiB,CAAC;AAExE,eAAO,MAAM,4BAA4B,oEAA8E,CAAC;AAExH,eAAO,MAAM,IAAI,OAAQ,MAAM,qBAA4C,CAAC;AAE5E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA0E/F"}
|
|
@@ -64,110 +64,6 @@ async function initPubSubManager() {
|
|
|
64
64
|
DELETE FROM prostgles.app_triggers
|
|
65
65
|
WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appId)}
|
|
66
66
|
`);
|
|
67
|
-
// console.log("REMOVE app check disabled");
|
|
68
|
-
// if (!this.appCheck && Math.random() > 12) {
|
|
69
|
-
// this.appCheck = setInterval(async () => {
|
|
70
|
-
// let checkForStaleTriggers = "";
|
|
71
|
-
// try {
|
|
72
|
-
// this.appChecking = true;
|
|
73
|
-
// const listeners = this.getActiveListeners();
|
|
74
|
-
// const updateCurrentlyUsedTriggersQuery = !listeners.length? "" : `
|
|
75
|
-
// UPDATE prostgles.app_triggers
|
|
76
|
-
// SET last_used = CASE WHEN (table_name, condition) IN (
|
|
77
|
-
// ${listeners.map(l => ` ( ${asValue(l.table_name)}, ${asValue(l.condition)} ) `).join(", ")}
|
|
78
|
-
// ) THEN NOW() ELSE last_used END
|
|
79
|
-
// WHERE app_id = ${asValue(this.appId)};
|
|
80
|
-
// `;
|
|
81
|
-
// const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
|
|
82
|
-
// let dataTriggerCheckQuery = "";
|
|
83
|
-
// if(this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()){
|
|
84
|
-
// this.checkedListenerTableCond = checkedListenerTableCond;
|
|
85
|
-
// dataTriggerCheckQuery = `
|
|
86
|
-
// /* Delete unused triggers. Might deadlock */
|
|
87
|
-
// IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
|
|
88
|
-
// THEN
|
|
89
|
-
// /* TODO: Fixed deadlocks */
|
|
90
|
-
// --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
|
|
91
|
-
// /* UPDATE currently used triggers */
|
|
92
|
-
// ${updateCurrentlyUsedTriggersQuery}
|
|
93
|
-
// /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
|
|
94
|
-
// DELETE FROM prostgles.app_triggers
|
|
95
|
-
// WHERE app_id = ${asValue(this.appId)}
|
|
96
|
-
// AND last_used < NOW() - 4 * ${asValue(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
|
|
97
|
-
// */
|
|
98
|
-
// END IF;
|
|
99
|
-
// `
|
|
100
|
-
// }
|
|
101
|
-
// const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected"
|
|
102
|
-
// checkForStaleTriggers = `
|
|
103
|
-
// DO $$
|
|
104
|
-
// BEGIN
|
|
105
|
-
// /*
|
|
106
|
-
// ${queryIdentifier}
|
|
107
|
-
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
108
|
-
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
109
|
-
// */
|
|
110
|
-
// /* prostgles schema must exist */
|
|
111
|
-
// IF
|
|
112
|
-
// EXISTS (
|
|
113
|
-
// SELECT 1
|
|
114
|
-
// FROM information_schema.tables
|
|
115
|
-
// WHERE table_schema = 'prostgles'
|
|
116
|
-
// AND table_name = 'apps'
|
|
117
|
-
// )
|
|
118
|
-
// THEN
|
|
119
|
-
// /* Last check used to remove disconnected apps */
|
|
120
|
-
// UPDATE prostgles.apps
|
|
121
|
-
// SET last_check = NOW()
|
|
122
|
-
// WHERE id = ${asValue(this.appId)};
|
|
123
|
-
// ${dataTriggerCheckQuery}
|
|
124
|
-
// END IF;
|
|
125
|
-
// END $$;`
|
|
126
|
-
// const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS/2));
|
|
127
|
-
// const timeout = setTimeout(() => {
|
|
128
|
-
// this.db.any(`
|
|
129
|
-
// /*
|
|
130
|
-
// ${queryIdentifier}
|
|
131
|
-
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
132
|
-
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
133
|
-
// */
|
|
134
|
-
// DO $$
|
|
135
|
-
// BEGIN
|
|
136
|
-
// /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
|
|
137
|
-
// PERFORM pg_cancel_backend(pid)
|
|
138
|
-
// FROM pg_catalog.pg_stat_activity
|
|
139
|
-
// WHERE pid <> pg_backend_pid()
|
|
140
|
-
// AND query = \${queryIdentifier};
|
|
141
|
-
// END $$;
|
|
142
|
-
// `, { queryTimeoutMillis, queryIdentifier })
|
|
143
|
-
// }, queryTimeoutMillis);
|
|
144
|
-
// await this.db.any(checkForStaleTriggers);
|
|
145
|
-
// clearTimeout(timeout);
|
|
146
|
-
// tries = 5;
|
|
147
|
-
// log("updated last_check");
|
|
148
|
-
// } catch (e: any) {
|
|
149
|
-
// tries --;
|
|
150
|
-
// /** In some cases a query idles and blocks everything else. Terminate all similar queries */
|
|
151
|
-
// this.db.any(
|
|
152
|
-
// "SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
|
|
153
|
-
// WHERE query ilike ${qid} \
|
|
154
|
-
// AND pid <> pg_backend_pid();",
|
|
155
|
-
// { qid: `%${REALTIME_TRIGGER_CHECK_QUERY}%` }
|
|
156
|
-
// );
|
|
157
|
-
// /** If no tries left
|
|
158
|
-
// * OR
|
|
159
|
-
// * If this database was dropped
|
|
160
|
-
// *
|
|
161
|
-
// * then stop interval
|
|
162
|
-
// * */
|
|
163
|
-
// if(tries <= 0 || e?.code === "3D000"){ // && e.message.includes(this.db.$cn.database)
|
|
164
|
-
// clearInterval(this.appCheck);
|
|
165
|
-
// }
|
|
166
|
-
// console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
167
|
-
// }
|
|
168
|
-
// this.appChecking = false;
|
|
169
|
-
// }, 0.8 * this.appCheckFrequencyMS);
|
|
170
|
-
// }
|
|
171
67
|
}
|
|
172
68
|
this.postgresNotifListenManager = new PostgresNotifListenManager_1.PostgresNotifListenManager(this.db, this.notifListener, PubSubManager_1.NOTIF_CHANNEL.getFull(this.appId));
|
|
173
69
|
await this.initialiseEventTriggers();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.js","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":";;;AAAA,qDAAsD;AACtD,8EAA2E;AAC3E,gFAA6E;AAC7E,mDAAwE;AACxE,2EAAwE;AAC3D,QAAA,4BAA4B,GAAG,kEAA2E,CAAC;AAEjH,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AAA/D,QAAA,IAAI,QAA2D;AAErE,KAAK,UAAU,iBAAiB;IACrC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO,SAAS,CAAC;IAE7C,IAAI,CAAC;QAEH,MAAM,SAAS,GAAG,MAAM,qDAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAE/D;;;UAGE;QACF,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAU,CAAC;QACf,OAAO,IAAA,2BAAS,EAAC,SAAS,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,iGAAiG;gBACjG,MAAM,IAAA,YAAI,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAE1B,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC7B,KAAK,GAAG,SAAS,CAAC;gBAClB,KAAK,GAAG,CAAC,CAAC;YACZ,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAG,CAAC,WAAW,IAAI,IAAA,0BAAQ,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAC,CAAC;oBACpD,WAAW,GAAG,IAAI,CAAC;oBACnB,KAAK,GAAG,CAAC,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;gBAClD,CAAC;gBACD,KAAK,GAAG,CAAC,CAAC;gBACV,KAAK,EAAG,CAAC;YACX,CAAC;QACH,CAAC;QACD,IAAG,KAAK,EAAC,CAAC;YACR,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO;QAEnC,oBAAoB;QACpB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,MAAM,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC;YACpD,MAAM,yBAAyB,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAA,6CAAqB,EAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9K,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACf;;sBAEc,EACZ;gBACA,IAAI,CAAC,KAAK;gBACV,kBAAkB;gBAClB,yBAAyB;aAC1B,CACF,CAAC;YAEF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,4CAA4C,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAChG,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,+EAA+E,IAAI,CAAC,KAAK,aAAa,CAAC;YAC/G,CAAC;YAED,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;;yBAEC,IAAA,uBAAO,EAAC,IAAI,CAAC,KAAK,CAAC;OACrC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"initPubSubManager.js","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -148,6 +148,22 @@ BEGIN
|
|
|
148
148
|
END;
|
|
149
149
|
$$ LANGUAGE plpgsql;
|
|
150
150
|
COMMENT ON FUNCTION prostgles."user" IS 'Used for row level security';
|
|
151
|
+
|
|
152
|
+
CREATE OR REPLACE FUNCTION prostgles.user_id()
|
|
153
|
+
RETURNS UUID AS $$
|
|
154
|
+
BEGIN
|
|
155
|
+
RETURN prostgles.user('id')::UUID;
|
|
156
|
+
END;
|
|
157
|
+
$$ LANGUAGE plpgsql;
|
|
158
|
+
COMMENT ON FUNCTION prostgles.user_id IS 'Session user id';
|
|
159
|
+
|
|
160
|
+
CREATE OR REPLACE FUNCTION prostgles.user_type()
|
|
161
|
+
RETURNS TEXT AS $$
|
|
162
|
+
BEGIN
|
|
163
|
+
RETURN prostgles.user('type')::TEXT;
|
|
164
|
+
END;
|
|
165
|
+
$$ LANGUAGE plpgsql;
|
|
166
|
+
COMMENT ON FUNCTION prostgles.user_type IS 'Session user type';
|
|
151
167
|
|
|
152
168
|
CREATE TABLE IF NOT EXISTS prostgles.apps (
|
|
153
169
|
id TEXT PRIMARY KEY DEFAULT prostgles.random_string(),
|
|
@@ -444,7 +460,9 @@ BEGIN
|
|
|
444
460
|
AFTER INSERT ON %2$s
|
|
445
461
|
REFERENCING NEW TABLE AS new_table
|
|
446
462
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
447
|
-
|
|
463
|
+
/* removed to allow less privileges for a user to create subscriptions
|
|
464
|
+
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
465
|
+
*/
|
|
448
466
|
$q$,
|
|
449
467
|
'prostgles_triggers_' || trw.table_name || '_insert', trw.table_name
|
|
450
468
|
) || format(
|
|
@@ -454,7 +472,7 @@ BEGIN
|
|
|
454
472
|
AFTER UPDATE ON %2$s
|
|
455
473
|
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
|
|
456
474
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
457
|
-
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
475
|
+
--COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
458
476
|
$q$,
|
|
459
477
|
'prostgles_triggers_' || trw.table_name || '_update', trw.table_name
|
|
460
478
|
) || format(
|
|
@@ -464,7 +482,7 @@ BEGIN
|
|
|
464
482
|
AFTER DELETE ON %2$s
|
|
465
483
|
REFERENCING OLD TABLE AS old_table
|
|
466
484
|
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
467
|
-
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
485
|
+
--COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
468
486
|
$q$,
|
|
469
487
|
'prostgles_triggers_' || trw.table_name || '_delete', trw.table_name
|
|
470
488
|
);
|
|
@@ -70,130 +70,6 @@ export async function initPubSubManager(this: PubSubManager): Promise<PubSubMana
|
|
|
70
70
|
DELETE FROM prostgles.app_triggers
|
|
71
71
|
WHERE app_id = ${asValue(this.appId)}
|
|
72
72
|
`);
|
|
73
|
-
|
|
74
|
-
// console.log("REMOVE app check disabled");
|
|
75
|
-
// if (!this.appCheck && Math.random() > 12) {
|
|
76
|
-
|
|
77
|
-
// this.appCheck = setInterval(async () => {
|
|
78
|
-
// let checkForStaleTriggers = "";
|
|
79
|
-
// try {
|
|
80
|
-
|
|
81
|
-
// this.appChecking = true;
|
|
82
|
-
|
|
83
|
-
// const listeners = this.getActiveListeners();
|
|
84
|
-
// const updateCurrentlyUsedTriggersQuery = !listeners.length? "" : `
|
|
85
|
-
// UPDATE prostgles.app_triggers
|
|
86
|
-
// SET last_used = CASE WHEN (table_name, condition) IN (
|
|
87
|
-
// ${listeners.map(l => ` ( ${asValue(l.table_name)}, ${asValue(l.condition)} ) `).join(", ")}
|
|
88
|
-
// ) THEN NOW() ELSE last_used END
|
|
89
|
-
// WHERE app_id = ${asValue(this.appId)};
|
|
90
|
-
// `;
|
|
91
|
-
|
|
92
|
-
// const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
|
|
93
|
-
// let dataTriggerCheckQuery = "";
|
|
94
|
-
// if(this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()){
|
|
95
|
-
// this.checkedListenerTableCond = checkedListenerTableCond;
|
|
96
|
-
// dataTriggerCheckQuery = `
|
|
97
|
-
// /* Delete unused triggers. Might deadlock */
|
|
98
|
-
// IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
|
|
99
|
-
|
|
100
|
-
// THEN
|
|
101
|
-
|
|
102
|
-
// /* TODO: Fixed deadlocks */
|
|
103
|
-
// --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
|
|
104
|
-
|
|
105
|
-
// /* UPDATE currently used triggers */
|
|
106
|
-
// ${updateCurrentlyUsedTriggersQuery}
|
|
107
|
-
|
|
108
|
-
// /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
|
|
109
|
-
// DELETE FROM prostgles.app_triggers
|
|
110
|
-
// WHERE app_id = ${asValue(this.appId)}
|
|
111
|
-
// AND last_used < NOW() - 4 * ${asValue(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
|
|
112
|
-
// */
|
|
113
|
-
|
|
114
|
-
// END IF;
|
|
115
|
-
|
|
116
|
-
// `
|
|
117
|
-
// }
|
|
118
|
-
|
|
119
|
-
// const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected"
|
|
120
|
-
// checkForStaleTriggers = `
|
|
121
|
-
// DO $$
|
|
122
|
-
// BEGIN
|
|
123
|
-
// /*
|
|
124
|
-
// ${queryIdentifier}
|
|
125
|
-
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
126
|
-
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
127
|
-
// */
|
|
128
|
-
// /* prostgles schema must exist */
|
|
129
|
-
// IF
|
|
130
|
-
// EXISTS (
|
|
131
|
-
// SELECT 1
|
|
132
|
-
// FROM information_schema.tables
|
|
133
|
-
// WHERE table_schema = 'prostgles'
|
|
134
|
-
// AND table_name = 'apps'
|
|
135
|
-
// )
|
|
136
|
-
// THEN
|
|
137
|
-
|
|
138
|
-
// /* Last check used to remove disconnected apps */
|
|
139
|
-
// UPDATE prostgles.apps
|
|
140
|
-
// SET last_check = NOW()
|
|
141
|
-
// WHERE id = ${asValue(this.appId)};
|
|
142
|
-
|
|
143
|
-
// ${dataTriggerCheckQuery}
|
|
144
|
-
// END IF;
|
|
145
|
-
|
|
146
|
-
// END $$;`
|
|
147
|
-
|
|
148
|
-
// const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS/2));
|
|
149
|
-
// const timeout = setTimeout(() => {
|
|
150
|
-
// this.db.any(`
|
|
151
|
-
// /*
|
|
152
|
-
// ${queryIdentifier}
|
|
153
|
-
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
154
|
-
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
155
|
-
// */
|
|
156
|
-
// DO $$
|
|
157
|
-
// BEGIN
|
|
158
|
-
// /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
|
|
159
|
-
// PERFORM pg_cancel_backend(pid)
|
|
160
|
-
// FROM pg_catalog.pg_stat_activity
|
|
161
|
-
// WHERE pid <> pg_backend_pid()
|
|
162
|
-
// AND query = \${queryIdentifier};
|
|
163
|
-
// END $$;
|
|
164
|
-
// `, { queryTimeoutMillis, queryIdentifier })
|
|
165
|
-
// }, queryTimeoutMillis);
|
|
166
|
-
// await this.db.any(checkForStaleTriggers);
|
|
167
|
-
// clearTimeout(timeout);
|
|
168
|
-
|
|
169
|
-
// tries = 5;
|
|
170
|
-
// log("updated last_check");
|
|
171
|
-
// } catch (e: any) {
|
|
172
|
-
// tries --;
|
|
173
|
-
|
|
174
|
-
// /** In some cases a query idles and blocks everything else. Terminate all similar queries */
|
|
175
|
-
// this.db.any(
|
|
176
|
-
// "SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
|
|
177
|
-
// WHERE query ilike ${qid} \
|
|
178
|
-
// AND pid <> pg_backend_pid();",
|
|
179
|
-
// { qid: `%${REALTIME_TRIGGER_CHECK_QUERY}%` }
|
|
180
|
-
// );
|
|
181
|
-
|
|
182
|
-
// /** If no tries left
|
|
183
|
-
// * OR
|
|
184
|
-
// * If this database was dropped
|
|
185
|
-
// *
|
|
186
|
-
// * then stop interval
|
|
187
|
-
// * */
|
|
188
|
-
// if(tries <= 0 || e?.code === "3D000"){ // && e.message.includes(this.db.$cn.database)
|
|
189
|
-
// clearInterval(this.appCheck);
|
|
190
|
-
// }
|
|
191
|
-
// console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
192
|
-
// }
|
|
193
|
-
|
|
194
|
-
// this.appChecking = false;
|
|
195
|
-
// }, 0.8 * this.appCheckFrequencyMS);
|
|
196
|
-
// }
|
|
197
73
|
}
|
|
198
74
|
|
|
199
75
|
this.postgresNotifListenManager = new PostgresNotifListenManager(this.db, this.notifListener, NOTIF_CHANNEL.getFull(this.appId));
|
package/package.json
CHANGED
|
@@ -257,6 +257,16 @@ export type DBSchemaGenerated = {
|
|
|
257
257
|
id: string;
|
|
258
258
|
};
|
|
259
259
|
};
|
|
260
|
+
newly_created_table: {
|
|
261
|
+
is_view: false;
|
|
262
|
+
select: true;
|
|
263
|
+
insert: true;
|
|
264
|
+
update: true;
|
|
265
|
+
delete: true;
|
|
266
|
+
columns: {
|
|
267
|
+
id?: null | number;
|
|
268
|
+
};
|
|
269
|
+
};
|
|
260
270
|
obj_table: {
|
|
261
271
|
is_view: false;
|
|
262
272
|
select: true;
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
"start": "tsc-watch --onSuccess \"node dist/server/index.js\"",
|
|
8
8
|
"dev": "NOSTOP=true npm start",
|
|
9
9
|
"build": "rm -rf ./node_modules/* && rm -rf ./media/* && rm -rf ./dist/* && npm i && tsc",
|
|
10
|
-
"test-server": "TEST_TYPE=server node --trace-uncaught --test
|
|
11
|
-
"test-client": "TEST_TYPE=client node --trace-uncaught --test
|
|
10
|
+
"test-server": "TEST_TYPE=server node --trace-uncaught --test dist/server/index.js ",
|
|
11
|
+
"test-client": "TEST_TYPE=client node --trace-uncaught --test dist/server/index.js "
|
|
12
12
|
},
|
|
13
13
|
"author": "",
|
|
14
14
|
"license": "ISC",
|