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)));