mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-18 02:06:01 +00:00
114 lines
3.1 KiB
JavaScript
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;
|
|
// },
|
|
};
|