From 390db6814b4e2b645abba20c8931e0a253dac91a Mon Sep 17 00:00:00 2001 From: lethalsopaper <2bluisugartechea@gmail.com> Date: Tue, 12 Nov 2024 13:32:41 -0600 Subject: [PATCH] Boton de oracle funciona pero no add table --- package-lock.json | 26 ---- src/assets/oracle-icon.png | Bin 0 -> 1468693 bytes src/data/constants.js | 1 + src/data/databases.js | 7 + src/data/datatypes.js | 10 ++ src/utils/exportSQL/oracle.js | 61 ++++++++ src/utils/importSQL/oracle.js | 268 ++++++++++++++++++++++++++++++++++ 7 files changed, 347 insertions(+), 26 deletions(-) create mode 100644 src/assets/oracle-icon.png create mode 100644 src/utils/exportSQL/oracle.js create mode 100644 src/utils/importSQL/oracle.js diff --git a/package-lock.json b/package-lock.json index f4bba7e..cedc673 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ "@uiw/codemirror-theme-github": "^4.21.25", "@uiw/codemirror-theme-vscode": "^4.21.25", "@uiw/react-codemirror": "^4.21.25", - "@vercel/analytics": "^1.2.2", "axios": "^1.7.4", "classnames": "^2.5.1", "dexie": "^3.2.4", @@ -2253,26 +2252,6 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/@vercel/analytics": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@vercel/analytics/-/analytics-1.2.2.tgz", - "integrity": "sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==", - "dependencies": { - "server-only": "^0.0.1" - }, - "peerDependencies": { - "next": ">= 13", - "react": "^18 || ^19" - }, - "peerDependenciesMeta": { - "next": { - "optional": true - }, - "react": { - "optional": true - } - } - }, "node_modules/@vitejs/plugin-react": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", @@ -5816,11 +5795,6 @@ "semver": "bin/semver.js" } }, - "node_modules/server-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/server-only/-/server-only-0.0.1.tgz", - "integrity": "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==" - }, "node_modules/set-function-length": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", diff --git a/src/assets/oracle-icon.png b/src/assets/oracle-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e82f01a7748e9f258d438d6a98cb7f551a14a8da GIT binary patch literal 1468693 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 { + return intRegex.test(field.default); + }, + hasCheck: true, + isSized: false, + hasPrecision: true, + canIncrement: true, + }, INT: { type: "INT", checkDefault: (field) => { diff --git a/src/utils/exportSQL/oracle.js b/src/utils/exportSQL/oracle.js new file mode 100644 index 0000000..967a45d --- /dev/null +++ b/src/utils/exportSQL/oracle.js @@ -0,0 +1,61 @@ +// Export to Oracle SQL based on mariadb.js +// The difference is that Oracle SQL can not handle the ON UPDATE constraint so it is removed from the script. + +import { parseDefault } from "./shared"; + +import { dbToTypes } from "../../data/datatypes"; + +export function toOracle(diagram) { + return `${diagram.tables + .map( + (table) => + `CREATE OR REPLACE TABLE \`${table.name}\` (\n${table.fields + .map( + (field) => + `\t\`${ + field.name + }\` ${field.type}${field.values ? "(" + field.values.map((value) => "'" + value + "'").join(", ") + ")" : ""}${field.unsigned ? " UNSIGNED" : ""}${field.notNull ? " NOT NULL" : ""}${ + field.increment ? " AUTO_INCREMENT" : "" + }${field.unique ? " UNIQUE" : ""}${ + field.default !== "" + ? ` DEFAULT ${parseDefault(field, diagram.database)}` + : "" + }${ + field.check === "" || + !dbToTypes[diagram.database][field.type].hasCheck + ? "" + : ` CHECK(${field.check})` + }${field.comment ? ` COMMENT '${field.comment}'` : ""}`, + ) + .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)${table.comment ? ` COMMENT='${table.comment}'` : ""};${`\n${table.indices + .map( + (i) => + `\nCREATE ${i.unique ? "UNIQUE " : ""}INDEX \`${ + i.name + }\`\nON \`${table.name}\` (${i.fields + .map((f) => `\`${f}\``) + .join(", ")});`, + ) + .join("")}`}`, + ) + .join("\n")}\n${diagram.references + .map( + (r) => + `ALTER TABLE \`${ + diagram.tables[r.startTableId].name + }\`\nADD FOREIGN KEY(\`${ + diagram.tables[r.startTableId].fields[r.startFieldId].name + }\`) REFERENCES \`${diagram.tables[r.endTableId].name}\`(\`${ + diagram.tables[r.endTableId].fields[r.endFieldId].name + }\`)\nON DELETE ${r.deleteConstraint.toUpperCase()};`, + ) + .join("\n")}`; +} + diff --git a/src/utils/importSQL/oracle.js b/src/utils/importSQL/oracle.js new file mode 100644 index 0000000..8c5c72a --- /dev/null +++ b/src/utils/importSQL/oracle.js @@ -0,0 +1,268 @@ +// Import SQL files from Oracle database + +import { Cardinality, DB } from "../../data/constants"; +import { dbToTypes } from "../../data/datatypes"; +import { buildSQLFromAST } from "./shared"; + +const affinity = { + [DB.MARIADB]: new Proxy( + { INT: "INTEGER" }, + { get: (target, prop) => (prop in target ? target[prop] : "BLOB") }, + ), + [DB.GENERIC]: new Proxy( + { + INT: "INTEGER", + TINYINT: "SMALLINT", + MEDIUMINT: "INTEGER", + BIT: "BOOLEAN", + YEAR: "INTEGER", + }, + { get: (target, prop) => (prop in target ? target[prop] : "BLOB") }, + ), +}; + +export function fromOracle(ast, diagramDb = DB.GENERIC) { + const tables = []; + const relationships = []; + + const parseSingleStatement = (e) => { + if (e.type === "create") { + if (e.keyword === "table") { + const table = {}; + table.name = e.table[0].table; + table.comment = ""; + table.color = "#175e7a"; + table.fields = []; + table.indices = []; + table.id = tables.length; + e.create_definitions.forEach((d) => { + if (d.resource === "column") { + const field = {}; + field.name = d.column.column; + + let type = d.definition.dataType; + if (!dbToTypes[diagramDb][type]) { + type = affinity[diagramDb][type]; + } + field.type = type; + + if (d.definition.expr && d.definition.expr.type === "expr_list") { + field.values = d.definition.expr.value.map((v) => v.value); + } + field.comment = d.comment ? d.comment.value.value : ""; + field.unique = false; + if (d.unique) field.unique = true; + field.increment = false; + if (d.auto_increment) field.increment = true; + field.notNull = false; + if (d.nullable) field.notNull = true; + field.primary = false; + if (d.primary_key) field.primary = true; + field.default = ""; + if (d.default_val) { + let defaultValue = ""; + if (d.default_val.value.type === "function") { + defaultValue = d.default_val.value.name.name[0].value; + if (d.default_val.value.args) { + defaultValue += + "(" + + d.default_val.value.args.value + .map((v) => { + if ( + v.type === "single_quote_string" || + v.type === "double_quote_string" + ) + return "'" + v.value + "'"; + return v.value; + }) + .join(", ") + + ")"; + } + } else if (d.default_val.value.type === "null") { + defaultValue = "NULL"; + } else { + defaultValue = d.default_val.value.value.toString(); + } + field.default = defaultValue; + } + if (d.definition["length"]) { + if (d.definition.scale) { + field.size = d.definition["length"] + "," + d.definition.scale; + } else { + field.size = d.definition["length"]; + } + } + field.check = ""; + if (d.check) { + field.check = buildSQLFromAST(d.check.definition[0], DB.MARIADB); + } + + table.fields.push(field); + } else if (d.resource === "constraint") { + if (d.constraint_type === "primary key") { + d.definition.forEach((c) => { + table.fields.forEach((f) => { + if (f.name === c.column && !f.primary) { + f.primary = true; + } + }); + }); + } else if (d.constraint_type.toLowerCase() === "foreign key") { + const relationship = {}; + const startTableId = table.id; + const startTable = e.table[0].table; + const startField = d.definition[0].column; + const endTable = d.reference_definition.table[0].table; + const endField = d.reference_definition.definition[0].column; + + const endTableId = tables.findIndex((t) => t.name === endTable); + if (endTableId === -1) return; + + const endFieldId = tables[endTableId].fields.findIndex( + (f) => f.name === endField, + ); + if (endFieldId === -1) return; + + const startFieldId = table.fields.findIndex( + (f) => f.name === startField, + ); + if (startFieldId === -1) return; + + relationship.name = startTable + "_" + startField + "_fk"; + relationship.startTableId = startTableId; + relationship.endTableId = endTableId; + relationship.endFieldId = endFieldId; + relationship.startFieldId = startFieldId; + let updateConstraint = "No action"; + let deleteConstraint = "No action"; + d.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); + } + }); + + relationship.updateConstraint = updateConstraint; + relationship.deleteConstraint = deleteConstraint; + + if (table.fields[startFieldId].unique) { + relationship.cardinality = Cardinality.ONE_TO_ONE; + } else { + relationship.cardinality = Cardinality.MANY_TO_ONE; + } + + relationships.push(relationship); + } + } + }); + table.fields.forEach((f, j) => { + f.id = j; + }); + tables.push(table); + } else if (e.keyword === "index") { + const index = {}; + index.name = e.index; + index.unique = false; + if (e.index_type === "unique") index.unique = true; + index.fields = []; + e.index_columns.forEach((f) => index.fields.push(f.column)); + + let found = -1; + tables.forEach((t, i) => { + if (found !== -1) return; + if (t.name === e.table.table) { + t.indices.push(index); + found = i; + } + }); + + if (found !== -1) tables[found].indices.forEach((i, j) => (i.id = j)); + } + } else if (e.type === "alter") { + e.expr.forEach((expr) => { + if ( + expr.action === "add" && + expr.create_definitions.constraint_type.toLowerCase() === "foreign key" + ) { + const relationship = {}; + const startTable = e.table[0].table; + const startField = expr.create_definitions.definition[0].column; + const endTable = + expr.create_definitions.reference_definition.table[0].table; + const endField = + expr.create_definitions.reference_definition.definition[0].column; + 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); + } + }, + ); + + const startTableId = tables.findIndex((t) => t.name === startTable); + if (startTable === -1) return; + + const endTableId = tables.findIndex((t) => t.name === endTable); + if (endTableId === -1) return; + + const endFieldId = tables[endTableId].fields.findIndex( + (f) => f.name === endField, + ); + if (endFieldId === -1) return; + + const startFieldId = tables[startTableId].fields.findIndex( + (f) => f.name === startField, + ); + if (startFieldId === -1) return; + + relationship.name = startTable + "_" + startField + "_fk"; + relationship.startTableId = startTableId; + relationship.startFieldId = startFieldId; + relationship.endTableId = endTableId; + relationship.endFieldId = endFieldId; + relationship.updateConstraint = updateConstraint; + relationship.deleteConstraint = deleteConstraint; + + if (tables[startTableId].fields[startFieldId].unique) { + relationship.cardinality = Cardinality.ONE_TO_ONE; + } else { + relationship.cardinality = Cardinality.MANY_TO_ONE; + } + + relationships.push(relationship); + + relationships.forEach((r, i) => (r.id = i)); + } + }); + } + }; + + if (Array.isArray(ast)) { + ast.forEach((e) => parseSingleStatement(e)); + } else { + parseSingleStatement(ast); + } + + relationships.forEach((r, i) => (r.id = i)); + + return { tables, relationships }; +} + +