diff --git a/src/components/EditorHeader/ControlPanel.jsx b/src/components/EditorHeader/ControlPanel.jsx index 0bea7ed..cf98934 100644 --- a/src/components/EditorHeader/ControlPanel.jsx +++ b/src/components/EditorHeader/ControlPanel.jsx @@ -1070,6 +1070,7 @@ export default function ControlPanel({ tables, relationships, enums, + database, }); setExportData((prev) => ({ ...prev, diff --git a/src/utils/exportAs/dbml.js b/src/utils/exportAs/dbml.js index 736df39..4bb4d4c 100644 --- a/src/utils/exportAs/dbml.js +++ b/src/utils/exportAs/dbml.js @@ -1,4 +1,5 @@ import { Cardinality } from "../../data/constants"; +import { dbToTypes } from "../../data/datatypes"; import i18n from "../../i18n/i18n"; import { escapeQuotes, parseDefault } from "../exportSQL/shared"; @@ -51,6 +52,15 @@ function cardinality(rel) { } } +function fieldSize(field, database) { + const typeMetadata = dbToTypes[database][field.type]; + + if ((typeMetadata.isSized || typeMetadata.hasPrecision) && field.size) + return `(${field.size})`; + + return ""; +} + export function toDBML(diagram) { const generateRelString = (rel) => { const { fields: startTableFields, name: startTableName } = @@ -68,21 +78,38 @@ export function toDBML(diagram) { return `Ref ${rel.name} {\n\t${startTableName}.${startFieldName} ${cardinality(rel)} ${endTableName}.${endFieldName} [ delete: ${rel.deleteConstraint.toLowerCase()}, update: ${rel.updateConstraint.toLowerCase()} ]\n}`; }; + let enumDefinitions = ""; + + for (const table of diagram.tables) { + for (const field of table.fields) { + if ( + (field.type === "ENUM" || field.type === "SET") && + Array.isArray(field.values) + ) { + enumDefinitions += `enum ${field.name}_${field.values.join("_")}_t {\n\t${field.values.join("\n\t")}\n}\n\n`; + } + } + } + return `${diagram.enums .map( (en) => `enum ${en.name} {\n${en.values.map((v) => `\t${v}`).join("\n")}\n}\n\n`, ) - .join("\n\n")}${diagram.tables + .join("\n\n")}${enumDefinitions}${diagram.tables .map( (table) => `Table ${table.name} {\n${table.fields .map( (field) => - `\t${field.name} ${field.type.toLowerCase()}${columnSettings( + `\t${field.name} ${ + field.type === "ENUM" || field.type === "SET" + ? `${field.name}_${field.values.join("_")}_t` + : field.type.toLowerCase() + }${fieldSize( field, diagram.database, - )}`, + )}${columnSettings(field, diagram.database)}`, ) .join("\n")}${ table.indices.length > 0 diff --git a/src/utils/exportSQL/mysql.js b/src/utils/exportSQL/mysql.js index 06b4378..6d9d4fb 100644 --- a/src/utils/exportSQL/mysql.js +++ b/src/utils/exportSQL/mysql.js @@ -10,7 +10,10 @@ function parseType(field) { res += `${field.values ? "(" + field.values.map((value) => "'" + value + "'").join(", ") + ")" : ""}`; } - if (dbToTypes[DB.MYSQL][field.type].isSized) { + if ( + dbToTypes[DB.MYSQL][field.type].isSized || + dbToTypes[DB.MYSQL][field.type].hasPrecision + ) { res += `${field.size && field.size !== "" ? "(" + field.size + ")" : ""}`; }