From 84dfd0e9d5ac23548854064fa7779287e16add89 Mon Sep 17 00:00:00 2001 From: KarimTamani Date: Sat, 14 Jun 2025 23:03:27 +0100 Subject: [PATCH] fix charset and collation order whene rendering a text column declaration sql --- src/components/navbar/rename-database.tsx | 3 +- src/components/tag-input/tag-input.tsx | 2 +- src/hooks/user-render-sql.tsx | 25 +++-- .../database/db-controller/sql-preview.tsx | 35 ++---- .../table-accordion-item/field/field-item.tsx | 5 +- .../field/field-setting.tsx | 59 +++++++--- .../database-history-provider.tsx | 3 +- .../database-provider/database-provider.tsx | 15 ++- src/utils/render/parsers/database_to_ast.ts | 106 +++++++++++++++++- src/utils/render/parsers/render-uttils.ts | 84 ++++++++++++++ src/utils/tables.ts | 3 +- 11 files changed, 268 insertions(+), 72 deletions(-) create mode 100644 src/utils/render/parsers/render-uttils.ts diff --git a/src/components/navbar/rename-database.tsx b/src/components/navbar/rename-database.tsx index a954c1c..67a1116 100644 --- a/src/components/navbar/rename-database.tsx +++ b/src/components/navbar/rename-database.tsx @@ -19,8 +19,7 @@ const RenameDatabase: React.FC = ({ database}) => { const { t } = useTranslation(); const [isLoading, setIsLoading] = useState(false); - useEffect(() => { - console.log (database.name) ; + useEffect(() => { setDbName(database.name); }, [database.name]) diff --git a/src/components/tag-input/tag-input.tsx b/src/components/tag-input/tag-input.tsx index e0cf198..83937e7 100644 --- a/src/components/tag-input/tag-input.tsx +++ b/src/components/tag-input/tag-input.tsx @@ -49,7 +49,7 @@ const TagInput: React.FC = ({ defaultItems = [], onItemsChange }) tags={tags} classNames={{ tag: "font-normal inline-block m-0.5 border-1 border-default rounded-full px-2 py-1 flex-row ", - remove: "bg-green-500 bg-default-900 rounded-full text-xs text-center ml-1 min-w-[15px] max-w-[15px] min-h-[15px] max-h-[15px] transition-colors duration-300 hover:bg-black", + remove: " bg-default-900 rounded-full text-xs text-center ml-1 min-w-[15px] max-w-[15px] min-h-[15px] max-h-[15px] transition-colors duration-300 hover:bg-black", tagInputField: "relative w-full inline-flex flex-row items-center bg-default-100 border-1 border-divider hover:border-primary focus-within:border-default-400 h-8 min-h-8 px-2 rounded-small transition-background !duration-150 transition-colors outline-none dark:bg-default placeholder:text-foreground-500 mt-2" , tags : "max-h-[256px] overflow-auto " }} diff --git a/src/hooks/user-render-sql.tsx b/src/hooks/user-render-sql.tsx index b7d57e1..b946b22 100644 --- a/src/hooks/user-render-sql.tsx +++ b/src/hooks/user-render-sql.tsx @@ -7,7 +7,8 @@ import { useEffect, useState } from "react"; import { Parser } from "node-sql-parser"; import { DatabaseType } from "@/lib/schemas/database-schema"; import { format } from 'sql-formatter'; -import { DatabaseDialect, getDatabaseByDialect } from "@/lib/database"; +import { getDatabaseByDialect } from "@/lib/database"; +import { fixCharsetPlacement } from "@/utils/render/parsers/render-uttils"; const parser = new Parser(); @@ -17,18 +18,22 @@ export const useRenderSql = (database: DatabaseType) => { const { data_types } = useDatabaseOperations(); useEffect(() => { - const dbAst: any = DatabaseToAst(database, data_types); - - const formattedSqlCode = format(parser.sqlify(dbAst, { - database: getDatabaseByDialect(database.dialect ).name - }), { language: 'sql' }); - setSql( - formattedSqlCode - ); + try { + const dbAst: any = DatabaseToAst(database, data_types); + const sql = fixCharsetPlacement(format(parser.sqlify(dbAst, { + database: getDatabaseByDialect(database.dialect).name + }), { language: "sql" } )); + + const formattedSqlCode = format(sql, { language: 'sql' }); + setSql( + (formattedSqlCode) + ); + } catch (error) { + console.log(error) + } }, [database]); - return sql; } \ No newline at end of file diff --git a/src/pages/database/db-controller/sql-preview.tsx b/src/pages/database/db-controller/sql-preview.tsx index d804c9e..b3ad2d8 100644 --- a/src/pages/database/db-controller/sql-preview.tsx +++ b/src/pages/database/db-controller/sql-preview.tsx @@ -6,33 +6,16 @@ import CodeMirror, { EditorView } from '@uiw/react-codemirror'; import { sql } from '@codemirror/lang-sql'; import { oneDark } from '@codemirror/theme-one-dark'; import { useTheme } from "next-themes"; -import { Parser } from "node-sql-parser"; +import { Parser } from "node-sql-parser"; import { overrideDarkTheme, overrideLightTheme } from "@/lib/colors"; +import { DatabaseType } from "@/lib/schemas/database-schema"; const parser = new Parser(); const code = ` - CREATE TABLE \`users\` ( - id BIGINT NOT NULL PRIMARY KEY UNIQUE, - name VARCHAR(255) NOT NULL, - lastname VARCHAR(255) NOT NULL, - email VARCHAR(255) NOT NULL UNIQUE, - password VARCHAR(255) NOT NULL, - profile_url VARCHAR(255), - age SMALLINT, - birthday DATE, - created_at TIMESTAMP NOT NULL -); - -CREATE TABLE \`addresses\` ( - id BIGINT NOT NULL PRIMARY KEY UNIQUE, - street_line VARCHAR(255) NOT NULL, - latitude FLOAT, - longitude FLOAT, -- fixed spelling - state_id BIGINT NOT NULL, - user_id BIGINT NOT NULL, - FOREIGN KEY (\`user_id\`) REFERENCES \`users\` (\`id\`) -); - + username VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT "test" , + username VARCHAR(100) NOT NULL DEFAULT "test" CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci + +) ` @@ -41,14 +24,14 @@ CREATE TABLE \`addresses\` ( const SqlPreview: React.FC = ({ }) => { const { database } = useDatabase(); - const sqlCode = useRenderSql(database); + const sqlCode = useRenderSql(database as DatabaseType); const { resolvedTheme } = useTheme(); useEffect(() => { const ast = parser.astify(code, { database: "Mysql" }) - console.log(ast) + // console.log(ast) }, []) return ( @@ -59,7 +42,7 @@ const SqlPreview: React.FC = ({ }) => { value={sqlCode} className="flex flex-1 w-full" extensions={[sql()]} - theme={resolvedTheme == "light" ? overrideLightTheme : [oneDark , overrideDarkTheme] } + theme={resolvedTheme == "light" ? overrideLightTheme : [oneDark, overrideDarkTheme]} /> } diff --git a/src/pages/database/db-controller/tables-controller/table-accordion-item/field/field-item.tsx b/src/pages/database/db-controller/tables-controller/table-accordion-item/field/field-item.tsx index 91266bb..324605e 100644 --- a/src/pages/database/db-controller/tables-controller/table-accordion-item/field/field-item.tsx +++ b/src/pages/database/db-controller/tables-controller/table-accordion-item/field/field-item.tsx @@ -85,7 +85,6 @@ const FieldItem: React.FC = ({ field }) => { placeholder={t("db_controller.name")} value={fieldName} onValueChange={setFieldName} - onBlur={saveFieldName} classNames={{ inputWrapper: "border-divider group-hover:border-primary", @@ -109,8 +108,6 @@ const FieldItem: React.FC = ({ field }) => { > N - - = ({ field }) => { - +