loading data from query fix

This commit is contained in:
Jan Prochazka
2020-04-14 21:18:43 +02:00
parent cc4eb133a7
commit 6e8ef35902
4 changed files with 81 additions and 2 deletions

View File

@@ -2,6 +2,7 @@ const path = require('path');
const fs = require('fs'); const fs = require('fs');
const lineReader = require('line-reader'); const lineReader = require('line-reader');
const { jsldir } = require('../utility/directories'); const { jsldir } = require('../utility/directories');
const socket = require('../utility/socket');
module.exports = { module.exports = {
openedReaders: {}, openedReaders: {},
@@ -78,4 +79,15 @@ module.exports = {
} }
return res; return res;
}, },
getStats_meta: 'get',
getStats({ jslid }) {
const file = path.join(jsldir(), `${jslid}.jsonl.stats`);
return JSON.parse(fs.readFileSync(file, 'utf-8'));
},
async notifyChangedStats(stats) {
await this.closeReader(stats.jslid);
socket.emit(`jsldata-stats-${stats.jslid}`, stats);
},
}; };

View File

@@ -3,6 +3,7 @@ const uuidv1 = require('uuid/v1');
const connections = require('./connections'); const connections = require('./connections');
const socket = require('../utility/socket'); const socket = require('../utility/socket');
const { fork } = require('child_process'); const { fork } = require('child_process');
const jsldata = require('./jsldata');
module.exports = { module.exports = {
/** @type {import('@dbgate/types').OpenedSession[]} */ /** @type {import('@dbgate/types').OpenedSession[]} */
@@ -53,6 +54,10 @@ module.exports = {
socket.emit(`session-recordset-${sesid}`, { jslid }); socket.emit(`session-recordset-${sesid}`, { jslid });
}, },
handle_stats(sesid, stats) {
jsldata.notifyChangedStats(stats);
},
create_meta: 'post', create_meta: 'post',
async create({ conid, database }) { async create({ conid, database }) {
const sesid = uuidv1(); const sesid = uuidv1();

View File

@@ -2,6 +2,7 @@ const engines = require('@dbgate/engines');
const uuidv1 = require('uuid/v1'); const uuidv1 = require('uuid/v1');
const path = require('path'); const path = require('path');
const fs = require('fs'); const fs = require('fs');
const _ = require('lodash');
const driverConnect = require('../utility/driverConnect'); const driverConnect = require('../utility/driverConnect');
const { jsldir } = require('../utility/directories'); const { jsldir } = require('../utility/directories');
@@ -26,7 +27,27 @@ class StreamHandler {
closeCurrentStream() { closeCurrentStream() {
if (this.currentStream) { if (this.currentStream) {
this.currentStream.end(); this.currentStream.end();
this.writeCurrentStats(true, true);
this.currentStream = null; this.currentStream = null;
this.jslid = null;
this.currentFile = null;
this.currentRowCount = null;
this.currentChangeIndex = null;
}
}
writeCurrentStats(isFinished = false, emitEvent = false) {
const stats = {
rowCount: this.currentRowCount,
changeIndex: this.currentChangeIndex,
isFinished,
jslid: this.jslid,
};
fs.writeFileSync(`${this.currentFile}.stats`, JSON.stringify(stats));
this.currentChangeIndex += 1;
if (emitEvent) {
process.send({ msgtype: 'stats', ...stats });
} }
} }
@@ -35,12 +56,23 @@ class StreamHandler {
this.jslid = uuidv1(); this.jslid = uuidv1();
this.currentFile = path.join(jsldir(), `${this.jslid}.jsonl`); this.currentFile = path.join(jsldir(), `${this.jslid}.jsonl`);
this.currentStream = fs.createWriteStream(this.currentFile); this.currentStream = fs.createWriteStream(this.currentFile);
this.currentRowCount = 0;
this.currentChangeIndex = 0;
fs.writeFileSync(`${this.currentFile}.info`, JSON.stringify(columns)); fs.writeFileSync(`${this.currentFile}.info`, JSON.stringify(columns));
process.send({ msgtype: 'recordset', jslid: this.jslid }); process.send({ msgtype: 'recordset', jslid: this.jslid });
this.writeCurrentStats();
this.onRow = _.throttle((jslid) => {
if (jslid == this.jslid) {
this.writeCurrentStats(false, true);
}
}, 500);
} }
row(row) { row(row) {
// console.log('ACCEPT ROW', row); // console.log('ACCEPT ROW', row);
this.currentStream.write(JSON.stringify(row) + '\n'); this.currentStream.write(JSON.stringify(row) + '\n');
this.currentRowCount += 1;
this.onRow(this.jslid);
} }
// error(error) { // error(error) {
// process.send({ msgtype: 'error', error }); // process.send({ msgtype: 'error', error });

View File

@@ -37,6 +37,7 @@ import ColumnHeaderControl from './ColumnHeaderControl';
import InlineButton from '../widgets/InlineButton'; import InlineButton from '../widgets/InlineButton';
import { showMenu } from '../modals/DropDownMenu'; import { showMenu } from '../modals/DropDownMenu';
import DataGridContextMenu from './DataGridContextMenu'; import DataGridContextMenu from './DataGridContextMenu';
import useSocket from '../utility/SocketProvider';
const GridContainer = styled.div` const GridContainer = styled.div`
position: absolute; position: absolute;
@@ -143,6 +144,18 @@ function dataPageAvailable(props) {
/** @param props {import('./types').DataGridProps} */ /** @param props {import('./types').DataGridProps} */
async function loadRowCount(props) { async function loadRowCount(props) {
const { display, conid, database, jslid } = props; const { display, conid, database, jslid } = props;
if (jslid) {
const response = await axios.request({
url: 'jsldata/get-stats',
method: 'get',
params: {
jslid,
},
});
return response.data.rowCount;
}
const sql = display.getCountQuery(); const sql = display.getCountQuery();
const response = await axios.request({ const response = await axios.request({
@@ -160,7 +173,7 @@ async function loadRowCount(props) {
/** @param props {import('./types').DataGridProps} */ /** @param props {import('./types').DataGridProps} */
export default function DataGridCore(props) { export default function DataGridCore(props) {
const { conid, database, display, changeSetState, dispatchChangeSet, tabVisible } = props; const { conid, database, display, changeSetState, dispatchChangeSet, tabVisible, jslid } = props;
// console.log('RENDER GRID', display.baseTable.pureName); // console.log('RENDER GRID', display.baseTable.pureName);
const columns = React.useMemo(() => display.getGridColumns(), [display]); const columns = React.useMemo(() => display.getGridColumns(), [display]);
@@ -225,7 +238,6 @@ export default function DataGridCore(props) {
setLoadProps((oldLoadProps) => ({ setLoadProps((oldLoadProps) => ({
...oldLoadProps, ...oldLoadProps,
isLoading: true, isLoading: true,
allRowCount: null,
})); }));
const loadStart = new Date().getTime(); const loadStart = new Date().getTime();
loadedTimeRef.current = loadStart; loadedTimeRef.current = loadStart;
@@ -265,6 +277,7 @@ export default function DataGridCore(props) {
// const { rows, columns } = data || {}; // const { rows, columns } = data || {};
const [firstVisibleRowScrollIndex, setFirstVisibleRowScrollIndex] = React.useState(0); const [firstVisibleRowScrollIndex, setFirstVisibleRowScrollIndex] = React.useState(0);
const [firstVisibleColumnScrollIndex, setFirstVisibleColumnScrollIndex] = React.useState(0); const [firstVisibleColumnScrollIndex, setFirstVisibleColumnScrollIndex] = React.useState(0);
const socket = useSocket();
const [headerRowRef, { height: rowHeight }] = useDimensions(); const [headerRowRef, { height: rowHeight }] = useDimensions();
const [tableBodyRef] = useDimensions(); const [tableBodyRef] = useDimensions();
@@ -357,6 +370,23 @@ export default function DataGridCore(props) {
} }
}, [tabVisible, focusFieldRef.current]); }, [tabVisible, focusFieldRef.current]);
const handleJslDataStats = React.useCallback((stats) => {
setLoadProps((oldProps) => ({
...oldProps,
allRowCount: stats.rowCount,
isLoadedAll: false,
}));
}, []);
React.useEffect(() => {
if (jslid && socket) {
socket.on(`jsldata-stats-${jslid}`, handleJslDataStats);
return () => {
socket.off(`jsldata-stats-${jslid}`, handleJslDataStats);
};
}
}, [jslid]);
// const handleCloseInplaceEditor = React.useCallback( // const handleCloseInplaceEditor = React.useCallback(
// mode => { // mode => {
// const [row, col] = currentCell || []; // const [row, col] = currentCell || [];