Skip to content

Commit 7ca34d8

Browse files
authored
Fix postgres import when alter expr isnt iterable (#495)
* Fix postgres import when alter expr isnt interable * Remove hardcoded constants * Fix type export and import
1 parent b974a7d commit 7ca34d8

File tree

2 files changed

+80
-68
lines changed

2 files changed

+80
-68
lines changed

src/utils/exportSQL/generic.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export function getTypeString(
8585
if (field.type === "DATETIME") {
8686
return `timestamp`;
8787
}
88-
if (dbToTypes[currentDb][field.type].isSized) {
88+
if (dbToTypes[currentDb][field.type].isSized && field.size) {
8989
const type =
9090
field.type === "BINARY"
9191
? "bit"
@@ -94,7 +94,11 @@ export function getTypeString(
9494
: field.type.toLowerCase();
9595
return `${type}(${field.size})`;
9696
}
97-
if (dbToTypes[currentDb][field.type].hasPrecision && field.size !== "") {
97+
if (
98+
dbToTypes[currentDb][field.type].hasPrecision &&
99+
field.size &&
100+
field.size.trim() !== ""
101+
) {
98102
return `${field.type.toLowerCase()}${field.size ? `(${field.size})` : ""}`;
99103
}
100104
return field.type.toLowerCase();

src/utils/importSQL/postgres.js

Lines changed: 74 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { nanoid } from "nanoid";
2-
import { Cardinality, DB } from "../../data/constants";
2+
import { Cardinality, Constraint, DB } from "../../data/constants";
33
import { dbToTypes } from "../../data/datatypes";
44
import { buildSQLFromAST } from "./shared";
55

@@ -13,6 +13,7 @@ const affinity = {
1313
INTEGER: "INT",
1414
MEDIUMINT: "INTEGER",
1515
BIT: "BOOLEAN",
16+
"CHATACTER VARYING": "VARCHAR",
1617
},
1718
{ get: (target, prop) => (prop in target ? target[prop] : "BLOB") },
1819
),
@@ -50,8 +51,11 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
5051
d.definition.dataType,
5152
),
5253
)?.name;
53-
if (!type && !dbToTypes[diagramDb][d.definition.dataType])
54-
type = affinity[diagramDb][d.definition.dataType.toUpperCase()];
54+
55+
type ??=
56+
dbToTypes[diagramDb][d.definition.dataType.toUpperCase()].type;
57+
type ??= affinity[diagramDb][d.definition.dataType.toUpperCase()];
58+
5559
field.type = type;
5660

5761
if (d.definition.expr && d.definition.expr.type === "expr_list") {
@@ -144,8 +148,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
144148
relationship.endTableId = endTable.id;
145149
relationship.endFieldId = endField.id;
146150
relationship.startFieldId = startField.id;
147-
let updateConstraint = "No action";
148-
let deleteConstraint = "No action";
151+
let updateConstraint = Constraint.NONE;
152+
let deleteConstraint = Constraint.NONE;
149153
d.reference_definition.on_action.forEach((c) => {
150154
if (c.type === "on update") {
151155
updateConstraint = c.value.value;
@@ -178,8 +182,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
178182
const endTableName = d.reference_definition.table[0].table;
179183
const endFieldName =
180184
d.reference_definition.definition[0].column.expr.value;
181-
let updateConstraint = "No action";
182-
let deleteConstraint = "No action";
185+
let updateConstraint = Constraint.NONE;
186+
let deleteConstraint = Constraint.NONE;
183187
d.reference_definition.on_action.forEach((c) => {
184188
if (c.type === "on update") {
185189
updateConstraint = c.value.value;
@@ -281,73 +285,77 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) {
281285
}
282286
}
283287
} else if (e.type === "alter") {
284-
e.expr.forEach((expr) => {
285-
if (
286-
expr.action === "add" &&
287-
expr.create_definitions.constraint_type.toLowerCase() ===
288-
"foreign key"
289-
) {
290-
const relationship = {};
291-
const startTableName = e.table[0].table;
292-
const startFieldName =
293-
expr.create_definitions.definition[0].column.expr.value;
294-
const endTableName =
295-
expr.create_definitions.reference_definition.table[0].table;
296-
const endFieldName =
297-
expr.create_definitions.reference_definition.definition[0].column
298-
.expr.value;
299-
let updateConstraint = "No action";
300-
let deleteConstraint = "No action";
301-
expr.create_definitions.reference_definition.on_action.forEach(
302-
(c) => {
303-
if (c.type === "on update") {
304-
updateConstraint = c.value.value;
305-
updateConstraint =
306-
updateConstraint[0].toUpperCase() +
307-
updateConstraint.substring(1);
308-
} else if (c.type === "on delete") {
309-
deleteConstraint = c.value.value;
310-
deleteConstraint =
311-
deleteConstraint[0].toUpperCase() +
312-
deleteConstraint.substring(1);
313-
}
314-
},
315-
);
316-
317-
const startTable = tables.find((t) => t.name === startTableName);
318-
if (!startTable) return;
288+
if (Array.isArray(e.expr)) {
289+
e.expr.forEach((expr) => {
290+
if (
291+
expr.action === "add" &&
292+
expr.create_definitions.constraint_type.toLowerCase() ===
293+
"foreign key"
294+
) {
295+
const relationship = {};
296+
const startTableName = e.table[0].table;
297+
const startFieldName =
298+
expr.create_definitions.definition[0].column.expr.value;
299+
const endTableName =
300+
expr.create_definitions.reference_definition.table[0].table;
301+
const endFieldName =
302+
expr.create_definitions.reference_definition.definition[0].column
303+
.expr.value;
304+
let updateConstraint = Constraint.NONE;
305+
let deleteConstraint = Constraint.NONE;
306+
expr.create_definitions.reference_definition.on_action.forEach(
307+
(c) => {
308+
if (c.type === "on update") {
309+
updateConstraint = c.value.value;
310+
updateConstraint =
311+
updateConstraint[0].toUpperCase() +
312+
updateConstraint.substring(1);
313+
} else if (c.type === "on delete") {
314+
deleteConstraint = c.value.value;
315+
deleteConstraint =
316+
deleteConstraint[0].toUpperCase() +
317+
deleteConstraint.substring(1);
318+
}
319+
},
320+
);
319321

320-
const endTable = tables.find((t) => t.name === endTableName);
321-
if (!endTable) return;
322+
const startTable = tables.find((t) => t.name === startTableName);
323+
if (!startTable) return;
322324

323-
const endField = endTable.fields.find((f) => f.name === endFieldName);
324-
if (!endField) return;
325+
const endTable = tables.find((t) => t.name === endTableName);
326+
if (!endTable) return;
325327

326-
const startField = startTable.fields.find(
327-
(f) => f.name === startFieldName,
328-
);
329-
if (!startField) return;
328+
const endField = endTable.fields.find(
329+
(f) => f.name === endFieldName,
330+
);
331+
if (!endField) return;
330332

331-
relationship.name = `fk_${startTableName}_${startFieldName}_${endTableName}`;
332-
relationship.startTableId = startTable.id;
333-
relationship.startFieldId = startField.id;
334-
relationship.endTableId = endTable.id;
335-
relationship.endFieldId = endField.id;
336-
relationship.updateConstraint = updateConstraint;
337-
relationship.deleteConstraint = deleteConstraint;
338-
relationship.cardinality = Cardinality.ONE_TO_ONE;
333+
const startField = startTable.fields.find(
334+
(f) => f.name === startFieldName,
335+
);
336+
if (!startField) return;
339337

340-
if (startField.unique) {
338+
relationship.name = `fk_${startTableName}_${startFieldName}_${endTableName}`;
339+
relationship.startTableId = startTable.id;
340+
relationship.startFieldId = startField.id;
341+
relationship.endTableId = endTable.id;
342+
relationship.endFieldId = endField.id;
343+
relationship.updateConstraint = updateConstraint;
344+
relationship.deleteConstraint = deleteConstraint;
341345
relationship.cardinality = Cardinality.ONE_TO_ONE;
342-
} else {
343-
relationship.cardinality = Cardinality.MANY_TO_ONE;
344-
}
345346

346-
relationships.push(relationship);
347+
if (startField.unique) {
348+
relationship.cardinality = Cardinality.ONE_TO_ONE;
349+
} else {
350+
relationship.cardinality = Cardinality.MANY_TO_ONE;
351+
}
347352

348-
relationships.forEach((r, i) => (r.id = i));
349-
}
350-
});
353+
relationships.push(relationship);
354+
355+
relationships.forEach((r, i) => (r.id = i));
356+
}
357+
});
358+
}
351359
}
352360
};
353361

0 commit comments

Comments
 (0)