@prisma-psm/pg 1.0.0
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/.idea/modules.xml +8 -0
- package/.idea/php.xml +9 -0
- package/.idea/psm-pg.iml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.idea/workspace.xml +73 -0
- package/LICENSE +201 -0
- package/README.md +2 -0
- package/package.json +21 -0
- package/src/index.d.ts +4 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +21 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +23 -0
- package/src/migration/migrate.d.ts +3 -0
- package/src/migration/migrate.d.ts.map +1 -0
- package/src/migration/migrate.js +8 -0
- package/src/migration/migrate.js.map +1 -0
- package/src/migration/migrate.ts +7 -0
- package/src/migration/test.d.ts +3 -0
- package/src/migration/test.d.ts.map +1 -0
- package/src/migration/test.js +40 -0
- package/src/migration/test.js.map +1 -0
- package/src/migration/test.ts +43 -0
- package/src/parser/backup/engine.d.ts +16 -0
- package/src/parser/backup/engine.d.ts.map +1 -0
- package/src/parser/backup/engine.js +176 -0
- package/src/parser/backup/engine.js.map +1 -0
- package/src/parser/backup/engine.ts +201 -0
- package/src/parser/backup/index.d.ts +7 -0
- package/src/parser/backup/index.d.ts.map +1 -0
- package/src/parser/backup/index.js +29 -0
- package/src/parser/backup/index.js.map +1 -0
- package/src/parser/backup/index.ts +30 -0
- package/src/parser/constraint.d.ts +22 -0
- package/src/parser/constraint.d.ts.map +1 -0
- package/src/parser/constraint.js +160 -0
- package/src/parser/constraint.js.map +1 -0
- package/src/parser/constraint.ts +161 -0
- package/src/parser/def.d.ts +37 -0
- package/src/parser/def.d.ts.map +1 -0
- package/src/parser/def.js +4 -0
- package/src/parser/def.js.map +1 -0
- package/src/parser/def.ts +22 -0
- package/src/parser/dependencies.d.ts +3 -0
- package/src/parser/dependencies.d.ts.map +1 -0
- package/src/parser/dependencies.js +39 -0
- package/src/parser/dependencies.js.map +1 -0
- package/src/parser/dependencies.ts +43 -0
- package/src/parser/indexes.d.ts +13 -0
- package/src/parser/indexes.d.ts.map +1 -0
- package/src/parser/indexes.js +54 -0
- package/src/parser/indexes.js.map +1 -0
- package/src/parser/indexes.ts +57 -0
- package/src/parser/modelParser.d.ts +19 -0
- package/src/parser/modelParser.d.ts.map +1 -0
- package/src/parser/modelParser.js +24 -0
- package/src/parser/modelParser.js.map +1 -0
- package/src/parser/modelParser.ts +30 -0
- package/src/parser/notice.d.ts +2 -0
- package/src/parser/notice.d.ts.map +1 -0
- package/src/parser/notice.js +8 -0
- package/src/parser/notice.js.map +1 -0
- package/src/parser/notice.ts +5 -0
- package/src/parser/parser.d.ts +15 -0
- package/src/parser/parser.d.ts.map +1 -0
- package/src/parser/parser.js +72 -0
- package/src/parser/parser.js.map +1 -0
- package/src/parser/parser.ts +87 -0
- package/src/parser/shadow.d.ts +4 -0
- package/src/parser/shadow.d.ts.map +1 -0
- package/src/parser/shadow.js +21 -0
- package/src/parser/shadow.js.map +1 -0
- package/src/parser/shadow.ts +20 -0
- package/src/parser/sql.d.ts +3 -0
- package/src/parser/sql.d.ts.map +1 -0
- package/src/parser/sql.js +67 -0
- package/src/parser/sql.js.map +1 -0
- package/src/parser/sql.ts +74 -0
- package/src/parser/sys.d.ts +11 -0
- package/src/parser/sys.d.ts.map +1 -0
- package/src/parser/sys.js +54 -0
- package/src/parser/sys.js.map +1 -0
- package/src/parser/sys.ts +56 -0
- package/src/parser/table/engine.d.ts +7 -0
- package/src/parser/table/engine.d.ts.map +1 -0
- package/src/parser/table/engine.js +103 -0
- package/src/parser/table/engine.js.map +1 -0
- package/src/parser/table/engine.ts +106 -0
- package/src/parser/table/field.d.ts +8 -0
- package/src/parser/table/field.d.ts.map +1 -0
- package/src/parser/table/field.js +25 -0
- package/src/parser/table/field.js.map +1 -0
- package/src/parser/table/field.ts +22 -0
- package/src/parser/table.d.ts +8 -0
- package/src/parser/table.d.ts.map +1 -0
- package/src/parser/table.js +31 -0
- package/src/parser/table.js.map +1 -0
- package/src/parser/table.ts +30 -0
- package/src/utils/escape.d.ts +3 -0
- package/src/utils/escape.d.ts.map +1 -0
- package/src/utils/escape.js +59 -0
- package/src/utils/escape.js.map +1 -0
- package/src/utils/escape.ts +36 -0
- package/src/utils/sha.d.ts +2 -0
- package/src/utils/sha.d.ts.map +1 -0
- package/src/utils/sha.js +33 -0
- package/src/utils/sha.js.map +1 -0
- package/src/utils/sha.ts +6 -0
- package/src/utils/tabs.d.ts +2 -0
- package/src/utils/tabs.d.ts.map +1 -0
- package/src/utils/tabs.js +16 -0
- package/src/utils/tabs.js.map +1 -0
- package/src/utils/tabs.ts +14 -0
- package/tsconfig.json +81 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFunctionRestoreSerial = createFunctionRestoreSerial;
|
|
4
|
+
exports.restoreBackupSQL = restoreBackupSQL;
|
|
5
|
+
exports.restoreSerialSQL = restoreSerialSQL;
|
|
6
|
+
const escape_1 = require("../../utils/escape");
|
|
7
|
+
const tabs_1 = require("../../utils/tabs");
|
|
8
|
+
const sys_1 = require("../sys");
|
|
9
|
+
const sha_1 = require("../../utils/sha");
|
|
10
|
+
const notice_1 = require("../notice");
|
|
11
|
+
function createFunctionRestoreSerial(opts) {
|
|
12
|
+
const sys = (0, escape_1.oid)(opts.sys);
|
|
13
|
+
const tab = " ";
|
|
14
|
+
return (0, tabs_1.noTab)([
|
|
15
|
+
`create or replace function ${sys}.restore_serial(
|
|
16
|
+
schema character varying,
|
|
17
|
+
source character varying,
|
|
18
|
+
shadow character varying,
|
|
19
|
+
temp character varying,
|
|
20
|
+
"from" character varying,
|
|
21
|
+
"to" character varying,
|
|
22
|
+
"seq" character varying
|
|
23
|
+
) returns table( sequence character varying, counts int8 )
|
|
24
|
+
language plpgsql as $$
|
|
25
|
+
declare
|
|
26
|
+
begin
|
|
27
|
+
if exists(
|
|
28
|
+
select *
|
|
29
|
+
from pg_tables t
|
|
30
|
+
where t.schemaname = schema
|
|
31
|
+
and t.tablename = source
|
|
32
|
+
) then
|
|
33
|
+
execute format( $statment$
|
|
34
|
+
select max( %I ) from %I.%I
|
|
35
|
+
$statment$, "from", schema, source )
|
|
36
|
+
into counts;
|
|
37
|
+
|
|
38
|
+
counts := coalesce( counts, 0 )+1;
|
|
39
|
+
-- example district_id_seq
|
|
40
|
+
sequence := coalesce( seq, format( '%I.%I', shadow, format( '%s_%s_seq', temp, "to" ) ) );
|
|
41
|
+
perform setval( sequence::regclass, counts, false );
|
|
42
|
+
end if;
|
|
43
|
+
return next;
|
|
44
|
+
end;
|
|
45
|
+
$$;`
|
|
46
|
+
], tab);
|
|
47
|
+
}
|
|
48
|
+
function restoreBackupSQL(opts) {
|
|
49
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4;
|
|
50
|
+
const schema = (0, escape_1.oid)(opts.model.schema);
|
|
51
|
+
const source = (0, escape_1.oid)(opts.source);
|
|
52
|
+
const shadow = (0, escape_1.oid)(opts.parser.shadow);
|
|
53
|
+
const table = (0, escape_1.oid)(opts.model.name);
|
|
54
|
+
const temp = (0, escape_1.oid)(opts.model.temp);
|
|
55
|
+
if ((_b = (_a = opts.model.psm) === null || _a === void 0 ? void 0 : _a.backup) === null || _b === void 0 ? void 0 : _b.skip)
|
|
56
|
+
return null;
|
|
57
|
+
let filter = (field) => {
|
|
58
|
+
return !field.isGenerated
|
|
59
|
+
&& field.kind === "scalar";
|
|
60
|
+
};
|
|
61
|
+
const columns = opts.model.fields.filter(filter)
|
|
62
|
+
.map(value => ` ${(0, escape_1.oid)(value.name)}`)
|
|
63
|
+
.join(", ");
|
|
64
|
+
const DEFAULT_QUERY = `select * from ${schema}.${source}`;
|
|
65
|
+
const DEFAULT_RESOLVER = opts.model.fields.filter(filter)
|
|
66
|
+
.map(value => {
|
|
67
|
+
return ` ${(0, escape_1.oid)(value.dbName || value.name)}`;
|
|
68
|
+
})
|
|
69
|
+
.join(", ");
|
|
70
|
+
const revision_resolver = opts.model.fields.filter(filter)
|
|
71
|
+
.map(field => {
|
|
72
|
+
var _a, _b;
|
|
73
|
+
let expression = (_b = (_a = field.psm) === null || _a === void 0 ? void 0 : _a.restore) === null || _b === void 0 ? void 0 : _b.expression;
|
|
74
|
+
if (!expression)
|
|
75
|
+
expression = ` ${(0, escape_1.oid)(field.dbName || field.name)}`;
|
|
76
|
+
return expression;
|
|
77
|
+
})
|
|
78
|
+
.join(", ");
|
|
79
|
+
let revision_query = DEFAULT_QUERY;
|
|
80
|
+
const expression = (_e = (_d = (_c = opts.model.psm) === null || _c === void 0 ? void 0 : _c.backup) === null || _d === void 0 ? void 0 : _d.rev) === null || _e === void 0 ? void 0 : _e.expression;
|
|
81
|
+
if (((_h = (_g = (_f = opts.model.psm) === null || _f === void 0 ? void 0 : _f.backup) === null || _g === void 0 ? void 0 : _g.rev) === null || _h === void 0 ? void 0 : _h.from) === "query"
|
|
82
|
+
&& !!expression)
|
|
83
|
+
revision_query = expression;
|
|
84
|
+
else if (((_l = (_k = (_j = opts.model.psm) === null || _j === void 0 ? void 0 : _j.backup) === null || _k === void 0 ? void 0 : _k.rev) === null || _l === void 0 ? void 0 : _l.from) === "query:linked"
|
|
85
|
+
&& !!expression
|
|
86
|
+
&& !!((_o = (_m = opts.model.psm) === null || _m === void 0 ? void 0 : _m.query) === null || _o === void 0 ? void 0 : _o[expression]))
|
|
87
|
+
revision_query = (_q = (_p = opts.model.psm) === null || _p === void 0 ? void 0 : _p.query) === null || _q === void 0 ? void 0 : _q[expression];
|
|
88
|
+
else if (((_t = (_s = (_r = opts.model.psm) === null || _r === void 0 ? void 0 : _r.backup) === null || _s === void 0 ? void 0 : _s.rev) === null || _t === void 0 ? void 0 : _t.from) === "model" && !!expression) {
|
|
89
|
+
let model = opts.parser.models.find(value => value.model === expression);
|
|
90
|
+
if (!!model)
|
|
91
|
+
revision_query = `select * from ${(0, escape_1.oid)(model.schema || "public")}.${(0, escape_1.oid)(model.dbName || model.name)}`;
|
|
92
|
+
}
|
|
93
|
+
const sys = (0, escape_1.oid)(opts.parser.sys);
|
|
94
|
+
let revision = "null";
|
|
95
|
+
const relation = `${schema}.${table}`;
|
|
96
|
+
if ((_w = (_v = (_u = opts.model.psm) === null || _u === void 0 ? void 0 : _u.backup) === null || _v === void 0 ? void 0 : _v.rev) === null || _w === void 0 ? void 0 : _w.version)
|
|
97
|
+
revision = (0, escape_1.val)((_y = (_x = opts.model.psm) === null || _x === void 0 ? void 0 : _x.backup) === null || _y === void 0 ? void 0 : _y.rev.version);
|
|
98
|
+
let always_query = DEFAULT_QUERY;
|
|
99
|
+
let always_resolver = DEFAULT_RESOLVER;
|
|
100
|
+
if (((_1 = (_0 = (_z = opts.model.psm) === null || _z === void 0 ? void 0 : _z.backup) === null || _0 === void 0 ? void 0 : _0.rev) === null || _1 === void 0 ? void 0 : _1.apply) === "ALWAYS" && !!revision_query && !!revision_resolver) {
|
|
101
|
+
always_query = revision_query;
|
|
102
|
+
always_resolver = revision_resolver;
|
|
103
|
+
revision = `always-${opts.parser.migration}`;
|
|
104
|
+
}
|
|
105
|
+
const next = `
|
|
106
|
+
do $$
|
|
107
|
+
declare
|
|
108
|
+
_revision character varying := ${revision}::character varying;
|
|
109
|
+
_relation character varying := ${(0, escape_1.val)(relation)}::character varying;
|
|
110
|
+
begin
|
|
111
|
+
if _revision is not null and not exists(
|
|
112
|
+
select 1
|
|
113
|
+
from ${sys}.revision r
|
|
114
|
+
where r.revision = _revision
|
|
115
|
+
and operation = 'restore:data'
|
|
116
|
+
and relation = _relation
|
|
117
|
+
) then
|
|
118
|
+
with __restore as (
|
|
119
|
+
${revision_query}
|
|
120
|
+
) insert into ${shadow}.${temp} (${columns})
|
|
121
|
+
select
|
|
122
|
+
${revision_resolver}
|
|
123
|
+
from __restore r;
|
|
124
|
+
elsif _revision is null then
|
|
125
|
+
with __restore as (
|
|
126
|
+
${always_query}
|
|
127
|
+
) insert into ${shadow}.${temp} (${columns})
|
|
128
|
+
select
|
|
129
|
+
${always_resolver}
|
|
130
|
+
from __restore r;
|
|
131
|
+
else
|
|
132
|
+
raise exception 'cannot restore revision';
|
|
133
|
+
end if;
|
|
134
|
+
|
|
135
|
+
${(0, sys_1.createRevision)(opts.parser, {
|
|
136
|
+
revision: (_4 = (_3 = (_2 = opts.model.psm) === null || _2 === void 0 ? void 0 : _2.backup) === null || _3 === void 0 ? void 0 : _3.rev) === null || _4 === void 0 ? void 0 : _4.version,
|
|
137
|
+
relation: relation,
|
|
138
|
+
hash: (0, sha_1.migrationHash)(opts.parser.migration, `restore:data-${relation}`),
|
|
139
|
+
operation: `restore:data-${relation}`
|
|
140
|
+
}).join("\n")}
|
|
141
|
+
end;
|
|
142
|
+
$$;
|
|
143
|
+
`.split("\n")
|
|
144
|
+
.filter(value => !!value)
|
|
145
|
+
.map(value => {
|
|
146
|
+
if (value.startsWith(" "))
|
|
147
|
+
return value.substring(" ".length);
|
|
148
|
+
return value;
|
|
149
|
+
})
|
|
150
|
+
.join("\n");
|
|
151
|
+
return [
|
|
152
|
+
(0, notice_1.notice)(`CREATE BACKUP FOR MODEL ${opts.model.model}`),
|
|
153
|
+
next,
|
|
154
|
+
(0, notice_1.notice)(`CREATE BACKUP FOR MODEL ${opts.model.model} OK`),
|
|
155
|
+
];
|
|
156
|
+
}
|
|
157
|
+
function restoreSerialSQL(opts) {
|
|
158
|
+
let seq = "null";
|
|
159
|
+
if (!!opts.seq)
|
|
160
|
+
seq = (0, escape_1.val)(opts.seq);
|
|
161
|
+
const args = [
|
|
162
|
+
` schema := ${(0, escape_1.val)(opts.model.schema)}::character varying`,
|
|
163
|
+
` source := ${(0, escape_1.val)(opts.source)}::character varying`,
|
|
164
|
+
` shadow := ${(0, escape_1.val)(opts.parser.shadow)}::character varying`,
|
|
165
|
+
` temp := ${(0, escape_1.val)(opts.model.temp)}::character varying`,
|
|
166
|
+
` "from" := ${(0, escape_1.val)(opts.from)}::character varying`,
|
|
167
|
+
` "to" := ${(0, escape_1.val)(opts.to)}::character varying`,
|
|
168
|
+
` "seq" := ${seq}::character varying`,
|
|
169
|
+
];
|
|
170
|
+
return [
|
|
171
|
+
(0, notice_1.notice)(`RESTORE SEQUENCE OF FIELD ${opts.to} FROM MODEL ${opts.model.model}`),
|
|
172
|
+
`select * from ${(0, escape_1.oid)(opts.parser.sys)}.restore_serial(\n ${args.join(",\n ")}\n);`,
|
|
173
|
+
(0, notice_1.notice)(`RESTORE SEQUENCE OF FIELD ${opts.to} FROM MODEL ${opts.model.model} OK`),
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import {FieldOption, ModelOptions} from "@prisma-psm/core";
|
|
2
|
+
import {oid, val} from "../../utils/escape";
|
|
3
|
+
import { noTab } from "../../utils/tabs";
|
|
4
|
+
import { PostgresParserOptions } from "../def";
|
|
5
|
+
import {createRevision} from "../sys";
|
|
6
|
+
import {migrationHash} from "../../utils/sha";
|
|
7
|
+
import {notice} from "../notice";
|
|
8
|
+
|
|
9
|
+
export function createFunctionRestoreSerial( opts: PostgresParserOptions) {
|
|
10
|
+
const sys = oid( opts.sys);
|
|
11
|
+
const tab = " "
|
|
12
|
+
return noTab([
|
|
13
|
+
`create or replace function ${sys}.restore_serial(
|
|
14
|
+
schema character varying,
|
|
15
|
+
source character varying,
|
|
16
|
+
shadow character varying,
|
|
17
|
+
temp character varying,
|
|
18
|
+
"from" character varying,
|
|
19
|
+
"to" character varying,
|
|
20
|
+
"seq" character varying
|
|
21
|
+
) returns table( sequence character varying, counts int8 )
|
|
22
|
+
language plpgsql as $$
|
|
23
|
+
declare
|
|
24
|
+
begin
|
|
25
|
+
if exists(
|
|
26
|
+
select *
|
|
27
|
+
from pg_tables t
|
|
28
|
+
where t.schemaname = schema
|
|
29
|
+
and t.tablename = source
|
|
30
|
+
) then
|
|
31
|
+
execute format( $statment$
|
|
32
|
+
select max( %I ) from %I.%I
|
|
33
|
+
$statment$, "from", schema, source )
|
|
34
|
+
into counts;
|
|
35
|
+
|
|
36
|
+
counts := coalesce( counts, 0 )+1;
|
|
37
|
+
-- example district_id_seq
|
|
38
|
+
sequence := coalesce( seq, format( '%I.%I', shadow, format( '%s_%s_seq', temp, "to" ) ) );
|
|
39
|
+
perform setval( sequence::regclass, counts, false );
|
|
40
|
+
end if;
|
|
41
|
+
return next;
|
|
42
|
+
end;
|
|
43
|
+
$$;`
|
|
44
|
+
], tab );
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
export interface RestoreOptions{
|
|
49
|
+
source:string
|
|
50
|
+
model:ModelOptions,
|
|
51
|
+
parser:PostgresParserOptions
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function restoreBackupSQL(opts:RestoreOptions ): string[] {
|
|
55
|
+
const schema = oid(opts.model.schema);
|
|
56
|
+
const source = oid(opts.source);
|
|
57
|
+
const shadow = oid(opts.parser.shadow);
|
|
58
|
+
const table = oid(opts.model.name);
|
|
59
|
+
const temp = oid(opts.model.temp);
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
if( opts.model.psm?.backup?.skip ) return null as any;
|
|
65
|
+
|
|
66
|
+
let filter = ( field:FieldOption)=>{
|
|
67
|
+
return !field.isGenerated
|
|
68
|
+
&& field.kind === "scalar"
|
|
69
|
+
;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const columns = opts.model.fields.filter( filter )
|
|
73
|
+
.map( value => ` ${oid(value.name)}` )
|
|
74
|
+
.join(", ")
|
|
75
|
+
;
|
|
76
|
+
|
|
77
|
+
const DEFAULT_QUERY = `select * from ${schema}.${source}`;
|
|
78
|
+
const DEFAULT_RESOLVER = opts.model.fields.filter( filter )
|
|
79
|
+
.map( value => {
|
|
80
|
+
return ` ${oid(value.dbName||value.name)}`;
|
|
81
|
+
})
|
|
82
|
+
.join(", ")
|
|
83
|
+
;
|
|
84
|
+
|
|
85
|
+
const revision_resolver = opts.model.fields.filter( filter )
|
|
86
|
+
.map( field => {
|
|
87
|
+
|
|
88
|
+
let expression = field.psm?.restore?.expression;
|
|
89
|
+
if( !expression ) expression = ` ${oid(field.dbName||field.name)}`;
|
|
90
|
+
return expression;
|
|
91
|
+
})
|
|
92
|
+
.join(", ")
|
|
93
|
+
;
|
|
94
|
+
|
|
95
|
+
let revision_query = DEFAULT_QUERY;
|
|
96
|
+
const expression = opts.model.psm?.backup?.rev?.expression;
|
|
97
|
+
if( opts.model.psm?.backup?.rev?.from === "query"
|
|
98
|
+
&& !!expression
|
|
99
|
+
) revision_query = expression
|
|
100
|
+
|
|
101
|
+
else if( opts.model.psm?.backup?.rev?.from === "query:linked"
|
|
102
|
+
&& !!expression
|
|
103
|
+
&& !!opts.model.psm?.query?.[expression]
|
|
104
|
+
) revision_query = opts.model.psm?.query?.[expression]
|
|
105
|
+
|
|
106
|
+
else if( opts.model.psm?.backup?.rev?.from === "model" && !!expression ){
|
|
107
|
+
let model = opts.parser.models.find( value => value.model === expression );
|
|
108
|
+
if( !!model ) revision_query = `select * from ${oid(model.schema||"public")}.${oid(model.dbName||model.name)}`
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const sys = oid( opts.parser.sys );
|
|
112
|
+
let revision= "null";
|
|
113
|
+
const relation = `${schema}.${table}`;
|
|
114
|
+
if( opts.model.psm?.backup?.rev?.version ) revision = val( opts.model.psm?.backup?.rev.version );
|
|
115
|
+
|
|
116
|
+
let always_query = DEFAULT_QUERY;
|
|
117
|
+
let always_resolver = DEFAULT_RESOLVER;
|
|
118
|
+
if( opts.model.psm?.backup?.rev?.apply === "ALWAYS" && !!revision_query && !!revision_resolver) {
|
|
119
|
+
always_query = revision_query;
|
|
120
|
+
always_resolver = revision_resolver;
|
|
121
|
+
revision = `always-${opts.parser.migration}`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const next = `
|
|
125
|
+
do $$
|
|
126
|
+
declare
|
|
127
|
+
_revision character varying := ${revision}::character varying;
|
|
128
|
+
_relation character varying := ${val(relation)}::character varying;
|
|
129
|
+
begin
|
|
130
|
+
if _revision is not null and not exists(
|
|
131
|
+
select 1
|
|
132
|
+
from ${sys}.revision r
|
|
133
|
+
where r.revision = _revision
|
|
134
|
+
and operation = 'restore:data'
|
|
135
|
+
and relation = _relation
|
|
136
|
+
) then
|
|
137
|
+
with __restore as (
|
|
138
|
+
${revision_query}
|
|
139
|
+
) insert into ${shadow}.${temp} (${ columns })
|
|
140
|
+
select
|
|
141
|
+
${revision_resolver}
|
|
142
|
+
from __restore r;
|
|
143
|
+
elsif _revision is null then
|
|
144
|
+
with __restore as (
|
|
145
|
+
${always_query}
|
|
146
|
+
) insert into ${shadow}.${temp} (${ columns })
|
|
147
|
+
select
|
|
148
|
+
${always_resolver}
|
|
149
|
+
from __restore r;
|
|
150
|
+
else
|
|
151
|
+
raise exception 'cannot restore revision';
|
|
152
|
+
end if;
|
|
153
|
+
|
|
154
|
+
${ createRevision( opts.parser, {
|
|
155
|
+
revision: opts.model.psm?.backup?.rev?.version,
|
|
156
|
+
relation: relation,
|
|
157
|
+
hash: migrationHash( opts.parser.migration, `restore:data-${relation}`),
|
|
158
|
+
operation: `restore:data-${relation}`
|
|
159
|
+
}).join("\n")}
|
|
160
|
+
end;
|
|
161
|
+
$$;
|
|
162
|
+
`.split("\n")
|
|
163
|
+
.filter( value => !!value )
|
|
164
|
+
.map( value => {
|
|
165
|
+
if( value.startsWith(" ") ) return value.substring(" ".length)
|
|
166
|
+
return value;
|
|
167
|
+
})
|
|
168
|
+
.join("\n");
|
|
169
|
+
|
|
170
|
+
return [
|
|
171
|
+
notice( `CREATE BACKUP FOR MODEL ${opts.model.model}` ),
|
|
172
|
+
next,
|
|
173
|
+
notice( `CREATE BACKUP FOR MODEL ${opts.model.model} OK` ),
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface RestoreSerialOptions extends RestoreOptions {
|
|
178
|
+
from:string
|
|
179
|
+
to:string
|
|
180
|
+
seq?:string
|
|
181
|
+
}
|
|
182
|
+
export function restoreSerialSQL( opts:RestoreSerialOptions) {
|
|
183
|
+
let seq = "null";
|
|
184
|
+
if( !!opts.seq ) seq = val( opts.seq );
|
|
185
|
+
const args = [
|
|
186
|
+
` schema := ${val(opts.model.schema)}::character varying`,
|
|
187
|
+
` source := ${val(opts.source)}::character varying`,
|
|
188
|
+
` shadow := ${val(opts.parser.shadow)}::character varying`,
|
|
189
|
+
` temp := ${val(opts.model.temp)}::character varying`,
|
|
190
|
+
` "from" := ${val(opts.from)}::character varying`,
|
|
191
|
+
` "to" := ${val(opts.to)}::character varying`,
|
|
192
|
+
` "seq" := ${seq}::character varying`,
|
|
193
|
+
];
|
|
194
|
+
return [
|
|
195
|
+
notice( `RESTORE SEQUENCE OF FIELD ${opts.to} FROM MODEL ${opts.model.model}`),
|
|
196
|
+
`select * from ${oid(opts.parser.sys)}.restore_serial(\n ${args.join(",\n ")}\n);`,
|
|
197
|
+
notice( `RESTORE SEQUENCE OF FIELD ${opts.to} FROM MODEL ${opts.model.model} OK`),
|
|
198
|
+
];
|
|
199
|
+
|
|
200
|
+
}
|
|
201
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ModelOptions } from "@prisma-psm/core";
|
|
2
|
+
import { PostgresParserOptions } from "../def";
|
|
3
|
+
export declare function backupParser(model: ModelOptions, parser: PostgresParserOptions): {
|
|
4
|
+
restore_backup: () => string[];
|
|
5
|
+
restore_serial: () => string[];
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAC,qBAAqB,EAAC,MAAM,QAAQ,CAAC;AAI7C,wBAAgB,YAAY,CAAE,KAAK,EAAC,YAAY,EAAE,MAAM,EAAC,qBAAqB;;;EAwB7E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.backupParser = backupParser;
|
|
4
|
+
const engine_1 = require("./engine");
|
|
5
|
+
const field_1 = require("../table/field");
|
|
6
|
+
function backupParser(model, parser) {
|
|
7
|
+
const fieldSQL = model.fields.map(field_1.fieldParser);
|
|
8
|
+
return {
|
|
9
|
+
restore_backup: () => (0, engine_1.restoreBackupSQL)({
|
|
10
|
+
source: model.name,
|
|
11
|
+
model: model,
|
|
12
|
+
parser: parser,
|
|
13
|
+
}),
|
|
14
|
+
restore_serial: () => {
|
|
15
|
+
const sequences = [];
|
|
16
|
+
fieldSQL.filter(f => f.serial).map(f => (0, engine_1.restoreSerialSQL)({
|
|
17
|
+
source: model.name,
|
|
18
|
+
parser: parser,
|
|
19
|
+
model: model,
|
|
20
|
+
from: f.name,
|
|
21
|
+
to: f.name,
|
|
22
|
+
})).forEach(value => {
|
|
23
|
+
sequences.push(...value);
|
|
24
|
+
});
|
|
25
|
+
return sequences;
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;AAKA,oCAwBC;AA3BD,qCAA4D;AAC5D,0CAA2C;AAE3C,SAAgB,YAAY,CAAE,KAAkB,EAAE,MAA4B;IAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAW,CAAC,CAAC;IAE/C,OAAO;QACH,cAAc,EAAE,GAAG,EAAE,CAAC,IAAA,yBAAgB,EAAC;YACnC,MAAM,EAAE,KAAK,CAAC,IAAI;YAClB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,MAAM;SACjB,CAAC;QACF,cAAc,EAAE,GAAG,EAAE;YACjB,MAAM,SAAS,GAAY,EAAE,CAAC;YAE9B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,IAAA,yBAAgB,EAAC;gBACtD,MAAM,EAAE,KAAK,CAAC,IAAI;gBAClB,MAAM,EAAE,MAAM;gBACd,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,EAAE,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC,CAAC,OAAO,CAAE,KAAK,CAAC,EAAE;gBACjB,SAAS,CAAC,IAAI,CAAE,GAAG,KAAK,CAAE,CAAC;YAC/B,CAAC,CAAC,CAAC;YACH,OAAO,SAAS,CAAC;QACrB,CAAC;KACJ,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {ModelOptions} from "@prisma-psm/core";
|
|
2
|
+
import {PostgresParserOptions} from "../def";
|
|
3
|
+
import {restoreBackupSQL, restoreSerialSQL} from "./engine";
|
|
4
|
+
import {fieldParser} from "../table/field";
|
|
5
|
+
|
|
6
|
+
export function backupParser( model:ModelOptions, parser:PostgresParserOptions ){
|
|
7
|
+
const fieldSQL = model.fields.map(fieldParser);
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
restore_backup: () => restoreBackupSQL({
|
|
11
|
+
source: model.name,
|
|
12
|
+
model: model,
|
|
13
|
+
parser: parser,
|
|
14
|
+
}),
|
|
15
|
+
restore_serial: () => {
|
|
16
|
+
const sequences:string[] = [];
|
|
17
|
+
|
|
18
|
+
fieldSQL.filter(f => f.serial).map(f => restoreSerialSQL({
|
|
19
|
+
source: model.name,
|
|
20
|
+
parser: parser,
|
|
21
|
+
model: model,
|
|
22
|
+
from: f.name,
|
|
23
|
+
to: f.name,
|
|
24
|
+
})).forEach( value => {
|
|
25
|
+
sequences.push( ...value );
|
|
26
|
+
});
|
|
27
|
+
return sequences;
|
|
28
|
+
},
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PostgresParserOptions } from "./def";
|
|
2
|
+
import { ModelOptions } from "@prisma-psm/core";
|
|
3
|
+
export type ConstraintsOptions = {
|
|
4
|
+
model: ModelOptions;
|
|
5
|
+
name: string;
|
|
6
|
+
key: "primary" | "foreign" | "unique" | "check" | "index";
|
|
7
|
+
fields?: string[];
|
|
8
|
+
refModel?: string;
|
|
9
|
+
algorithm?: string;
|
|
10
|
+
refModelSchema?: string;
|
|
11
|
+
refFields?: string[];
|
|
12
|
+
parser: PostgresParserOptions;
|
|
13
|
+
};
|
|
14
|
+
export declare function constraintsParser(model: ModelOptions, parser: PostgresParserOptions): {
|
|
15
|
+
create_primary_keys: () => string[];
|
|
16
|
+
drop_primary_keys: () => string[];
|
|
17
|
+
create_foreign_key: () => string[];
|
|
18
|
+
drop_foreign_key: () => string[];
|
|
19
|
+
create_unique_key: () => string[];
|
|
20
|
+
drop_unique_key: () => string[];
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=constraint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint.d.ts","sourceRoot":"","sources":["constraint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAG9C,MAAM,MAAM,kBAAkB,GAAG;IAC7B,KAAK,EAAC,YAAY,CAAC;IACnB,IAAI,EAAC,MAAM,CAAA;IACX,GAAG,EAAE,SAAS,GAAC,SAAS,GAAC,QAAQ,GAAC,OAAO,GAAC,OAAO,CAAC;IAClD,MAAM,CAAC,EAAC,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAC,MAAM,CAAA;IAChB,SAAS,CAAC,EAAC,MAAM,CAAA;IACjB,cAAc,CAAC,EAAC,MAAM,CAAA;IACtB,SAAS,CAAC,EAAC,MAAM,EAAE,CAAC;IACpB,MAAM,EAAC,qBAAqB,CAAA;CAC/B,CAAA;AAqCD,wBAAgB,iBAAiB,CAAE,KAAK,EAAC,YAAY,EAAE,MAAM,EAAC,qBAAqB;;;;;;;EA4GlF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.constraintsParser = constraintsParser;
|
|
4
|
+
const escape_1 = require("../utils/escape");
|
|
5
|
+
const notice_1 = require("./notice");
|
|
6
|
+
function resolver(parser, opts) {
|
|
7
|
+
var _a, _b;
|
|
8
|
+
const name = (0, escape_1.oid)(opts.name);
|
|
9
|
+
let refFields = "";
|
|
10
|
+
let fieldsId = "";
|
|
11
|
+
let refModel = "";
|
|
12
|
+
let refModelSchema = "";
|
|
13
|
+
if (!!((_a = opts.refFields) === null || _a === void 0 ? void 0 : _a.length))
|
|
14
|
+
refFields = opts.refFields.map(escape_1.oid).join(`, `);
|
|
15
|
+
if (!!((_b = opts.fields) === null || _b === void 0 ? void 0 : _b.length))
|
|
16
|
+
fieldsId = opts.fields.map(escape_1.oid).join(`, `);
|
|
17
|
+
if (!!opts.refModel)
|
|
18
|
+
refModel = (0, escape_1.oid)(opts.refModel);
|
|
19
|
+
if (!!opts.refModelSchema)
|
|
20
|
+
refModelSchema = (0, escape_1.oid)(opts.refModelSchema);
|
|
21
|
+
return {
|
|
22
|
+
create_primary: () => ([
|
|
23
|
+
(0, notice_1.notice)(`CREATE PRIMARY KEY ${name} OF MODEL ${opts.model.model}`),
|
|
24
|
+
`alter table if exists ${(0, escape_1.oid)(parser.shadow)}.${(0, escape_1.oid)(opts.model.temp)} add constraint ${name} primary key (${fieldsId});`,
|
|
25
|
+
(0, notice_1.notice)(`CREATE PRIMARY KEY ${name} OF MODEL ${opts.model.model} OK!`),
|
|
26
|
+
]),
|
|
27
|
+
create_foreign: () => ([
|
|
28
|
+
(0, notice_1.notice)(`CREATE FOREIGN KEY ${name} OF MODEL ${opts.model.model}`),
|
|
29
|
+
`alter table if exists ${(0, escape_1.oid)(parser.shadow)}.${(0, escape_1.oid)(opts.model.temp)} add constraint ${name} foreign key (${fieldsId}) references ${refModelSchema}.${refModel} ( ${refFields} );`,
|
|
30
|
+
(0, notice_1.notice)(`CREATE FOREIGN KEY ${name} OF MODEL ${opts.model.model} OK!`),
|
|
31
|
+
]),
|
|
32
|
+
create_unique: () => ([
|
|
33
|
+
(0, notice_1.notice)(`CREATE UNIQUE KEY ${name} OF MODEL ${opts.model.model}`),
|
|
34
|
+
`alter table if exists ${(0, escape_1.oid)(parser.shadow)}.${(0, escape_1.oid)(opts.model.temp)} add constraint ${name} unique (${fieldsId});`,
|
|
35
|
+
(0, notice_1.notice)(`CREATE UNIQUE KEY ${name} OF MODEL ${opts.model.model} OK!`),
|
|
36
|
+
]),
|
|
37
|
+
drop: () => ([
|
|
38
|
+
(0, notice_1.notice)(`DROP CONSTRAINT KEY ${name} OF MODEL ${opts.model.model}`),
|
|
39
|
+
`alter table if exists ${(0, escape_1.oid)(opts.model.schema)}.${(0, escape_1.oid)(opts.model.name)} drop constraint if exists ${name};`,
|
|
40
|
+
(0, notice_1.notice)(`DROP CONSTRAINT KEY ${name} OF MODEL ${opts.model.model} OK!`),
|
|
41
|
+
]),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function constraintsParser(model, parser) {
|
|
45
|
+
const primary = (() => {
|
|
46
|
+
var _a;
|
|
47
|
+
const index = model.indexes.find(value => value.type === "id");
|
|
48
|
+
if (!index)
|
|
49
|
+
return;
|
|
50
|
+
let localField = (_a = index.fields) === null || _a === void 0 ? void 0 : _a.map(next => {
|
|
51
|
+
const field = model.fields.find(value1 => value1.name === next.name);
|
|
52
|
+
if (!field)
|
|
53
|
+
return next.name;
|
|
54
|
+
return field.dbName || field.name;
|
|
55
|
+
});
|
|
56
|
+
let name = index.dbName || index.name;
|
|
57
|
+
if (!name)
|
|
58
|
+
name = `pk_${model.name}_${localField.join("_")}_by_prisma`;
|
|
59
|
+
return resolver(parser, {
|
|
60
|
+
key: "primary",
|
|
61
|
+
fields: localField,
|
|
62
|
+
name: name,
|
|
63
|
+
parser: parser,
|
|
64
|
+
model: model,
|
|
65
|
+
});
|
|
66
|
+
})();
|
|
67
|
+
const unique = model.indexes.filter(field => {
|
|
68
|
+
return field.type === "unique";
|
|
69
|
+
}).map(index => {
|
|
70
|
+
var _a;
|
|
71
|
+
let localField = (_a = index.fields) === null || _a === void 0 ? void 0 : _a.map(next => {
|
|
72
|
+
const field = model.fields.find(value1 => value1.name === next.name);
|
|
73
|
+
if (!field)
|
|
74
|
+
return next.name;
|
|
75
|
+
return field.dbName || field.name;
|
|
76
|
+
});
|
|
77
|
+
let name = index.dbName || index.name;
|
|
78
|
+
if (!name)
|
|
79
|
+
name = `uk_${model.name}_${localField.join("_")}_by_prisma`;
|
|
80
|
+
return resolver(parser, {
|
|
81
|
+
key: "unique",
|
|
82
|
+
fields: localField,
|
|
83
|
+
name: name,
|
|
84
|
+
parser: parser,
|
|
85
|
+
model: model
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
const foreign = model.fields.filter(field => {
|
|
89
|
+
var _a, _b;
|
|
90
|
+
return field.kind === "object"
|
|
91
|
+
&& !!field.relationName
|
|
92
|
+
&& ((_a = field.relationFromFields) === null || _a === void 0 ? void 0 : _a.length)
|
|
93
|
+
&& ((_b = field.relationToFields) === null || _b === void 0 ? void 0 : _b.length);
|
|
94
|
+
}).map(next => {
|
|
95
|
+
var _a, _b, _c;
|
|
96
|
+
let localField = (_a = next.relationFromFields) === null || _a === void 0 ? void 0 : _a.map(name => {
|
|
97
|
+
const field = model.fields.find(value1 => value1.name === name);
|
|
98
|
+
if (!field)
|
|
99
|
+
return name;
|
|
100
|
+
return field.dbName || field.name;
|
|
101
|
+
});
|
|
102
|
+
let reference = parser.models.find(value => value.model === next.type);
|
|
103
|
+
if ((_b = reference === null || reference === void 0 ? void 0 : reference.psm) === null || _b === void 0 ? void 0 : _b.view)
|
|
104
|
+
return null;
|
|
105
|
+
let referenceField = (_c = next.relationToFields) === null || _c === void 0 ? void 0 : _c.map(name => {
|
|
106
|
+
if (!reference)
|
|
107
|
+
return name;
|
|
108
|
+
const field = reference.fields.find(value1 => value1.name === name);
|
|
109
|
+
if (!field)
|
|
110
|
+
return name;
|
|
111
|
+
return field.dbName || field.name;
|
|
112
|
+
});
|
|
113
|
+
let name = next.relationName;
|
|
114
|
+
let ref = reference === null || reference === void 0 ? void 0 : reference.name;
|
|
115
|
+
if (!name)
|
|
116
|
+
name = `fk_${model.name}_${referenceField === null || referenceField === void 0 ? void 0 : referenceField.join("_")}_to_${ref}_by_prisma`;
|
|
117
|
+
return resolver(parser, {
|
|
118
|
+
key: "foreign",
|
|
119
|
+
fields: localField,
|
|
120
|
+
name: name,
|
|
121
|
+
refModel: ref,
|
|
122
|
+
refFields: referenceField,
|
|
123
|
+
refModelSchema: (reference === null || reference === void 0 ? void 0 : reference.schema) || "public",
|
|
124
|
+
parser: parser,
|
|
125
|
+
model: model,
|
|
126
|
+
});
|
|
127
|
+
}).filter(value => !!value);
|
|
128
|
+
const maps = (list, key) => {
|
|
129
|
+
const fk = [];
|
|
130
|
+
if (!list)
|
|
131
|
+
return [];
|
|
132
|
+
list.forEach(value => {
|
|
133
|
+
if (!value)
|
|
134
|
+
return;
|
|
135
|
+
fk.push(...value === null || value === void 0 ? void 0 : value[key]());
|
|
136
|
+
});
|
|
137
|
+
return fk;
|
|
138
|
+
};
|
|
139
|
+
return {
|
|
140
|
+
create_primary_keys: () => {
|
|
141
|
+
return maps([primary], "create_primary");
|
|
142
|
+
},
|
|
143
|
+
drop_primary_keys: () => {
|
|
144
|
+
return maps([primary], "drop");
|
|
145
|
+
},
|
|
146
|
+
create_foreign_key: () => {
|
|
147
|
+
return maps(foreign, "create_foreign");
|
|
148
|
+
},
|
|
149
|
+
drop_foreign_key: () => {
|
|
150
|
+
return maps(foreign, "drop");
|
|
151
|
+
},
|
|
152
|
+
create_unique_key: () => {
|
|
153
|
+
return maps(unique, "create_unique");
|
|
154
|
+
},
|
|
155
|
+
drop_unique_key: () => {
|
|
156
|
+
return maps(unique, "drop");
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=constraint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint.js","sourceRoot":"","sources":["constraint.ts"],"names":[],"mappings":"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"}
|