diff --git a/src/components/ControlPanel.jsx b/src/components/ControlPanel.jsx
index 62c4f6a..12e324e 100644
--- a/src/components/ControlPanel.jsx
+++ b/src/components/ControlPanel.jsx
@@ -1012,7 +1012,7 @@ export default function ControlPanel({
},
},
{
- "SQL Server": () => {
+ "MSSQL": () => {
setVisible(MODAL.CODE);
const src = jsonToSQLServer({
tables: tables,
diff --git a/src/components/TypesOverview.jsx b/src/components/TypesOverview.jsx
index fe47f5b..bf95020 100644
--- a/src/components/TypesOverview.jsx
+++ b/src/components/TypesOverview.jsx
@@ -83,14 +83,28 @@ export default function TableOverview() {
- This feature is meant for object-relational DBMSs like
- PostgreSQL. However, if used for relational DBMSs, a JSON type
- will be generated with the custom type schema.
+
+
+ This feature is meant for object-relational databases like{" "}
+ PostgreSQL .
+
+
+ If used for MySQL or MariaDB {" "}
+ a JSON
type will be generated with the
+ corresponding json validation check.
+
+
+ If used for SQLite it will be translated to a{" "}
+ BLOB
.
+
+
+ If used for MSSQL a type alias to the first
+ field will be generated.
+
}
showArrow
- position="right"
+ position="rightTop"
>
} />
@@ -217,10 +231,10 @@ export default function TableOverview() {
fields: t.fields.map((e, id) =>
id === j
? {
- ...f,
- type: value,
- values: f.values ? [...f.values] : [],
- }
+ ...f,
+ type: value,
+ values: f.values ? [...f.values] : [],
+ }
: e
),
});
diff --git a/src/utils/index.js b/src/utils/index.js
index 418ccde..3949538 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -86,7 +86,7 @@ function generateSchema(type) {
)}\n\t\t\t},\n\t\t\t"additionalProperties": false\n\t\t}`;
}
-function getTypeString(field, dbms = "mysql") {
+function getTypeString(field, dbms = "mysql", baseType = false) {
if (dbms === "mysql") {
if (field.type === "UUID") {
return `VARCHAR(36)`;
@@ -131,14 +131,51 @@ function getTypeString(field, dbms = "mysql") {
field.type === "BINARY"
? "bit"
: field.type === "VARBINARY"
- ? "bit varying"
- : field.type.toLowerCase();
+ ? "bit varying"
+ : field.type.toLowerCase();
return `${type}(${field.size})`;
}
if (hasPrecision(field.type) && field.size !== "") {
return `${field.type}${field.size}`;
}
return field.type.toLowerCase();
+ } else if (dbms === "mssql") {
+ let type = field.type;
+ switch (field.type) {
+ case "ENUM":
+ return baseType
+ ? "NVARCHAR(255)"
+ : `NVARCHAR(255) CHECK([${field.name}] in (${field.values
+ .map((v) => `'${v}'`)
+ .join(", ")}))`;
+ case "VARCHAR":
+ type = `NVARCHAR`;
+ break;
+ case "UUID":
+ type = "UNIQUEIDENTIFIER";
+ break;
+ case "DOUBLE":
+ type = "FLOAT";
+ break;
+ case "BOOLEAN":
+ return "BIT";
+ case "SET":
+ return "NVARCHAR(255)";
+ case "BLOB":
+ return "VARBINARY(MAX)";
+ case "JSON":
+ return "NVARCHAR(MAX)";
+ case "TEXT":
+ return "TEXT";
+ default:
+ type = field.type;
+ break;
+ }
+ if (isSized(field.type)) {
+ return `${type}(${field.size})`;
+ }
+
+ return type;
}
}
@@ -160,56 +197,68 @@ function jsonToMySQL(obj) {
return `${obj.tables
.map(
(table) =>
- `${table.comment === "" ? "" : `/* ${table.comment} */\n`
+ `${
+ table.comment === "" ? "" : `/* ${table.comment} */\n`
}CREATE TABLE \`${table.name}\` (\n${table.fields
.map(
(field) =>
- `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t\`${field.name
- }\` ${getTypeString(field)}${field.notNull ? " NOT NULL" : ""}${field.increment ? " AUTO_INCREMENT" : ""
- }${field.unique ? " UNIQUE" : ""}${field.default !== ""
- ? ` DEFAULT ${hasQuotes(field.type) &&
- field.default.toLowerCase() !== "null"
- ? `"${field.default}"`
- : `${field.default}`
- }`
- : ""
- }${field.check === "" || !hasCheck(field.type)
- ? !sqlDataTypes.includes(field.type)
- ? ` CHECK(\n\t\tJSON_SCHEMA_VALID("${generateSchema(
- obj.types.find(
- (t) => t.name === field.type.toLowerCase()
- )
- )}", \`${field.name}\`))`
+ `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t\`${
+ field.name
+ }\` ${getTypeString(field)}${field.notNull ? " NOT NULL" : ""}${
+ field.increment ? " AUTO_INCREMENT" : ""
+ }${field.unique ? " UNIQUE" : ""}${
+ field.default !== ""
+ ? ` DEFAULT ${
+ hasQuotes(field.type) &&
+ field.default.toLowerCase() !== "null"
+ ? `"${field.default}"`
+ : `${field.default}`
+ }`
: ""
- : ` CHECK(${field.check})`
+ }${
+ field.check === "" || !hasCheck(field.type)
+ ? !sqlDataTypes.includes(field.type)
+ ? ` CHECK(\n\t\tJSON_SCHEMA_VALID("${generateSchema(
+ obj.types.find(
+ (t) => t.name === field.type.toLowerCase()
+ )
+ )}", \`${field.name}\`))`
+ : ""
+ : ` CHECK(${field.check})`
}`
)
- .join(",\n")}${table.fields.filter((f) => f.primary).length > 0
+ .join(",\n")}${
+ table.fields.filter((f) => f.primary).length > 0
? `,\n\tPRIMARY KEY(${table.fields
- .filter((f) => f.primary)
- .map((f) => `\`${f.name}\``)
- .join(", ")})`
+ .filter((f) => f.primary)
+ .map((f) => `\`${f.name}\``)
+ .join(", ")})`
+ : ""
+ }\n);\n${
+ table.indices.length > 0
+ ? `\n${table.indices.map(
+ (i) =>
+ `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX \`${
+ i.name
+ }\`\nON \`${table.name}\` (${i.fields
+ .map((f) => `\`${f}\``)
+ .join(", ")});`
+ )}`
: ""
- }\n);\n${table.indices.length > 0
- ? `\n${table.indices.map(
- (i) =>
- `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX \`${i.name
- }\`\nON \`${table.name}\` (${i.fields
- .map((f) => `\`${f}\``)
- .join(", ")});`
- )}`
- : ""
}`
)
.join("\n")}\n${obj.references
- .map(
- (r) =>
- `ALTER TABLE \`${obj.tables[r.startTableId].name
- }\`\nADD FOREIGN KEY(\`${obj.tables[r.startTableId].fields[r.startFieldId].name
- }\`) REFERENCES \`${obj.tables[r.endTableId].name}\`(\`${obj.tables[r.endTableId].fields[r.endFieldId].name
- }\`)\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};`
- )
- .join("\n")}`;
+ .map(
+ (r) =>
+ `ALTER TABLE \`${
+ obj.tables[r.startTableId].name
+ }\`\nADD FOREIGN KEY(\`${
+ obj.tables[r.startTableId].fields[r.startFieldId].name
+ }\`) REFERENCES \`${obj.tables[r.endTableId].name}\`(\`${
+ obj.tables[r.endTableId].fields[r.endFieldId].name
+ }\`)\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};`
+ )
+ .join("\n")}`;
}
function jsonToPostgreSQL(obj) {
@@ -225,73 +274,86 @@ function jsonToPostgreSQL(obj) {
if (typeStatements.length > 0) {
return (
typeStatements.join("") +
- `${type.comment === "" ? "" : `/**\n${type.comment}\n*/\n`
+ `${
+ type.comment === "" ? "" : `/**\n${type.comment}\n*/\n`
}CREATE TYPE ${type.name} AS (\n${type.fields
.map((f) => `\t${f.name} ${getTypeString(f, "postgres")}`)
.join("\n")}\n);`
);
} else {
- return `${type.comment === "" ? "" : `/**\n${type.comment}\n*/\n`
- }CREATE TYPE ${type.name} AS (\n${type.fields
- .map((f) => `\t${f.name} ${getTypeString(f, "postgres")}`)
- .join("\n")}\n);`;
+ return `${
+ type.comment === "" ? "" : `/**\n${type.comment}\n*/\n`
+ }CREATE TYPE ${type.name} AS (\n${type.fields
+ .map((f) => `\t${f.name} ${getTypeString(f, "postgres")}`)
+ .join("\n")}\n);`;
}
})}\n${obj.tables
.map(
(table) =>
- `${table.comment === "" ? "" : `/**\n${table.comment}\n*/\n`}${table.fields.filter((f) => f.type === "ENUM" || f.type === "SET")
- .length > 0
- ? `${table.fields
- .filter((f) => f.type === "ENUM" || f.type === "SET")
- .map(
- (f) =>
- `CREATE TYPE "${f.name}_t" AS ENUM (${f.values
- .map((v) => `'${v}'`)
- .join(", ")});\n\n`
- )}`
- : ""
+ `${table.comment === "" ? "" : `/**\n${table.comment}\n*/\n`}${
+ table.fields.filter((f) => f.type === "ENUM" || f.type === "SET")
+ .length > 0
+ ? `${table.fields
+ .filter((f) => f.type === "ENUM" || f.type === "SET")
+ .map(
+ (f) =>
+ `CREATE TYPE "${f.name}_t" AS ENUM (${f.values
+ .map((v) => `'${v}'`)
+ .join(", ")});\n\n`
+ )}`
+ : ""
}CREATE TABLE "${table.name}" (\n${table.fields
.map(
(field) =>
- `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t"${field.name
- }" ${getTypeString(field, "postgres")}${field.notNull ? " NOT NULL" : ""
- }${field.default !== ""
- ? ` DEFAULT ${hasQuotes(field.type) &&
- field.default.toLowerCase() !== "null"
- ? `'${field.default}'`
- : `${field.default}`
- }`
- : ""
- }${field.check === "" || !hasCheck(field.type)
- ? ""
- : ` CHECK(${field.check})`
+ `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t"${
+ field.name
+ }" ${getTypeString(field, "postgres")}${
+ field.notNull ? " NOT NULL" : ""
+ }${
+ field.default !== ""
+ ? ` DEFAULT ${
+ hasQuotes(field.type) &&
+ field.default.toLowerCase() !== "null"
+ ? `'${field.default}'`
+ : `${field.default}`
+ }`
+ : ""
+ }${
+ field.check === "" || !hasCheck(field.type)
+ ? ""
+ : ` CHECK(${field.check})`
}`
)
- .join(",\n")}${table.fields.filter((f) => f.primary).length > 0
+ .join(",\n")}${
+ table.fields.filter((f) => f.primary).length > 0
? `,\n\tPRIMARY KEY(${table.fields
- .filter((f) => f.primary)
- .map((f) => `"${f.name}"`)
- .join(", ")})`
+ .filter((f) => f.primary)
+ .map((f) => `"${f.name}"`)
+ .join(", ")})`
+ : ""
+ }\n);\n${
+ table.indices.length > 0
+ ? `${table.indices.map(
+ (i) =>
+ `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX "${
+ i.name
+ }"\nON "${table.name}" (${i.fields
+ .map((f) => `"${f}"`)
+ .join(", ")});`
+ )}`
: ""
- }\n);\n${table.indices.length > 0
- ? `${table.indices.map(
- (i) =>
- `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX "${i.name
- }"\nON "${table.name}" (${i.fields
- .map((f) => `"${f}"`)
- .join(", ")});`
- )}`
- : ""
}`
)
.join("\n")}\n${obj.references
- .map(
- (r) =>
- `ALTER TABLE "${obj.tables[r.startTableId].name}"\nADD FOREIGN KEY("${obj.tables[r.startTableId].fields[r.startFieldId].name
- }") REFERENCES "${obj.tables[r.endTableId].name}"("${obj.tables[r.endTableId].fields[r.endFieldId].name
- }")\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};`
- )
- .join("\n")}`;
+ .map(
+ (r) =>
+ `ALTER TABLE "${obj.tables[r.startTableId].name}"\nADD FOREIGN KEY("${
+ obj.tables[r.startTableId].fields[r.startFieldId].name
+ }") REFERENCES "${obj.tables[r.endTableId].name}"("${
+ obj.tables[r.endTableId].fields[r.endFieldId].name
+ }")\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};`
+ )
+ .join("\n")}`;
}
function getSQLiteType(field) {
@@ -319,7 +381,9 @@ function getSQLiteType(field) {
case "VARBINARY":
return "TEXT";
case "ENUM":
- return `TEXT CHECK("${field.name}" in (${field.values.map(v => `'${v}'`).join(", ")}))`;
+ return `TEXT CHECK("${field.name}" in (${field.values
+ .map((v) => `'${v}'`)
+ .join(", ")}))`;
default:
return "BLOB";
}
@@ -327,114 +391,210 @@ function getSQLiteType(field) {
function getInlineFK(table, obj) {
let fk = "";
- obj.references.forEach(r => {
+ obj.references.forEach((r) => {
if (fk !== "") return;
if (r.startTableId === table.id) {
- fk = `FOREIGN KEY ("${table.fields[r.startFieldId].name}") REFERENCES "${obj.tables[r.endTableId].name}"("${obj.tables[r.endTableId].fields[r.endFieldId].name}")\n\tON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()}`;
+ fk = `FOREIGN KEY ("${table.fields[r.startFieldId].name}") REFERENCES "${
+ obj.tables[r.endTableId].name
+ }"("${
+ obj.tables[r.endTableId].fields[r.endFieldId].name
+ }")\n\tON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()}`;
}
- })
+ });
return fk;
}
function jsonToSQLite(obj) {
return obj.tables
- .map(
- (table) => {
- const inlineFK = getInlineFK(table, obj);
- return `${table.comment === "" ? "" : `/* ${table.comment} */\n`
- }CREATE TABLE IF NOT EXISTS "${table.name}" (\n${table.fields
- .map(
- (field) =>
- `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t"${field.name
- }" ${getSQLiteType(field)}${field.notNull ? " NOT NULL" : ""}${field.unique ? " UNIQUE" : ""}${field.default !== ""
- ? ` DEFAULT ${hasQuotes(field.type) &&
+ .map((table) => {
+ const inlineFK = getInlineFK(table, obj);
+ return `${
+ table.comment === "" ? "" : `/* ${table.comment} */\n`
+ }CREATE TABLE IF NOT EXISTS "${table.name}" (\n${table.fields
+ .map(
+ (field) =>
+ `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t"${
+ field.name
+ }" ${getSQLiteType(field)}${field.notNull ? " NOT NULL" : ""}${
+ field.unique ? " UNIQUE" : ""
+ }${
+ field.default !== ""
+ ? ` DEFAULT ${
+ hasQuotes(field.type) &&
field.default.toLowerCase() !== "null"
- ? `'${field.default}'`
- : `${field.default}`
+ ? `'${field.default}'`
+ : `${field.default}`
}`
- : ""
- }${field.check === "" || !hasCheck(field.type) ?
- "" : ` CHECK(${field.check})`
- }`
- )
- .join(",\n")}${table.fields.filter((f) => f.primary).length > 0
- ? `,\n\tPRIMARY KEY(${table.fields
- .filter((f) => f.primary)
- .map((f) => `"${f.name}"`)
- .join(", ")})${inlineFK !== "" ? ',\n' : ''}`
- : ""
- }\t${inlineFK}\n);\n${table.indices.length > 0
- ? `${table.indices.map(
- (i) =>
- `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX IF NOT EXISTS "${i.name
- }"\nON "${table.name}" (${i.fields
- .map((f) => `"${f}"`)
- .join(", ")});`
- ).join("\n")}`
- : ""
- }`
- }
- ).join("\n");
+ : ""
+ }${
+ field.check === "" || !hasCheck(field.type)
+ ? ""
+ : ` CHECK(${field.check})`
+ }`
+ )
+ .join(",\n")}${
+ table.fields.filter((f) => f.primary).length > 0
+ ? `,\n\tPRIMARY KEY(${table.fields
+ .filter((f) => f.primary)
+ .map((f) => `"${f.name}"`)
+ .join(", ")})${inlineFK !== "" ? ",\n" : ""}`
+ : ""
+ }\t${inlineFK}\n);\n${
+ table.indices.length > 0
+ ? `${table.indices
+ .map(
+ (i) =>
+ `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX IF NOT EXISTS "${
+ i.name
+ }"\nON "${table.name}" (${i.fields
+ .map((f) => `"${f}"`)
+ .join(", ")});`
+ )
+ .join("\n")}`
+ : ""
+ }`;
+ })
+ .join("\n");
}
function jsonToMariaDB(obj) {
return `${obj.tables
.map(
(table) =>
- `${table.comment === "" ? "" : `/* ${table.comment} */\n`
+ `${
+ table.comment === "" ? "" : `/* ${table.comment} */\n`
}CREATE OR REPLACE TABLE \`${table.name}\` (\n${table.fields
.map(
(field) =>
- `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t\`${field.name
- }\` ${getTypeString(field)}${field.notNull ? " NOT NULL" : ""}${field.increment ? " AUTO_INCREMENT" : ""
- }${field.unique ? " UNIQUE" : ""}${field.default !== ""
- ? ` DEFAULT ${hasQuotes(field.type) &&
- field.default.toLowerCase() !== "null"
- ? `"${field.default}"`
- : `${field.default}`
- }`
- : ""
- }${field.check === "" || !hasCheck(field.type)
- ? !sqlDataTypes.includes(field.type)
- ? ` CHECK(\n\t\tJSON_SCHEMA_VALID('${generateSchema(
- obj.types.find(
- (t) => t.name === field.type.toLowerCase()
- )
- )}', \`${field.name}\`))`
+ `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t\`${
+ field.name
+ }\` ${getTypeString(field)}${field.notNull ? " NOT NULL" : ""}${
+ field.increment ? " AUTO_INCREMENT" : ""
+ }${field.unique ? " UNIQUE" : ""}${
+ field.default !== ""
+ ? ` DEFAULT ${
+ hasQuotes(field.type) &&
+ field.default.toLowerCase() !== "null"
+ ? `"${field.default}"`
+ : `${field.default}`
+ }`
: ""
- : ` CHECK(${field.check})`
+ }${
+ field.check === "" || !hasCheck(field.type)
+ ? !sqlDataTypes.includes(field.type)
+ ? ` CHECK(\n\t\tJSON_SCHEMA_VALID('${generateSchema(
+ obj.types.find(
+ (t) => t.name === field.type.toLowerCase()
+ )
+ )}', \`${field.name}\`))`
+ : ""
+ : ` CHECK(${field.check})`
}`
)
- .join(",\n")}${table.fields.filter((f) => f.primary).length > 0
+ .join(",\n")}${
+ table.fields.filter((f) => f.primary).length > 0
? `,\n\tPRIMARY KEY(${table.fields
- .filter((f) => f.primary)
- .map((f) => `\`${f.name}\``)
- .join(", ")})`
+ .filter((f) => f.primary)
+ .map((f) => `\`${f.name}\``)
+ .join(", ")})`
+ : ""
+ }\n);${
+ table.indices.length > 0
+ ? `\n${table.indices.map(
+ (i) =>
+ `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX \`${
+ i.name
+ }\`\nON \`${table.name}\` (${i.fields
+ .map((f) => `\`${f}\``)
+ .join(", ")});`
+ )}`
: ""
- }\n);${table.indices.length > 0
- ? `\n${table.indices.map(
- (i) =>
- `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX \`${i.name
- }\`\nON \`${table.name}\` (${i.fields
- .map((f) => `\`${f}\``)
- .join(", ")});`
- )}`
- : ""
}`
)
.join("\n")}\n${obj.references
- .map(
- (r) =>
- `ALTER TABLE \`${obj.tables[r.startTableId].name
- }\`\nADD FOREIGN KEY(\`${obj.tables[r.startTableId].fields[r.startFieldId].name
- }\`) REFERENCES \`${obj.tables[r.endTableId].name}\`(\`${obj.tables[r.endTableId].fields[r.endFieldId].name
- }\`)\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};`
- )
- .join("\n")}`;
+ .map(
+ (r) =>
+ `ALTER TABLE \`${
+ obj.tables[r.startTableId].name
+ }\`\nADD FOREIGN KEY(\`${
+ obj.tables[r.startTableId].fields[r.startFieldId].name
+ }\`) REFERENCES \`${obj.tables[r.endTableId].name}\`(\`${
+ obj.tables[r.endTableId].fields[r.endFieldId].name
+ }\`)\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};`
+ )
+ .join("\n")}`;
}
function jsonToSQLServer(obj) {
- return "TODO";
+ return `${obj.types
+ .map((type) => {
+ return `${
+ type.comment === "" ? "" : `/**\n${type.comment}\n*/\n`
+ }CREATE TYPE [${type.name}] FROM ${
+ type.fields.length < 0
+ ? ""
+ : `${getTypeString(type.fields[0], "mssql", true)}`
+ };\nGO\n`;
+ })
+ .join("\n")}\n${obj.tables
+ .map(
+ (table) =>
+ `${
+ table.comment === "" ? "" : `/**\n${table.comment}\n*/\n`
+ }CREATE TABLE [${table.name}] (\n${table.fields
+ .map(
+ (field) =>
+ `${field.comment === "" ? "" : `\t-- ${field.comment}\n`}\t[${
+ field.name
+ }] ${getTypeString(field, "mssql")}${
+ field.notNull ? " NOT NULL" : ""
+ }${field.increment ? " IDENTITY" : ""}${
+ field.unique ? " UNIQUE" : ""
+ }${
+ field.default !== ""
+ ? ` DEFAULT ${
+ hasQuotes(field.type) &&
+ field.default.toLowerCase() !== "null"
+ ? `'${field.default}'`
+ : `${field.default}`
+ }`
+ : ""
+ }${
+ field.check === "" || !hasCheck(field.type)
+ ? ""
+ : ` CHECK(${field.check})`
+ }`
+ )
+ .join(",\n")}${
+ table.fields.filter((f) => f.primary).length > 0
+ ? `,\n\tPRIMARY KEY(${table.fields
+ .filter((f) => f.primary)
+ .map((f) => `[${f.name}]`)
+ .join(", ")})`
+ : ""
+ }\n);\nGO\n${
+ table.indices.length > 0
+ ? `${table.indices.map(
+ (i) =>
+ `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX [${
+ i.name
+ }]\nON [${table.name}] (${i.fields
+ .map((f) => `[${f}]`)
+ .join(", ")});\nGO\n`
+ )}`
+ : ""
+ }`
+ )
+ .join("\n")}\n${obj.references
+ .map(
+ (r) =>
+ `ALTER TABLE [${obj.tables[r.startTableId].name}]\nADD FOREIGN KEY([${
+ obj.tables[r.startTableId].fields[r.startFieldId].name
+ }]) REFERENCES [${obj.tables[r.endTableId].name}]([${
+ obj.tables[r.endTableId].fields[r.endFieldId].name
+ }])\nON UPDATE ${r.updateConstraint.toUpperCase()} ON DELETE ${r.deleteConstraint.toUpperCase()};\nGO`
+ )
+ .join("\n")}`;
}
function arrayIsEqual(arr1, arr2) {
@@ -442,9 +602,7 @@ function arrayIsEqual(arr1, arr2) {
}
function isSized(type) {
- return ["CHAR", "VARCHAR", "BINARY", "VARBINARY", "TEXT"].includes(
- type
- );
+ return ["CHAR", "VARCHAR", "BINARY", "VARBINARY", "TEXT"].includes(type);
}
function hasPrecision(type) {
@@ -686,9 +844,11 @@ function validateDiagram(diagram) {
diagram.tables[r.startTableId].fields[r.startFieldId].type !==
diagram.tables[r.endTableId].fields[r.endFieldId].type
) {
- issues.push(`Referencing column "${diagram.tables[r.endTableId].fields[r.endFieldId].name
- }" and referenced column "${diagram.tables[r.startTableId].fields[r.startFieldId].name
- }" are incompatible.
+ issues.push(`Referencing column "${
+ diagram.tables[r.endTableId].fields[r.endFieldId].name
+ }" and referenced column "${
+ diagram.tables[r.startTableId].fields[r.startFieldId].name
+ }" are incompatible.
`);
}
});
@@ -747,56 +907,81 @@ const calcPath = (x1, x2, y1, y2, startFieldId, endFieldId, zoom = 1) => {
if (y1 <= y2) {
if (x1 + tableWidth <= x2) {
- return `M ${x1 + tableWidth - offsetX * 2} ${y1} L ${midX - r
- } ${y1} A ${r} ${r} 0 0 1 ${midX} ${y1 + r} L ${midX} ${y2 - r
- } A ${r} ${r} 0 0 0 ${midX + r} ${y2} L ${endX} ${y2}`;
+ return `M ${x1 + tableWidth - offsetX * 2} ${y1} L ${
+ midX - r
+ } ${y1} A ${r} ${r} 0 0 1 ${midX} ${y1 + r} L ${midX} ${
+ y2 - r
+ } A ${r} ${r} 0 0 0 ${midX + r} ${y2} L ${endX} ${y2}`;
} else if (x2 <= x1 + tableWidth && x1 <= x2) {
- return `M ${x1 + tableWidth - 2 * offsetX} ${y1} L ${x2 + tableWidth
- } ${y1} A ${r} ${r} 0 0 1 ${x2 + tableWidth + r} ${y1 + r} L ${x2 + tableWidth + r
- } ${y2 - r} A ${r} ${r} 0 0 1 ${x2 + tableWidth} ${y2} L ${x2 + tableWidth - 2 * offsetX
- } ${y2}`;
+ return `M ${x1 + tableWidth - 2 * offsetX} ${y1} L ${
+ x2 + tableWidth
+ } ${y1} A ${r} ${r} 0 0 1 ${x2 + tableWidth + r} ${y1 + r} L ${
+ x2 + tableWidth + r
+ } ${y2 - r} A ${r} ${r} 0 0 1 ${x2 + tableWidth} ${y2} L ${
+ x2 + tableWidth - 2 * offsetX
+ } ${y2}`;
} else if (x2 + tableWidth >= x1 && x2 + tableWidth <= x1 + tableWidth) {
- return `M ${x1} ${y1} L ${x2 - r} ${y1} A ${r} ${r} 0 0 0 ${x2 - r - r} ${y1 + r
- } L ${x2 - r - r} ${y2 - r} A ${r} ${r} 0 0 0 ${x2 - r
- } ${y2} L ${x2} ${y2}`;
+ return `M ${x1} ${y1} L ${x2 - r} ${y1} A ${r} ${r} 0 0 0 ${x2 - r - r} ${
+ y1 + r
+ } L ${x2 - r - r} ${y2 - r} A ${r} ${r} 0 0 0 ${
+ x2 - r
+ } ${y2} L ${x2} ${y2}`;
} else {
- return `M ${x1} ${y1} L ${midX + r} ${y1} A ${r} ${r} 0 0 0 ${midX} ${y1 + r
- } L ${midX} ${y2 - r} A ${r} ${r} 0 0 1 ${midX - r
- } ${y2} L ${endX} ${y2}`;
+ return `M ${x1} ${y1} L ${midX + r} ${y1} A ${r} ${r} 0 0 0 ${midX} ${
+ y1 + r
+ } L ${midX} ${y2 - r} A ${r} ${r} 0 0 1 ${
+ midX - r
+ } ${y2} L ${endX} ${y2}`;
}
} else {
if (x1 + tableWidth <= x2) {
- return `M ${x1 + tableWidth - offsetX * 2} ${y1} L ${midX - r
- } ${y1} A ${r} ${r} 0 0 0 ${midX} ${y1 - r} L ${midX} ${y2 + r
- } A ${r} ${r} 0 0 1 ${midX + r} ${y2} L ${endX} ${y2}`;
+ return `M ${x1 + tableWidth - offsetX * 2} ${y1} L ${
+ midX - r
+ } ${y1} A ${r} ${r} 0 0 0 ${midX} ${y1 - r} L ${midX} ${
+ y2 + r
+ } A ${r} ${r} 0 0 1 ${midX + r} ${y2} L ${endX} ${y2}`;
} else if (x1 + tableWidth >= x2 && x1 + tableWidth <= x2 + tableWidth) {
// this for the overlap remember
if (startTableY < y2) {
- return `M ${x1} ${y1} L ${x1 - r - r} ${y1} A ${r} ${r} 0 0 1 ${x1 - r - r - r
- } ${y1 - r} L ${x1 - r - r - r} ${y2 + r} A ${r} ${r} 0 0 1 ${x1 - r - r
- } ${y2} L ${x1 - r - 4} ${y2}`;
+ return `M ${x1} ${y1} L ${x1 - r - r} ${y1} A ${r} ${r} 0 0 1 ${
+ x1 - r - r - r
+ } ${y1 - r} L ${x1 - r - r - r} ${y2 + r} A ${r} ${r} 0 0 1 ${
+ x1 - r - r
+ } ${y2} L ${x1 - r - 4} ${y2}`;
}
- return `M ${x1} ${y1} L ${x1 - r - r} ${y1} A ${r} ${r} 0 0 1 ${x1 - r - r - r
- } ${y1 - r} L ${x1 - r - r - r} ${y2 + r} A ${r} ${r} 0 0 1 ${x1 - r - r
- } ${y2} L ${endX} ${y2}`;
+ return `M ${x1} ${y1} L ${x1 - r - r} ${y1} A ${r} ${r} 0 0 1 ${
+ x1 - r - r - r
+ } ${y1 - r} L ${x1 - r - r - r} ${y2 + r} A ${r} ${r} 0 0 1 ${
+ x1 - r - r
+ } ${y2} L ${endX} ${y2}`;
} else if (x1 >= x2 && x1 <= x2 + tableWidth) {
// this for the overlap remember
if (startTableY < y2) {
- return `M ${x1 + tableWidth - 2 * offsetX} ${y1} L ${x1 + tableWidth - 2 * offsetX + r
- } ${y1} A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r + r} ${y1 - r
- } L ${x1 + tableWidth - 2 * offsetX + r + r} ${y2 + r
- } A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r} ${y2} L ${x1 + tableWidth - 16
- } ${y2}`;
- }
- return `M ${x1 + tableWidth - 2 * offsetX} ${y1} L ${x1 + tableWidth - 2 * offsetX + r
- } ${y1} A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r + r} ${y1 - r
- } L ${x1 + tableWidth - 2 * offsetX + r + r} ${y2 + r
- } A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r} ${y2} L ${x2 + tableWidth - 2 * offsetX
+ return `M ${x1 + tableWidth - 2 * offsetX} ${y1} L ${
+ x1 + tableWidth - 2 * offsetX + r
+ } ${y1} A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r + r} ${
+ y1 - r
+ } L ${x1 + tableWidth - 2 * offsetX + r + r} ${
+ y2 + r
+ } A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r} ${y2} L ${
+ x1 + tableWidth - 16
} ${y2}`;
+ }
+ return `M ${x1 + tableWidth - 2 * offsetX} ${y1} L ${
+ x1 + tableWidth - 2 * offsetX + r
+ } ${y1} A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r + r} ${
+ y1 - r
+ } L ${x1 + tableWidth - 2 * offsetX + r + r} ${
+ y2 + r
+ } A ${r} ${r} 0 0 0 ${x1 + tableWidth - 2 * offsetX + r} ${y2} L ${
+ x2 + tableWidth - 2 * offsetX
+ } ${y2}`;
} else {
- return `M ${x1} ${y1} L ${midX + r} ${y1} A ${r} ${r} 0 0 1 ${midX} ${y1 - r
- } L ${midX} ${y2 + r} A ${r} ${r} 0 0 0 ${midX - r
- } ${y2} L ${endX} ${y2}`;
+ return `M ${x1} ${y1} L ${midX + r} ${y1} A ${r} ${r} 0 0 1 ${midX} ${
+ y1 - r
+ } L ${midX} ${y2 + r} A ${r} ${r} 0 0 0 ${
+ midX - r
+ } ${y2} L ${endX} ${y2}`;
}
}
};