@@ -4,6 +4,8 @@ import * as path from 'path';
4
4
import * as tmp from 'tmp' ;
5
5
import { promisify } from 'util' ;
6
6
import * as vscode from 'vscode' ;
7
+ import { ErrorCodes , ResponseError } from 'vscode-languageclient' ;
8
+
7
9
import * as cli from './cli' ;
8
10
import { DatabaseItem , getUpgradesDirectories } from './databases' ;
9
11
import * as helpers from './helpers' ;
@@ -103,13 +105,19 @@ export class QueryInfo {
103
105
} finally {
104
106
qs . unRegisterCallback ( callbackId ) ;
105
107
}
106
- return result || { evaluationTime : 0 , message : "No result from server" , queryId : - 1 , runId : callbackId , resultType : messages . QueryResultType . OTHER_ERROR } ;
108
+ return result || {
109
+ evaluationTime : 0 ,
110
+ message : "No result from server" ,
111
+ queryId : - 1 ,
112
+ runId : callbackId ,
113
+ resultType : messages . QueryResultType . OTHER_ERROR
114
+ } ;
107
115
}
108
116
109
117
async compile (
110
118
qs : qsClient . QueryServerClient ,
111
119
) : Promise < messages . CompilationMessage [ ] > {
112
- let compiled : messages . CheckQueryResult ;
120
+ let compiled : messages . CheckQueryResult | undefined ;
113
121
try {
114
122
const params : messages . CompileQueryParams = {
115
123
compilationOptions : {
@@ -140,8 +148,7 @@ export class QueryInfo {
140
148
} finally {
141
149
qs . logger . log ( " - - - COMPILATION DONE - - - " ) ;
142
150
}
143
-
144
- return ( compiled . messages || [ ] ) . filter ( msg => msg . severity == 0 ) ;
151
+ return ( compiled ?. messages || [ ] ) . filter ( msg => msg . severity === messages . Severity . ERROR ) ;
145
152
}
146
153
147
154
/**
@@ -411,10 +418,24 @@ export async function compileAndRunQueryAgainstDatabase(
411
418
const query = new QueryInfo ( qlProgram , db , packConfig . dbscheme , quickEvalPosition , metadata ) ;
412
419
await checkDbschemeCompatibility ( cliServer , qs , query ) ;
413
420
414
- const errors = await query . compile ( qs ) ;
421
+ let errors ;
422
+ try {
423
+ errors = await query . compile ( qs ) ;
424
+ } catch ( e ) {
425
+ if ( e instanceof ResponseError && e . code == ErrorCodes . RequestCancelled ) {
426
+ return createSyntheticResult ( query , db , historyItemOptions , 'Query cancelled' , messages . QueryResultType . CANCELLATION ) ;
427
+ } else {
428
+ throw e ;
429
+ }
430
+ }
415
431
416
432
if ( errors . length == 0 ) {
417
433
const result = await query . run ( qs ) ;
434
+ if ( result . resultType !== messages . QueryResultType . SUCCESS ) {
435
+ const message = result . message || 'Failed to run query' ;
436
+ logger . log ( message ) ;
437
+ helpers . showAndLogErrorMessage ( message ) ;
438
+ }
418
439
return {
419
440
query,
420
441
result,
@@ -448,20 +469,31 @@ export async function compileAndRunQueryAgainstDatabase(
448
469
" and choose CodeQL Query Server from the dropdown." ) ;
449
470
}
450
471
451
- return {
452
- query,
453
- result : {
454
- evaluationTime : 0 ,
455
- resultType : messages . QueryResultType . OTHER_ERROR ,
456
- queryId : - 1 ,
457
- runId : - 1 ,
458
- message : "Query had compilation errors"
459
- } ,
460
- database : {
461
- name : db . name ,
462
- databaseUri : db . databaseUri . toString ( true )
463
- } ,
464
- options : historyItemOptions ,
465
- } ;
472
+ return createSyntheticResult ( query , db , historyItemOptions , 'Query had compilation errors' , messages . QueryResultType . OTHER_ERROR ) ;
466
473
}
467
474
}
475
+
476
+ function createSyntheticResult (
477
+ query : QueryInfo ,
478
+ db : DatabaseItem ,
479
+ historyItemOptions : QueryHistoryItemOptions ,
480
+ message : string ,
481
+ resultType : number
482
+ ) {
483
+
484
+ return {
485
+ query,
486
+ result : {
487
+ evaluationTime : 0 ,
488
+ resultType : resultType ,
489
+ queryId : - 1 ,
490
+ runId : - 1 ,
491
+ message
492
+ } ,
493
+ database : {
494
+ name : db . name ,
495
+ databaseUri : db . databaseUri . toString ( true )
496
+ } ,
497
+ options : historyItemOptions ,
498
+ } ;
499
+ }
0 commit comments