Skip to content

Commit 8d95d95

Browse files
authored
feat: change dialect based on the driver (#157)
* feat: change dialect based on the driver * add schema to the extension
1 parent ca0bdb3 commit 8d95d95

6 files changed

Lines changed: 54 additions & 18 deletions

File tree

src/components/gui/sql-editor/index.tsx

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import CodeMirror, {
22
EditorView,
3+
Extension,
34
ReactCodeMirrorRef,
45
} from "@uiw/react-codemirror";
6+
import { LanguageSupport } from "@codemirror/language";
57
import {
68
acceptCompletion,
79
completionStatus,
810
startCompletion,
911
} from "@codemirror/autocomplete";
10-
import { sql, SQLNamespace } from "@codemirror/lang-sql";
12+
import { sql, SQLNamespace, MySQL as MySQLDialect } from "@codemirror/lang-sql";
1113
import { forwardRef, KeyboardEventHandler, useMemo } from "react";
1214

1315
import { defaultKeymap, insertTab } from "@codemirror/commands";
@@ -19,9 +21,11 @@ import { sqliteDialect } from "@/drivers/sqlite/sqlite-dialect";
1921
import { functionTooltip } from "./function-tooltips";
2022
import sqliteFunctionList from "@/drivers/sqlite/function-tooltip.json";
2123
import { toast } from "sonner";
24+
import { SupportedDialect } from "@/drivers/base-driver";
2225

2326
interface SqlEditorProps {
2427
value: string;
28+
dialect: SupportedDialect;
2529
readOnly?: boolean;
2630
onChange?: (value: string) => void;
2731
schema?: SQLNamespace;
@@ -38,6 +42,7 @@ interface SqlEditorProps {
3842
const SqlEditor = forwardRef<ReactCodeMirrorRef, SqlEditorProps>(
3943
function SqlEditor(
4044
{
45+
dialect,
4146
value,
4247
onChange,
4348
schema,
@@ -119,6 +124,44 @@ const SqlEditor = forwardRef<ReactCodeMirrorRef, SqlEditorProps>(
119124
]);
120125
}, [fontSize, onFontSizeChanged]);
121126

127+
const extensions = useMemo(() => {
128+
let sqlDialect: LanguageSupport | undefined = undefined;
129+
let tooltipExtension: Extension | undefined = undefined;
130+
131+
if (dialect === "sqlite") {
132+
sqlDialect = sql({
133+
dialect: sqliteDialect,
134+
schema,
135+
});
136+
tooltipExtension = functionTooltip(sqliteFunctionList);
137+
} else {
138+
sqlDialect = sql({
139+
dialect: MySQLDialect,
140+
schema,
141+
});
142+
}
143+
144+
return [
145+
keyExtensions,
146+
sqlDialect,
147+
tooltipExtension,
148+
tableNameHighlightPlugin,
149+
EditorView.updateListener.of((state) => {
150+
const pos = state.state.selection.main.head;
151+
const line = state.state.doc.lineAt(pos);
152+
const lineNumber = line.number;
153+
const columnNumber = pos - line.from;
154+
if (onCursorChange) onCursorChange(pos, lineNumber, columnNumber);
155+
}),
156+
].filter(Boolean) as Extension[];
157+
}, [
158+
dialect,
159+
onCursorChange,
160+
keyExtensions,
161+
schema,
162+
tableNameHighlightPlugin,
163+
]);
164+
122165
return (
123166
<CodeMirror
124167
ref={ref}
@@ -137,22 +180,7 @@ const SqlEditor = forwardRef<ReactCodeMirrorRef, SqlEditorProps>(
137180
fontSize: 20,
138181
height: "100%",
139182
}}
140-
extensions={[
141-
keyExtensions,
142-
sql({
143-
dialect: sqliteDialect,
144-
schema,
145-
}),
146-
functionTooltip(sqliteFunctionList),
147-
tableNameHighlightPlugin,
148-
EditorView.updateListener.of((state) => {
149-
const pos = state.state.selection.main.head;
150-
const line = state.state.doc.lineAt(pos);
151-
const lineNumber = line.number;
152-
const columnNumber = pos - line.from;
153-
if (onCursorChange) onCursorChange(pos, lineNumber, columnNumber);
154-
}),
155-
]}
183+
extensions={extensions}
156184
/>
157185
);
158186
}

src/components/gui/tabs/query-tab.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ export default function QueryWindow({
227227
<div className="grow overflow-hidden">
228228
<SqlEditor
229229
ref={editorRef}
230+
dialect={databaseDriver.getFlags().dialect}
230231
value={code}
231232
onChange={setCode}
232233
schema={autoCompleteSchema}

src/components/gui/tabs/trigger-tab.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ export default function TriggerTab({
7777
</div>
7878
<div className="grow overflow-hidden">
7979
<div className="h-full">
80-
<SqlEditor value={trigger?.statement ?? ""} />
80+
<SqlEditor
81+
value={trigger?.statement ?? ""}
82+
dialect={databaseDriver.getFlags().dialect}
83+
/>
8184
</div>
8285
</div>
8386
</div>

src/drivers/base-driver.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export function describeTableColumnType(type: TableColumnDataType) {
3131
}
3232
}
3333

34+
export type SupportedDialect = "sqlite" | "mysql";
3435
export type SqlOrder = "ASC" | "DESC";
3536
export type DatabaseRow = Record<string, unknown>;
3637

@@ -202,6 +203,7 @@ export interface DriverFlags {
202203
supportBigInt: boolean;
203204
supportCreateUpdateTable: boolean;
204205
mismatchDetection: boolean;
206+
dialect: SupportedDialect;
205207
}
206208

207209
export interface DatabaseTableColumnChange {

src/drivers/mysql/mysql-driver.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ export default abstract class MySQLLikeDriver extends CommonSQLImplement {
5151
supportBigInt: false,
5252
mismatchDetection: false,
5353
supportCreateUpdateTable: false,
54+
dialect: "mysql",
5455
};
5556
}
5657

src/drivers/sqlite-base-driver.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export abstract class SqliteLikeBaseDriver extends CommonSQLImplement {
3030
optionalSchema: true,
3131
mismatchDetection: false,
3232
supportCreateUpdateTable: true,
33+
dialect: "sqlite",
3334
};
3435
}
3536

0 commit comments

Comments
 (0)