diff --git a/packages/api/src/controllers/databaseConnections.js b/packages/api/src/controllers/databaseConnections.js index 6d5d78868..59ca5c760 100644 --- a/packages/api/src/controllers/databaseConnections.js +++ b/packages/api/src/controllers/databaseConnections.js @@ -18,6 +18,12 @@ module.exports = { existing.structure = structure; socket.emitChanged(`database-structure-changed-${conid}-${database}`); }, + handle_structureTime(conid, database, { analysedTime }) { + const existing = this.opened.find(x => x.conid == conid && x.database == database); + if (!existing) return; + existing.analysedTime = analysedTime; + socket.emitChanged(`database-status-changed-${conid}-${database}`); + }, handle_version(conid, database, { version }) { const existing = this.opened.find(x => x.conid == conid && x.database == database); if (!existing) return; @@ -123,9 +129,19 @@ module.exports = { status_meta: 'get', async status({ conid, database }) { const existing = this.opened.find(x => x.conid == conid && x.database == database); - if (existing) return existing.status; + if (existing) { + return { + ...existing.status, + analysedTime: existing.analysedTime, + }; + } const lastClosed = this.closed[`${conid}/${database}`]; - if (lastClosed) return lastClosed.status; + if (lastClosed) { + return { + ...lastClosed.status, + analysedTime: lastClosed.analysedTime, + }; + } return { name: 'error', message: 'Not connected', @@ -156,6 +172,13 @@ module.exports = { return { status: 'ok' }; }, + syncModel_meta: 'post', + async syncModel({ conid, database }) { + const conn = await this.ensureOpened(conid, database); + conn.subprocess.send({ msgtype: 'syncModel' }); + return { status: 'ok' }; + }, + close(conid, database, kill = true) { const existing = this.opened.find(x => x.conid == conid && x.database == database); if (existing) { diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index e491d3af7..ede62818f 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -12,6 +12,7 @@ let afterConnectCallbacks = []; let analysedStructure = null; let lastPing = null; let lastStatus = null; +let analysedTime = 0; async function checkedAsyncCall(promise) { try { @@ -28,23 +29,38 @@ async function checkedAsyncCall(promise) { } } +let loadingModel = false; + async function handleFullRefresh() { + loadingModel = true; const driver = requireEngineDriver(storedConnection); setStatusName('loadStructure'); analysedStructure = await checkedAsyncCall(driver.analyseFull(systemConnection)); + analysedTime = new Date().getTime(); process.send({ msgtype: 'structure', structure: analysedStructure }); + process.send({ msgtype: 'structureTime', analysedTime }); setStatusName('ok'); + loadingModel = false; } async function handleIncrementalRefresh() { + loadingModel = true; const driver = requireEngineDriver(storedConnection); setStatusName('checkStructure'); const newStructure = await checkedAsyncCall(driver.analyseIncremental(systemConnection, analysedStructure)); + analysedTime = new Date().getTime(); if (newStructure != null) { analysedStructure = newStructure; process.send({ msgtype: 'structure', structure: analysedStructure }); } + process.send({ msgtype: 'structureTime', analysedTime }); setStatusName('ok'); + loadingModel = false; +} + +function handleSyncModel() { + if (loadingModel) return; + handleIncrementalRefresh(); } function setStatus(status) { @@ -80,7 +96,7 @@ async function handleConnect({ connection, structure, globalSettings }) { handleFullRefresh(); } - if (extractBoolSettingsValue(globalSettings, 'connection.autoRefresh', true)) { + if (extractBoolSettingsValue(globalSettings, 'connection.autoRefresh', false)) { setInterval( handleIncrementalRefresh, extractIntSettingsValue(globalSettings, 'connection.autoRefreshInterval', 30, 3, 3600) * 1000 @@ -172,6 +188,7 @@ const messageHandlers = { collectionData: handleCollectionData, sqlPreview: handleSqlPreview, ping: handlePing, + syncModel: handleSyncModel, // runCommand: handleRunCommand, }; diff --git a/packages/api/src/proc/serverConnectionProcess.js b/packages/api/src/proc/serverConnectionProcess.js index e47371574..08ec935bb 100644 --- a/packages/api/src/proc/serverConnectionProcess.js +++ b/packages/api/src/proc/serverConnectionProcess.js @@ -61,7 +61,7 @@ async function handleConnect(connection) { systemConnection = await connectUtility(driver, storedConnection); readVersion(); handleRefresh(); - if (extractBoolSettingsValue(globalSettings, 'connection.autoRefresh', true)) { + if (extractBoolSettingsValue(globalSettings, 'connection.autoRefresh', false)) { setInterval(handleRefresh, extractIntSettingsValue(globalSettings, 'connection.autoRefreshInterval', 30, 5, 3600) * 1000); } } catch (err) { diff --git a/packages/types/index.d.ts b/packages/types/index.d.ts index d1898b830..3ff9e1cd4 100644 --- a/packages/types/index.d.ts +++ b/packages/types/index.d.ts @@ -4,6 +4,7 @@ export interface OpenedDatabaseConnection { conid: string; database: string; structure: DatabaseInfo; + analysedTime?: number; serverVersion?: any; subprocess: ChildProcess; disconnected?: boolean; diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 342e04a0c..c6a989fd1 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -40,6 +40,7 @@ 'icon home': 'mdi mdi-home', 'icon query-design': 'mdi mdi-vector-polyline-edit', 'icon form': 'mdi mdi-form-select', + 'icon history': 'mdi mdi-history', 'icon edit': 'mdi mdi-pencil', 'icon delete': 'mdi mdi-delete', diff --git a/packages/web/src/settings/SettingsModal.svelte b/packages/web/src/settings/SettingsModal.svelte index 20cc98c76..fec407219 100644 --- a/packages/web/src/settings/SettingsModal.svelte +++ b/packages/web/src/settings/SettingsModal.svelte @@ -50,7 +50,7 @@
@@ -75,6 +91,18 @@
{/if} + {#if $status?.analysedTime} +
+ +
+ {moment($status?.analysedTime).fromNow() + (timerValue ? '' : '')} +
+
+ {/if}
{#each contextItems || [] as item} @@ -94,6 +122,7 @@ color: var(--theme-font-inv-1); align-items: stretch; justify-content: space-between; + cursor: default; } .container { display: flex; @@ -108,4 +137,5 @@ text-overflow: ellipsis; white-space: nowrap; } +