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;
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}`);
}
},

View File

@@ -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();

View File

@@ -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) {

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 }) => ({
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 }) => ({

View File

@@ -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]);