Skip to content

Commit 82c40c6

Browse files
committed
Add generalized run query method.
1 parent 1a34d78 commit 82c40c6

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { CancellationToken } from "vscode";
2+
import { CodeQLCliServer } from "../codeql-cli/cli";
3+
import { ProgressCallback } from "../common/vscode/progress";
4+
import { DatabaseItem } from "../databases/local-databases";
5+
import { CoreCompletedQuery, QueryRunner } from "../query-server";
6+
import { createLockFileForStandardQuery } from "./standard-queries";
7+
import { TeeLogger, showAndLogExceptionWithTelemetry } from "../common/logging";
8+
import { QueryResultType } from "../query-server/new-messages";
9+
import { extLogger } from "../common/logging/vscode";
10+
import { telemetryListener } from "../common/vscode/telemetry";
11+
import { redactableError } from "../common/errors";
12+
import { basename } from "path";
13+
14+
type RunQueriesOptions = {
15+
cliServer: CodeQLCliServer;
16+
queryRunner: QueryRunner;
17+
databaseItem: DatabaseItem;
18+
queryPath: string;
19+
queryStorageDir: string;
20+
additionalPacks: string[];
21+
extensionPacks: string[] | undefined;
22+
progress: ProgressCallback;
23+
token: CancellationToken;
24+
};
25+
26+
export async function runQuery({
27+
cliServer,
28+
queryRunner,
29+
databaseItem,
30+
queryPath,
31+
queryStorageDir,
32+
additionalPacks,
33+
extensionPacks,
34+
progress,
35+
token,
36+
}: RunQueriesOptions): Promise<CoreCompletedQuery | undefined> {
37+
// Create a lock file for the query. This is required to resolve dependencies and library path for the query.
38+
const { cleanup: cleanupLockFile } = await createLockFileForStandardQuery(
39+
cliServer,
40+
queryPath,
41+
);
42+
43+
// Create a query run to execute
44+
const queryRun = queryRunner.createQueryRun(
45+
databaseItem.databaseUri.fsPath,
46+
{
47+
queryPath,
48+
quickEvalPosition: undefined,
49+
quickEvalCountOnly: false,
50+
},
51+
false,
52+
additionalPacks,
53+
extensionPacks,
54+
queryStorageDir,
55+
undefined,
56+
undefined,
57+
);
58+
59+
const completedQuery = await queryRun.evaluate(
60+
progress,
61+
token,
62+
new TeeLogger(queryRunner.logger, queryRun.outputDir.logPath),
63+
);
64+
65+
await cleanupLockFile?.();
66+
67+
if (completedQuery.resultType !== QueryResultType.SUCCESS) {
68+
void showAndLogExceptionWithTelemetry(
69+
extLogger,
70+
telemetryListener,
71+
redactableError`Failed to run ${basename(queryPath)} query: ${
72+
completedQuery.message ?? "No message"
73+
}`,
74+
);
75+
return;
76+
}
77+
return completedQuery;
78+
}

0 commit comments

Comments
 (0)