optimalizations

This commit is contained in:
Jan Prochazka
2020-05-01 17:50:12 +02:00
parent 7d36ddbc04
commit d0533f3f08
6 changed files with 38 additions and 16 deletions

View File

@@ -30,7 +30,6 @@ module.exports = {
if (!existing) return; if (!existing) return;
existing.status = status; existing.status = status;
socket.emitChanged(`database-status-changed-${conid}-${database}`); socket.emitChanged(`database-status-changed-${conid}-${database}`);
socket.emitChanged(`database-structure-changed-${conid}-${database}`);
}, },
handle_ping() {}, handle_ping() {},
@@ -117,7 +116,6 @@ module.exports = {
structure: existing.structure, structure: existing.structure,
}; };
socket.emitChanged(`database-status-changed-${conid}-${database}`); socket.emitChanged(`database-status-changed-${conid}-${database}`);
socket.emitChanged(`database-structure-changed-${conid}-${database}`);
} }
}, },

View File

@@ -42,10 +42,16 @@ async function handleConnect({ connection, structure }) {
storedConnection = connection; storedConnection = connection;
lastPing = new Date().getTime(); lastPing = new Date().getTime();
setStatusName('pending'); if (!structure) setStatusName('pending');
else setStatusName('ok');
const driver = engines(storedConnection); const driver = engines(storedConnection);
systemConnection = await driverConnect(driver, storedConnection); systemConnection = await driverConnect(driver, storedConnection);
if (structure) {
analysedStructure = structure;
handleIncrementalRefresh();
} else {
handleFullRefresh(); handleFullRefresh();
}
setInterval(handleIncrementalRefresh, 30 * 1000); setInterval(handleIncrementalRefresh, 30 * 1000);
for (const [resolve] of afterConnectCallbacks) { for (const [resolve] of afterConnectCallbacks) {
resolve(); resolve();

View File

@@ -1,3 +1,5 @@
import getAsArray from './getAsArray';
let cachedByKey = {}; let cachedByKey = {};
let cachedPromisesByKey = {}; let cachedPromisesByKey = {};
const cachedKeysByReloadTrigger = {}; const cachedKeysByReloadTrigger = {};
@@ -8,22 +10,26 @@ export function cacheGet(key) {
export function cacheSet(key, value, reloadTrigger) { export function cacheSet(key, value, reloadTrigger) {
cachedByKey[key] = value; cachedByKey[key] = value;
if (!(reloadTrigger in cachedKeysByReloadTrigger)) { for (const item of getAsArray(reloadTrigger)) {
cachedKeysByReloadTrigger[reloadTrigger] = []; if (!(item in cachedKeysByReloadTrigger)) {
cachedKeysByReloadTrigger[item] = [];
}
cachedKeysByReloadTrigger[item].push(key);
} }
cachedKeysByReloadTrigger[reloadTrigger].push(key);
delete cachedPromisesByKey[key]; delete cachedPromisesByKey[key];
} }
export function cacheClean(reloadTrigger) { export function cacheClean(reloadTrigger) {
const keys = cachedKeysByReloadTrigger[reloadTrigger]; for (const item of getAsArray(reloadTrigger)) {
const keys = cachedKeysByReloadTrigger[item];
if (keys) { if (keys) {
for (const key of keys) { for (const key of keys) {
delete cachedByKey[key]; delete cachedByKey[key];
delete cachedPromisesByKey[key]; delete cachedPromisesByKey[key];
} }
} }
delete cachedKeysByReloadTrigger[reloadTrigger]; delete cachedKeysByReloadTrigger[item];
}
} }
export function getCachedPromise(key, func) { export function getCachedPromise(key, func) {

View File

@@ -0,0 +1,7 @@
import _ from 'lodash';
export default function getAsArray(obj) {
if (_.isArray(obj)) return obj;
if (obj != null) return [obj];
return [];
}

View File

@@ -24,7 +24,7 @@ const connectionInfoLoader = ({ conid }) => ({
const sqlObjectListLoader = ({ conid, database }) => ({ const sqlObjectListLoader = ({ conid, database }) => ({
url: 'metadata/list-objects', url: 'metadata/list-objects',
params: { conid, database }, params: { conid, database },
reloadTrigger: `database-structure-changed-${conid}-${database}`, reloadTrigger: [`database-structure-changed-${conid}-${database}`, `database-status-changed-${conid}-${database}`],
}); });
const databaseListLoader = ({ conid }) => ({ const databaseListLoader = ({ conid }) => ({

View File

@@ -4,6 +4,7 @@ import axios from './axios';
import useSocket from './SocketProvider'; import useSocket from './SocketProvider';
import stableStringify from 'json-stable-stringify'; import stableStringify from 'json-stable-stringify';
import { getCachedPromise, cacheGet, cacheSet } from './cache'; import { getCachedPromise, cacheGet, cacheSet } from './cache';
import getAsArray from './getAsArray';
export default function useFetch({ export default function useFetch({
url, url,
@@ -57,9 +58,13 @@ export default function useFetch({
React.useEffect(() => { React.useEffect(() => {
if (reloadTrigger && socket) { if (reloadTrigger && socket) {
socket.on(reloadTrigger, handleReload); for (const item of getAsArray(reloadTrigger)) {
socket.on(item, handleReload);
}
return () => { return () => {
socket.off(reloadTrigger, handleReload); for (const item of getAsArray(reloadTrigger)) {
socket.off(item, handleReload);
}
}; };
} }
}, [socket, reloadTrigger]); }, [socket, reloadTrigger]);