mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-21 22:16:00 +00:00
oracle: handle statements in stream
This commit is contained in:
@@ -98,78 +98,108 @@ const drivers = driverBases.map(driverBase => ({
|
|||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
// console.log('queryStream', sql);
|
// console.log('queryStream', sql);
|
||||||
const query = client.queryStream(sql);
|
|
||||||
// const consumeStream = new Promise((resolve, reject) => {
|
|
||||||
let rowcount = 0;
|
|
||||||
let wasHeader = false;
|
|
||||||
|
|
||||||
query.on('metadata', row => {
|
if (sql.trim().toLowerCase().startsWith('select')) {
|
||||||
// console.log('metadata', row);
|
const query = client.queryStream(sql);
|
||||||
if (!wasHeader) {
|
// const consumeStream = new Promise((resolve, reject) => {
|
||||||
columns = extractOracleColumns(row);
|
let rowcount = 0;
|
||||||
if (columns && columns.length > 0) {
|
let wasHeader = false;
|
||||||
options.recordset(columns);
|
|
||||||
|
query.on('metadata', row => {
|
||||||
|
// console.log('metadata', row);
|
||||||
|
if (!wasHeader) {
|
||||||
|
columns = extractOracleColumns(row);
|
||||||
|
if (columns && columns.length > 0) {
|
||||||
|
options.recordset(columns);
|
||||||
|
}
|
||||||
|
wasHeader = true;
|
||||||
}
|
}
|
||||||
wasHeader = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// options.row(zipDataRow(row, columns));
|
// options.row(zipDataRow(row, columns));
|
||||||
});
|
|
||||||
|
|
||||||
query.on('data', row => {
|
|
||||||
// console.log('stream DATA');
|
|
||||||
if (!wasHeader) {
|
|
||||||
columns = extractOracleColumns(row);
|
|
||||||
if (columns && columns.length > 0) {
|
|
||||||
options.recordset(columns);
|
|
||||||
}
|
|
||||||
wasHeader = true;
|
|
||||||
}
|
|
||||||
options.row(zipDataRow(row, columns));
|
|
||||||
});
|
|
||||||
|
|
||||||
query.on('end', () => {
|
|
||||||
const { command, rowCount } = query._result || {};
|
|
||||||
|
|
||||||
if (command != 'SELECT' && _.isNumber(rowCount)) {
|
|
||||||
options.info({
|
|
||||||
message: `${rowCount} rows affected`,
|
|
||||||
time: new Date(),
|
|
||||||
severity: 'info',
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wasHeader) {
|
|
||||||
columns = extractOracleColumns(query._result);
|
|
||||||
if (columns && columns.length > 0) {
|
|
||||||
options.recordset(columns);
|
|
||||||
}
|
|
||||||
wasHeader = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
options.done();
|
|
||||||
});
|
|
||||||
|
|
||||||
query.on('error', error => {
|
|
||||||
console.log('ERROR', error);
|
|
||||||
const { message, lineNumber, procName } = error;
|
|
||||||
options.info({
|
|
||||||
message,
|
|
||||||
line: lineNumber,
|
|
||||||
procedure: procName,
|
|
||||||
time: new Date(),
|
|
||||||
severity: 'error',
|
|
||||||
});
|
});
|
||||||
options.done();
|
|
||||||
});
|
|
||||||
query.on('close', function () {
|
|
||||||
//console.log("stream 'close' event");
|
|
||||||
// The underlying ResultSet has been closed, so the connection can now
|
|
||||||
// be closed, if desired. Note: do not close connections on 'end'.
|
|
||||||
//resolve(rowcount);
|
|
||||||
});
|
|
||||||
//});
|
|
||||||
|
|
||||||
|
query.on('data', row => {
|
||||||
|
// console.log('stream DATA');
|
||||||
|
if (!wasHeader) {
|
||||||
|
columns = extractOracleColumns(row);
|
||||||
|
if (columns && columns.length > 0) {
|
||||||
|
options.recordset(columns);
|
||||||
|
}
|
||||||
|
wasHeader = true;
|
||||||
|
}
|
||||||
|
options.row(zipDataRow(row, columns));
|
||||||
|
});
|
||||||
|
|
||||||
|
query.on('end', () => {
|
||||||
|
const { command, rowCount } = query._result || {};
|
||||||
|
|
||||||
|
if (command != 'SELECT' && _.isNumber(rowCount)) {
|
||||||
|
options.info({
|
||||||
|
message: `${rowCount} rows affected`,
|
||||||
|
time: new Date(),
|
||||||
|
severity: 'info',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wasHeader) {
|
||||||
|
columns = extractOracleColumns(query._result);
|
||||||
|
if (columns && columns.length > 0) {
|
||||||
|
options.recordset(columns);
|
||||||
|
}
|
||||||
|
wasHeader = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
options.done();
|
||||||
|
});
|
||||||
|
|
||||||
|
query.on('error', error => {
|
||||||
|
console.log('ERROR', error);
|
||||||
|
const { message, lineNumber, procName } = error;
|
||||||
|
options.info({
|
||||||
|
message,
|
||||||
|
line: lineNumber,
|
||||||
|
procedure: procName,
|
||||||
|
time: new Date(),
|
||||||
|
severity: 'error',
|
||||||
|
});
|
||||||
|
options.done();
|
||||||
|
});
|
||||||
|
query.on('close', function () {
|
||||||
|
//console.log("stream 'close' event");
|
||||||
|
// The underlying ResultSet has been closed, so the connection can now
|
||||||
|
// be closed, if desired. Note: do not close connections on 'end'.
|
||||||
|
//resolve(rowcount);
|
||||||
|
});
|
||||||
|
//});
|
||||||
|
} else {
|
||||||
|
client.execute(sql, (err, res) => {
|
||||||
|
if (err) {
|
||||||
|
console.log('Error query', err, sql);
|
||||||
|
options.info({
|
||||||
|
message: err.message,
|
||||||
|
time: new Date(),
|
||||||
|
severity: 'error',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const { rowsAffected, metaData, rows } = res || {};
|
||||||
|
|
||||||
|
if (rows && metaData) {
|
||||||
|
const columns = extractOracleColumns(metaData);
|
||||||
|
options.recordset(columns);
|
||||||
|
for (const row of rows) {
|
||||||
|
options.row(zipDataRow(row, columns));
|
||||||
|
}
|
||||||
|
} else if (rowsAffected) {
|
||||||
|
options.info({
|
||||||
|
message: `${rowsAffected} rows affected`,
|
||||||
|
time: new Date(),
|
||||||
|
severity: 'info',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
options.done();
|
||||||
|
});
|
||||||
|
}
|
||||||
//const numrows = await consumeStream;
|
//const numrows = await consumeStream;
|
||||||
//console.log('Rows selected: ' + numrows);
|
//console.log('Rows selected: ' + numrows);
|
||||||
//client.query(query);
|
//client.query(query);
|
||||||
|
|||||||
Reference in New Issue
Block a user