Skip to content

Commit 2d2eb92

Browse files
committed
feat: Generate RPG data structure from result metadata
1 parent 083ba23 commit 2d2eb92

File tree

2 files changed

+64
-6
lines changed

2 files changed

+64
-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/index.ts

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { updateStatusBar } from "../jobManager/statusBar";
1818
import { DbCache } from "../../language/providers/logic/cache";
1919
import { ExplainType } from "../../connection/types";
2020

21-
export type StatementQualifier = "statement" | "update" | "explain" | "onlyexplain" | "json" | "csv" | "cl" | "sql";
21+
export type StatementQualifier = "statement" | "update" | "explain" | "onlyexplain" | "json" | "csv" | "cl" | "sql" | "rpg";
2222

2323
export interface StatementInfo {
2424
content: string,
@@ -375,7 +375,65 @@ async function runHandler(options?: StatementInfo) {
375375
} else {
376376
vscode.window.showInformationMessage(`No job currently selected.`);
377377
}
378-
378+
379+
} else if ([`rpg`].includes(statementDetail.qualifier)) {
380+
chosenView.setLoadingText(`Executing SQL statement...`, false);
381+
382+
setCancelButtonVisibility(true);
383+
updateStatusBar({executing: true});
384+
const result = await JobManager.runSQLVerbose(statementDetail.content, undefined, 1);
385+
setCancelButtonVisibility(false);
386+
//let content = ``;
387+
let content = `**free\n\n-- Row data structure\n`
388+
+ `dcl-ds row_t qualified template;\n`;
389+
390+
for (let i = 0; i < result.metadata.column_count; i++) {
391+
content += ` ${isNaN(+result.metadata.columns[i].label.charAt(0)) ? '' : 'col'}${result.metadata.columns[i].label.toLowerCase()} `;
392+
switch (result.metadata.columns[i].type) {
393+
case `NUMERIC`:
394+
content += `zoned(${result.metadata.columns[i].precision}${result.metadata.columns[i].scale > 0 ? ' : ' + result.metadata.columns[i].scale : ''});\n`;
395+
break;
396+
case `DECIMAL`:
397+
content += `packed(${result.metadata.columns[i].precision}${result.metadata.columns[i].scale > 0 ? ' : ' + result.metadata.columns[i].scale : ''});\n`;
398+
break;
399+
case `CHAR`:
400+
content += `char(${result.metadata.columns[i].precision});\n`;
401+
break;
402+
case `VARCHAR`:
403+
content += `varchar(${result.metadata.columns[i].precision});\n`;
404+
break;
405+
case `DATE`:
406+
content += `date;\n`;
407+
break;
408+
case `TIME`:
409+
content += `time;\n`;
410+
break;
411+
case `TIMESTAMP`:
412+
content += `timestamp;\n`;
413+
break;
414+
case `SMALLINT`:
415+
content += `int(5);\n`;
416+
break;
417+
case `INTEGER`:
418+
content += `int(10);\n`;
419+
break;
420+
case `BIGINT`:
421+
content += `int(20);\n`;
422+
break;
423+
case `BOOLEAN`:
424+
content += `ind;\n`;
425+
break;
426+
default:
427+
content += `// type:${result.metadata.columns[i].type} precision:${result.metadata.columns[i].precision} scale:${result.metadata.columns[i].scale}\n`;
428+
break;
429+
}
430+
}
431+
content += `end-ds;\n`;
432+
const textDoc = await vscode.workspace.openTextDocument({ language: 'rpgle', content });
433+
await vscode.window.showTextDocument(textDoc);
434+
updateStatusBar({executing: false});
435+
chosenView.setLoadingText(`RPG data structure generated.`, false);
436+
379437
} else {
380438
// Otherwise... it's a bit complicated.
381439
chosenView.setLoadingText(`Executing SQL statement...`, false);
@@ -426,7 +484,7 @@ async function runHandler(options?: StatementInfo) {
426484
];
427485
content += insertStatement.join(`\n`) + `;\n`;
428486
}
429-
break;
487+
break;
430488
}
431489

432490
const textDoc = await vscode.workspace.openTextDocument({ language: statementDetail.qualifier, content });
@@ -524,7 +582,7 @@ export function parseStatement(editor?: vscode.TextEditor, existingInfo?: Statem
524582
}
525583

526584
if (statementInfo.content) {
527-
[`cl`, `json`, `csv`, `sql`, `explain`, `update`].forEach(mode => {
585+
[`cl`, `json`, `csv`, `sql`, `explain`, `update`, `rpg`].forEach(mode => {
528586
if (statementInfo.content.trim().toLowerCase().startsWith(mode + `:`)) {
529587
statementInfo.content = statementInfo.content.substring(mode.length + 1).trim();
530588

0 commit comments

Comments
 (0)