mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-26 01:46:02 +00:00
disconnect command (hard disconnect in electron, soft disconnect in webapp)
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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' };
|
||||||
|
|||||||
@@ -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
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user