From c82436d5c77f9c2fd089327b249aecffee18e428 Mon Sep 17 00:00:00 2001 From: gjsjohnmurray Date: Wed, 26 Feb 2025 10:48:38 +0000 Subject: [PATCH] Add `resultSetRowLimit` extension setting --- package.json | 13 +++++++++++++ src/extension.ts | 2 ++ src/ls/driver.ts | 8 +++++--- src/ls/irisdb.ts | 6 ++++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c4411e5..19c6ee7 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,19 @@ "onLanguage:sql", "onCommand:sqltools.*" ], + "contributes": { + "configuration": { + "title": "SQLTools InterSystems IRIS Driver", + "properties": { + "sqltools-intersystems-driver.resultSetRowLimit": { + "description": "Maximum number of rows returned by any query, including metadata queries. Use 0 for no limit, which may cause timeouts or other failures. Setting is applied at connection time and is ignored by server versions earlier than 2023.1.", + "type": "integer", + "default": 1000, + "minimum": 0 + } + } + } + }, "main": "./dist/extension.js", "ls": "./dist/ls/plugin.js", "dependencies": { diff --git a/src/extension.ts b/src/extension.ts index 71c54f1..8337b02 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -149,6 +149,7 @@ export async function activate(extContext: ExtensionContext): Promise im queries: IQueries = queries; private showSystem = false; private filter = ""; + private resultSetRowLimit; public async open() { if (this.connection) { @@ -26,7 +27,7 @@ export default class IRISDriver extends AbstractDriver im this.showSystem = this.credentials.showSystem || false; this.filter = this.credentials.filter || ""; - let { https, server: host, port, pathPrefix, username, password } = this.credentials; + let { https, server: host, port, pathPrefix, username, password, resultSetRowLimit } = this.credentials; config = { https, host, @@ -36,8 +37,9 @@ export default class IRISDriver extends AbstractDriver im username, password }; + this.resultSetRowLimit = resultSetRowLimit; - const irisdb = new IRISdb(config); + const irisdb = new IRISdb(config, resultSetRowLimit); return irisdb.open() .then(() => { this.connection = Promise.resolve(irisdb); @@ -91,7 +93,7 @@ export default class IRISDriver extends AbstractDriver im resultsAgg.push({ cols, connId: this.getId(), - messages: [{ date: new Date(), message: `Query ok with ${queryResult[0]?.content.length ?? 'no'} results` }], + messages: [{ date: new Date(), message: `Query ok with ${queryResult[0]?.content.length ?? 'no'} results (resultSetRowLimit = ${this.resultSetRowLimit})` }], results: this.mapRows(queryResult[0]?.content, cols), query: queries.toString(), requestId: opt.requestId, diff --git a/src/ls/irisdb.ts b/src/ls/irisdb.ts index 47c52fe..f0d694b 100644 --- a/src/ls/irisdb.ts +++ b/src/ls/irisdb.ts @@ -26,6 +26,7 @@ export interface IQueries extends IBaseQueries { export default class IRISdb { private config: IRISDirect; + private resultSetRowLimit: number; private cookies: string[] = []; private _apiVersion = 1; @@ -33,9 +34,10 @@ export default class IRISdb { return this._apiVersion; } - public constructor(config: IRISDirect) { + public constructor(config: IRISDirect, resultSetRowLimit: number) { this.config = config; this.config.namespace = this.config.namespace.toUpperCase(); + this.resultSetRowLimit = resultSetRowLimit; } public updateCookies(newCookies: string[]): void { @@ -187,7 +189,7 @@ export default class IRISdb { return this.request(1, "POST", `${this.config.namespace}/action/query`, { parameters, query, - }, this._apiVersion >= 6 ? { positional: true } : {}).then(data => data.result) + }, this._apiVersion >= 6 ? { positional: true , max: this.resultSetRowLimit > 0 ? this.resultSetRowLimit : undefined } : {}).then(data => data.result) }