@@ -18,7 +18,7 @@ import { updateStatusBar } from "../jobManager/statusBar";
18
18
import { DbCache } from "../../language/providers/logic/cache" ;
19
19
import { ExplainType } from "../../connection/types" ;
20
20
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" ;
22
22
23
23
export interface StatementInfo {
24
24
content : string ,
@@ -375,7 +375,65 @@ async function runHandler(options?: StatementInfo) {
375
375
} else {
376
376
vscode . window . showInformationMessage ( `No job currently selected.` ) ;
377
377
}
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
+
379
437
} else {
380
438
// Otherwise... it's a bit complicated.
381
439
chosenView . setLoadingText ( `Executing SQL statement...` , false ) ;
@@ -426,7 +484,7 @@ async function runHandler(options?: StatementInfo) {
426
484
] ;
427
485
content += insertStatement . join ( `\n` ) + `;\n` ;
428
486
}
429
- break ;
487
+ break ;
430
488
}
431
489
432
490
const textDoc = await vscode . workspace . openTextDocument ( { language : statementDetail . qualifier , content } ) ;
@@ -524,7 +582,7 @@ export function parseStatement(editor?: vscode.TextEditor, existingInfo?: Statem
524
582
}
525
583
526
584
if ( statementInfo . content ) {
527
- [ `cl` , `json` , `csv` , `sql` , `explain` , `update` ] . forEach ( mode => {
585
+ [ `cl` , `json` , `csv` , `sql` , `explain` , `update` , `rpg` ] . forEach ( mode => {
528
586
if ( statementInfo . content . trim ( ) . toLowerCase ( ) . startsWith ( mode + `:` ) ) {
529
587
statementInfo . content = statementInfo . content . substring ( mode . length + 1 ) . trim ( ) ;
530
588
0 commit comments