diff --git a/packages/api/src/controllers/serverConnections.js b/packages/api/src/controllers/serverConnections.js index 86e461feb..cdc4bcb76 100644 --- a/packages/api/src/controllers/serverConnections.js +++ b/packages/api/src/controllers/serverConnections.js @@ -274,6 +274,20 @@ module.exports = { return this.loadDataCore('serverSummary', { conid }); }, + killDatabaseProcess_meta: true, + async killDatabaseProcess(ctx, req) { + const { conid, pid } = ctx; + testConnectionPermission(conid, req); + + const opened = await this.ensureOpened(conid); + if (!opened) { + return null; + } + if (opened.connection.isReadOnly) return false; + + return this.sendRequest(opened, { msgtype: 'killDatabaseProcess', pid }); + }, + summaryCommand_meta: true, async summaryCommand({ conid, command, row }, req) { testConnectionPermission(conid, req); diff --git a/packages/api/src/proc/serverConnectionProcess.js b/packages/api/src/proc/serverConnectionProcess.js index d58aa18ed..99435f274 100644 --- a/packages/api/src/proc/serverConnectionProcess.js +++ b/packages/api/src/proc/serverConnectionProcess.js @@ -146,6 +146,18 @@ async function handleServerSummary({ msgid }) { return handleDriverDataCore(msgid, driver => driver.serverSummary(dbhan)); } +async function handleKillDatabaseProccess({ msgid, pid }) { + await waitConnected(); + const driver = requireEngineDriver(storedConnection); + + try { + const result = await driver.killProcess(dbhan, Number(pid)); + process.send({ msgtype: 'response', msgid, result }); + } catch (err) { + process.send({ msgtype: 'response', msgid, errorMessage: err.message }); + } +} + async function handleSummaryCommand({ msgid, command, row }) { return handleDriverDataCore(msgid, driver => driver.summaryCommand(dbhan, command, row)); } @@ -154,6 +166,7 @@ const messageHandlers = { connect: handleConnect, ping: handlePing, serverSummary: handleServerSummary, + killDatabaseProcess: handleKillDatabaseProccess, summaryCommand: handleSummaryCommand, createDatabase: props => handleDatabaseOp('createDatabase', props), dropDatabase: props => handleDatabaseOp('dropDatabase', props), diff --git a/packages/web/src/widgets/SummaryProcesses.svelte b/packages/web/src/widgets/SummaryProcesses.svelte index c9e765bd3..b1b19bc85 100644 --- a/packages/web/src/widgets/SummaryProcesses.svelte +++ b/packages/web/src/widgets/SummaryProcesses.svelte @@ -3,12 +3,22 @@ import TableControl from '../elements/TableControl.svelte'; import { _t } from '../translations'; import CtaButton from '../buttons/CtaButton.svelte'; + import { apiCall } from '../utility/api'; + import runCommand from '../commands/runCommand'; + export let conid; export let processes: DatabaseProcess[] = []; - async function killProcess(processId: string) { + async function killProcess(processId: number) { // TODO: Implement kill process functionality console.log('Kill process:', processId); + + await apiCall('server-connections/kill-database-process', { + pid: processId, + conid, + }); + + runCommand('serverSummary.refresh'); } function formatRunningTime(seconds: number): string {