From 4d3f082466b90c26b85f2124a8739dfdf48a898c Mon Sep 17 00:00:00 2001 From: worksofliam Date: Thu, 20 Feb 2025 23:03:27 -0500 Subject: [PATCH 1/8] enableSQL does not exist on config, and was moved to connection Signed-off-by: worksofliam --- src/api/components/getMemberInfo.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/components/getMemberInfo.ts b/src/api/components/getMemberInfo.ts index dd591a35f..508e37e79 100644 --- a/src/api/components/getMemberInfo.ts +++ b/src/api/components/getMemberInfo.ts @@ -59,7 +59,7 @@ export class GetMemberInfo implements IBMiComponent { const statement = `select * from table(${tempLib}.${this.procedureName}('${library}', '${sourceFile}', '${member}'))`; let results: Tools.DB2Row[] = []; - if (config.enableSQL) { + if (connection.enableSQL) { try { results = await connection.runSQL(statement); } catch (e) { } // Ignore errors, will return undefined. @@ -92,7 +92,7 @@ export class GetMemberInfo implements IBMiComponent { .join(' union all '); let results: Tools.DB2Row[] = []; - if (config.enableSQL) { + if (connection.enableSQL) { try { results = await connection.runSQL(statement); } catch (e) { }; // Ignore errors, will return undefined. From 27aa437e64063fd10ed6a768225fa60e5ecc13b8 Mon Sep 17 00:00:00 2001 From: worksofliam Date: Thu, 20 Feb 2025 23:03:49 -0500 Subject: [PATCH 2/8] Make sure component manager is checking the component if the stored state is NotChecked Signed-off-by: worksofliam --- src/api/components/manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/components/manager.ts b/src/api/components/manager.ts index 0d67c78a9..71cc6de34 100644 --- a/src/api/components/manager.ts +++ b/src/api/components/manager.ts @@ -62,7 +62,7 @@ export class ComponentManager { const installed = lastInstalled.find(i => i.id.name === component.getIdentification().name); const sameVersion = installed && (installed.id.version === component.getIdentification().version); - if (!installed || !sameVersion) { + if (!installed || !sameVersion || installed.state === `NotChecked`) { await newComponent.check(); } else { newComponent.overrideState(installed.state); From 827d05e3507712b9292f3de28ef12bcf1eb943ea Mon Sep 17 00:00:00 2001 From: worksofliam Date: Thu, 20 Feb 2025 23:04:06 -0500 Subject: [PATCH 3/8] Disable the Go to File user input when busy Signed-off-by: worksofliam --- src/commands/open.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/commands/open.ts b/src/commands/open.ts index a4cc2b39e..5cffb9c22 100644 --- a/src/commands/open.ts +++ b/src/commands/open.ts @@ -341,6 +341,9 @@ export function registerOpenCommands(instance: Instance): Disposable[] { }); quickPick.onDidAccept(async () => { + quickPick.busy = true; + quickPick.enabled = false; + let selection = quickPick.selectedItems.length === 1 ? quickPick.selectedItems[0].label : undefined; if (selection && selection !== LOADING_LABEL) { if (selection === CLEAR_RECENT) { @@ -408,6 +411,9 @@ export function registerOpenCommands(instance: Instance): Disposable[] { } } } + + quickPick.busy = false; + quickPick.enabled = true; }); quickPick.onDidTriggerItemButton((event: QuickPickItemButtonEvent) => { From 069aaaae0541098a59bb0ad4470c18fd7d2e426c Mon Sep 17 00:00:00 2001 From: worksofliam Date: Thu, 20 Feb 2025 23:04:18 -0500 Subject: [PATCH 4/8] If getMemberInfo component is not available, handle crash Signed-off-by: worksofliam --- src/api/IBMiContent.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/api/IBMiContent.ts b/src/api/IBMiContent.ts index 9833ae693..b1da62aea 100644 --- a/src/api/IBMiContent.ts +++ b/src/api/IBMiContent.ts @@ -766,7 +766,12 @@ export default class IBMiContent { */ getMemberInfo(library: string, sourceFile: string, member: string) { const component = this.ibmi.getComponent(GetMemberInfo.ID)!; - return component.getMemberInfo(this.ibmi, library, sourceFile, member); + + if (component) { + return component.getMemberInfo(this.ibmi, library, sourceFile, member); + } else { + return Promise.resolve(undefined); + } } /** From 9ce6d457f6060d7742e823d4cc01e0c5a52bbdb4 Mon Sep 17 00:00:00 2001 From: worksofliam Date: Fri, 21 Feb 2025 13:55:00 -0500 Subject: [PATCH 5/8] Fix to date types not being returned Signed-off-by: worksofliam --- src/api/components/getMemberInfo.ts | 26 +++++++++++++++++++++---- src/api/tests/suites/components.test.ts | 4 ++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/api/components/getMemberInfo.ts b/src/api/components/getMemberInfo.ts index 346971902..f27c9aaab 100644 --- a/src/api/components/getMemberInfo.ts +++ b/src/api/components/getMemberInfo.ts @@ -53,6 +53,24 @@ export class GetMemberInfo implements IBMiComponent { }); } + private static parseDateString(tsString: string|undefined): Date | undefined { + if (!tsString) { + return undefined; + } + + const dateParts = tsString.split('-'); + const timeParts = dateParts[3].split('.'); + + const year = parseInt(dateParts[0], 10); + const month = parseInt(dateParts[1], 10) - 1; // Months are zero-based in JavaScript + const day = parseInt(dateParts[2], 10); + const hours = parseInt(timeParts[0], 10); + const minutes = parseInt(timeParts[1], 10); + const seconds = parseInt(timeParts[2], 10); + + return new Date(year, month, day, hours, minutes, seconds); + } + async getMemberInfo(connection: IBMi, library: string, sourceFile: string, member: string): Promise { const config = connection.config!; const tempLib = config.tempLibrary; @@ -78,8 +96,8 @@ export class GetMemberInfo implements IBMiComponent { name: result.MEMBER, extension: result.EXTENSION, text: result.DESCRIPTION, - created: new Date(result.CREATED ? Number(result.CREATED) : 0), - changed: new Date(result.CHANGED ? Number(result.CHANGED) : 0) + created: GetMemberInfo.parseDateString(String(result.CREATED)), + changed: GetMemberInfo.parseDateString(String(result.CHANGED)) } as IBMiMember } } @@ -110,8 +128,8 @@ export class GetMemberInfo implements IBMiComponent { name: result.MEMBER, extension: result.EXTENSION, text: result.DESCRIPTION, - created: new Date(result.CREATED ? Number(result.CREATED) : 0), - changed: new Date(result.CHANGED ? Number(result.CHANGED) : 0) + created: GetMemberInfo.parseDateString(String(result.CREATED)), + changed: GetMemberInfo.parseDateString(String(result.CHANGED)) } as IBMiMember }); } diff --git a/src/api/tests/suites/components.test.ts b/src/api/tests/suites/components.test.ts index 7bf79dc80..1256da6a8 100644 --- a/src/api/tests/suites/components.test.ts +++ b/src/api/tests/suites/components.test.ts @@ -70,8 +70,8 @@ describe('Component Tests', () => { expect(memberInfoC?.library).toBe(tempLib); expect(memberInfoC?.file).toBe(tempSPF); expect(memberInfoC?.name).toBe(tempMbr); - expect(memberInfoC?.created).toBeTypeOf('number'); - expect(memberInfoC?.changed).toBeTypeOf('number'); + expect(memberInfoC?.created).toBeTypeOf('object'); + expect(memberInfoC?.changed).toBeTypeOf('object'); // Cleanup... await connection!.runCommand({ From ea3ce686df580c2705accf501a891e6e4ddae919 Mon Sep 17 00:00:00 2001 From: worksofliam Date: Fri, 21 Feb 2025 13:55:13 -0500 Subject: [PATCH 6/8] Add timeouts to existing tests Signed-off-by: worksofliam --- src/api/tests/suites/content.test.ts | 2 +- src/api/tests/suites/encoding.test.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/api/tests/suites/content.test.ts b/src/api/tests/suites/content.test.ts index d125cbd79..7f3375394 100644 --- a/src/api/tests/suites/content.test.ts +++ b/src/api/tests/suites/content.test.ts @@ -521,7 +521,7 @@ describe('Content Tests', {concurrent: true}, () => { expect(error).toBeInstanceOf(Tools.SqlError); expect(error.sqlstate).toBe('38501'); } - }); + }, {timeout: 25000}); it('Test @clCommand + select statement', async () => { const content = connection.getContent(); diff --git a/src/api/tests/suites/encoding.test.ts b/src/api/tests/suites/encoding.test.ts index f40282605..cabeb8dcf 100644 --- a/src/api/tests/suites/encoding.test.ts +++ b/src/api/tests/suites/encoding.test.ts @@ -80,7 +80,6 @@ describe('Encoding tests', {concurrent: true} ,() => { }); it('Run variants through shells', async () => { - const text = `Hello${connection?.variantChars.local}world`; const basicCommandA = `echo "${IBMi.escapeForShell(text)}"`; const basicCommandB = `echo '${text}'`; @@ -110,7 +109,7 @@ describe('Encoding tests', {concurrent: true} ,() => { expect(paseTextResultA?.stdout).toBe(text); expect(qshTextResultB?.stdout).toBe(text); expect(paseTextResultB?.stdout).toBe(text); - }); + }, {timeout: 25000}); it('streamfileResolve with dollar', async () => { await connection.withTempDirectory(async tempDir => { From 727966947af93af0a8cefadd0e22b58b04b9ec82 Mon Sep 17 00:00:00 2001 From: worksofliam Date: Fri, 21 Feb 2025 14:50:22 -0500 Subject: [PATCH 7/8] Add missing await to override state Signed-off-by: worksofliam --- src/api/components/manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/components/manager.ts b/src/api/components/manager.ts index 71cc6de34..d68bdbd70 100644 --- a/src/api/components/manager.ts +++ b/src/api/components/manager.ts @@ -65,7 +65,7 @@ export class ComponentManager { if (!installed || !sameVersion || installed.state === `NotChecked`) { await newComponent.check(); } else { - newComponent.overrideState(installed.state); + await newComponent.overrideState(installed.state); } this.registered.set(component.getIdentification().name, newComponent); From 14b2b0c60e55bf23216984149ed785cca3b6388d Mon Sep 17 00:00:00 2001 From: worksofliam Date: Mon, 24 Feb 2025 12:55:02 -0500 Subject: [PATCH 8/8] Remove logic to handle busy state Signed-off-by: worksofliam --- src/commands/open.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/commands/open.ts b/src/commands/open.ts index 5cffb9c22..a4cc2b39e 100644 --- a/src/commands/open.ts +++ b/src/commands/open.ts @@ -341,9 +341,6 @@ export function registerOpenCommands(instance: Instance): Disposable[] { }); quickPick.onDidAccept(async () => { - quickPick.busy = true; - quickPick.enabled = false; - let selection = quickPick.selectedItems.length === 1 ? quickPick.selectedItems[0].label : undefined; if (selection && selection !== LOADING_LABEL) { if (selection === CLEAR_RECENT) { @@ -411,9 +408,6 @@ export function registerOpenCommands(instance: Instance): Disposable[] { } } } - - quickPick.busy = false; - quickPick.enabled = true; }); quickPick.onDidTriggerItemButton((event: QuickPickItemButtonEvent) => {