@@ -17,6 +17,7 @@ import { generateSqlForAdvisedIndexes } from "./explain/advice";
17
17
import { updateStatusBar } from "../jobManager/statusBar" ;
18
18
import { DbCache } from "../../language/providers/logic/cache" ;
19
19
import { ExplainType } from "../../connection/types" ;
20
+ import { ColumnMetaData } from "@ibm/mapepire-js" ;
20
21
21
22
export type StatementQualifier = "statement" | "update" | "explain" | "onlyexplain" | "json" | "csv" | "cl" | "sql" | "rpg" ;
22
23
@@ -376,62 +377,12 @@ async function runHandler(options?: StatementInfo) {
376
377
vscode . window . showInformationMessage ( `No job currently selected.` ) ;
377
378
}
378
379
379
- } else if ( [ `rpg` ] . includes ( statementDetail . qualifier ) ) {
380
+ } else if ( statementDetail . qualifier === `rpg` ) {
380
381
if ( statementDetail . statement . type !== StatementType . Select ) {
381
382
vscode . window . showErrorMessage ( 'RPG qualifier only supported for select statements' ) ;
382
383
} else {
383
384
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 ) ;
435
386
const textDoc = await vscode . workspace . openTextDocument ( { language : 'rpgle' , content } ) ;
436
387
await vscode . window . showTextDocument ( textDoc ) ;
437
388
updateStatusBar ( { executing : false } ) ;
@@ -542,6 +493,53 @@ async function runHandler(options?: StatementInfo) {
542
493
}
543
494
}
544
495
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
+
545
543
export function parseStatement ( editor ?: vscode . TextEditor , existingInfo ?: StatementInfo ) : ParsedStatementInfo {
546
544
let statementInfo : ParsedStatementInfo = {
547
545
content : `` ,
0 commit comments