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.
Files changed (76) hide show
  1. package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
  2. package/dist/DboBuilder/DboBuilder.js +5 -3
  3. package/dist/DboBuilder/DboBuilder.js.map +1 -1
  4. package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
  5. package/dist/DboBuilder/TableHandler/update.js +2 -2
  6. package/dist/DboBuilder/TableHandler/update.js.map +1 -1
  7. package/dist/DboBuilder/ViewHandler/getValidatedSubscribeOptions.d.ts.map +1 -1
  8. package/dist/DboBuilder/ViewHandler/getValidatedSubscribeOptions.js +3 -1
  9. package/dist/DboBuilder/ViewHandler/getValidatedSubscribeOptions.js.map +1 -1
  10. package/dist/DboBuilder/ViewHandler/subscribe.d.ts.map +1 -1
  11. package/dist/DboBuilder/ViewHandler/subscribe.js +4 -3
  12. package/dist/DboBuilder/ViewHandler/subscribe.js.map +1 -1
  13. package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
  14. package/dist/DboBuilder/getSubscribeRelatedTables.js +5 -5
  15. package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
  16. package/dist/PubSubManager/PubSubManager.d.ts +6 -13
  17. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  18. package/dist/PubSubManager/PubSubManager.js +2 -2
  19. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  20. package/dist/PubSubManager/addSub.d.ts.map +1 -1
  21. package/dist/PubSubManager/addSub.js +7 -7
  22. package/dist/PubSubManager/addSub.js.map +1 -1
  23. package/dist/PubSubManager/addSync.d.ts.map +1 -1
  24. package/dist/PubSubManager/addSync.js +1 -1
  25. package/dist/PubSubManager/addSync.js.map +1 -1
  26. package/dist/PubSubManager/addTrigger.d.ts +4 -2
  27. package/dist/PubSubManager/addTrigger.d.ts.map +1 -1
  28. package/dist/PubSubManager/addTrigger.js +55 -3
  29. package/dist/PubSubManager/addTrigger.js.map +1 -1
  30. package/dist/PubSubManager/getCreatePubSubManagerError.js +1 -1
  31. package/dist/PubSubManager/getCreatePubSubManagerError.js.map +1 -1
  32. package/dist/PubSubManager/init/getDataWatchFunctionQuery.d.ts +5 -0
  33. package/dist/PubSubManager/init/getDataWatchFunctionQuery.d.ts.map +1 -1
  34. package/dist/PubSubManager/init/getDataWatchFunctionQuery.js +80 -51
  35. package/dist/PubSubManager/init/getDataWatchFunctionQuery.js.map +1 -1
  36. package/dist/PubSubManager/{getPubSubManagerInitQuery.d.ts → init/getPubSubManagerInitQuery.d.ts} +1 -1
  37. package/dist/PubSubManager/init/getPubSubManagerInitQuery.d.ts.map +1 -0
  38. package/dist/PubSubManager/{getPubSubManagerInitQuery.js → init/getPubSubManagerInitQuery.js} +22 -19
  39. package/dist/PubSubManager/init/getPubSubManagerInitQuery.js.map +1 -0
  40. package/dist/PubSubManager/{initPubSubManager.d.ts → init/initPubSubManager.d.ts} +1 -1
  41. package/dist/PubSubManager/init/initPubSubManager.d.ts.map +1 -0
  42. package/dist/PubSubManager/{initPubSubManager.js → init/initPubSubManager.js} +3 -3
  43. package/dist/PubSubManager/init/initPubSubManager.js.map +1 -0
  44. package/dist/PubSubManager/initialiseEventTriggers.js +1 -1
  45. package/dist/PubSubManager/initialiseEventTriggers.js.map +1 -1
  46. package/dist/PubSubManager/notifListener.d.ts.map +1 -1
  47. package/dist/PubSubManager/notifListener.js +15 -15
  48. package/dist/PubSubManager/notifListener.js.map +1 -1
  49. package/dist/PubSubManager/orphanTriggerCheck.js +1 -1
  50. package/dist/PubSubManager/orphanTriggerCheck.js.map +1 -1
  51. package/dist/TableConfig/runSQLFile.d.ts +3 -0
  52. package/dist/TableConfig/runSQLFile.d.ts.map +1 -1
  53. package/dist/TableConfig/runSQLFile.js +11 -1
  54. package/dist/TableConfig/runSQLFile.js.map +1 -1
  55. package/lib/DboBuilder/DboBuilder.ts +13 -3
  56. package/lib/DboBuilder/TableHandler/update.ts +2 -3
  57. package/lib/DboBuilder/ViewHandler/getValidatedSubscribeOptions.ts +9 -1
  58. package/lib/DboBuilder/ViewHandler/subscribe.ts +5 -3
  59. package/lib/DboBuilder/getSubscribeRelatedTables.ts +8 -5
  60. package/lib/PubSubManager/PubSubManager.ts +7 -12
  61. package/lib/PubSubManager/addSub.ts +10 -9
  62. package/lib/PubSubManager/addSync.ts +5 -1
  63. package/lib/PubSubManager/addTrigger.ts +77 -6
  64. package/lib/PubSubManager/getCreatePubSubManagerError.ts +1 -1
  65. package/lib/PubSubManager/init/getDataWatchFunctionQuery.ts +80 -50
  66. package/lib/PubSubManager/{getPubSubManagerInitQuery.ts → init/getPubSubManagerInitQuery.ts} +23 -20
  67. package/lib/PubSubManager/{initPubSubManager.ts → init/initPubSubManager.ts} +4 -4
  68. package/lib/PubSubManager/initialiseEventTriggers.ts +1 -1
  69. package/lib/PubSubManager/notifListener.ts +19 -28
  70. package/lib/PubSubManager/orphanTriggerCheck.ts +1 -1
  71. package/lib/TableConfig/runSQLFile.ts +19 -2
  72. package/package.json +2 -2
  73. package/dist/PubSubManager/getPubSubManagerInitQuery.d.ts.map +0 -1
  74. package/dist/PubSubManager/getPubSubManagerInitQuery.js.map +0 -1
  75. package/dist/PubSubManager/initPubSubManager.d.ts.map +0 -1
  76. package/dist/PubSubManager/initPubSubManager.js.map +0 -1
