diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index 347d3258a..3da5c8d6e 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -30,7 +30,6 @@ module.exports = { if (!existing) return; existing.status = status; socket.emitChanged(`database-status-changed-${conid}-${database}`); - socket.emitChanged(`database-structure-changed-${conid}-${database}`); }, handle_ping() {}, @@ -117,7 +116,6 @@ module.exports = { structure: existing.structure, }; socket.emitChanged(`database-status-changed-${conid}-${database}`); - socket.emitChanged(`database-structure-changed-${conid}-${database}`); } }, diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 18fc6522d..04a97454e 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -42,10 +42,16 @@ async function handleConnect({ connection, structure }) { storedConnection = connection; lastPing = new Date().getTime(); - setStatusName('pending'); + if (!structure) setStatusName('pending'); + else setStatusName('ok'); const driver = engines(storedConnection); systemConnection = await driverConnect(driver, storedConnection); - handleFullRefresh(); + if (structure) { + analysedStructure = structure; + handleIncrementalRefresh(); + } else { + handleFullRefresh(); + } setInterval(handleIncrementalRefresh, 30 * 1000); for (const [resolve] of afterConnectCallbacks) { resolve(); diff --git a/packages/web/src/utility/cache.js b/packages/web/src/utility/cache.js index 9433026a2..8dd251bf0 100644 --- a/packages/web/src/utility/cache.js +++ b/packages/web/src/utility/cache.js @@ -1,3 +1,5 @@ +import getAsArray from './getAsArray'; + let cachedByKey = {}; let cachedPromisesByKey = {}; const cachedKeysByReloadTrigger = {}; @@ -8,22 +10,26 @@ export function cacheGet(key) { export function cacheSet(key, value, reloadTrigger) { cachedByKey[key] = value; - if (!(reloadTrigger in cachedKeysByReloadTrigger)) { - cachedKeysByReloadTrigger[reloadTrigger] = []; + for (const item of getAsArray(reloadTrigger)) { + if (!(item in cachedKeysByReloadTrigger)) { + cachedKeysByReloadTrigger[item] = []; + } + cachedKeysByReloadTrigger[item].push(key); } - cachedKeysByReloadTrigger[reloadTrigger].push(key); delete cachedPromisesByKey[key]; } export function cacheClean(reloadTrigger) { - const keys = cachedKeysByReloadTrigger[reloadTrigger]; - if (keys) { - for (const key of keys) { - delete cachedByKey[key]; - delete cachedPromisesByKey[key]; + for (const item of getAsArray(reloadTrigger)) { + const keys = cachedKeysByReloadTrigger[item]; + if (keys) { + for (const key of keys) { + delete cachedByKey[key]; + delete cachedPromisesByKey[key]; + } } + delete cachedKeysByReloadTrigger[item]; } - delete cachedKeysByReloadTrigger[reloadTrigger]; } export function getCachedPromise(key, func) { diff --git a/packages/web/src/utility/getAsArray.js b/packages/web/src/utility/getAsArray.js new file mode 100644 index 000000000..623baebc0 --- /dev/null +++ b/packages/web/src/utility/getAsArray.js @@ -0,0 +1,7 @@ +import _ from 'lodash'; + +export default function getAsArray(obj) { + if (_.isArray(obj)) return obj; + if (obj != null) return [obj]; + return []; +} diff --git a/packages/web/src/utility/metadataLoaders.js b/packages/web/src/utility/metadataLoaders.js index 2616ea25c..1ccef509f 100644 --- a/packages/web/src/utility/metadataLoaders.js +++ b/packages/web/src/utility/metadataLoaders.js @@ -24,7 +24,7 @@ const connectionInfoLoader = ({ conid }) => ({ const sqlObjectListLoader = ({ conid, database }) => ({ url: 'metadata/list-objects', params: { conid, database }, - reloadTrigger: `database-structure-changed-${conid}-${database}`, + reloadTrigger: [`database-structure-changed-${conid}-${database}`, `database-status-changed-${conid}-${database}`], }); const databaseListLoader = ({ conid }) => ({ diff --git a/packages/web/src/utility/useFetch.js b/packages/web/src/utility/useFetch.js index 4d300a6cd..fcf6fa85e 100644 --- a/packages/web/src/utility/useFetch.js +++ b/packages/web/src/utility/useFetch.js @@ -4,6 +4,7 @@ import axios from './axios'; import useSocket from './SocketProvider'; import stableStringify from 'json-stable-stringify'; import { getCachedPromise, cacheGet, cacheSet } from './cache'; +import getAsArray from './getAsArray'; export default function useFetch({ url, @@ -57,9 +58,13 @@ export default function useFetch({ React.useEffect(() => { if (reloadTrigger && socket) { - socket.on(reloadTrigger, handleReload); + for (const item of getAsArray(reloadTrigger)) { + socket.on(item, handleReload); + } return () => { - socket.off(reloadTrigger, handleReload); + for (const item of getAsArray(reloadTrigger)) { + socket.off(item, handleReload); + } }; } }, [socket, reloadTrigger]);