diff --git a/packages/api/src/controllers/jsldata.js b/packages/api/src/controllers/jsldata.js index 2b08b9518..a938019d1 100644 --- a/packages/api/src/controllers/jsldata.js +++ b/packages/api/src/controllers/jsldata.js @@ -22,7 +22,10 @@ module.exports = { if (!this.openedReaders[jslid]) return Promise.reject(); return new Promise((resolve, reject) => { const { reader } = this.openedReaders[jslid]; - if (!reader.hasNextLine()) return Promise.resolve(null); + if (!reader.hasNextLine()) { + resolve(null); + return; + } reader.nextLine((err, line) => { this.openedReaders[jslid].readedCount += 1; if (err) reject(err); @@ -66,7 +69,6 @@ module.exports = { getRows_meta: 'get', async getRows({ jslid, offset, limit }) { - // console.log('GET ROWS', offset, limit); await this.ensureReader(jslid, offset); const res = []; for (let i = 0; i < limit; i += 1) { diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index d25bced38..c80ded9ee 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -27,7 +27,7 @@ async function handleConnect(connection) { const driver = engines(storedConnection); systemConnection = await driverConnect(driver, storedConnection); handleFullRefresh(); - setInterval(handleIncrementalRefresh, 10 * 1000); + setInterval(handleIncrementalRefresh, 30 * 1000); for (const [resolve] of afterConnectCallbacks) { resolve(); } diff --git a/packages/web/src/query/MessagesView.js b/packages/web/src/query/MessagesView.js index 923da9376..2d662d7de 100644 --- a/packages/web/src/query/MessagesView.js +++ b/packages/web/src/query/MessagesView.js @@ -75,6 +75,7 @@ export default function MessagesView({ items, onMessageClick }) { Message Time Delta + Duration Procedure Line @@ -85,6 +86,11 @@ export default function MessagesView({ items, onMessageClick }) { {row.message} {moment(row.time).format('HH:mm:ss')} {formatDuration(new Date(row.time).getTime() - time0)} + + {index > 0 + ? formatDuration(new Date(row.time).getTime() - new Date(items[index - 1].time).getTime()) + : 'n/a'} + {row.procedure} {row.line} diff --git a/packages/web/src/query/SessionMessagesView.js b/packages/web/src/query/SessionMessagesView.js index 9d6f2e88c..82c8afbfc 100644 --- a/packages/web/src/query/SessionMessagesView.js +++ b/packages/web/src/query/SessionMessagesView.js @@ -2,12 +2,16 @@ import React from 'react'; import MessagesView from './MessagesView'; import useSocket from '../utility/SocketProvider'; -export default function SessionMessagesView({ sessionId, onMessageClick }) { +export default function SessionMessagesView({ sessionId, onMessageClick, executeNumber }) { const [messages, setMessages] = React.useState([]); const socket = useSocket(); const handleInfo = React.useCallback((info) => setMessages((items) => [...items, info]), []); + React.useEffect(() => { + setMessages([]); + }, [executeNumber]); + React.useEffect(() => { if (sessionId && socket) { socket.on(`session-info-${sessionId}`, handleInfo); diff --git a/packages/web/src/sqleditor/ResultTabs.js b/packages/web/src/sqleditor/ResultTabs.js index 5f7332393..86b19b3bc 100644 --- a/packages/web/src/sqleditor/ResultTabs.js +++ b/packages/web/src/sqleditor/ResultTabs.js @@ -3,7 +3,7 @@ import { TabPage, TabControl } from '../widgets/TabControl'; import useSocket from '../utility/SocketProvider'; import JslDataGrid from './JslDataGrid'; -export default function ResultTabs({ children, sessionId }) { +export default function ResultTabs({ children, sessionId, executeNumber }) { const socket = useSocket(); const [resultIds, setResultIds] = React.useState([]); @@ -12,6 +12,10 @@ export default function ResultTabs({ children, sessionId }) { setResultIds((ids) => [...ids, jslid]); }; + React.useEffect(() => { + setResultIds([]); + }, [executeNumber]); + React.useEffect(() => { if (sessionId && socket) { socket.on(`session-recordset-${sessionId}`, handleResultSet); @@ -22,7 +26,7 @@ export default function ResultTabs({ children, sessionId }) { }, [sessionId, socket]); return ( - + 0 ? 1 : 0}> {children} {resultIds.map((jslid, index) => ( diff --git a/packages/web/src/tabs/QueryTab.js b/packages/web/src/tabs/QueryTab.js index 137af9c48..c4c4fb7cb 100644 --- a/packages/web/src/tabs/QueryTab.js +++ b/packages/web/src/tabs/QueryTab.js @@ -10,6 +10,7 @@ import SessionMessagesView from '../query/SessionMessagesView'; import { TabPage } from '../widgets/TabControl'; import ResultTabs from '../sqleditor/ResultTabs'; import { VerticalSplitter } from '../widgets/Splitter'; +import keycodes from '../utility/keycodes'; // const MainContainer = styled.div``; @@ -27,6 +28,7 @@ export default function QueryTab({ tabid, conid, database, tabVisible, toolbarPo const [queryText, setQueryText] = React.useState(() => localStorage.getItem(localStorageKey) || ''); const queryTextRef = React.useRef(queryText); const [sessionId, setSessionId] = React.useState(null); + const [executeNumber, setExecuteNumber] = React.useState(0); const saveToStorage = React.useCallback(() => localStorage.setItem(localStorageKey, queryTextRef.current), [ localStorageKey, @@ -54,6 +56,7 @@ export default function QueryTab({ tabid, conid, database, tabVisible, toolbarPo }; const handleExecute = async () => { + setExecuteNumber((num) => num + 1); let sesid = sessionId; if (!sesid) { const resp = await axios.post('sessions/create', { @@ -69,7 +72,12 @@ export default function QueryTab({ tabid, conid, database, tabVisible, toolbarPo }); }; - const handleKeyDown = () => {}; + const handleKeyDown = (data, hash, keyString, keyCode, event) => { + if (keyCode == keycodes.f5) { + event.preventDefault(); + handleExecute(); + } + }; const handleMesageClick = (message) => { // console.log('EDITOR', editorRef.current.editor); @@ -89,9 +97,9 @@ export default function QueryTab({ tabid, conid, database, tabVisible, toolbarPo onKeyDown={handleKeyDown} editorRef={editorRef} /> - + - + diff --git a/packages/web/src/widgets/TabControl.js b/packages/web/src/widgets/TabControl.js index 4731be7ab..ee07a7831 100644 --- a/packages/web/src/widgets/TabControl.js +++ b/packages/web/src/widgets/TabControl.js @@ -61,13 +61,17 @@ export function TabPage({ key, label, children }) { return children; } -export function TabControl({ children }) { +export function TabControl({ children, activePageIndex = undefined }) { const [value, setValue] = React.useState(0); // const [mountedTabs, setMountedTabs] = React.useState({}); const childrenArray = (_.isArray(children) ? _.flatten(children) : [children]).filter((x) => x); + React.useEffect(() => { + if (activePageIndex != null) setValue(activePageIndex); + }, [activePageIndex]); + // // cleanup closed tabs // if (_.difference(_.keys(mountedTabs), _.map(childrenArray, 'props.key')).length > 0) { // setMountedTabs(_.pickBy(mountedTabs, (v, k) => childrenArray.find((x) => x.props.key == k)));