diff --git a/packages/api/src/controllers/sessions.js b/packages/api/src/controllers/sessions.js index e429979f1..adf281b47 100644 --- a/packages/api/src/controllers/sessions.js +++ b/packages/api/src/controllers/sessions.js @@ -95,15 +95,15 @@ module.exports = { return { state: 'ok' }; }, - cancel_meta: 'post', - async cancel({ sesid }) { - const session = this.opened.find((x) => x.sesid == sesid); - if (!session) { - throw new Error('Invalid session'); - } - session.subprocess.send({ msgtype: 'cancel' }); - return { state: 'ok' }; - }, + // cancel_meta: 'post', + // async cancel({ sesid }) { + // const session = this.opened.find((x) => x.sesid == sesid); + // if (!session) { + // throw new Error('Invalid session'); + // } + // session.subprocess.send({ msgtype: 'cancel' }); + // return { state: 'ok' }; + // }, kill_meta: 'post', async kill({ sesid }) { @@ -112,6 +112,7 @@ module.exports = { throw new Error('Invalid session'); } session.subprocess.kill(); + this.dispatchMessage(sesid, 'Connection closed'); return { state: 'ok' }; }, diff --git a/packages/api/src/proc/sessionProcess.js b/packages/api/src/proc/sessionProcess.js index eae01137e..9777baf05 100644 --- a/packages/api/src/proc/sessionProcess.js +++ b/packages/api/src/proc/sessionProcess.js @@ -11,7 +11,7 @@ const requireEngineDriver = require('../utility/requireEngineDriver'); let systemConnection; let storedConnection; let afterConnectCallbacks = []; -let currentHandlers = []; +// let currentHandlers = []; class TableWriter { constructor(columns, resultIndex) { @@ -64,17 +64,20 @@ class TableWriter { } class StreamHandler { - constructor(resultIndex) { + constructor(resultIndexHolder, resolve) { this.recordset = this.recordset.bind(this); this.row = this.row.bind(this); // this.error = this.error.bind(this); this.done = this.done.bind(this); this.info = this.info.bind(this); - // use this for cancelling - this.stream = null; + + // use this for cancelling - not implemented + // this.stream = null; + this.plannedStats = false; - this.resultIndex = resultIndex; - currentHandlers = [...currentHandlers, this]; + this.resultIndexHolder = resultIndexHolder; + this.resolve = resolve; + // currentHandlers = [...currentHandlers, this]; } closeCurrentWriter() { @@ -86,7 +89,8 @@ class StreamHandler { recordset(columns) { this.closeCurrentWriter(); - this.currentWriter = new TableWriter(columns, this.resultIndex); + this.currentWriter = new TableWriter(columns, this.resultIndexHolder.value); + this.resultIndexHolder.value += 1; // this.writeCurrentStats(); @@ -107,14 +111,21 @@ class StreamHandler { // } done(result) { this.closeCurrentWriter(); - process.send({ msgtype: 'done', result }); - currentHandlers = currentHandlers.filter((x) => x != this); + // currentHandlers = currentHandlers.filter((x) => x != this); + this.resolve(); } info(info) { process.send({ msgtype: 'info', info }); } } +function handleStream(driver, resultIndexHolder, sql) { + return new Promise((resolve, reject) => { + const handler = new StreamHandler(resultIndexHolder, resolve); + driver.stream(systemConnection, sql, handler); + }); +} + async function handleConnect(connection) { storedConnection = connection; @@ -126,11 +137,11 @@ async function handleConnect(connection) { afterConnectCallbacks = []; } -function handleCancel() { - for (const handler of currentHandlers) { - if (handler.stream) handler.stream.cancel(); - } -} +// function handleCancel() { +// for (const handler of currentHandlers) { +// if (handler.stream) handler.stream.cancel(); +// } +// } function waitConnected() { if (systemConnection) return Promise.resolve(); @@ -143,19 +154,23 @@ async function handleExecuteQuery({ sql }) { await waitConnected(); const driver = requireEngineDriver(storedConnection); - let resultIndex = 0; + const resultIndexHolder = { + value: 0, + }; for (const sqlItem of goSplit(sql)) { - const handler = new StreamHandler(resultIndex); - const stream = await driver.stream(systemConnection, sqlItem, handler); - handler.stream = stream; - resultIndex += 1; + await handleStream(driver, resultIndexHolder, sqlItem); + // const handler = new StreamHandler(resultIndex); + // const stream = await driver.stream(systemConnection, sqlItem, handler); + // handler.stream = stream; + // resultIndex = handler.resultIndex; } + process.send({ msgtype: 'done' }); } const messageHandlers = { connect: handleConnect, executeQuery: handleExecuteQuery, - cancel: handleCancel, + // cancel: handleCancel, }; async function handleMessage({ msgtype, ...other }) { diff --git a/packages/web/src/query/QueryToolbar.js b/packages/web/src/query/QueryToolbar.js index 99066b581..72567f0f3 100644 --- a/packages/web/src/query/QueryToolbar.js +++ b/packages/web/src/query/QueryToolbar.js @@ -2,16 +2,16 @@ import React from 'react'; import useHasPermission from '../utility/useHasPermission'; import ToolbarButton from '../widgets/ToolbarButton'; -export default function QueryToolbar({ execute, cancel, isDatabaseDefined, busy, save, format, isConnected, kill }) { +export default function QueryToolbar({ execute, isDatabaseDefined, busy, save, format, isConnected, kill }) { const hasPermission = useHasPermission(); return ( <> Execute - + {/* Cancel - + */} Kill diff --git a/packages/web/src/tabs/QueryTab.js b/packages/web/src/tabs/QueryTab.js index 48f432fb6..b98897b99 100644 --- a/packages/web/src/tabs/QueryTab.js +++ b/packages/web/src/tabs/QueryTab.js @@ -24,6 +24,7 @@ import useExtensions from '../utility/useExtensions'; export default function QueryTab({ tabid, conid, database, initialArgs, tabVisible, toolbarPortalRef, ...other }) { const [sessionId, setSessionId] = React.useState(null); + const [visibleResultTabs, setVisibleResultTabs] = React.useState(false); const [executeNumber, setExecuteNumber] = React.useState(0); const setOpenedTabs = useSetOpenedTabs(); const socket = useSocket(); @@ -63,6 +64,7 @@ export default function QueryTab({ tabid, conid, database, initialArgs, tabVisib const handleExecute = async () => { if (busy) return; setExecuteNumber((num) => num + 1); + setVisibleResultTabs(true); const selectedText = editorRef.current.editor.getSelectedText(); let sesid = sessionId; @@ -81,14 +83,14 @@ export default function QueryTab({ tabid, conid, database, initialArgs, tabVisib }); }; - const handleCancel = () => { - axios.post('sessions/cancel', { - sesid: sessionId, - }); - }; + // const handleCancel = () => { + // axios.post('sessions/cancel', { + // sesid: sessionId, + // }); + // }; - const handleKill = () => { - axios.post('sessions/kill', { + const handleKill = async () => { + await axios.post('sessions/kill', { sesid: sessionId, }); setSessionId(null); @@ -135,7 +137,7 @@ export default function QueryTab({ tabid, conid, database, initialArgs, tabVisib conid={conid} database={database} /> - {sessionId && ( + {visibleResultTabs && (