prostgles-server 2.0.278 → 2.0.281
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/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser.js +3 -2
- package/dist/PublishParser.js.map +1 -1
- package/dist/TableConfig.d.ts +28 -0
- package/dist/TableConfig.d.ts.map +1 -1
- package/dist/TableConfig.js +47 -4
- package/dist/TableConfig.js.map +1 -1
- package/lib/PublishParser.d.ts.map +1 -1
- package/lib/PublishParser.js +3 -2
- package/lib/PublishParser.ts +425 -423
- package/lib/TableConfig.d.ts +28 -0
- package/lib/TableConfig.d.ts.map +1 -1
- package/lib/TableConfig.js +47 -4
- package/lib/TableConfig.ts +83 -4
- package/package.json +1 -1
- package/tests/client/PID.txt +1 -1
- package/tests/server/package-lock.json +1 -1
package/lib/TableConfig.d.ts
CHANGED
|
@@ -22,6 +22,34 @@ declare type BaseTableDefinition<LANG_IDS = AnyObject> = {
|
|
|
22
22
|
};
|
|
23
23
|
dropIfExistsCascade?: boolean;
|
|
24
24
|
dropIfExists?: boolean;
|
|
25
|
+
triggers?: {
|
|
26
|
+
[triggerName: string]: {
|
|
27
|
+
type: "before" | "after" | "instead of";
|
|
28
|
+
actions: ("insert" | "update" | "delete")[];
|
|
29
|
+
forEach: "statement" | "row";
|
|
30
|
+
/**
|
|
31
|
+
* @example
|
|
32
|
+
* DECLARE
|
|
33
|
+
x_rec record;
|
|
34
|
+
BEGIN
|
|
35
|
+
raise notice '=operation: % =', TG_OP;
|
|
36
|
+
IF (TG_OP = 'UPDATE' OR TG_OP = 'DELETE') THEN
|
|
37
|
+
FOR x_rec IN SELECT * FROM old_table LOOP
|
|
38
|
+
raise notice 'OLD: %', x_rec;
|
|
39
|
+
END loop;
|
|
40
|
+
END IF;
|
|
41
|
+
IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
|
|
42
|
+
FOR x_rec IN SELECT * FROM new_table LOOP
|
|
43
|
+
raise notice 'NEW: %', x_rec;
|
|
44
|
+
END loop;
|
|
45
|
+
END IF;
|
|
46
|
+
|
|
47
|
+
RETURN NULL;
|
|
48
|
+
END;
|
|
49
|
+
*/
|
|
50
|
+
query: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
25
53
|
};
|
|
26
54
|
declare type LookupTableDefinition<LANG_IDS> = {
|
|
27
55
|
isLookupTable: {
|
package/lib/TableConfig.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableConfig.d.ts","sourceRoot":"","sources":["TableConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,SAAS,EAAE,SAAS,EAAG,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAClH,OAAO,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,eAAe,EAAS,SAAS,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,EAAwB,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAElF,aAAK,YAAY,GAAG;IAClB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,WAAW,CAAC,QAAQ,IAAI;KACjC,OAAO,IAAI,MAAM,QAAQ,GAAG,MAAM;CACpC,CAAA;AAED,eAAO,MAAM,SAAS;;;;;kBAiBrB,CAAA;AAED,aAAK,mBAAmB,CAAC,QAAQ,GAAG,SAAS,IAAI;IAC/C,IAAI,CAAC,EAAE;QACL,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;KACxC,CAAA;IACD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TableConfig.d.ts","sourceRoot":"","sources":["TableConfig.ts"],"names":[],"mappings":"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"}
|
package/lib/TableConfig.js
CHANGED
|
@@ -125,9 +125,11 @@ class TableConfigurator {
|
|
|
125
125
|
if (!this.config || !this.prostgles.pgp)
|
|
126
126
|
throw "config or pgp missing";
|
|
127
127
|
/* Create lookup tables */
|
|
128
|
-
Object.keys(this.config).map(
|
|
129
|
-
const
|
|
130
|
-
const
|
|
128
|
+
Object.keys(this.config).map(async (tableNameRaw) => {
|
|
129
|
+
const tableName = (0, prostgles_types_1.asName)(tableNameRaw);
|
|
130
|
+
const tableConf = this.config[tableNameRaw];
|
|
131
|
+
const { dropIfExists = false, dropIfExistsCascade = false, triggers } = tableConf;
|
|
132
|
+
const isDropped = dropIfExists || dropIfExistsCascade;
|
|
131
133
|
if (dropIfExistsCascade) {
|
|
132
134
|
queries.push(`DROP TABLE IF EXISTS ${tableName} CASCADE;`);
|
|
133
135
|
}
|
|
@@ -136,7 +138,7 @@ class TableConfigurator {
|
|
|
136
138
|
}
|
|
137
139
|
if ("isLookupTable" in tableConf && Object.keys(tableConf.isLookupTable?.values).length) {
|
|
138
140
|
const rows = Object.keys(tableConf.isLookupTable?.values).map(id => ({ id, ...(tableConf.isLookupTable?.values[id]) }));
|
|
139
|
-
if (
|
|
141
|
+
if (isDropped || !this.dbo?.[tableNameRaw]) {
|
|
140
142
|
const keys = Object.keys(rows[0]).filter(k => k !== "id");
|
|
141
143
|
queries.push(`CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
142
144
|
id TEXT PRIMARY KEY
|
|
@@ -149,6 +151,47 @@ class TableConfigurator {
|
|
|
149
151
|
// console.log("Created lookup table " + tableName)
|
|
150
152
|
}
|
|
151
153
|
}
|
|
154
|
+
if (triggers) {
|
|
155
|
+
const existingTriggers = await this.dbo.sql(`
|
|
156
|
+
SELECT event_object_table
|
|
157
|
+
,trigger_name
|
|
158
|
+
FROM information_schema.triggers
|
|
159
|
+
WHERE event_object_table = ` + "${tableName}" + `
|
|
160
|
+
ORDER BY event_object_table
|
|
161
|
+
`, { tableName: tableNameRaw }, { returnType: "rows" });
|
|
162
|
+
(0, prostgles_types_1.getKeys)(triggers).map(triggerName => {
|
|
163
|
+
const trigger = triggers[triggerName];
|
|
164
|
+
if (isDropped) {
|
|
165
|
+
queries.push(`DROP TRIGGER IF EXISTS ${(0, prostgles_types_1.asName)(triggerName)} ON ${tableName};`);
|
|
166
|
+
}
|
|
167
|
+
const funcNameParsed = (0, prostgles_types_1.asName)(triggerName);
|
|
168
|
+
if (isDropped || !existingTriggers.some(t => t.trigger_name === triggerName)) {
|
|
169
|
+
queries.push(`
|
|
170
|
+
CREATE OR REPLACE FUNCTION ${funcNameParsed}()
|
|
171
|
+
RETURNS trigger
|
|
172
|
+
LANGUAGE plpgsql
|
|
173
|
+
AS
|
|
174
|
+
$$
|
|
175
|
+
${trigger.query}
|
|
176
|
+
$$;
|
|
177
|
+
`);
|
|
178
|
+
}
|
|
179
|
+
trigger.actions.forEach(action => {
|
|
180
|
+
const triggerActionName = triggerName + "_" + action;
|
|
181
|
+
const triggerActionNameParsed = (0, prostgles_types_1.asName)(triggerActionName);
|
|
182
|
+
if (dropIfExists || dropIfExistsCascade) {
|
|
183
|
+
queries.push(`DROP TRIGGER IF EXISTS ${triggerActionNameParsed} ON ${tableName};`);
|
|
184
|
+
}
|
|
185
|
+
queries.push(`
|
|
186
|
+
CREATE TRIGGER ${triggerActionNameParsed}
|
|
187
|
+
${trigger.type} ${action} ON ${tableName}
|
|
188
|
+
REFERENCING NEW TABLE AS new_table
|
|
189
|
+
FOR EACH ${trigger.forEach}
|
|
190
|
+
EXECUTE PROCEDURE ${funcNameParsed}();
|
|
191
|
+
`);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
}
|
|
152
195
|
});
|
|
153
196
|
if (queries.length) {
|
|
154
197
|
const q = queries.join("\n");
|
package/lib/TableConfig.ts
CHANGED
|
@@ -39,6 +39,34 @@ type BaseTableDefinition<LANG_IDS = AnyObject> = {
|
|
|
39
39
|
}
|
|
40
40
|
dropIfExistsCascade?: boolean;
|
|
41
41
|
dropIfExists?: boolean;
|
|
42
|
+
triggers?: {
|
|
43
|
+
[triggerName: string]: {
|
|
44
|
+
type: "before" | "after" | "instead of";
|
|
45
|
+
actions: ("insert" | "update" | "delete")[];
|
|
46
|
+
forEach: "statement" | "row";
|
|
47
|
+
/**
|
|
48
|
+
* @example
|
|
49
|
+
* DECLARE
|
|
50
|
+
x_rec record;
|
|
51
|
+
BEGIN
|
|
52
|
+
raise notice '=operation: % =', TG_OP;
|
|
53
|
+
IF (TG_OP = 'UPDATE' OR TG_OP = 'DELETE') THEN
|
|
54
|
+
FOR x_rec IN SELECT * FROM old_table LOOP
|
|
55
|
+
raise notice 'OLD: %', x_rec;
|
|
56
|
+
END loop;
|
|
57
|
+
END IF;
|
|
58
|
+
IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE') THEN
|
|
59
|
+
FOR x_rec IN SELECT * FROM new_table LOOP
|
|
60
|
+
raise notice 'NEW: %', x_rec;
|
|
61
|
+
END loop;
|
|
62
|
+
END IF;
|
|
63
|
+
|
|
64
|
+
RETURN NULL;
|
|
65
|
+
END;
|
|
66
|
+
*/
|
|
67
|
+
query: string;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
42
70
|
}
|
|
43
71
|
|
|
44
72
|
type LookupTableDefinition<LANG_IDS> = {
|
|
@@ -337,9 +365,12 @@ export default class TableConfigurator<LANG_IDS = { en: 1 }> {
|
|
|
337
365
|
|
|
338
366
|
if (!this.config || !this.prostgles.pgp) throw "config or pgp missing"
|
|
339
367
|
/* Create lookup tables */
|
|
340
|
-
Object.keys(this.config).map(
|
|
341
|
-
const
|
|
342
|
-
const
|
|
368
|
+
Object.keys(this.config).map(async tableNameRaw => {
|
|
369
|
+
const tableName = asName(tableNameRaw);
|
|
370
|
+
const tableConf = this.config![tableNameRaw];
|
|
371
|
+
const { dropIfExists = false, dropIfExistsCascade = false, triggers } = tableConf;
|
|
372
|
+
const isDropped = dropIfExists || dropIfExistsCascade;
|
|
373
|
+
|
|
343
374
|
if (dropIfExistsCascade) {
|
|
344
375
|
queries.push(`DROP TABLE IF EXISTS ${tableName} CASCADE;`);
|
|
345
376
|
} else if (dropIfExists) {
|
|
@@ -347,7 +378,7 @@ export default class TableConfigurator<LANG_IDS = { en: 1 }> {
|
|
|
347
378
|
}
|
|
348
379
|
if ("isLookupTable" in tableConf && Object.keys(tableConf.isLookupTable?.values).length) {
|
|
349
380
|
const rows = Object.keys(tableConf.isLookupTable?.values).map(id => ({ id, ...(tableConf.isLookupTable?.values[id]) }));
|
|
350
|
-
if (
|
|
381
|
+
if (isDropped || !this.dbo?.[tableNameRaw]) {
|
|
351
382
|
const keys = Object.keys(rows[0]).filter(k => k !== "id");
|
|
352
383
|
queries.push(`CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
353
384
|
id TEXT PRIMARY KEY
|
|
@@ -361,6 +392,54 @@ export default class TableConfigurator<LANG_IDS = { en: 1 }> {
|
|
|
361
392
|
// console.log("Created lookup table " + tableName)
|
|
362
393
|
}
|
|
363
394
|
}
|
|
395
|
+
|
|
396
|
+
if(triggers){
|
|
397
|
+
|
|
398
|
+
const existingTriggers: { trigger_name: string }[] = await this.dbo.sql!(`
|
|
399
|
+
SELECT event_object_table
|
|
400
|
+
,trigger_name
|
|
401
|
+
FROM information_schema.triggers
|
|
402
|
+
WHERE event_object_table = `+ "${tableName}" + `
|
|
403
|
+
ORDER BY event_object_table
|
|
404
|
+
`,
|
|
405
|
+
{ tableName: tableNameRaw },
|
|
406
|
+
{ returnType: "rows" }) as any;
|
|
407
|
+
|
|
408
|
+
getKeys(triggers).map(triggerName => {
|
|
409
|
+
const trigger = triggers[triggerName];
|
|
410
|
+
if(isDropped){
|
|
411
|
+
queries.push(`DROP TRIGGER IF EXISTS ${asName(triggerName)} ON ${tableName};`)
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const funcNameParsed = asName(triggerName);
|
|
415
|
+
if(isDropped || !existingTriggers.some(t => t.trigger_name === triggerName)){
|
|
416
|
+
queries.push(`
|
|
417
|
+
CREATE OR REPLACE FUNCTION ${funcNameParsed}()
|
|
418
|
+
RETURNS trigger
|
|
419
|
+
LANGUAGE plpgsql
|
|
420
|
+
AS
|
|
421
|
+
$$
|
|
422
|
+
${trigger.query}
|
|
423
|
+
$$;
|
|
424
|
+
`);
|
|
425
|
+
}
|
|
426
|
+
trigger.actions.forEach(action => {
|
|
427
|
+
const triggerActionName = triggerName+"_"+action;
|
|
428
|
+
|
|
429
|
+
const triggerActionNameParsed = asName(triggerActionName)
|
|
430
|
+
if(dropIfExists || dropIfExistsCascade){
|
|
431
|
+
queries.push(`DROP TRIGGER IF EXISTS ${triggerActionNameParsed} ON ${tableName};`)
|
|
432
|
+
}
|
|
433
|
+
queries.push(`
|
|
434
|
+
CREATE TRIGGER ${triggerActionNameParsed}
|
|
435
|
+
${trigger.type} ${action} ON ${tableName}
|
|
436
|
+
REFERENCING NEW TABLE AS new_table
|
|
437
|
+
FOR EACH ${trigger.forEach}
|
|
438
|
+
EXECUTE PROCEDURE ${funcNameParsed}();
|
|
439
|
+
`)
|
|
440
|
+
})
|
|
441
|
+
})
|
|
442
|
+
}
|
|
364
443
|
});
|
|
365
444
|
|
|
366
445
|
if (queries.length) {
|
package/package.json
CHANGED
package/tests/client/PID.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
35287
|