@@ -16,7 +16,7 @@ const typeMap = {
16
16
17
17
export const AllSQLTypes : SQLType [ ] = [ "tables" , "views" , "aliases" , "constraints" , "functions" , "variables" , "indexes" , "procedures" , "sequences" , "packages" , "triggers" , "types" , "logicals" ] ;
18
18
19
- export const InternalTypes : { [ t : string ] : string } = {
19
+ export const InternalTypes : { [ t : string ] : string } = {
20
20
"tables" : `table` ,
21
21
"views" : `view` ,
22
22
"aliases" : `alias` ,
@@ -34,12 +34,12 @@ export const InternalTypes: {[t: string]: string} = {
34
34
35
35
export const SQL_ESCAPE_CHAR = `\\` ;
36
36
37
- type BasicColumnType = string | number ;
38
- interface PartStatementInfo { clause : string , parameters : BasicColumnType [ ] } ;
37
+ type BasicColumnType = string | number ;
38
+ interface PartStatementInfo { clause : string , parameters : BasicColumnType [ ] } ;
39
39
40
40
function getFilterClause ( againstColumn : string , filter : string , noAnd ?: boolean ) : PartStatementInfo {
41
41
if ( ! filter ) {
42
- return { clause : `` , parameters : [ ] } ;
42
+ return { clause : `` , parameters : [ ] } ;
43
43
}
44
44
45
45
let clause = `${ noAnd ? '' : 'AND' } UPPER(${ againstColumn } )` ;
@@ -63,7 +63,7 @@ function getFilterClause(againstColumn: string, filter: string, noAnd?: boolean)
63
63
} ;
64
64
}
65
65
66
- export interface ObjectReference { name : string , schema ?: string } ;
66
+ export interface ObjectReference { name : string , schema ?: string } ;
67
67
68
68
const BASE_RESOLVE_SELECT = [
69
69
`select ` ,
@@ -91,14 +91,7 @@ export default class Schemas {
91
91
let resolvedObjects : ResolvedSqlObject [ ] = [ ] ;
92
92
93
93
// We need to remove any duplicates from the list of objects to resolve
94
- const uniqueObjects = new Set < string > ( ) ;
95
- sqlObjects = sqlObjects . filter ( ( obj ) => {
96
- if ( ! uniqueObjects . has ( obj . name ) ) {
97
- uniqueObjects . add ( obj . name ) ;
98
- return true ;
99
- }
100
- return false ;
101
- } ) ;
94
+ sqlObjects = sqlObjects . filter ( o => sqlObjects . indexOf ( o ) === sqlObjects . findIndex ( obj => obj . name === o . name && obj . schema === o . schema ) ) ;
102
95
103
96
// First, we use OBJECT_STATISTICS to resolve the object based on the library list.
104
97
// But, if the object is qualified with a schema, we need to use that schema to get the correct object.
@@ -130,52 +123,64 @@ export default class Schemas {
130
123
. map ( ( obj ) => obj . name ) ;
131
124
const qualified = sqlObjects . filter ( ( obj ) => obj . schema ) ;
132
125
133
- let baseStatement = [
134
- `select s.routine_name as name, l.schema_name as schema, s.ROUTINE_TYPE as sqlType` ,
135
- `from qsys2.library_list_info as l` ,
136
- `right join qsys2.sysroutines as s on l.schema_name = s.routine_schema` ,
137
- `where ` ,
138
- ` l.schema_name is not null and` ,
139
- ` s.routine_name in (${ unqualified . map ( ( ) => `?` ) . join ( `, ` ) } )` ,
140
- ] . join ( ` ` ) ;
141
- parameters . push ( ...unqualified ) ;
142
-
143
- if ( qualified . length > 0 ) {
144
- const qualifiedClause = qualified
145
- . map ( ( obj ) => `(s.routine_name = ? AND s.routine_schema = ?)` )
146
- . join ( ` OR ` ) ;
147
- baseStatement += ` and (${ qualifiedClause } )` ;
148
- parameters . push ( ...qualified . flatMap ( ( obj ) => [ obj . name , obj . schema ] ) ) ;
149
- }
126
+ if ( qualified . length && unqualified . length ) {
127
+ let baseStatement = [
128
+ `select s.routine_name as name, l.schema_name as schema, s.ROUTINE_TYPE as sqlType` ,
129
+ `from qsys2.library_list_info as l` ,
130
+ `right join qsys2.sysroutines as s on l.schema_name = s.routine_schema` ,
131
+ `where ` ,
132
+ ` l.schema_name is not null` ,
133
+ ] . join ( ` ` ) ;
134
+
135
+ if ( unqualified . length > 0 ) {
136
+ baseStatement += ` and s.routine_name in (${ unqualified . map ( ( ) => `?` ) . join ( `, ` ) } )` ;
137
+ parameters . push ( ...unqualified ) ;
138
+ }
150
139
151
- statements . push ( baseStatement ) ;
140
+ if ( qualified . length > 0 ) {
141
+ const qualifiedClause = qualified
142
+ . map ( ( obj ) => `(s.routine_name = ? AND s.routine_schema = ?)` )
143
+ . join ( ` OR ` ) ;
144
+ baseStatement += ` and (${ qualifiedClause } )` ;
145
+ parameters . push ( ...qualified . flatMap ( ( obj ) => [ obj . name , obj . schema ] ) ) ;
146
+ }
147
+
148
+ statements . push ( baseStatement ) ;
149
+ }
152
150
153
151
if ( statements . length === 0 ) {
154
- return [ ] ;
152
+ return resolvedObjects ;
155
153
}
156
154
157
155
const query = `${ statements . join ( " UNION ALL " ) } ` ;
158
- const objects : any [ ] = await JobManager . runSQL ( query , { parameters } ) ;
159
-
160
- resolvedObjects . push (
161
- ...objects
162
- . map ( ( object ) => ( {
163
- name : object . NAME ,
164
- schema : object . SCHEMA ,
165
- sqlType : object . SQLTYPE ,
166
- } ) )
167
- . filter ( ( o ) => o . sqlType )
168
- ) ;
169
-
170
- // add reslved objects to to ReferenceCache
171
- resolvedObjects . forEach ( ( obj ) => {
172
- const key = this . buildReferenceCacheKey ( obj ) ;
173
- if ( ! ReferenceCache . has ( key ) ) {
174
- ReferenceCache . set ( key , obj ) ;
175
- }
176
- } ) ;
177
156
178
- return resolvedObjects ;
157
+ try {
158
+ const objects : any [ ] = await JobManager . runSQL ( query , { parameters } ) ;
159
+
160
+ resolvedObjects . push (
161
+ ...objects
162
+ . map ( ( object ) => ( {
163
+ name : object . NAME ,
164
+ schema : object . SCHEMA ,
165
+ sqlType : object . SQLTYPE ,
166
+ } ) )
167
+ . filter ( ( o ) => o . sqlType )
168
+ ) ;
169
+
170
+ // add reslved objects to to ReferenceCache
171
+ resolvedObjects . forEach ( ( obj ) => {
172
+ const key = this . buildReferenceCacheKey ( obj ) ;
173
+ if ( ! ReferenceCache . has ( key ) ) {
174
+ ReferenceCache . set ( key , obj ) ;
175
+ }
176
+ } ) ;
177
+
178
+ return resolvedObjects ;
179
+ } catch ( e ) {
180
+ console . warn ( `Error resolving objects: ${ JSON . stringify ( sqlObjects ) } ` ) ;
181
+ console . warn ( e ) ;
182
+ return [ ] ;
183
+ }
179
184
}
180
185
181
186
static async getRelatedObjects (
@@ -376,8 +381,7 @@ export default class Schemas {
376
381
const objects : any [ ] = await JobManager . runSQL (
377
382
[
378
383
query ,
379
- `${ details . limit ? `limit ${ details . limit } ` : `` } ${
380
- details . offset ? `offset ${ details . offset } ` : ``
384
+ `${ details . limit ? `limit ${ details . limit } ` : `` } ${ details . offset ? `offset ${ details . offset } ` : ``
381
385
} `,
382
386
] . join ( ` ` ) ,
383
387
{
@@ -442,12 +446,12 @@ export default class Schemas {
442
446
`CALL QSYS2.GENERATE_SQL( ${ options . join ( `, ` ) } )` ,
443
447
] . join ( ` ` ) , { parameters : [ object , schema , internalType ] } ) ;
444
448
445
- // TODO: eventually .content -> .getContent(), it's not available yet
446
- const contents = (
447
- await connection . content . downloadStreamfileRaw ( tempFilePath )
448
- ) . toString ( ) ;
449
- return contents ;
450
- }
449
+ // TODO: eventually .content -> .getContent(), it's not available yet
450
+ const contents = (
451
+ await connection . content . downloadStreamfileRaw ( tempFilePath )
452
+ ) . toString ( ) ;
453
+ return contents ;
454
+ }
451
455
) ;
452
456
453
457
return result ;
@@ -458,9 +462,8 @@ export default class Schemas {
458
462
name : string ,
459
463
type : string
460
464
) : Promise < void > {
461
- const query = `DROP ${
462
- ( this . isRoutineType ( type ) ? "SPECIFIC " : "" ) + type
463
- } IF EXISTS ${ schema } .${ name } `;
465
+ const query = `DROP ${ ( this . isRoutineType ( type ) ? "SPECIFIC " : "" ) + type
466
+ } IF EXISTS ${ schema } .${ name } `;
464
467
await getInstance ( ) . getContent ( ) . runSQL ( query ) ;
465
468
}
466
469
@@ -470,9 +473,8 @@ export default class Schemas {
470
473
newName : string ,
471
474
type : string
472
475
) : Promise < void > {
473
- const query = `RENAME ${
474
- type === "view" ? "table" : type
475
- } ${ schema } .${ oldName } TO ${ newName } `;
476
+ const query = `RENAME ${ type === "view" ? "table" : type
477
+ } ${ schema } .${ oldName } TO ${ newName } `;
476
478
await getInstance ( ) . getContent ( ) . runSQL ( query ) ;
477
479
}
478
480
0 commit comments