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); + } } /** diff --git a/src/api/components/getMemberInfo.ts b/src/api/components/getMemberInfo.ts index 3d9559ff9..f27c9aaab 100644 --- a/src/api/components/getMemberInfo.ts +++ b/src/api/components/getMemberInfo.ts @@ -53,13 +53,31 @@ 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; 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. @@ -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 } } @@ -92,7 +110,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. @@ -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/components/manager.ts b/src/api/components/manager.ts index 0d67c78a9..d68bdbd70 100644 --- a/src/api/components/manager.ts +++ b/src/api/components/manager.ts @@ -62,10 +62,10 @@ 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); + await newComponent.overrideState(installed.state); } this.registered.set(component.getIdentification().name, newComponent); 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({ 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 => {