@@ -1,7 +1,12 @@
1
- import { DB_OBJ_NAMES } from "../getPubSubManagerInitQuery";
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 unions TEXT := '';
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 TEXT := NULL;
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 t_ids
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 unions
56
+ INTO condition_checks_union_query
75
57
  FROM prostgles.v_triggers
76
58
  WHERE table_name = escaped_table;
77
59
 
78
60
 
79
- /* unions = 'old_table union new_table' or any one of the tables */
80
- IF unions IS NOT NULL THEN
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.t_ids)
88
+ SELECT ARRAY_AGG(DISTINCT t.t_id)
107
89
  FROM (
108
90
  %s
109
91
  ) t
110
92
  $c$,
111
- unions
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
- EXCEPTION WHEN OTHERS THEN
121
-
122
- has_errors := TRUE;
100
+ EXCEPTION WHEN OTHERS THEN
101
+
102
+ has_errors := TRUE;
123
103
 
124
- GET STACKED DIAGNOSTICS
125
- err_text = MESSAGE_TEXT,
126
- err_detail = PG_EXCEPTION_DETAIL,
127
- err_hint = PG_EXCEPTION_HINT;
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 'unions: % , cids: %', unions, c_ids;
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
+ `;
@@ -1,16 +1,16 @@
1
1
  import { tryCatchV2 } from "prostgles-types";
2
- import { DboBuilder } from "../DboBuilder/DboBuilder";
3
- import { pgp } from "../DboBuilder/DboBuilderTypes";
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 "./PubSubManagerUtils";
11
- import { getAppCheckQuery } from "./orphanTriggerCheck";
12
- import { version } from "../../package.json";
13
- import { getDataWatchFunctionQuery } from "./init/getDataWatchFunctionQuery";
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 provided fields for changes */
201
- fields _TEXT ,
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', trw.table_name
341
- ) || format(
340
+ 'prostgles_triggers_' || trw.table_name || '_insert',
341
+ trw.table_name
342
+ ) ||
343
+ format(
342
344
  $q$
343
- ${createTriggerQuery}
344
- AFTER UPDATE ON %2$s
345
- REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
346
- FOR EACH STATEMENT EXECUTE PROCEDURE ${DB_OBJ_NAMES.data_watch_func}();
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', trw.table_name
350
- ) || format(
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', trw.table_name
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 "../PostgresNotifListenManager";
3
- import { getWatchSchemaTagList } from "../SchemaWatch/getWatchSchemaTagList";
4
- import { type PubSubManager } from "./PubSubManager";
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 "./PubSubManagerUtils";
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, tryCatchV2 } from "prostgles-types";
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, changed_columns_str = ""] = dataArr;
73
- const condition_ids = condition_ids_str?.split(",").map((v) => +v);
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 (condition_ids?.every((id) => Number.isInteger(id))) {
99
+ } else if (conditionIds?.every((id) => Number.isInteger(id))) {
102
100
  state = "ok";
103
101
  const firedTableConditions = tableTriggerConditions.filter(({ idx }) =>
104
- condition_ids.includes(idx)
102
+ conditionIds.includes(idx)
105
103
  );
106
- const orphanedTableConditions = condition_ids.filter((condId) => {
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 { throttle = 0, throttleOpts, actions } = sub.subscribeOptions;
145
- if (changedColumns?.length) {
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
- sub.newQuery.select.some((f) => f.fields.includes(changedColumn))
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
- export const getQueryErrorPositionInfo = (err: any, _fileContent?: string) => {
32
- const { position, length, query } = err as { position: number; length: number; query: string },
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.296",
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.169"
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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"}