Skip to content

Commit 81e5ac8

Browse files
authored
feat: added schema update for create and drop, table and db (#94)
* feat: added schema update for create and drop, table and db * refactor: changed schema context default function to use NotImplementedCallback * feat: memorized context values to optimize performance * feat: reload schema on alter
1 parent a16af04 commit 81e5ac8

File tree

3 files changed

+39
-10
lines changed

3 files changed

+39
-10
lines changed

src/renderer/contexts/SchemaProvider.tsx

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
import React, { useState, PropsWithChildren, useContext } from 'react';
1+
import React, { useState, PropsWithChildren, useContext, useMemo } from 'react';
22
import { useDatabaseSetting } from './DatabaseSettingProvider';
33
import { DatabaseSchemas } from 'types/SqlSchema';
4+
import NotImplementCallback from 'libs/NotImplementCallback';
45

56
const SchemaContext = React.createContext<{
67
schema?: DatabaseSchemas;
78
currentDatabase?: string;
89
setCurrentDatabase: (v: string) => void;
10+
reloadSchema: () => void;
911
}>({
1012
schema: {},
11-
setCurrentDatabase: () => {
12-
throw 'Not implemented';
13-
},
13+
setCurrentDatabase: NotImplementCallback,
14+
reloadSchema: NotImplementCallback,
1415
});
1516

1617
export function useSchema() {
@@ -20,16 +21,25 @@ export function useSchema() {
2021
export function SchemaProvider({
2122
children,
2223
schema,
23-
}: PropsWithChildren<{ schema?: DatabaseSchemas }>) {
24+
reloadSchema,
25+
}: PropsWithChildren<{ schema?: DatabaseSchemas; reloadSchema: () => void }>) {
2426
const { setting } = useDatabaseSetting();
2527
const [currentDatabase, setCurrentDatabase] = useState(
2628
setting?.config?.database
2729
);
2830

31+
const providerValuesMemo = useMemo(
32+
() => ({
33+
schema,
34+
currentDatabase,
35+
setCurrentDatabase,
36+
reloadSchema,
37+
}),
38+
[schema, currentDatabase, setCurrentDatabase, reloadSchema]
39+
);
40+
2941
return (
30-
<SchemaContext.Provider
31-
value={{ schema: schema, currentDatabase, setCurrentDatabase }}
32-
>
42+
<SchemaContext.Provider value={providerValuesMemo}>
3343
{children}
3444
</SchemaContext.Provider>
3545
);

src/renderer/contexts/SwitchDatabaseProvider.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { useSqlExecute } from './SqlExecuteProvider';
66
export default function SwitchDatabaseProvider({
77
children,
88
}: PropsWithChildren) {
9-
const { setCurrentDatabase } = useSchema();
9+
const { setCurrentDatabase, reloadSchema } = useSchema();
1010
const { runner } = useSqlExecute();
1111

1212
useEffect(() => {
@@ -15,6 +15,15 @@ export default function SwitchDatabaseProvider({
1515
if (statement.analyze.type === 'use') {
1616
setCurrentDatabase(statement.analyze.db);
1717
}
18+
if (
19+
statement.analyze.type === 'create' ||
20+
// only has delete, while drop is fired instead
21+
// @ts-expect-error TODO: fix this
22+
statement.analyze.type === 'drop' ||
23+
statement.analyze.type === 'alter'
24+
) {
25+
reloadSchema();
26+
}
1827
}
1928
return true;
2029
};

src/renderer/screens/DatabaseScreen/index.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ function DatabaseScreenBody() {
4646
});
4747
}, [setSchema, setError, setErrorMessage, common, setLoading]);
4848

49+
const reloadSchema = useCallback(() => {
50+
common
51+
.getSchema()
52+
.then(setSchema)
53+
.catch((e) => {
54+
setError(true);
55+
setErrorMessage(e.message);
56+
});
57+
}, [setSchema, setError, setErrorMessage, common]);
58+
4959
useEffect(() => {
5060
fetchSchema();
5161
}, [fetchSchema]);
@@ -92,7 +102,7 @@ function DatabaseScreenBody() {
92102
}
93103

94104
return (
95-
<SchemaProvider schema={schema}>
105+
<SchemaProvider schema={schema} reloadSchema={reloadSchema}>
96106
<SwitchDatabaseProvider>
97107
<UpdateConnectionStatus />
98108
<Layout>

0 commit comments

Comments
 (0)