introduced dbhandle instead of overwriting 3rd party client's fields

This commit is contained in:
SPRINX0\prochazka
2024-09-20 10:27:03 +02:00
parent 6b8b511d0d
commit 48d4374346
26 changed files with 387 additions and 371 deletions

View File

@@ -24,7 +24,7 @@ class Analyser extends DatabaseAnalyser {
createQuery(resFileName, typeFields, replacements = {}) {
let res = sql[resFileName];
res = res.replace('#DATABASE#', this.pool.__dbgate_database_name__);
res = res.replace('#DATABASE#', this.dbhan.database);
return super.createQuery(res, typeFields, replacements);
}
@@ -82,8 +82,8 @@ class Analyser extends DatabaseAnalyser {
async _computeSingleObjectId() {
const { pureName } = this.singleObjectFilter;
const resId = await this.driver.query(
this.pool,
`SELECT uuid as id FROM system.tables WHERE database = '${this.pool.__dbgate_database_name__}' AND name='${pureName}'`
this.dbhan,
`SELECT uuid as id FROM system.tables WHERE database = '${this.dbhan.database}' AND name='${pureName}'`
);
this.singleObjectId = resId.rows[0]?.id;
}

View File

@@ -5,11 +5,11 @@ const _ = require('lodash');
*
* @param {import('dbgate-types').EngineDriver} driver
*/
function createOracleBulkInsertStream(driver, stream, pool, name, options) {
const writable = createBulkInsertStreamBase(driver, stream, pool, name, options);
function createOracleBulkInsertStream(driver, stream, dbhan, name, options) {
const writable = createBulkInsertStreamBase(driver, stream, dbhan, name, options);
writable.send = async () => {
await pool.insert({
await dbhan.client.insert({
table: name.pureName,
values: writable.buffer,
format: 'JSONEachRow',

View File

@@ -5,7 +5,6 @@ const Analyser = require('./Analyser');
const { createClient } = require('@clickhouse/client');
const createBulkInsertStream = require('./createBulkInsertStream');
/** @type {import('dbgate-types').EngineDriver} */
const driver = {
...driverBase,
@@ -19,13 +18,15 @@ const driver = {
database,
});
client.__dbgate_database_name__ = database;
return client;
return {
client,
database,
};
},
// called for retrieve data (eg. browse in data grid) and for update database
async query(client, query, options) {
async query(dbhan, query, options) {
if (options?.discardResult) {
await client.command({
await dbhan.client.command({
query,
});
return {
@@ -33,7 +34,7 @@ const driver = {
columns: [],
};
} else {
const resultSet = await client.query({
const resultSet = await dbhan.client.query({
query,
format: 'JSONCompactEachRowWithNamesAndTypes',
});
@@ -58,10 +59,10 @@ const driver = {
}
},
// called in query console
async stream(client, query, options) {
async stream(dbhan, query, options) {
try {
if (!query.match(/^\s*SELECT/i)) {
const resp = await client.command({
const resp = await dbhan.client.command({
query,
});
// console.log('RESP', resp);
@@ -77,7 +78,7 @@ const driver = {
return;
}
const resultSet = await client.query({
const resultSet = await dbhan.client.query({
query,
format: 'JSONCompactEachRowWithNamesAndTypes',
});
@@ -139,13 +140,13 @@ const driver = {
}
},
// called when exporting table or view
async readQuery(client, query, structure) {
async readQuery(dbhan, query, structure) {
const pass = new stream.PassThrough({
objectMode: true,
highWaterMark: 100,
});
const resultSet = await client.query({
const resultSet = await dbhan.client.query({
query,
format: 'JSONCompactEachRowWithNamesAndTypes',
});
@@ -191,12 +192,12 @@ const driver = {
return pass;
},
async writeTable(pool, name, options) {
return createBulkInsertStream(this, stream, pool, name, options);
async writeTable(dbhan, name, options) {
return createBulkInsertStream(this, stream, dbhan, name, options);
},
// detect server version
async getVersion(client) {
const resultSet = await client.query({
async getVersion(dbhan) {
const resultSet = await dbhan.client.query({
query: 'SELECT version() as version',
format: 'JSONEachRow',
});
@@ -204,8 +205,8 @@ const driver = {
return { version: dataset[0].version };
},
// list databases on server
async listDatabases(client) {
const resultSet = await client.query({
async listDatabases(dbhan) {
const resultSet = await dbhan.client.query({
query: `SELECT name
FROM system.databases
WHERE name NOT IN ('system', 'information_schema', 'information_schema_ro', 'INFORMATION_SCHEMA')`,
@@ -215,8 +216,8 @@ const driver = {
return dataset;
},
async close(client) {
return client.close();
async close(dbhan) {
return dbhan.client.close();
},
};