diff --git a/src/utils/exportSQL/generic.js b/src/utils/exportSQL/generic.js index b86d99f..e9d5763 100644 --- a/src/utils/exportSQL/generic.js +++ b/src/utils/exportSQL/generic.js @@ -85,7 +85,7 @@ export function getTypeString( if (field.type === "DATETIME") { return `timestamp`; } - if (dbToTypes[currentDb][field.type].isSized) { + if (dbToTypes[currentDb][field.type].isSized && field.size) { const type = field.type === "BINARY" ? "bit" @@ -94,7 +94,11 @@ export function getTypeString( : field.type.toLowerCase(); return `${type}(${field.size})`; } - if (dbToTypes[currentDb][field.type].hasPrecision && field.size !== "") { + if ( + dbToTypes[currentDb][field.type].hasPrecision && + field.size && + field.size.trim() !== "" + ) { return `${field.type.toLowerCase()}${field.size ? `(${field.size})` : ""}`; } return field.type.toLowerCase(); diff --git a/src/utils/importSQL/postgres.js b/src/utils/importSQL/postgres.js index 5798725..a375171 100644 --- a/src/utils/importSQL/postgres.js +++ b/src/utils/importSQL/postgres.js @@ -1,5 +1,5 @@ import { nanoid } from "nanoid"; -import { Cardinality, DB } from "../../data/constants"; +import { Cardinality, Constraint, DB } from "../../data/constants"; import { dbToTypes } from "../../data/datatypes"; import { buildSQLFromAST } from "./shared"; @@ -13,6 +13,7 @@ const affinity = { INTEGER: "INT", MEDIUMINT: "INTEGER", BIT: "BOOLEAN", + "CHATACTER VARYING": "VARCHAR", }, { get: (target, prop) => (prop in target ? target[prop] : "BLOB") }, ), @@ -50,8 +51,11 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) { d.definition.dataType, ), )?.name; - if (!type && !dbToTypes[diagramDb][d.definition.dataType]) - type = affinity[diagramDb][d.definition.dataType.toUpperCase()]; + + type ??= + dbToTypes[diagramDb][d.definition.dataType.toUpperCase()].type; + type ??= affinity[diagramDb][d.definition.dataType.toUpperCase()]; + field.type = type; if (d.definition.expr && d.definition.expr.type === "expr_list") { @@ -144,8 +148,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) { relationship.endTableId = endTable.id; relationship.endFieldId = endField.id; relationship.startFieldId = startField.id; - let updateConstraint = "No action"; - let deleteConstraint = "No action"; + let updateConstraint = Constraint.NONE; + let deleteConstraint = Constraint.NONE; d.reference_definition.on_action.forEach((c) => { if (c.type === "on update") { updateConstraint = c.value.value; @@ -178,8 +182,8 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) { const endTableName = d.reference_definition.table[0].table; const endFieldName = d.reference_definition.definition[0].column.expr.value; - let updateConstraint = "No action"; - let deleteConstraint = "No action"; + let updateConstraint = Constraint.NONE; + let deleteConstraint = Constraint.NONE; d.reference_definition.on_action.forEach((c) => { if (c.type === "on update") { updateConstraint = c.value.value; @@ -281,73 +285,77 @@ export function fromPostgres(ast, diagramDb = DB.GENERIC) { } } } else if (e.type === "alter") { - e.expr.forEach((expr) => { - if ( - expr.action === "add" && - expr.create_definitions.constraint_type.toLowerCase() === - "foreign key" - ) { - const relationship = {}; - const startTableName = e.table[0].table; - const startFieldName = - expr.create_definitions.definition[0].column.expr.value; - const endTableName = - expr.create_definitions.reference_definition.table[0].table; - const endFieldName = - expr.create_definitions.reference_definition.definition[0].column - .expr.value; - let updateConstraint = "No action"; - let deleteConstraint = "No action"; - expr.create_definitions.reference_definition.on_action.forEach( - (c) => { - if (c.type === "on update") { - updateConstraint = c.value.value; - updateConstraint = - updateConstraint[0].toUpperCase() + - updateConstraint.substring(1); - } else if (c.type === "on delete") { - deleteConstraint = c.value.value; - deleteConstraint = - deleteConstraint[0].toUpperCase() + - deleteConstraint.substring(1); - } - }, - ); + if (Array.isArray(e.expr)) { + e.expr.forEach((expr) => { + if ( + expr.action === "add" && + expr.create_definitions.constraint_type.toLowerCase() === + "foreign key" + ) { + const relationship = {}; + const startTableName = e.table[0].table; + const startFieldName = + expr.create_definitions.definition[0].column.expr.value; + const endTableName = + expr.create_definitions.reference_definition.table[0].table; + const endFieldName = + expr.create_definitions.reference_definition.definition[0].column + .expr.value; + let updateConstraint = Constraint.NONE; + let deleteConstraint = Constraint.NONE; + expr.create_definitions.reference_definition.on_action.forEach( + (c) => { + if (c.type === "on update") { + updateConstraint = c.value.value; + updateConstraint = + updateConstraint[0].toUpperCase() + + updateConstraint.substring(1); + } else if (c.type === "on delete") { + deleteConstraint = c.value.value; + deleteConstraint = + deleteConstraint[0].toUpperCase() + + deleteConstraint.substring(1); + } + }, + ); - const startTable = tables.find((t) => t.name === startTableName); - if (!startTable) return; + const startTable = tables.find((t) => t.name === startTableName); + if (!startTable) return; - const endTable = tables.find((t) => t.name === endTableName); - if (!endTable) return; + const endTable = tables.find((t) => t.name === endTableName); + if (!endTable) return; - const endField = endTable.fields.find((f) => f.name === endFieldName); - if (!endField) return; + const endField = endTable.fields.find( + (f) => f.name === endFieldName, + ); + if (!endField) return; - const startField = startTable.fields.find( - (f) => f.name === startFieldName, - ); - if (!startField) return; + const startField = startTable.fields.find( + (f) => f.name === startFieldName, + ); + if (!startField) return; - relationship.name = `fk_${startTableName}_${startFieldName}_${endTableName}`; - relationship.startTableId = startTable.id; - relationship.startFieldId = startField.id; - relationship.endTableId = endTable.id; - relationship.endFieldId = endField.id; - relationship.updateConstraint = updateConstraint; - relationship.deleteConstraint = deleteConstraint; - relationship.cardinality = Cardinality.ONE_TO_ONE; - - if (startField.unique) { + relationship.name = `fk_${startTableName}_${startFieldName}_${endTableName}`; + relationship.startTableId = startTable.id; + relationship.startFieldId = startField.id; + relationship.endTableId = endTable.id; + relationship.endFieldId = endField.id; + relationship.updateConstraint = updateConstraint; + relationship.deleteConstraint = deleteConstraint; relationship.cardinality = Cardinality.ONE_TO_ONE; - } else { - relationship.cardinality = Cardinality.MANY_TO_ONE; + + if (startField.unique) { + relationship.cardinality = Cardinality.ONE_TO_ONE; + } else { + relationship.cardinality = Cardinality.MANY_TO_ONE; + } + + relationships.push(relationship); + + relationships.forEach((r, i) => (r.id = i)); } - - relationships.push(relationship); - - relationships.forEach((r, i) => (r.id = i)); - } - }); + }); + } } };