Files
dbgate/packages/api/src/controllers/sessions.js
2020-04-14 21:18:43 +02:00

114 lines
3.1 KiB
JavaScript

const _ = require('lodash');
const uuidv1 = require('uuid/v1');
const connections = require('./connections');
const socket = require('../utility/socket');
const { fork } = require('child_process');
const jsldata = require('./jsldata');
module.exports = {
/** @type {import('@dbgate/types').OpenedSession[]} */
opened: [],
// handle_error(sesid, props) {
// const { error } = props;
// console.log(`Error in database session ${sesid}`, error);
// this.dispatchMessage(sesid, {
// severity: 'error',
// message: error && error.toString(),
// });
// },
// handle_row(sesid, props) {
// const { row } = props;
// socket.emit('sessionRow', row);
// },
dispatchMessage(sesid, message) {
if (_.isString(message)) {
socket.emit(`session-info-${sesid}`, {
message,
time: new Date(),
severity: 'info',
});
}
if (_.isPlainObject(message)) {
socket.emit(`session-info-${sesid}`, {
time: new Date(),
severity: 'info',
...message,
});
}
},
handle_info(sesid, props) {
const { info } = props;
this.dispatchMessage(sesid, info);
},
handle_done(sesid) {
socket.emit(`session-done-${sesid}`);
this.dispatchMessage(sesid, 'Query execution finished');
},
handle_recordset(sesid, props) {
const { jslid } = props;
socket.emit(`session-recordset-${sesid}`, { jslid });
},
handle_stats(sesid, stats) {
jsldata.notifyChangedStats(stats);
},
create_meta: 'post',
async create({ conid, database }) {
const sesid = uuidv1();
const connection = await connections.get({ conid });
const subprocess = fork(process.argv[1], ['sessionProcess']);
const newOpened = {
conid,
database,
subprocess,
connection,
sesid,
};
this.opened.push(newOpened);
// @ts-ignore
subprocess.on('message', ({ msgtype, ...message }) => {
this[`handle_${msgtype}`](sesid, message);
});
subprocess.send({ msgtype: 'connect', ...connection, database });
return newOpened;
},
executeQuery_meta: 'post',
async executeQuery({ sesid, sql }) {
const session = this.opened.find((x) => x.sesid == sesid);
if (!session) {
throw new Error('Invalid session');
}
console.log(`Processing query, sesid=${sesid}, sql=${sql}`);
this.dispatchMessage(sesid, 'Query execution started');
session.subprocess.send({ msgtype: 'executeQuery', sql });
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' };
},
// runCommand_meta: 'post',
// async runCommand({ conid, database, sql }) {
// console.log(`Running SQL command , conid=${conid}, database=${database}, sql=${sql}`);
// const opened = await this.ensureOpened(conid, database);
// const res = await this.sendRequest(opened, { msgtype: 'queryData', sql });
// return res;
// },
};