disconnect command (hard disconnect in electron, soft disconnect in webapp)

This commit is contained in:
Jan Prochazka
2021-05-06 09:34:05 +02:00
parent e739aed80d
commit cd7edcb443
6 changed files with 95 additions and 43 deletions

View File

@@ -80,7 +80,7 @@ module.exports = {
msgtype: 'connect', msgtype: 'connect',
connection: { ...connection, database }, connection: { ...connection, database },
structure: lastClosed ? lastClosed.structure : null, structure: lastClosed ? lastClosed.structure : null,
globalSettings: config.settingsValue globalSettings: config.settingsValue,
}); });
return newOpened; return newOpened;
}, },
@@ -149,8 +149,8 @@ module.exports = {
}, },
refresh_meta: 'post', refresh_meta: 'post',
async refresh({ conid, database }) { async refresh({ conid, database, keepOpen }) {
this.close(conid, database); if (!keepOpen) this.close(conid, database);
await this.ensureOpened(conid, database); await this.ensureOpened(conid, database);
return { status: 'ok' }; return { status: 'ok' };
@@ -173,6 +173,12 @@ module.exports = {
} }
}, },
disconnect_meta: 'post',
async disconnect({ conid, database }) {
await this.close(conid, database, true);
return { status: 'ok' };
},
structure_meta: 'get', structure_meta: 'get',
async structure({ conid, database }) { async structure({ conid, database }) {
const opened = await this.ensureOpened(conid, database); const opened = await this.ensureOpened(conid, database);

View File

@@ -86,6 +86,12 @@ module.exports = {
} }
}, },
disconnect_meta: 'post',
async disconnect({ conid }) {
await this.close(conid, true);
return { status: 'ok' };
},
listDatabases_meta: 'get', listDatabases_meta: 'get',
async listDatabases({ conid }) { async listDatabases({ conid }) {
const opened = await this.ensureOpened(conid); const opened = await this.ensureOpened(conid);
@@ -123,8 +129,8 @@ module.exports = {
}, },
refresh_meta: 'post', refresh_meta: 'post',
async refresh({ conid }) { async refresh({ conid, keepOpen }) {
this.close(conid); if (!keepOpen) this.close(conid);
await this.ensureOpened(conid); await this.ensureOpened(conid);
return { status: 'ok' }; return { status: 'ok' };

View File

@@ -1,14 +1,65 @@
<script context="module"> <script context="module">
const getContextMenu = (data, $openedConnections, $extensions) => () => { export const extractKey = data => data._id;
export const createMatcher = ({ displayName, server }) => filter => filterName(filter, displayName, server);
</script>
<script lang="ts">
import _ from 'lodash';
import AppObjectCore from './AppObjectCore.svelte';
import { currentDatabase, extensions, getCurrentConfig, openedConnections } from '../stores';
import axiosInstance from '../utility/axiosInstance';
import { filterName } from 'dbgate-datalib';
import { showModal } from '../modals/modalTools';
import ConnectionModal from '../modals/ConnectionModal.svelte';
import ConfirmModal from '../modals/ConfirmModal.svelte';
import InputTextModal from '../modals/InputTextModal.svelte';
import openNewTab from '../utility/openNewTab';
import { getDatabaseMenuItems } from './DatabaseAppObject.svelte';
import getElectron from '../utility/getElectron';
export let data;
let statusIcon = null;
let statusTitle = null;
let extInfo = null;
let engineStatusIcon = null;
let engineStatusTitle = null;
const electron = getElectron();
const handleConnect = () => {
if (data.singleDatabase) {
$currentDatabase = { connection: data, name: data.defaultDatabase };
axiosInstance.post('database-connections/refresh', {
conid: data._id,
database: data.defaultDatabase,
keepOpen: true,
});
} else {
$openedConnections = _.uniq([...$openedConnections, data._id]);
axiosInstance.post('server-connections/refresh', {
conid: data._id,
keepOpen: true,
});
}
};
const getContextMenu = () => {
const config = getCurrentConfig(); const config = getCurrentConfig();
const handleRefresh = () => { const handleRefresh = () => {
axiosInstance.post('server-connections/refresh', { conid: data._id }); axiosInstance.post('server-connections/refresh', { conid: data._id });
}; };
const handleDisconnect = () => { const handleDisconnect = () => {
openedConnections.update(list => list.filter(x => x != data._id)); openedConnections.update(list => list.filter(x => x != data._id));
}; if (electron) {
const handleConnect = () => { axiosInstance.post('server-connections/disconnect', { conid: data._id });
openedConnections.update(list => _.uniq([...list, data._id])); }
if (_.get($currentDatabase, 'connection._id') == data._id) {
if (electron) {
axiosInstance.post('database-connections/disconnect', { conid: data._id, database: $currentDatabase.name });
}
currentDatabase.set(null);
}
}; };
const handleEdit = () => { const handleEdit = () => {
showModal(ConnectionModal, { connection: data }); showModal(ConnectionModal, { connection: data });
@@ -86,35 +137,13 @@
onClick: handleCreateDatabase, onClick: handleCreateDatabase,
}, },
], ],
data.singleDatabase && [{ divider: true }, getDatabaseMenuItems(data, data.defaultDatabase, $extensions)], data.singleDatabase && [
{ divider: true },
getDatabaseMenuItems(data, data.defaultDatabase, $extensions, $currentDatabase),
],
]; ];
}; };
export const extractKey = data => data._id;
export const createMatcher = ({ displayName, server }) => filter => filterName(filter, displayName, server);
</script>
<script lang="ts">
import _ from 'lodash';
import AppObjectCore from './AppObjectCore.svelte';
import { currentDatabase, extensions, getCurrentConfig, openedConnections } from '../stores';
import axiosInstance from '../utility/axiosInstance';
import { filterName } from 'dbgate-datalib';
import { showModal } from '../modals/modalTools';
import ConnectionModal from '../modals/ConnectionModal.svelte';
import ConfirmModal from '../modals/ConfirmModal.svelte';
import InputTextModal from '../modals/InputTextModal.svelte';
import openNewTab from '../utility/openNewTab';
import { getDatabaseMenuItems } from './DatabaseAppObject.svelte';
export let data;
let statusIcon = null;
let statusTitle = null;
let extInfo = null;
let engineStatusIcon = null;
let engineStatusTitle = null;
$: { $: {
if ($extensions.drivers.find(x => x.engine == data.engine)) { if ($extensions.drivers.find(x => x.engine == data.engine)) {
const match = (data.engine || '').match(/^([^@]*)@/); const match = (data.engine || '').match(/^([^@]*)@/);
@@ -174,10 +203,7 @@
statusIcon={statusIcon || engineStatusIcon} statusIcon={statusIcon || engineStatusIcon}
statusTitle={statusTitle || engineStatusTitle} statusTitle={statusTitle || engineStatusTitle}
{extInfo} {extInfo}
menu={getContextMenu(data, $openedConnections, $extensions)} menu={getContextMenu}
on:click={() => { on:click={handleConnect}
if (data.singleDatabase) $currentDatabase = { connection: data, name: data.defaultDatabase };
else $openedConnections = _.uniq([...$openedConnections, data._id]);
}}
on:click on:click
/> />

View File

@@ -1,7 +1,8 @@
<script lang="ts" context="module"> <script lang="ts" context="module">
export const extractKey = props => props.name; export const extractKey = props => props.name;
const electron = getElectron();
export function getDatabaseMenuItems(connection, name, $extensions) { export function getDatabaseMenuItems(connection, name, $extensions, $currentDatabase) {
const handleNewQuery = () => { const handleNewQuery = () => {
const tooltip = `${connection.displayName || connection.server}\n${name}`; const tooltip = `${connection.displayName || connection.server}\n${name}`;
openNewTab({ openNewTab({
@@ -45,11 +46,21 @@
}); });
}; };
const handleDisconnect = () => {
if (electron) {
axiosInstance.post('database-connections/disconnect', { conid: connection._id, database: name });
}
currentDatabase.set(null);
};
return [ return [
{ onClick: handleNewQuery, text: 'New query' }, { onClick: handleNewQuery, text: 'New query' },
{ onClick: handleImport, text: 'Import' }, { onClick: handleImport, text: 'Import' },
{ onClick: handleExport, text: 'Export' }, { onClick: handleExport, text: 'Export' },
{ onClick: handleSqlGenerator, text: 'SQL Generator' }, { onClick: handleSqlGenerator, text: 'SQL Generator' },
_.get($currentDatabase, 'connection._id') == _.get(connection, '_id') &&
_.get($currentDatabase, 'name') == name && { onClick: handleDisconnect, text: 'Disconnect' },
]; ];
} }
</script> </script>
@@ -61,12 +72,14 @@
import SqlGeneratorModal from '../modals/SqlGeneratorModal.svelte'; import SqlGeneratorModal from '../modals/SqlGeneratorModal.svelte';
import { getDefaultFileFormat } from '../plugins/fileformats'; import { getDefaultFileFormat } from '../plugins/fileformats';
import { currentDatabase, extensions } from '../stores'; import { currentDatabase, extensions } from '../stores';
import axiosInstance from '../utility/axiosInstance';
import getElectron from '../utility/getElectron';
import openNewTab from '../utility/openNewTab'; import openNewTab from '../utility/openNewTab';
import AppObjectCore from './AppObjectCore.svelte'; import AppObjectCore from './AppObjectCore.svelte';
export let data; export let data;
function createMenu() { function createMenu() {
return getDatabaseMenuItems(data.connection, data.name, $extensions); return getDatabaseMenuItems(data.connection, data.name, $extensions, $currentDatabase);
} }
</script> </script>

View File

@@ -8,7 +8,7 @@ class Analyser extends DatabaseAnalyser {
async _runAnalysis() { async _runAnalysis() {
const tables = await this.driver.query(this.pool, "select * from sqlite_master where type='table'"); const tables = await this.driver.query(this.pool, "select * from sqlite_master where type='table'");
console.log('TABLES', tables); // console.log('TABLES', tables);
const tableSqls = _.zipObject( const tableSqls = _.zipObject(
tables.rows.map((x) => x.name), tables.rows.map((x) => x.name),

View File

@@ -15,6 +15,7 @@ const driver = {
}, },
// @ts-ignore // @ts-ignore
async query(pool, sql) { async query(pool, sql) {
console.log('SQLITE SQL', sql);
const stmt = pool.prepare(sql); const stmt = pool.prepare(sql);
// stmt.raw(); // stmt.raw();
const columns = stmt.columns(); const columns = stmt.columns();