Skip to content

Commit 2515d80

Browse files
committed
Move RPG code generation to another function
1 parent 79d5820 commit 2515d80

File tree

1 file changed

+50
-52
lines changed

1 file changed

+50
-52
lines changed

src/views/results/index.ts

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { generateSqlForAdvisedIndexes } from "./explain/advice";
1717
import { updateStatusBar } from "../jobManager/statusBar";
1818
import { DbCache } from "../../language/providers/logic/cache";
1919
import { ExplainType } from "../../connection/types";
20+
import { ColumnMetaData } from "@ibm/mapepire-js";
2021

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

@@ -376,62 +377,12 @@ async function runHandler(options?: StatementInfo) {
376377
vscode.window.showInformationMessage(`No job currently selected.`);
377378
}
378379

379-
} else if ([`rpg`].includes(statementDetail.qualifier)) {
380+
} else if (statementDetail.qualifier === `rpg`) {
380381
if (statementDetail.statement.type !== StatementType.Select) {
381382
vscode.window.showErrorMessage('RPG qualifier only supported for select statements');
382383
} else {
383384
chosenView.setLoadingText(`Executing SQL statement...`, false);
384-
385-
setCancelButtonVisibility(true);
386-
updateStatusBar({executing: true});
387-
const result = await JobManager.runSQLVerbose(statementDetail.content, undefined, 1);
388-
setCancelButtonVisibility(false);
389-
let content = `**free\n\n`
390-
+ `// statement: ${statementDetail.content}\n\n`
391-
+ `// Row data structure\ndcl-ds row_t qualified template;\n`;
392-
393-
for (let i = 0; i < result.metadata.column_count; i++) {
394-
content += ` ${isNaN(+result.metadata.columns[i].label.charAt(0)) ? '' : 'col'}${result.metadata.columns[i].label.toLowerCase()} `;
395-
switch (result.metadata.columns[i].type) {
396-
case `NUMERIC`:
397-
content += `zoned(${result.metadata.columns[i].precision}${result.metadata.columns[i].scale > 0 ? ' : ' + result.metadata.columns[i].scale : ''});\n`;
398-
break;
399-
case `DECIMAL`:
400-
content += `packed(${result.metadata.columns[i].precision}${result.metadata.columns[i].scale > 0 ? ' : ' + result.metadata.columns[i].scale : ''});\n`;
401-
break;
402-
case `CHAR`:
403-
content += `char(${result.metadata.columns[i].precision});\n`;
404-
break;
405-
case `VARCHAR`:
406-
content += `varchar(${result.metadata.columns[i].precision});\n`;
407-
break;
408-
case `DATE`:
409-
content += `date;\n`;
410-
break;
411-
case `TIME`:
412-
content += `time;\n`;
413-
break;
414-
case `TIMESTAMP`:
415-
content += `timestamp;\n`;
416-
break;
417-
case `SMALLINT`:
418-
content += `int(5);\n`;
419-
break;
420-
case `INTEGER`:
421-
content += `int(10);\n`;
422-
break;
423-
case `BIGINT`:
424-
content += `int(20);\n`;
425-
break;
426-
case `BOOLEAN`:
427-
content += `ind;\n`;
428-
break;
429-
default:
430-
content += `// type:${result.metadata.columns[i].type} precision:${result.metadata.columns[i].precision} scale:${result.metadata.columns[i].scale}\n`;
431-
break;
432-
}
433-
}
434-
content += `end-ds;\n`;
385+
let content: string = await statementToRpgDs(statementDetail);
435386
const textDoc = await vscode.workspace.openTextDocument({ language: 'rpgle', content });
436387
await vscode.window.showTextDocument(textDoc);
437388
updateStatusBar({executing: false});
@@ -542,6 +493,53 @@ async function runHandler(options?: StatementInfo) {
542493
}
543494
}
544495

496+
async function statementToRpgDs(statement: ParsedStatementInfo) : Promise<string> {
497+
setCancelButtonVisibility(true);
498+
updateStatusBar({executing: true});
499+
const result = await JobManager.runSQLVerbose(statement.content, undefined, 1);
500+
setCancelButtonVisibility(false);
501+
502+
let content = `**free\n\n`
503+
+ `// statement: ${statement.content}\n\n`
504+
+ `// Row data structure\ndcl-ds row_t qualified template;\n`;
505+
506+
for (let i = 0; i < result.metadata.column_count; i++) {
507+
content += ` ${isNaN(+result.metadata.columns[i].label.charAt(0)) ? '' : 'col'}${result.metadata.columns[i].label.toLowerCase()} `;
508+
content += columnToRpgDefinition(result.metadata.columns[i]);
509+
}
510+
content += `end-ds;\n`;
511+
return content;
512+
}
513+
514+
function columnToRpgDefinition(column: ColumnMetaData) : string {
515+
switch (column.type) {
516+
case `NUMERIC`:
517+
return `zoned(${column.precision}${column.scale > 0 ? ' : ' + column.scale : ''});\n`;
518+
case `DECIMAL`:
519+
return `packed(${column.precision}${column.scale > 0 ? ' : ' + column.scale : ''});\n`;
520+
case `CHAR`:
521+
return `char(${column.precision});\n`;
522+
case `VARCHAR`:
523+
return `varchar(${column.precision});\n`;
524+
case `DATE`:
525+
return `date;\n`;
526+
case `TIME`:
527+
return `time;\n`;
528+
case `TIMESTAMP`:
529+
return `timestamp;\n`;
530+
case `SMALLINT`:
531+
return `int(5);\n`;
532+
case `INTEGER`:
533+
return `int(10);\n`;
534+
case `BIGINT`:
535+
return `int(20);\n`;
536+
case `BOOLEAN`:
537+
return `ind;\n`;
538+
default:
539+
return `// type:${column.type} precision:${column.precision} scale:${column.scale}\n`;
540+
}
541+
}
542+
545543
export function parseStatement(editor?: vscode.TextEditor, existingInfo?: StatementInfo): ParsedStatementInfo {
546544
let statementInfo: ParsedStatementInfo = {
547545
content: ``,

0 commit comments

Comments
 (0)