handle disconnected database

This commit is contained in:
Jan Prochazka
2020-05-01 19:50:55 +02:00
parent 024c7ddf21
commit cfc44e4f2f
4 changed files with 64 additions and 4 deletions

View File

@@ -85,6 +85,16 @@ module.exports = {
return res; return res;
}, },
status_meta: 'get',
async status({ conid, database }) {
const existing = this.opened.find((x) => x.conid == conid && x.database == database);
if (existing) return existing.status;
return {
name: 'error',
message: 'Not connected',
};
},
ping_meta: 'post', ping_meta: 'post',
async ping({ conid, database }) { async ping({ conid, database }) {
const existing = this.opened.find((x) => x.conid == conid && x.database == database); const existing = this.opened.find((x) => x.conid == conid && x.database == database);

View File

@@ -10,16 +10,31 @@ let analysedStructure = null;
let lastPing = null; let lastPing = null;
let lastStatus = null; let lastStatus = null;
async function checkedAsyncCall(promise) {
try {
const res = await promise;
return res;
} catch (err) {
setStatus({
name: 'error',
message: err.message,
});
// console.error(err);
setTimeout(() => process.exit(1), 1000);
throw err;
}
}
async function handleFullRefresh() { async function handleFullRefresh() {
const driver = engines(storedConnection); const driver = engines(storedConnection);
analysedStructure = await driver.analyseFull(systemConnection); analysedStructure = await checkedAsyncCall(driver.analyseFull(systemConnection));
process.send({ msgtype: 'structure', structure: analysedStructure }); process.send({ msgtype: 'structure', structure: analysedStructure });
setStatusName('ok'); setStatusName('ok');
} }
async function handleIncrementalRefresh() { async function handleIncrementalRefresh() {
const driver = engines(storedConnection); const driver = engines(storedConnection);
const newStructure = await driver.analyseIncremental(systemConnection, analysedStructure); const newStructure = await checkedAsyncCall(driver.analyseIncremental(systemConnection, analysedStructure));
if (newStructure != null) { if (newStructure != null) {
analysedStructure = newStructure; analysedStructure = newStructure;
process.send({ msgtype: 'structure', structure: analysedStructure }); process.send({ msgtype: 'structure', structure: analysedStructure });
@@ -43,9 +58,8 @@ async function handleConnect({ connection, structure }) {
lastPing = new Date().getTime(); lastPing = new Date().getTime();
if (!structure) setStatusName('pending'); if (!structure) setStatusName('pending');
else setStatusName('ok');
const driver = engines(storedConnection); const driver = engines(storedConnection);
systemConnection = await driverConnect(driver, storedConnection); systemConnection = await checkedAsyncCall(driverConnect(driver, storedConnection));
if (structure) { if (structure) {
analysedStructure = structure; analysedStructure = structure;
handleIncrementalRefresh(); handleIncrementalRefresh();

View File

@@ -27,6 +27,12 @@ const sqlObjectListLoader = ({ conid, database }) => ({
reloadTrigger: [`database-structure-changed-${conid}-${database}`, `database-status-changed-${conid}-${database}`], reloadTrigger: [`database-structure-changed-${conid}-${database}`, `database-status-changed-${conid}-${database}`],
}); });
const databaseStatusLoader = ({ conid, database }) => ({
url: 'database-connections/status',
params: { conid, database },
reloadTrigger: `database-status-changed-${conid}-${database}`,
});
const databaseListLoader = ({ conid }) => ({ const databaseListLoader = ({ conid }) => ({
url: 'server-connections/list-databases', url: 'server-connections/list-databases',
params: { conid }, params: { conid },
@@ -125,6 +131,13 @@ export function useSqlObjectList(args) {
return useCore(sqlObjectListLoader, args); return useCore(sqlObjectListLoader, args);
} }
export function getDatabaseStatus(args) {
return getCore(databaseStatusLoader, args);
}
export function useDatabaseStatus(args) {
return useCore(databaseStatusLoader, args);
}
export function getDatabaseList(args) { export function getDatabaseList(args) {
return getCore(databaseListLoader, args); return getCore(databaseListLoader, args);
} }

View File

@@ -3,6 +3,8 @@ import styled from 'styled-components';
import { getEngineIcon } from '../icons'; import { getEngineIcon } from '../icons';
import { useCurrentDatabase } from '../utility/globalState'; import { useCurrentDatabase } from '../utility/globalState';
import { useDatabaseStatus } from '../utility/metadataLoaders';
import { FontIcon } from '../icons';
const Container = styled.div` const Container = styled.div`
display: flex; display: flex;
@@ -18,6 +20,7 @@ const Item = styled.div`
export default function StatusBar() { export default function StatusBar() {
const { name, connection } = useCurrentDatabase() || {}; const { name, connection } = useCurrentDatabase() || {};
const status = useDatabaseStatus(connection ? { conid: connection._id, database: name } : {});
const { displayName, server, user, engine } = connection || {}; const { displayName, server, user, engine } = connection || {};
const EngineIcon = getEngineIcon(engine); const EngineIcon = getEngineIcon(engine);
return ( return (
@@ -38,6 +41,26 @@ export default function StatusBar() {
<i className="fas fa-user" /> {user} <i className="fas fa-user" /> {user}
</Item> </Item>
)} )}
{status && (
<Item>
{status.name == 'pending' && (
<>
<FontIcon icon="fas fa-spinner fa-spin" /> Loading
</>
)}
{status.name == 'ok' && (
<>
<FontIcon icon="fas fa-check-circle lime" /> Connected
</>
)}
{status.name == 'error' && (
<>
<FontIcon icon="fas fa-times-circle red" /> Error
</>
)}
</Item>
)}
</Container> </Container>
); );
} }