mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-26 08:45:59 +00:00
query fixes
This commit is contained in:
@@ -22,7 +22,10 @@ module.exports = {
|
|||||||
if (!this.openedReaders[jslid]) return Promise.reject();
|
if (!this.openedReaders[jslid]) return Promise.reject();
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const { reader } = this.openedReaders[jslid];
|
const { reader } = this.openedReaders[jslid];
|
||||||
if (!reader.hasNextLine()) return Promise.resolve(null);
|
if (!reader.hasNextLine()) {
|
||||||
|
resolve(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
reader.nextLine((err, line) => {
|
reader.nextLine((err, line) => {
|
||||||
this.openedReaders[jslid].readedCount += 1;
|
this.openedReaders[jslid].readedCount += 1;
|
||||||
if (err) reject(err);
|
if (err) reject(err);
|
||||||
@@ -66,7 +69,6 @@ module.exports = {
|
|||||||
|
|
||||||
getRows_meta: 'get',
|
getRows_meta: 'get',
|
||||||
async getRows({ jslid, offset, limit }) {
|
async getRows({ jslid, offset, limit }) {
|
||||||
// console.log('GET ROWS', offset, limit);
|
|
||||||
await this.ensureReader(jslid, offset);
|
await this.ensureReader(jslid, offset);
|
||||||
const res = [];
|
const res = [];
|
||||||
for (let i = 0; i < limit; i += 1) {
|
for (let i = 0; i < limit; i += 1) {
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ async function handleConnect(connection) {
|
|||||||
const driver = engines(storedConnection);
|
const driver = engines(storedConnection);
|
||||||
systemConnection = await driverConnect(driver, storedConnection);
|
systemConnection = await driverConnect(driver, storedConnection);
|
||||||
handleFullRefresh();
|
handleFullRefresh();
|
||||||
setInterval(handleIncrementalRefresh, 10 * 1000);
|
setInterval(handleIncrementalRefresh, 30 * 1000);
|
||||||
for (const [resolve] of afterConnectCallbacks) {
|
for (const [resolve] of afterConnectCallbacks) {
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ export default function MessagesView({ items, onMessageClick }) {
|
|||||||
<StyledHeader>Message</StyledHeader>
|
<StyledHeader>Message</StyledHeader>
|
||||||
<StyledHeader>Time</StyledHeader>
|
<StyledHeader>Time</StyledHeader>
|
||||||
<StyledHeader>Delta</StyledHeader>
|
<StyledHeader>Delta</StyledHeader>
|
||||||
|
<StyledHeader>Duration</StyledHeader>
|
||||||
<StyledHeader>Procedure</StyledHeader>
|
<StyledHeader>Procedure</StyledHeader>
|
||||||
<StyledHeader>Line</StyledHeader>
|
<StyledHeader>Line</StyledHeader>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -85,6 +86,11 @@ export default function MessagesView({ items, onMessageClick }) {
|
|||||||
<StyledCell>{row.message}</StyledCell>
|
<StyledCell>{row.message}</StyledCell>
|
||||||
<StyledCell>{moment(row.time).format('HH:mm:ss')}</StyledCell>
|
<StyledCell>{moment(row.time).format('HH:mm:ss')}</StyledCell>
|
||||||
<StyledCell>{formatDuration(new Date(row.time).getTime() - time0)}</StyledCell>
|
<StyledCell>{formatDuration(new Date(row.time).getTime() - time0)}</StyledCell>
|
||||||
|
<StyledCell>
|
||||||
|
{index > 0
|
||||||
|
? formatDuration(new Date(row.time).getTime() - new Date(items[index - 1].time).getTime())
|
||||||
|
: 'n/a'}
|
||||||
|
</StyledCell>
|
||||||
<StyledCell>{row.procedure}</StyledCell>
|
<StyledCell>{row.procedure}</StyledCell>
|
||||||
<StyledCell>{row.line}</StyledCell>
|
<StyledCell>{row.line}</StyledCell>
|
||||||
</StyledRow>
|
</StyledRow>
|
||||||
|
|||||||
@@ -2,12 +2,16 @@ import React from 'react';
|
|||||||
import MessagesView from './MessagesView';
|
import MessagesView from './MessagesView';
|
||||||
import useSocket from '../utility/SocketProvider';
|
import useSocket from '../utility/SocketProvider';
|
||||||
|
|
||||||
export default function SessionMessagesView({ sessionId, onMessageClick }) {
|
export default function SessionMessagesView({ sessionId, onMessageClick, executeNumber }) {
|
||||||
const [messages, setMessages] = React.useState([]);
|
const [messages, setMessages] = React.useState([]);
|
||||||
const socket = useSocket();
|
const socket = useSocket();
|
||||||
|
|
||||||
const handleInfo = React.useCallback((info) => setMessages((items) => [...items, info]), []);
|
const handleInfo = React.useCallback((info) => setMessages((items) => [...items, info]), []);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setMessages([]);
|
||||||
|
}, [executeNumber]);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (sessionId && socket) {
|
if (sessionId && socket) {
|
||||||
socket.on(`session-info-${sessionId}`, handleInfo);
|
socket.on(`session-info-${sessionId}`, handleInfo);
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { TabPage, TabControl } from '../widgets/TabControl';
|
|||||||
import useSocket from '../utility/SocketProvider';
|
import useSocket from '../utility/SocketProvider';
|
||||||
import JslDataGrid from './JslDataGrid';
|
import JslDataGrid from './JslDataGrid';
|
||||||
|
|
||||||
export default function ResultTabs({ children, sessionId }) {
|
export default function ResultTabs({ children, sessionId, executeNumber }) {
|
||||||
const socket = useSocket();
|
const socket = useSocket();
|
||||||
const [resultIds, setResultIds] = React.useState([]);
|
const [resultIds, setResultIds] = React.useState([]);
|
||||||
|
|
||||||
@@ -12,6 +12,10 @@ export default function ResultTabs({ children, sessionId }) {
|
|||||||
setResultIds((ids) => [...ids, jslid]);
|
setResultIds((ids) => [...ids, jslid]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
setResultIds([]);
|
||||||
|
}, [executeNumber]);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (sessionId && socket) {
|
if (sessionId && socket) {
|
||||||
socket.on(`session-recordset-${sessionId}`, handleResultSet);
|
socket.on(`session-recordset-${sessionId}`, handleResultSet);
|
||||||
@@ -22,7 +26,7 @@ export default function ResultTabs({ children, sessionId }) {
|
|||||||
}, [sessionId, socket]);
|
}, [sessionId, socket]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<TabControl>
|
<TabControl activePageIndex={resultIds.length > 0 ? 1 : 0}>
|
||||||
{children}
|
{children}
|
||||||
{resultIds.map((jslid, index) => (
|
{resultIds.map((jslid, index) => (
|
||||||
<TabPage label={`Result ${index + 1}`} key={index}>
|
<TabPage label={`Result ${index + 1}`} key={index}>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import SessionMessagesView from '../query/SessionMessagesView';
|
|||||||
import { TabPage } from '../widgets/TabControl';
|
import { TabPage } from '../widgets/TabControl';
|
||||||
import ResultTabs from '../sqleditor/ResultTabs';
|
import ResultTabs from '../sqleditor/ResultTabs';
|
||||||
import { VerticalSplitter } from '../widgets/Splitter';
|
import { VerticalSplitter } from '../widgets/Splitter';
|
||||||
|
import keycodes from '../utility/keycodes';
|
||||||
|
|
||||||
// const MainContainer = styled.div``;
|
// 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 [queryText, setQueryText] = React.useState(() => localStorage.getItem(localStorageKey) || '');
|
||||||
const queryTextRef = React.useRef(queryText);
|
const queryTextRef = React.useRef(queryText);
|
||||||
const [sessionId, setSessionId] = React.useState(null);
|
const [sessionId, setSessionId] = React.useState(null);
|
||||||
|
const [executeNumber, setExecuteNumber] = React.useState(0);
|
||||||
|
|
||||||
const saveToStorage = React.useCallback(() => localStorage.setItem(localStorageKey, queryTextRef.current), [
|
const saveToStorage = React.useCallback(() => localStorage.setItem(localStorageKey, queryTextRef.current), [
|
||||||
localStorageKey,
|
localStorageKey,
|
||||||
@@ -54,6 +56,7 @@ export default function QueryTab({ tabid, conid, database, tabVisible, toolbarPo
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleExecute = async () => {
|
const handleExecute = async () => {
|
||||||
|
setExecuteNumber((num) => num + 1);
|
||||||
let sesid = sessionId;
|
let sesid = sessionId;
|
||||||
if (!sesid) {
|
if (!sesid) {
|
||||||
const resp = await axios.post('sessions/create', {
|
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) => {
|
const handleMesageClick = (message) => {
|
||||||
// console.log('EDITOR', editorRef.current.editor);
|
// console.log('EDITOR', editorRef.current.editor);
|
||||||
@@ -89,9 +97,9 @@ export default function QueryTab({ tabid, conid, database, tabVisible, toolbarPo
|
|||||||
onKeyDown={handleKeyDown}
|
onKeyDown={handleKeyDown}
|
||||||
editorRef={editorRef}
|
editorRef={editorRef}
|
||||||
/>
|
/>
|
||||||
<ResultTabs sessionId={sessionId}>
|
<ResultTabs sessionId={sessionId} executeNumber={executeNumber}>
|
||||||
<TabPage label="Messages" key="messages">
|
<TabPage label="Messages" key="messages">
|
||||||
<SessionMessagesView sessionId={sessionId} onMessageClick={handleMesageClick} />
|
<SessionMessagesView sessionId={sessionId} onMessageClick={handleMesageClick} executeNumber={executeNumber} />
|
||||||
</TabPage>
|
</TabPage>
|
||||||
</ResultTabs>
|
</ResultTabs>
|
||||||
</VerticalSplitter>
|
</VerticalSplitter>
|
||||||
|
|||||||
@@ -61,13 +61,17 @@ export function TabPage({ key, label, children }) {
|
|||||||
return children;
|
return children;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function TabControl({ children }) {
|
export function TabControl({ children, activePageIndex = undefined }) {
|
||||||
const [value, setValue] = React.useState(0);
|
const [value, setValue] = React.useState(0);
|
||||||
|
|
||||||
// const [mountedTabs, setMountedTabs] = React.useState({});
|
// const [mountedTabs, setMountedTabs] = React.useState({});
|
||||||
|
|
||||||
const childrenArray = (_.isArray(children) ? _.flatten(children) : [children]).filter((x) => x);
|
const childrenArray = (_.isArray(children) ? _.flatten(children) : [children]).filter((x) => x);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (activePageIndex != null) setValue(activePageIndex);
|
||||||
|
}, [activePageIndex]);
|
||||||
|
|
||||||
// // cleanup closed tabs
|
// // cleanup closed tabs
|
||||||
// if (_.difference(_.keys(mountedTabs), _.map(childrenArray, 'props.key')).length > 0) {
|
// if (_.difference(_.keys(mountedTabs), _.map(childrenArray, 'props.key')).length > 0) {
|
||||||
// setMountedTabs(_.pickBy(mountedTabs, (v, k) => childrenArray.find((x) => x.props.key == k)));
|
// setMountedTabs(_.pickBy(mountedTabs, (v, k) => childrenArray.find((x) => x.props.key == k)));
|
||||||
|
|||||||
Reference in New Issue
Block a user