mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-30 20:53:57 +00:00
mssql: support readableStream (missing drained pause+resume+drained support)
This commit is contained in:
@@ -8,7 +8,7 @@ async function queryReader({ connection, sql }) {
|
|||||||
const driver = engines(connection);
|
const driver = engines(connection);
|
||||||
const pool = await driverConnect(driver, connection);
|
const pool = await driverConnect(driver, connection);
|
||||||
console.log(`Connected.`);
|
console.log(`Connected.`);
|
||||||
return driver.readableStream(pool, sql);
|
return await driver.readableStream(pool, sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = queryReader;
|
module.exports = queryReader;
|
||||||
|
|||||||
@@ -2,12 +2,16 @@ const mssql = require('mssql');
|
|||||||
const mysql = require('mysql');
|
const mysql = require('mysql');
|
||||||
const pg = require('pg');
|
const pg = require('pg');
|
||||||
const pgQueryStream = require('pg-query-stream');
|
const pgQueryStream = require('pg-query-stream');
|
||||||
|
const fs = require('fs');
|
||||||
|
const stream = require('stream');
|
||||||
|
|
||||||
const nativeModules = {
|
const nativeModules = {
|
||||||
mssql,
|
mssql,
|
||||||
mysql,
|
mysql,
|
||||||
pg,
|
pg,
|
||||||
pgQueryStream,
|
pgQueryStream,
|
||||||
|
fs,
|
||||||
|
stream,
|
||||||
};
|
};
|
||||||
|
|
||||||
function driverConnect(driver, connection) {
|
function driverConnect(driver, connection) {
|
||||||
|
|||||||
@@ -154,6 +154,27 @@ const driver = {
|
|||||||
|
|
||||||
return request;
|
return request;
|
||||||
},
|
},
|
||||||
|
async readableStream(pool, sql) {
|
||||||
|
const request = await pool.request();
|
||||||
|
const { stream } = pool._nativeModules;
|
||||||
|
|
||||||
|
const pass = new stream.PassThrough({
|
||||||
|
objectMode: true,
|
||||||
|
highWaterMark: 100,
|
||||||
|
});
|
||||||
|
|
||||||
|
request.stream = true;
|
||||||
|
request.on('row', (row) => pass.write(row));
|
||||||
|
request.on('error', (err) => {
|
||||||
|
console.error(err);
|
||||||
|
pass.end();
|
||||||
|
});
|
||||||
|
request.on('done', () => pass.end());
|
||||||
|
|
||||||
|
request.query(sql);
|
||||||
|
|
||||||
|
return pass;
|
||||||
|
},
|
||||||
async getVersion(pool) {
|
async getVersion(pool) {
|
||||||
const { version } = (await this.query(pool, 'SELECT @@VERSION AS version')).rows[0];
|
const { version } = (await this.query(pool, 'SELECT @@VERSION AS version')).rows[0];
|
||||||
return { version };
|
return { version };
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ const driver = {
|
|||||||
|
|
||||||
return query;
|
return query;
|
||||||
},
|
},
|
||||||
readableStream(connection, sql) {
|
async readableStream(connection, sql) {
|
||||||
const query = connection.query(sql);
|
const query = connection.query(sql);
|
||||||
return query.stream({ highWaterMark: 100 });
|
return query.stream({ highWaterMark: 100 });
|
||||||
},
|
},
|
||||||
|
|||||||
2
packages/types/engines.d.ts
vendored
2
packages/types/engines.d.ts
vendored
@@ -17,7 +17,7 @@ export interface EngineDriver {
|
|||||||
connect(nativeModules, { server, port, user, password, database }): any;
|
connect(nativeModules, { server, port, user, password, database }): any;
|
||||||
query(pool: any, sql: string): Promise<QueryResult>;
|
query(pool: any, sql: string): Promise<QueryResult>;
|
||||||
stream(pool: any, sql: string, options: StreamOptions);
|
stream(pool: any, sql: string, options: StreamOptions);
|
||||||
readableStream(pool: any, sql: string): stream.Readable;
|
readableStream(pool: any, sql: string): Promise<stream.Readable>;
|
||||||
getVersion(pool: any): Promise<{ version: string }>;
|
getVersion(pool: any): Promise<{ version: string }>;
|
||||||
listDatabases(
|
listDatabases(
|
||||||
pool: any
|
pool: any
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import { DropDownMenuItem } from '../modals/DropDownMenu';
|
|||||||
import { openNewTab } from '../utility/common';
|
import { openNewTab } from '../utility/common';
|
||||||
import { getConnectionInfo } from '../utility/metadataLoaders';
|
import { getConnectionInfo } from '../utility/metadataLoaders';
|
||||||
import fullDisplayName from '../utility/fullDisplayName';
|
import fullDisplayName from '../utility/fullDisplayName';
|
||||||
import { filterName } from '@dbgate/datalib';
|
import { filterName, fullNameToString } from '@dbgate/datalib';
|
||||||
|
import ImportExportModal from '../modals/ImportExportModal';
|
||||||
|
|
||||||
const icons = {
|
const icons = {
|
||||||
tables: 'table2.svg',
|
tables: 'table2.svg',
|
||||||
@@ -28,6 +29,10 @@ const menus = {
|
|||||||
label: 'Show CREATE TABLE script',
|
label: 'Show CREATE TABLE script',
|
||||||
sqlTemplate: 'CREATE TABLE',
|
sqlTemplate: 'CREATE TABLE',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Export',
|
||||||
|
isExport: true,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
views: [
|
views: [
|
||||||
{
|
{
|
||||||
@@ -38,6 +43,10 @@ const menus = {
|
|||||||
label: 'Show CREATE VIEW script',
|
label: 'Show CREATE VIEW script',
|
||||||
sqlTemplate: 'CREATE OBJECT',
|
sqlTemplate: 'CREATE OBJECT',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Export',
|
||||||
|
isExport: true,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
procedures: [
|
procedures: [
|
||||||
{
|
{
|
||||||
@@ -90,14 +99,28 @@ async function openObjectDetail(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function Menu({ data, makeAppObj, setOpenedTabs }) {
|
function Menu({ data, makeAppObj, setOpenedTabs, showModal }) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{menus[data.objectTypeField].map((menu) => (
|
{menus[data.objectTypeField].map((menu) => (
|
||||||
<DropDownMenuItem
|
<DropDownMenuItem
|
||||||
key={menu.label}
|
key={menu.label}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
openObjectDetail(setOpenedTabs, menu.tab, menu.sqlTemplate, data);
|
if (menu.isExport) {
|
||||||
|
showModal((modalState) => (
|
||||||
|
<ImportExportModal
|
||||||
|
modalState={modalState}
|
||||||
|
initialValues={{
|
||||||
|
sourceStorageType: 'database',
|
||||||
|
sourceConnectionId: data.conid,
|
||||||
|
sourceDatabaseName: data.database,
|
||||||
|
sourceTables: [fullNameToString(data)],
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
openObjectDetail(setOpenedTabs, menu.tab, menu.sqlTemplate, data);
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{menu.label}
|
{menu.label}
|
||||||
|
|||||||
Reference in New Issue
Block a user