Skip to content

Commit 0b747d8

Browse files
committed
Improved support for DBCS output
Signed-off-by: worksofliam <[email protected]>
1 parent 8239670 commit 0b747d8

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

src/api/Tools.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,16 @@ export namespace Tools {
101101
figuredLengths = true;
102102
} else {
103103
let row: DB2Row = {};
104+
let slideBytesBy = 0;
104105

105106
headers.forEach(header => {
106-
const strValue = line.substring(header.from, header.from + header.length).trimEnd();
107+
const fromPos = header.from - slideBytesBy;
108+
const strValue = line.substring(fromPos, fromPos + header.length).trimEnd();
107109

108110
let realValue: string | number | null = strValue;
109111

112+
slideBytesBy += strValue.split(``).map(c => Buffer.byteLength(c) === 1 ? 0 : 1).reduce((a: number, b: number) => a + b, 0);
113+
110114
// is value a number?
111115
if (strValue.startsWith(` `)) {
112116
const asNumber = Number(strValue.trim());

src/testing/tools.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,75 @@ export const ToolsSuite: TestSuite = {
4848
statement = Tools.fixSQL("@COMMAND LIB(QTEMP/*ALL) TEXT('Hello!');\nSelect * From QTEMP.MYTABLE -- This is mytable");
4949
assert.deepStrictEqual(statement, "Call QSYS2.QCMDEXC('COMMAND LIB(QTEMP/*ALL) TEXT(''Hello!'')');\nSelect * From QTEMP.MYTABLE \n-- This is mytable");
5050
}
51+
},
52+
{
53+
name: `EN result set test`, test: async () => {
54+
const lines = [
55+
`DB2>`,
56+
` ?>`,
57+
` ?>`,
58+
` ?>`,
59+
` ?>`,
60+
` ?>`,
61+
` ?>`,
62+
``,
63+
`CUSNUM LSTNAM INIT STREET CITY STATE ZIPCOD CDTLMT CHGCOD BALDUE CDTDUE `,
64+
`-------- -------- ----- ------------- ------ ------ ------- ------- ------- -------- --------`,
65+
` 938472 Henning G K 4859 Elm Ave Dallas TX 75217 5000 3 37.00 0.00`,
66+
``,
67+
` 1 RECORD(S) SELECTED.`,
68+
]
69+
70+
const rows = Tools.db2Parse(lines.join(`\n`));
71+
72+
assert.strictEqual(rows.length, 1);
73+
74+
assert.strictEqual(rows[0].CUSNUM, 938472);
75+
assert.strictEqual(rows[0].LSTNAM, `Henning`);
76+
assert.strictEqual(rows[0].INIT, `G K`);
77+
assert.strictEqual(rows[0].STREET, `4859 Elm Ave`);
78+
assert.strictEqual(rows[0].CITY, `Dallas`);
79+
assert.strictEqual(rows[0].STATE, `TX`);
80+
assert.strictEqual(rows[0].ZIPCOD, 75217);
81+
assert.strictEqual(rows[0].CDTLMT, 5000);
82+
assert.strictEqual(rows[0].CHGCOD, 3);
83+
assert.strictEqual(rows[0].BALDUE, 37);
84+
assert.strictEqual(rows[0].CDTDUE, 0);
85+
}
86+
},
87+
{
88+
name: `JP result set test`, test: async () => {
89+
const lines = [
90+
`DB2>`,
91+
` ?>`,
92+
` ?>`,
93+
` ?>`,
94+
` ?>`,
95+
``,
96+
``,
97+
`LIBRARY RECORD_LENGTH ASP SOURCE_FILE NAME TYPE TEXT LINES CREATED CHANGED `,
98+
`---------- -------------------- ------ ------------ ---------- ---------- ------------------------------------------------------------------------------------------------------------------------------ -------------------- -------------------- --------------------`,
99+
`SNDLIB 112 0 QRPGLESRC SNDDEFD DSPF 送信定義一覧/追加・修正 124 1712670631000 1712683676000`,
100+
`SNDLIB 112 0 QRPGLESRC SNDDEFR RPGLE 送信定義一覧/追加・修正 386 1712683661000 1712683692000`,
101+
``,
102+
` 2 RECORD(S) SELECTED.`,
103+
];
104+
105+
const rows = Tools.db2Parse(lines.join(`\n`));
106+
107+
assert.strictEqual(rows.length, 2);
108+
109+
assert.strictEqual(rows[0].LIBRARY, `SNDLIB`);
110+
assert.strictEqual(rows[0].RECORD_LENGTH, 112);
111+
assert.strictEqual(rows[0].ASP, 0);
112+
assert.strictEqual(rows[0].SOURCE_FILE, `QRPGLESRC`);
113+
assert.strictEqual(rows[0].NAME, `SNDDEFD`);
114+
assert.strictEqual(rows[0].TYPE, `DSPF`);
115+
assert.strictEqual(rows[0].TEXT, `送信定義一覧/追加・修正`);
116+
assert.strictEqual(rows[0].LINES, 124);
117+
assert.strictEqual(rows[0].CREATED, 1712670631000);
118+
assert.strictEqual(rows[0].CHANGED, 1712683676000);
119+
}
51120
}
52121
]
53122
};

0 commit comments

Comments
 (0)