Skip to content

Commit 7f22262

Browse files
committed
fix: RPG symbol name using name or label. Remove non-alphanum chars
1 parent 8b83b2e commit 7f22262

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/views/results/codegen.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
import { assert, expect, test } from 'vitest'
2-
import { columnToRpgDefinition, queryResultToRpgDs } from './codegen';
2+
import { columnToRpgDefinition, columnToRpgFieldName, queryResultToRpgDs } from './codegen';
33
import { QueryResult } from '@ibm/mapepire-js';
44

5+
test('Column to RPG symbol', () => {
6+
let name;
7+
8+
name = columnToRpgFieldName({display_size: 0, label: 'änderungs- benutzer ', name: 'ANDBEN', type: 'CHAR', precision: 10, scale: 0}, 'Label');
9+
expect(name).toBe('anderungs_benutzer');
10+
11+
name = columnToRpgFieldName({display_size: 0, label: 'änderungs- benutzer ', name: 'ANDBEN', type: 'CHAR', precision: 10, scale: 0}, 'Name');
12+
expect(name).toBe('andben');
13+
14+
name = columnToRpgFieldName({display_size: 0, label: '', name: '0001', type: 'INTEGER', precision: 0, scale: 0}, 'Name');
15+
expect(name).toBe('col0001');
16+
});
17+
518
test('Column to RPG definition', () => {
619
let rpgdef;
720

src/views/results/codegen.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
11
import { ColumnMetaData, QueryResult } from "@ibm/mapepire-js";
22

3-
export function queryResultToRpgDs(result: QueryResult<any>) : string {
3+
export function queryResultToRpgDs(result: QueryResult<any>, source: string = 'Name') : string {
44
let content = `dcl-ds row_t qualified template;\n`;
55
for (let i = 0; i < result.metadata.column_count; i++) {
6-
const name = `${isNaN(+result.metadata.columns[i].label.charAt(0)) ? '' : 'col'}${result.metadata.columns[i].label.toLowerCase()}`
6+
const name = columnToRpgFieldName(result.metadata.columns[i], source);
77
content += ` ${name} ${columnToRpgDefinition(result.metadata.columns[i])};\n`;
88
}
99
content += `end-ds;\n`;
1010
return content;
1111
}
1212

13+
export function columnToRpgFieldName(column: ColumnMetaData, source: string = 'Name') : string {
14+
let name = source === 'Label' ? column.label.toLowerCase().trim() : column.name.toLowerCase().trim();
15+
name = name.replace(/\u00fc/g, "u"); // ü
16+
name = name.replace(/\u00e4/g, "a"); // ä
17+
name = name.replace(/\u00e4/g, "o"); // ö
18+
name = name.replace(/\u00df/g, "s"); // sharp s/Eszett
19+
name = name.replace(/\s+/g, "_").replace(/[^a-zA-Z0-9_]/g, '').trim(); // space to underscore and remove non-alphanumeric chars
20+
if (!isNaN(+name.charAt(0))) {
21+
name = `col` + name;
22+
}
23+
return name;
24+
}
25+
1326
export function columnToRpgDefinition(column: ColumnMetaData) : string {
1427
switch (column.type) {
1528
case `NUMERIC`:

src/views/results/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { updateStatusBar } from "../jobManager/statusBar";
1818
import { DbCache } from "../../language/providers/logic/cache";
1919
import { ExplainType } from "../../connection/types";
2020
import { queryResultToRpgDs } from "./codegen";
21+
import Configuration from "../../configuration";
2122

2223
export type StatementQualifier = "statement" | "update" | "explain" | "onlyexplain" | "json" | "csv" | "cl" | "sql" | "rpg";
2324

@@ -390,7 +391,7 @@ async function runHandler(options?: StatementInfo) {
390391
let content = `**free\n\n`
391392
+ `// statement: ${statementDetail.content}\n\n`
392393
+ `// Row data structure\n`
393-
+ queryResultToRpgDs(result);
394+
+ queryResultToRpgDs(result, Configuration.get(`resultsets.columnHeadings`));
394395
const textDoc = await vscode.workspace.openTextDocument({ language: 'rpgle', content });
395396
await vscode.window.showTextDocument(textDoc);
396397
chosenView.setLoadingText(`RPG data structure generated.`, false);

0 commit comments

Comments
 (0)