prostgles-server 4.2.296 → 4.2.298
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/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +5 -3
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/update.js +2 -2
- package/dist/DboBuilder/TableHandler/update.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getValidatedSubscribeOptions.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getValidatedSubscribeOptions.js +3 -1
- package/dist/DboBuilder/ViewHandler/getValidatedSubscribeOptions.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.js +4 -3
- package/dist/DboBuilder/ViewHandler/subscribe.js.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.js +5 -5
- package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts +6 -13
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +2 -2
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/dist/PubSubManager/addSub.d.ts.map +1 -1
- package/dist/PubSubManager/addSub.js +7 -7
- package/dist/PubSubManager/addSub.js.map +1 -1
- package/dist/PubSubManager/addSync.d.ts.map +1 -1
- package/dist/PubSubManager/addSync.js +1 -1
- package/dist/PubSubManager/addSync.js.map +1 -1
- package/dist/PubSubManager/addTrigger.d.ts +4 -2
- package/dist/PubSubManager/addTrigger.d.ts.map +1 -1
- package/dist/PubSubManager/addTrigger.js +55 -3
- package/dist/PubSubManager/addTrigger.js.map +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js.map +1 -1
- package/dist/PubSubManager/init/getDataWatchFunctionQuery.d.ts +5 -0
- package/dist/PubSubManager/init/getDataWatchFunctionQuery.d.ts.map +1 -1
- package/dist/PubSubManager/init/getDataWatchFunctionQuery.js +80 -51
- package/dist/PubSubManager/init/getDataWatchFunctionQuery.js.map +1 -1
- package/dist/PubSubManager/{getPubSubManagerInitQuery.d.ts → init/getPubSubManagerInitQuery.d.ts} +1 -1
- package/dist/PubSubManager/init/getPubSubManagerInitQuery.d.ts.map +1 -0
- package/dist/PubSubManager/{getPubSubManagerInitQuery.js → init/getPubSubManagerInitQuery.js} +22 -19
- package/dist/PubSubManager/init/getPubSubManagerInitQuery.js.map +1 -0
- package/dist/PubSubManager/{initPubSubManager.d.ts → init/initPubSubManager.d.ts} +1 -1
- package/dist/PubSubManager/init/initPubSubManager.d.ts.map +1 -0
- package/dist/PubSubManager/{initPubSubManager.js → init/initPubSubManager.js} +3 -3
- package/dist/PubSubManager/init/initPubSubManager.js.map +1 -0
- package/dist/PubSubManager/initialiseEventTriggers.js +1 -1
- package/dist/PubSubManager/initialiseEventTriggers.js.map +1 -1
- package/dist/PubSubManager/notifListener.d.ts.map +1 -1
- package/dist/PubSubManager/notifListener.js +15 -15
- package/dist/PubSubManager/notifListener.js.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.js +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.js.map +1 -1
- package/dist/TableConfig/runSQLFile.d.ts +3 -0
- package/dist/TableConfig/runSQLFile.d.ts.map +1 -1
- package/dist/TableConfig/runSQLFile.js +11 -1
- package/dist/TableConfig/runSQLFile.js.map +1 -1
- package/lib/DboBuilder/DboBuilder.ts +13 -3
- package/lib/DboBuilder/TableHandler/update.ts +2 -3
- package/lib/DboBuilder/ViewHandler/getValidatedSubscribeOptions.ts +9 -1
- package/lib/DboBuilder/ViewHandler/subscribe.ts +5 -3
- package/lib/DboBuilder/getSubscribeRelatedTables.ts +8 -5
- package/lib/PubSubManager/PubSubManager.ts +7 -12
- package/lib/PubSubManager/addSub.ts +10 -9
- package/lib/PubSubManager/addSync.ts +5 -1
- package/lib/PubSubManager/addTrigger.ts +77 -6
- package/lib/PubSubManager/getCreatePubSubManagerError.ts +1 -1
- package/lib/PubSubManager/init/getDataWatchFunctionQuery.ts +80 -50
- package/lib/PubSubManager/{getPubSubManagerInitQuery.ts → init/getPubSubManagerInitQuery.ts} +23 -20
- package/lib/PubSubManager/{initPubSubManager.ts → init/initPubSubManager.ts} +4 -4
- package/lib/PubSubManager/initialiseEventTriggers.ts +1 -1
- package/lib/PubSubManager/notifListener.ts +19 -28
- package/lib/PubSubManager/orphanTriggerCheck.ts +1 -1
- package/lib/TableConfig/runSQLFile.ts +19 -2
- package/package.json +2 -2
- package/dist/PubSubManager/getPubSubManagerInitQuery.d.ts.map +0 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.js.map +0 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +0 -1
- package/dist/PubSubManager/initPubSubManager.js.map +0 -1
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import { DB_OBJ_NAMES } from "
|
|
1
|
+
import { DB_OBJ_NAMES } from "./getPubSubManagerInitQuery";
|
|
2
2
|
import { getAppCheckQuery } from "../orphanTriggerCheck";
|
|
3
3
|
import { asValue, DELIMITER, NOTIF_CHANNEL, NOTIF_TYPE } from "../PubSubManagerUtils";
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Error:
|
|
7
|
+
* could not identify an equality operator for type json', code: '42883'
|
|
8
|
+
*/
|
|
9
|
+
export const udtNamesWithoutEqualityComparison = ["json", "xml"];
|
|
5
10
|
export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
6
11
|
return `
|
|
7
12
|
|
|
@@ -11,7 +16,7 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
|
11
16
|
DECLARE t_ids TEXT[];
|
|
12
17
|
DECLARE c_ids INTEGER[];
|
|
13
18
|
DECLARE err_c_ids INTEGER[];
|
|
14
|
-
DECLARE
|
|
19
|
+
DECLARE condition_checks_union_query TEXT := '';
|
|
15
20
|
DECLARE query TEXT := '';
|
|
16
21
|
DECLARE v_trigger RECORD;
|
|
17
22
|
DECLARE has_errors BOOLEAN := FALSE;
|
|
@@ -23,38 +28,15 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
|
23
28
|
DECLARE view_def_query TEXT := '';
|
|
24
29
|
|
|
25
30
|
DECLARE escaped_table TEXT;
|
|
31
|
+
|
|
32
|
+
DECLARE _columns_info JSONB := NULL;
|
|
26
33
|
|
|
27
|
-
DECLARE changed_columns
|
|
28
|
-
|
|
34
|
+
DECLARE changed_columns _TEXT := NULL;
|
|
29
35
|
BEGIN
|
|
30
|
-
|
|
31
|
-
--PERFORM pg_notify('debug', concat_ws(' ', 'TABLE', TG_TABLE_NAME, TG_OP));
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-- Determine changed columns for UPDATE operations
|
|
35
|
-
IF TG_OP = 'UPDATE' THEN
|
|
36
|
-
WITH cols AS (
|
|
37
|
-
SELECT column_name::text
|
|
38
|
-
FROM information_schema.columns
|
|
39
|
-
WHERE table_schema = TG_TABLE_SCHEMA
|
|
40
|
-
AND table_name = TG_TABLE_NAME
|
|
41
|
-
),
|
|
42
|
-
changed AS (
|
|
43
|
-
SELECT column_name
|
|
44
|
-
FROM cols
|
|
45
|
-
WHERE EXISTS (
|
|
46
|
-
SELECT 1 FROM new_table n
|
|
47
|
-
JOIN old_table o ON TRUE
|
|
48
|
-
WHERE n.* IS DISTINCT FROM o.*
|
|
49
|
-
LIMIT 1
|
|
50
|
-
)
|
|
51
|
-
)
|
|
52
|
-
SELECT string_agg(column_name, ',') INTO changed_columns
|
|
53
|
-
FROM changed;
|
|
54
|
-
END IF;
|
|
55
|
-
|
|
56
|
-
|
|
36
|
+
|
|
57
37
|
escaped_table := concat_ws('.', CASE WHEN TG_TABLE_SCHEMA <> CURRENT_SCHEMA THEN format('%I', TG_TABLE_SCHEMA) END, format('%I', TG_TABLE_NAME));
|
|
38
|
+
|
|
39
|
+
${CHANGED_COLUMNS_CHECK}
|
|
58
40
|
|
|
59
41
|
SELECT string_agg(
|
|
60
42
|
format(
|
|
@@ -63,7 +45,7 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
|
63
45
|
SELECT 1
|
|
64
46
|
FROM %s
|
|
65
47
|
WHERE %s
|
|
66
|
-
) THEN %s::text END AS
|
|
48
|
+
) THEN %s::text END AS t_id
|
|
67
49
|
$c$,
|
|
68
50
|
table_name,
|
|
69
51
|
condition,
|
|
@@ -71,13 +53,13 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
|
71
53
|
),
|
|
72
54
|
E' UNION \n '
|
|
73
55
|
)
|
|
74
|
-
INTO
|
|
56
|
+
INTO condition_checks_union_query
|
|
75
57
|
FROM prostgles.v_triggers
|
|
76
58
|
WHERE table_name = escaped_table;
|
|
77
59
|
|
|
78
60
|
|
|
79
|
-
/*
|
|
80
|
-
IF
|
|
61
|
+
/* condition_checks_union_query = 'old_table union new_table' or any one of the tables */
|
|
62
|
+
IF condition_checks_union_query IS NOT NULL THEN
|
|
81
63
|
|
|
82
64
|
SELECT
|
|
83
65
|
format(
|
|
@@ -103,33 +85,31 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
|
103
85
|
||
|
|
104
86
|
format(
|
|
105
87
|
$c$
|
|
106
|
-
SELECT ARRAY_AGG(DISTINCT t.
|
|
88
|
+
SELECT ARRAY_AGG(DISTINCT t.t_id)
|
|
107
89
|
FROM (
|
|
108
90
|
%s
|
|
109
91
|
) t
|
|
110
92
|
$c$,
|
|
111
|
-
|
|
93
|
+
condition_checks_union_query
|
|
112
94
|
)
|
|
113
95
|
INTO query;
|
|
114
96
|
|
|
115
|
-
BEGIN
|
|
116
|
-
EXECUTE query INTO t_ids;
|
|
117
|
-
|
|
118
|
-
--RAISE NOTICE 'trigger fired ok';
|
|
97
|
+
BEGIN
|
|
98
|
+
EXECUTE query INTO t_ids;
|
|
119
99
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
100
|
+
EXCEPTION WHEN OTHERS THEN
|
|
101
|
+
|
|
102
|
+
has_errors := TRUE;
|
|
123
103
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
104
|
+
GET STACKED DIAGNOSTICS
|
|
105
|
+
err_text = MESSAGE_TEXT,
|
|
106
|
+
err_detail = PG_EXCEPTION_DETAIL,
|
|
107
|
+
err_hint = PG_EXCEPTION_HINT;
|
|
128
108
|
|
|
129
109
|
END;
|
|
130
110
|
|
|
131
111
|
--RAISE NOTICE 'has_errors: % ', has_errors;
|
|
132
|
-
--RAISE NOTICE '
|
|
112
|
+
--RAISE NOTICE 'condition_checks_union_query: % , cids: %', condition_checks_union_query, c_ids;
|
|
133
113
|
|
|
134
114
|
IF (t_ids IS NOT NULL OR has_errors) THEN
|
|
135
115
|
|
|
@@ -153,7 +133,7 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
|
153
133
|
THEN concat_ws('; ', 'error', err_text, err_detail, err_hint, 'query: ' || query )
|
|
154
134
|
ELSE COALESCE(v_trigger.cids, '')
|
|
155
135
|
END,
|
|
156
|
-
COALESCE(changed_columns, '')
|
|
136
|
+
COALESCE(changed_columns::TEXT, '')
|
|
157
137
|
${debugMode ? ", COALESCE(current_query(), 'current_query ??'), ' ', query" : ""}
|
|
158
138
|
), 7999/4) -- Some chars are 2bytes -> 'Ω'
|
|
159
139
|
);
|
|
@@ -181,3 +161,53 @@ export const getDataWatchFunctionQuery = (debugMode: boolean | undefined) => {
|
|
|
181
161
|
|
|
182
162
|
`;
|
|
183
163
|
};
|
|
164
|
+
|
|
165
|
+
const CHANGED_COLUMNS_CHECK = `
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
-- Determine changed columns for UPDATE operations
|
|
169
|
+
IF TG_OP = 'UPDATE' THEN
|
|
170
|
+
|
|
171
|
+
SELECT columns_info
|
|
172
|
+
INTO _columns_info
|
|
173
|
+
FROM prostgles.v_triggers
|
|
174
|
+
WHERE table_name = escaped_table
|
|
175
|
+
AND columns_info IS NOT NULL;
|
|
176
|
+
|
|
177
|
+
IF _columns_info IS NOT NULL THEN
|
|
178
|
+
query := format(
|
|
179
|
+
$c$
|
|
180
|
+
WITH changed AS (
|
|
181
|
+
SELECT column_name
|
|
182
|
+
FROM jsonb_object_keys(%L) as column_name
|
|
183
|
+
WHERE EXISTS (
|
|
184
|
+
SELECT 1
|
|
185
|
+
FROM old_table o
|
|
186
|
+
LEFT JOIN new_table n
|
|
187
|
+
ON %s
|
|
188
|
+
WHERE %s
|
|
189
|
+
)
|
|
190
|
+
)
|
|
191
|
+
SELECT array_agg(column_name)
|
|
192
|
+
FROM changed;
|
|
193
|
+
$c$,
|
|
194
|
+
_columns_info->>'tracked_columns',
|
|
195
|
+
_columns_info->>'join_condition',
|
|
196
|
+
_columns_info->>'where_statement'
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
BEGIN
|
|
200
|
+
EXECUTE query INTO changed_columns;
|
|
201
|
+
END;
|
|
202
|
+
|
|
203
|
+
/* It is possible to get no changes */
|
|
204
|
+
changed_columns := COALESCE(changed_columns, '{}');
|
|
205
|
+
|
|
206
|
+
IF NOT starts_with(changed_columns::TEXT, '{') THEN
|
|
207
|
+
RAISE EXCEPTION 'changed_columns is not a JSON array: %', changed_columns;
|
|
208
|
+
END IF;
|
|
209
|
+
|
|
210
|
+
END IF;
|
|
211
|
+
END IF;
|
|
212
|
+
|
|
213
|
+
`;
|
package/lib/PubSubManager/{getPubSubManagerInitQuery.ts → init/getPubSubManagerInitQuery.ts}
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { tryCatchV2 } from "prostgles-types";
|
|
2
|
-
import { DboBuilder } from "
|
|
3
|
-
import { pgp } from "
|
|
2
|
+
import { DboBuilder } from "../../DboBuilder/DboBuilder";
|
|
3
|
+
import { pgp } from "../../DboBuilder/DboBuilderTypes";
|
|
4
4
|
import {
|
|
5
5
|
asValue,
|
|
6
6
|
DELIMITER,
|
|
7
7
|
EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID,
|
|
8
8
|
NOTIF_CHANNEL,
|
|
9
9
|
NOTIF_TYPE,
|
|
10
|
-
} from "
|
|
11
|
-
import { getAppCheckQuery } from "
|
|
12
|
-
import { version } from "
|
|
13
|
-
import { getDataWatchFunctionQuery } from "./
|
|
10
|
+
} from "../PubSubManagerUtils";
|
|
11
|
+
import { getAppCheckQuery } from "../orphanTriggerCheck";
|
|
12
|
+
import { version } from "../../../package.json";
|
|
13
|
+
import { getDataWatchFunctionQuery } from "./getDataWatchFunctionQuery";
|
|
14
14
|
|
|
15
15
|
export const DB_OBJ_NAMES = {
|
|
16
16
|
trigger_add_remove_func: "prostgles.trigger_add_remove_func",
|
|
@@ -197,8 +197,8 @@ BEGIN
|
|
|
197
197
|
condition TEXT NOT NULL,
|
|
198
198
|
condition_hash TEXT NOT NULL,
|
|
199
199
|
|
|
200
|
-
/** If defined, will check the
|
|
201
|
-
|
|
200
|
+
/** If defined, will check which columns changed which will then be used in the sub notification logic */
|
|
201
|
+
columns_info JSONB ,
|
|
202
202
|
|
|
203
203
|
/* The view from the root subscription, found in the condition.
|
|
204
204
|
We need this because old_table/new_table data is not reflected in the view inside the AFTER trigger
|
|
@@ -337,25 +337,28 @@ BEGIN
|
|
|
337
337
|
COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
338
338
|
*/
|
|
339
339
|
$q$,
|
|
340
|
-
'prostgles_triggers_' || trw.table_name || '_insert',
|
|
341
|
-
|
|
340
|
+
'prostgles_triggers_' || trw.table_name || '_insert',
|
|
341
|
+
trw.table_name
|
|
342
|
+
) ||
|
|
343
|
+
format(
|
|
342
344
|
$q$
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
--COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
345
|
+
${createTriggerQuery}
|
|
346
|
+
AFTER UPDATE ON %2$s
|
|
347
|
+
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
|
|
348
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
348
349
|
$q$,
|
|
349
|
-
'prostgles_triggers_' || trw.table_name || '_update',
|
|
350
|
-
|
|
350
|
+
'prostgles_triggers_' || trw.table_name || '_update',
|
|
351
|
+
trw.table_name
|
|
352
|
+
) ||
|
|
353
|
+
format(
|
|
351
354
|
$q$
|
|
352
355
|
${createTriggerQuery}
|
|
353
356
|
AFTER DELETE ON %2$s
|
|
354
357
|
REFERENCING OLD TABLE AS old_table
|
|
355
|
-
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
356
|
-
--COMMENT ON TRIGGER %1$I ON %2$s IS 'Prostgles internal trigger used to notify when data in the table changed';
|
|
358
|
+
FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
|
|
357
359
|
$q$,
|
|
358
|
-
'prostgles_triggers_' || trw.table_name || '_delete',
|
|
360
|
+
'prostgles_triggers_' || trw.table_name || '_delete',
|
|
361
|
+
trw.table_name
|
|
359
362
|
);
|
|
360
363
|
END IF;
|
|
361
364
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { isDefined, isObject } from "prostgles-types";
|
|
2
|
-
import { PostgresNotifListenManager } from "
|
|
3
|
-
import { getWatchSchemaTagList } from "
|
|
4
|
-
import { type PubSubManager } from "
|
|
2
|
+
import { PostgresNotifListenManager } from "../../PostgresNotifListenManager";
|
|
3
|
+
import { getWatchSchemaTagList } from "../../SchemaWatch/getWatchSchemaTagList";
|
|
4
|
+
import { type PubSubManager } from "../PubSubManager";
|
|
5
5
|
import { getPubSubManagerInitQuery } from "./getPubSubManagerInitQuery";
|
|
6
|
-
import { asValue, NOTIF_CHANNEL } from "
|
|
6
|
+
import { asValue, NOTIF_CHANNEL } from "../PubSubManagerUtils";
|
|
7
7
|
export const REALTIME_TRIGGER_CHECK_QUERY =
|
|
8
8
|
"prostgles-server internal query used to manage realtime triggers";
|
|
9
9
|
|
|
@@ -3,7 +3,7 @@ import { type PubSubManager } from "./PubSubManager";
|
|
|
3
3
|
import { getIsSuperUser } from "../Prostgles";
|
|
4
4
|
import { EVENT_TRIGGER_TAGS } from "../Event_Trigger_Tags";
|
|
5
5
|
import { DELETE_DISCONNECTED_APPS_QUERY } from "./orphanTriggerCheck";
|
|
6
|
-
import { DB_OBJ_NAMES } from "./getPubSubManagerInitQuery";
|
|
6
|
+
import { DB_OBJ_NAMES } from "./init/getPubSubManagerInitQuery";
|
|
7
7
|
import { EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID } from "./PubSubManagerUtils";
|
|
8
8
|
|
|
9
9
|
const asValue = (v: any) => pgp.as.format("$1", [v]);
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { includes, pickKeys
|
|
1
|
+
import { includes, pickKeys } from "prostgles-types";
|
|
2
2
|
import { parseFieldFilter } from "../DboBuilder/ViewHandler/parseFieldFilter";
|
|
3
3
|
import { PubSubManager } from "./PubSubManager";
|
|
4
4
|
import { DELIMITER, log, NOTIF_TYPE, type NotifTypeName } from "./PubSubManagerUtils";
|
|
5
|
-
import { getJSONBObjectSchemaValidationError } from "../JSONBValidation/JSONBValidation";
|
|
6
5
|
|
|
7
6
|
/* Relay relevant data to relevant subscriptions */
|
|
8
7
|
export async function notifListener(this: PubSubManager, data: { payload: string }) {
|
|
@@ -69,8 +68,10 @@ export async function notifListener(this: PubSubManager, data: { payload: string
|
|
|
69
68
|
throw "notifListener: dataArr length < 3";
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
const [_, table_name, op_name, condition_ids_str,
|
|
73
|
-
const
|
|
71
|
+
const [_, table_name, op_name, condition_ids_str, raw_changed_columns_str = ""] = dataArr;
|
|
72
|
+
const changedColumns =
|
|
73
|
+
!raw_changed_columns_str ? undefined : raw_changed_columns_str.slice(1, -1).split(",");
|
|
74
|
+
const conditionIds = condition_ids_str?.split(",").map((v) => +v);
|
|
74
75
|
|
|
75
76
|
if (!table_name) {
|
|
76
77
|
throw "table_name undef";
|
|
@@ -79,9 +80,6 @@ export async function notifListener(this: PubSubManager, data: { payload: string
|
|
|
79
80
|
const tableTriggerConditions = this.getTriggerInfo(table_name);
|
|
80
81
|
let state: "error" | "no-triggers" | "ok" | "invalid_condition_ids" = "ok";
|
|
81
82
|
|
|
82
|
-
// const triggers = await this.db.any("SELECT * FROM prostgles.triggers WHERE table_name = $1 AND id IN ($2:csv)", [table_name, condition_ids_str.split(",").map(v => +v)]);
|
|
83
|
-
// const conditions: string[] = triggers.map(t => t.condition);
|
|
84
|
-
|
|
85
83
|
if (!tableTriggerConditions?.length) {
|
|
86
84
|
state = "no-triggers";
|
|
87
85
|
|
|
@@ -98,12 +96,12 @@ export async function notifListener(this: PubSubManager, data: { payload: string
|
|
|
98
96
|
});
|
|
99
97
|
|
|
100
98
|
/* Trigger ok */
|
|
101
|
-
} else if (
|
|
99
|
+
} else if (conditionIds?.every((id) => Number.isInteger(id))) {
|
|
102
100
|
state = "ok";
|
|
103
101
|
const firedTableConditions = tableTriggerConditions.filter(({ idx }) =>
|
|
104
|
-
|
|
102
|
+
conditionIds.includes(idx)
|
|
105
103
|
);
|
|
106
|
-
const orphanedTableConditions =
|
|
104
|
+
const orphanedTableConditions = conditionIds.filter((condId) => {
|
|
107
105
|
const tc = tableTriggerConditions.at(condId);
|
|
108
106
|
return !tc || (tc.subs.length === 0 && tc.syncs.length === 0);
|
|
109
107
|
});
|
|
@@ -131,33 +129,26 @@ export async function notifListener(this: PubSubManager, data: { payload: string
|
|
|
131
129
|
((sub.socket_id && this.sockets[sub.socket_id]) || sub.localFuncs)
|
|
132
130
|
)
|
|
133
131
|
);
|
|
134
|
-
const { data: changedColValidation } = tryCatchV2(() =>
|
|
135
|
-
getJSONBObjectSchemaValidationError(
|
|
136
|
-
{ cols: "string[]" },
|
|
137
|
-
{ cols: JSON.parse(`[${changed_columns_str}]`) as string[] },
|
|
138
|
-
"cols"
|
|
139
|
-
)
|
|
140
|
-
);
|
|
141
|
-
const changedColumns = changedColValidation?.data?.cols;
|
|
142
132
|
|
|
143
133
|
activeAndReadySubs.forEach((sub) => {
|
|
144
|
-
const
|
|
145
|
-
|
|
134
|
+
const operation = (op_name?.toLowerCase() || "insert") as keyof NonNullable<typeof actions>;
|
|
135
|
+
const { tracked_columns, subscribeOptions } = sub;
|
|
136
|
+
const { throttle = 0, throttleOpts, actions, skipChangedColumnsCheck } = subscribeOptions;
|
|
137
|
+
if (
|
|
138
|
+
!skipChangedColumnsCheck &&
|
|
139
|
+
changedColumns &&
|
|
140
|
+
operation === "update" &&
|
|
141
|
+
tracked_columns
|
|
142
|
+
) {
|
|
146
143
|
const subFieldsHaveChanged = changedColumns.some((changedColumn) =>
|
|
147
|
-
|
|
144
|
+
tracked_columns.includes(changedColumn)
|
|
148
145
|
);
|
|
149
146
|
if (!subFieldsHaveChanged) return;
|
|
150
147
|
}
|
|
151
|
-
const commandLowerCase = (op_name?.toLowerCase() || "insert") as keyof NonNullable<
|
|
152
|
-
typeof actions
|
|
153
|
-
>;
|
|
154
148
|
|
|
155
149
|
const actionIsIgnored =
|
|
156
150
|
actions &&
|
|
157
|
-
!includes(
|
|
158
|
-
parseFieldFilter(actions, false, ["insert", "update", "delete"]),
|
|
159
|
-
commandLowerCase
|
|
160
|
-
);
|
|
151
|
+
!includes(parseFieldFilter(actions, false, ["insert", "update", "delete"]), operation);
|
|
161
152
|
if (actionIsIgnored) {
|
|
162
153
|
return;
|
|
163
154
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { PubSubManager } from "./PubSubManager";
|
|
2
2
|
import { EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID } from "./PubSubManagerUtils";
|
|
3
|
-
import { REALTIME_TRIGGER_CHECK_QUERY } from "./initPubSubManager";
|
|
3
|
+
import { REALTIME_TRIGGER_CHECK_QUERY } from "./init/initPubSubManager";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Schema and Data watch triggers (DB_OBJ_NAMES.schema_watch_func, DB_OBJ_NAMES.data_watch_func)
|
|
@@ -28,8 +28,17 @@ export const runSQLFile = async (prostgles: Prostgles) => {
|
|
|
28
28
|
return res.data?.success;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Given an sql error, return the lines of the query that caused the error.
|
|
33
|
+
*/
|
|
34
|
+
export const getQueryErrorPositionInfo = (err: any, _fileContent?: string): string | undefined => {
|
|
35
|
+
const { position, length, query, internalPosition, internalQuery } = err as {
|
|
36
|
+
position: number;
|
|
37
|
+
length: number;
|
|
38
|
+
query: string;
|
|
39
|
+
internalPosition?: string;
|
|
40
|
+
internalQuery?: string;
|
|
41
|
+
},
|
|
33
42
|
fileContent = _fileContent || query,
|
|
34
43
|
lines = fileContent.split("\n");
|
|
35
44
|
|
|
@@ -42,4 +51,12 @@ export const getQueryErrorPositionInfo = (err: any, _fileContent?: string) => {
|
|
|
42
51
|
.map((txt, i) => `${startLine + i + 1} ${i === 1 ? "->" : " "} ${txt}`)
|
|
43
52
|
.join("\n");
|
|
44
53
|
}
|
|
54
|
+
|
|
55
|
+
if (internalPosition && internalQuery) {
|
|
56
|
+
return getQueryErrorPositionInfo({
|
|
57
|
+
query: internalQuery,
|
|
58
|
+
position: parseInt(internalPosition),
|
|
59
|
+
length: internalQuery.length,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
45
62
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prostgles-server",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.298",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"pg": "^8.11.5",
|
|
58
58
|
"pg-cursor": "^2.11.0",
|
|
59
59
|
"pg-promise": "^11.9.1",
|
|
60
|
-
"prostgles-types": "^4.0.
|
|
60
|
+
"prostgles-types": "^4.0.171"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@eslint/js": "^9.22.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getPubSubManagerInitQuery.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/getPubSubManagerInitQuery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAatD,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AA4dX;;;GAGG;AACH,eAAO,MAAM,yBAAyB,SAC9B,UAAU,KACf,QAAQ,MAAM,GAAG,SAAS,CAyB5B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getPubSubManagerInitQuery.js","sourceRoot":"","sources":["../../lib/PubSubManager/getPubSubManagerInitQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGrD,eAAO,MAAM,4BAA4B,qEAC2B,CAAC;AAErE,eAAO,MAAM,IAAI,OAAQ,MAAM,qBAA8C,CAAC;AAE9E,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA0E/F"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.js","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"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"}
|