From 1376debde50fa5c0e00003e01a079ff7b5af2368 Mon Sep 17 00:00:00 2001 From: Ganesh Kumar Date: Fri, 15 Nov 2024 16:17:42 +0530 Subject: [PATCH] feat: statement timeout can be configured from env for postgresql mysql mssql plugins --- plugins/packages/mssql/lib/index.ts | 12 ++++++++---- plugins/packages/mysql/lib/index.ts | 12 ++++++++---- plugins/packages/postgresql/lib/index.ts | 17 ++++++++++------- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/plugins/packages/mssql/lib/index.ts b/plugins/packages/mssql/lib/index.ts index e9864a608c..84263a93a2 100644 --- a/plugins/packages/mssql/lib/index.ts +++ b/plugins/packages/mssql/lib/index.ts @@ -10,12 +10,16 @@ import { import { SourceOptions, QueryOptions } from './types'; import { isEmpty } from '@tooljet-plugins/common'; -const STATEMENT_TIMEOUT = 10000; - export default class MssqlQueryService implements QueryService { private static _instance: MssqlQueryService; + private STATEMENT_TIMEOUT; constructor() { + this.STATEMENT_TIMEOUT = + process.env?.PLUGINS_SQL_DB_STATEMENT_TIMEOUT && !isNaN(Number(process.env?.PLUGINS_SQL_DB_STATEMENT_TIMEOUT)) + ? Number(process.env.PLUGINS_SQL_DB_STATEMENT_TIMEOUT) + : 120000; + if (MssqlQueryService._instance) { return MssqlQueryService._instance; } @@ -84,13 +88,13 @@ export default class MssqlQueryService implements QueryService { private async executeQuery(knexInstance: Knex, query: string, sanitizedQueryParams: Record = {}) { if (isEmpty(query)) throw new Error('Query is empty'); - const result = await knexInstance.raw(query, sanitizedQueryParams).timeout(STATEMENT_TIMEOUT); + const result = await knexInstance.raw(query, sanitizedQueryParams).timeout(this.STATEMENT_TIMEOUT); return result; } async testConnection(sourceOptions: SourceOptions): Promise { const knexInstance = await this.getConnection(sourceOptions, {}, false); - await knexInstance.raw('select @@version;').timeout(STATEMENT_TIMEOUT); + await knexInstance.raw('select @@version;').timeout(this.STATEMENT_TIMEOUT); knexInstance.destroy(); return { diff --git a/plugins/packages/mysql/lib/index.ts b/plugins/packages/mysql/lib/index.ts index 9fc9e9afac..8a4509a894 100644 --- a/plugins/packages/mysql/lib/index.ts +++ b/plugins/packages/mysql/lib/index.ts @@ -10,12 +10,16 @@ import { import { SourceOptions, QueryOptions } from './types'; import { isEmpty } from '@tooljet-plugins/common'; -const STATEMENT_TIMEOUT = 10000; - export default class MysqlQueryService implements QueryService { private static _instance: MysqlQueryService; + private STATEMENT_TIMEOUT; constructor() { + this.STATEMENT_TIMEOUT = + process.env?.PLUGINS_SQL_DB_STATEMENT_TIMEOUT && !isNaN(Number(process.env?.PLUGINS_SQL_DB_STATEMENT_TIMEOUT)) + ? Number(process.env.PLUGINS_SQL_DB_STATEMENT_TIMEOUT) + : 120000; + if (MysqlQueryService._instance) { return MysqlQueryService._instance; } @@ -51,7 +55,7 @@ export default class MysqlQueryService implements QueryService { async testConnection(sourceOptions: SourceOptions): Promise { const knexInstance = await this.getConnection(sourceOptions, {}, false); - await knexInstance.raw('select @@version;').timeout(STATEMENT_TIMEOUT); + await knexInstance.raw('select @@version;').timeout(this.STATEMENT_TIMEOUT); knexInstance.destroy(); return { status: 'ok' }; } @@ -77,7 +81,7 @@ export default class MysqlQueryService implements QueryService { private async executeQuery(knexInstance: Knex, query: string, sanitizedQueryParams: Record = {}) { if (isEmpty(query)) throw new Error('Query is empty'); - const result = await knexInstance.raw(query, sanitizedQueryParams).timeout(STATEMENT_TIMEOUT); + const result = await knexInstance.raw(query, sanitizedQueryParams).timeout(this.STATEMENT_TIMEOUT); return result; } diff --git a/plugins/packages/postgresql/lib/index.ts b/plugins/packages/postgresql/lib/index.ts index 78a5b9320e..fcbf2d736b 100644 --- a/plugins/packages/postgresql/lib/index.ts +++ b/plugins/packages/postgresql/lib/index.ts @@ -10,12 +10,16 @@ import { SourceOptions, QueryOptions } from './types'; import knex, { Knex } from 'knex'; import { isEmpty } from '@tooljet-plugins/common'; -const STATEMENT_TIMEOUT = 10000; - export default class PostgresqlQueryService implements QueryService { private static _instance: PostgresqlQueryService; + private STATEMENT_TIMEOUT; constructor() { + this.STATEMENT_TIMEOUT = + process.env?.PLUGINS_SQL_DB_STATEMENT_TIMEOUT && !isNaN(Number(process.env?.PLUGINS_SQL_DB_STATEMENT_TIMEOUT)) + ? Number(process.env.PLUGINS_SQL_DB_STATEMENT_TIMEOUT) + : 120000; + if (PostgresqlQueryService._instance) { return PostgresqlQueryService._instance; } @@ -51,7 +55,7 @@ export default class PostgresqlQueryService implements QueryService { async testConnection(sourceOptions: SourceOptions): Promise { const knexInstance = await this.getConnection(sourceOptions, {}, false); - await knexInstance.raw('SELECT version();').timeout(STATEMENT_TIMEOUT); + await knexInstance.raw('SELECT version();').timeout(this.STATEMENT_TIMEOUT); return { status: 'ok' }; } @@ -75,9 +79,7 @@ export default class PostgresqlQueryService implements QueryService { private async executeQuery(knexInstance: Knex, query: string, sanitizedQueryParams: Record = {}) { if (isEmpty(query)) throw new Error('Query is empty'); - - const { rows } = await knexInstance.raw(query, sanitizedQueryParams).timeout(STATEMENT_TIMEOUT); - + const { rows } = await knexInstance.raw(query, sanitizedQueryParams); return rows; } @@ -100,6 +102,7 @@ export default class PostgresqlQueryService implements QueryService { password: sourceOptions.password, port: sourceOptions.port, ssl: this.getSslConfig(sourceOptions), + statement_timeout: this.STATEMENT_TIMEOUT, }; } else if (sourceOptions.connection_type === 'string' && sourceOptions.connection_string) { connectionConfig = { @@ -111,7 +114,7 @@ export default class PostgresqlQueryService implements QueryService { client: 'pg', connection: connectionConfig, pool: { min: 0, max: 10, acquireTimeoutMillis: 10000 }, - acquireConnectionTimeout: 10000, + acquireConnectionTimeout: 60000, ...this.connectionOptions(sourceOptions), };