From 4fd88f08e113694f26942a07fffc89e68cdb7d50 Mon Sep 17 00:00:00 2001 From: rin-yato Date: Fri, 4 Aug 2023 01:15:03 +0700 Subject: [PATCH 1/4] feat: added schema update for create and drop, table and db --- src/renderer/contexts/SchemaProvider.tsx | 14 ++++++++++++-- src/renderer/contexts/SwitchDatabaseProvider.tsx | 10 +++++++++- src/renderer/screens/DatabaseScreen/index.tsx | 12 +++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/renderer/contexts/SchemaProvider.tsx b/src/renderer/contexts/SchemaProvider.tsx index dc04846..1662415 100644 --- a/src/renderer/contexts/SchemaProvider.tsx +++ b/src/renderer/contexts/SchemaProvider.tsx @@ -6,11 +6,15 @@ const SchemaContext = React.createContext<{ schema?: DatabaseSchemas; currentDatabase?: string; setCurrentDatabase: (v: string) => void; + reloadSchema: () => void; }>({ schema: {}, setCurrentDatabase: () => { throw 'Not implemented'; }, + reloadSchema: () => { + throw 'Not implemented'; + }, }); export function useSchema() { @@ -20,7 +24,8 @@ export function useSchema() { export function SchemaProvider({ children, schema, -}: PropsWithChildren<{ schema?: DatabaseSchemas }>) { + reloadSchema, +}: PropsWithChildren<{ schema?: DatabaseSchemas; reloadSchema: () => void }>) { const { setting } = useDatabaseSetting(); const [currentDatabase, setCurrentDatabase] = useState( setting?.config?.database @@ -28,7 +33,12 @@ export function SchemaProvider({ return ( {children} diff --git a/src/renderer/contexts/SwitchDatabaseProvider.tsx b/src/renderer/contexts/SwitchDatabaseProvider.tsx index 155894c..9113285 100644 --- a/src/renderer/contexts/SwitchDatabaseProvider.tsx +++ b/src/renderer/contexts/SwitchDatabaseProvider.tsx @@ -6,7 +6,7 @@ import { useSqlExecute } from './SqlExecuteProvider'; export default function SwitchDatabaseProvider({ children, }: PropsWithChildren) { - const { setCurrentDatabase } = useSchema(); + const { setCurrentDatabase, reloadSchema } = useSchema(); const { runner } = useSqlExecute(); useEffect(() => { @@ -15,6 +15,14 @@ export default function SwitchDatabaseProvider({ if (statement.analyze.type === 'use') { setCurrentDatabase(statement.analyze.db); } + if ( + statement.analyze.type === 'create' || + // only has delete, while drop is fired instead + // @ts-expect-error TODO: fix this + statement.analyze.type === 'drop' + ) { + reloadSchema(); + } } return true; }; diff --git a/src/renderer/screens/DatabaseScreen/index.tsx b/src/renderer/screens/DatabaseScreen/index.tsx index 419021c..cce3bb4 100644 --- a/src/renderer/screens/DatabaseScreen/index.tsx +++ b/src/renderer/screens/DatabaseScreen/index.tsx @@ -46,6 +46,16 @@ function DatabaseScreenBody() { }); }, [setSchema, setError, setErrorMessage, common, setLoading]); + const reloadSchema = useCallback(() => { + common + .getSchema() + .then(setSchema) + .catch((e) => { + setError(true); + setErrorMessage(e.message); + }); + }, [setSchema, setError, setErrorMessage, common]); + useEffect(() => { fetchSchema(); }, [fetchSchema]); @@ -92,7 +102,7 @@ function DatabaseScreenBody() { } return ( - + From 96fe4ed81d30bac4a15d7d46f74420223661cab5 Mon Sep 17 00:00:00 2001 From: rin-yato Date: Fri, 4 Aug 2023 11:56:39 +0700 Subject: [PATCH 2/4] refactor: changed schema context default function to use NotImplementedCallback --- src/renderer/contexts/SchemaProvider.tsx | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/renderer/contexts/SchemaProvider.tsx b/src/renderer/contexts/SchemaProvider.tsx index 1662415..483db6e 100644 --- a/src/renderer/contexts/SchemaProvider.tsx +++ b/src/renderer/contexts/SchemaProvider.tsx @@ -1,6 +1,7 @@ import React, { useState, PropsWithChildren, useContext } from 'react'; import { useDatabaseSetting } from './DatabaseSettingProvider'; import { DatabaseSchemas } from 'types/SqlSchema'; +import NotImplementCallback from 'libs/NotImplementCallback'; const SchemaContext = React.createContext<{ schema?: DatabaseSchemas; @@ -9,12 +10,8 @@ const SchemaContext = React.createContext<{ reloadSchema: () => void; }>({ schema: {}, - setCurrentDatabase: () => { - throw 'Not implemented'; - }, - reloadSchema: () => { - throw 'Not implemented'; - }, + setCurrentDatabase: NotImplementCallback, + reloadSchema: NotImplementCallback, }); export function useSchema() { From 2c686a257761cb8b6e0df5aaa7885f6ff5a2fd3a Mon Sep 17 00:00:00 2001 From: rin-yato Date: Fri, 4 Aug 2023 12:09:05 +0700 Subject: [PATCH 3/4] feat: memorized context values to optimize performance --- src/renderer/contexts/SchemaProvider.tsx | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/renderer/contexts/SchemaProvider.tsx b/src/renderer/contexts/SchemaProvider.tsx index 483db6e..fa852a4 100644 --- a/src/renderer/contexts/SchemaProvider.tsx +++ b/src/renderer/contexts/SchemaProvider.tsx @@ -1,4 +1,4 @@ -import React, { useState, PropsWithChildren, useContext } from 'react'; +import React, { useState, PropsWithChildren, useContext, useMemo } from 'react'; import { useDatabaseSetting } from './DatabaseSettingProvider'; import { DatabaseSchemas } from 'types/SqlSchema'; import NotImplementCallback from 'libs/NotImplementCallback'; @@ -28,15 +28,18 @@ export function SchemaProvider({ setting?.config?.database ); + const providerValuesMemo = useMemo( + () => ({ + schema, + currentDatabase, + setCurrentDatabase, + reloadSchema, + }), + [schema, currentDatabase, setCurrentDatabase, reloadSchema] + ); + return ( - + {children} ); From adf99306e0e63c4e5bb3a75ea2a972e85a036b6b Mon Sep 17 00:00:00 2001 From: rin-yato Date: Fri, 4 Aug 2023 12:13:49 +0700 Subject: [PATCH 4/4] feat: reload schema on alter --- src/renderer/contexts/SwitchDatabaseProvider.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/renderer/contexts/SwitchDatabaseProvider.tsx b/src/renderer/contexts/SwitchDatabaseProvider.tsx index 9113285..df0a31d 100644 --- a/src/renderer/contexts/SwitchDatabaseProvider.tsx +++ b/src/renderer/contexts/SwitchDatabaseProvider.tsx @@ -19,7 +19,8 @@ export default function SwitchDatabaseProvider({ statement.analyze.type === 'create' || // only has delete, while drop is fired instead // @ts-expect-error TODO: fix this - statement.analyze.type === 'drop' + statement.analyze.type === 'drop' || + statement.analyze.type === 'alter' ) { reloadSchema(); }