Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

68 changes: 65 additions & 3 deletions src/views/results/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { updateStatusBar } from "../jobManager/statusBar";
import { DbCache } from "../../language/providers/logic/cache";
import { ExplainType } from "../../connection/types";

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

export interface StatementInfo {
content: string,
Expand Down Expand Up @@ -375,7 +375,69 @@ async function runHandler(options?: StatementInfo) {
} else {
vscode.window.showInformationMessage(`No job currently selected.`);
}


} else if ([`rpg`].includes(statementDetail.qualifier)) {
if (statementDetail.statement.type !== StatementType.Select) {
vscode.window.showErrorMessage('RPG qualifier only supported for select statements');
} else {
chosenView.setLoadingText(`Executing SQL statement...`, false);

setCancelButtonVisibility(true);
updateStatusBar({executing: true});
const result = await JobManager.runSQLVerbose(statementDetail.content, undefined, 1);
setCancelButtonVisibility(false);
let content = `**free\n\n`
+ `// statement: ${statementDetail.content}\n\n`
+ `// Row data structure\ndcl-ds row_t qualified template;\n`;

for (let i = 0; i < result.metadata.column_count; i++) {
content += ` ${isNaN(+result.metadata.columns[i].label.charAt(0)) ? '' : 'col'}${result.metadata.columns[i].label.toLowerCase()} `;
switch (result.metadata.columns[i].type) {
case `NUMERIC`:
content += `zoned(${result.metadata.columns[i].precision}${result.metadata.columns[i].scale > 0 ? ' : ' + result.metadata.columns[i].scale : ''});\n`;
break;
case `DECIMAL`:
content += `packed(${result.metadata.columns[i].precision}${result.metadata.columns[i].scale > 0 ? ' : ' + result.metadata.columns[i].scale : ''});\n`;
break;
case `CHAR`:
content += `char(${result.metadata.columns[i].precision});\n`;
break;
case `VARCHAR`:
content += `varchar(${result.metadata.columns[i].precision});\n`;
break;
case `DATE`:
content += `date;\n`;
break;
case `TIME`:
content += `time;\n`;
break;
case `TIMESTAMP`:
content += `timestamp;\n`;
break;
case `SMALLINT`:
content += `int(5);\n`;
break;
case `INTEGER`:
content += `int(10);\n`;
break;
case `BIGINT`:
content += `int(20);\n`;
break;
case `BOOLEAN`:
content += `ind;\n`;
break;
default:
content += `// type:${result.metadata.columns[i].type} precision:${result.metadata.columns[i].precision} scale:${result.metadata.columns[i].scale}\n`;
break;
}
}
content += `end-ds;\n`;
const textDoc = await vscode.workspace.openTextDocument({ language: 'rpgle', content });
await vscode.window.showTextDocument(textDoc);
updateStatusBar({executing: false});
chosenView.setLoadingText(`RPG data structure generated.`, false);
}

} else {
// Otherwise... it's a bit complicated.
chosenView.setLoadingText(`Executing SQL statement...`, false);
Expand Down Expand Up @@ -524,7 +586,7 @@ export function parseStatement(editor?: vscode.TextEditor, existingInfo?: Statem
}

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

Expand Down
Loading