Skip to content

Commit c292f58

Browse files
committed
Factor out database qlpack inference.
1 parent 6f935ae commit c292f58

File tree

2 files changed

+55
-41
lines changed

2 files changed

+55
-41
lines changed

extensions/ql-vscode/src/helpers.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import * as fs from 'fs-extra';
2+
import * as glob from 'glob-promise';
3+
import * as yaml from 'js-yaml';
14
import * as path from 'path';
25
import { CancellationToken, ExtensionContext, ProgressOptions, window as Window, workspace } from 'vscode';
6+
import { CodeQLCliServer } from './cli';
37
import { logger } from './logging';
48
import { QueryInfo } from './run-queries';
59

@@ -244,3 +248,53 @@ function createRateLimitedResult(): RateLimitedResult {
244248
kind: InvocationRateLimiterResultKind.RateLimited
245249
};
246250
}
251+
252+
253+
export type DatasetFolderInfo = {
254+
dbscheme: string;
255+
qlpack: string;
256+
}
257+
258+
export async function getQlPackForDbscheme(cliServer: CodeQLCliServer, dbschemePath: string): Promise<string> {
259+
const qlpacks = await cliServer.resolveQlpacks(getOnDiskWorkspaceFolders());
260+
const packs: { packDir: string | undefined; packName: string }[] =
261+
Object.entries(qlpacks).map(([packName, dirs]) => {
262+
if (dirs.length < 1) {
263+
logger.log(`In getQlPackFor ${dbschemePath}, qlpack ${packName} has no directories`);
264+
return { packName, packDir: undefined };
265+
}
266+
if (dirs.length > 1) {
267+
logger.log(`In getQlPackFor ${dbschemePath}, qlpack ${packName} has more than one directory; arbitrarily choosing the first`);
268+
}
269+
return {
270+
packName,
271+
packDir: dirs[0]
272+
}
273+
});
274+
for (const { packDir, packName } of packs) {
275+
if (packDir !== undefined) {
276+
const qlpack = yaml.safeLoad(await fs.readFile(path.join(packDir, 'qlpack.yml'), 'utf8'));
277+
if (qlpack.dbscheme !== undefined && path.basename(qlpack.dbscheme) === path.basename(dbschemePath)) {
278+
return packName;
279+
}
280+
}
281+
}
282+
throw new Error(`Could not find qlpack file for dbscheme ${dbschemePath}`);
283+
}
284+
285+
export async function resolveDatasetFolder(cliServer: CodeQLCliServer, datasetFolder: string): Promise<DatasetFolderInfo> {
286+
const dbschemes = await glob(path.join(datasetFolder, '*.dbscheme'))
287+
288+
if (dbschemes.length < 1) {
289+
throw new Error(`Can't find dbscheme for current database in ${datasetFolder}`);
290+
}
291+
292+
dbschemes.sort();
293+
const dbscheme = dbschemes[0];
294+
if (dbschemes.length > 1) {
295+
Window.showErrorMessage(`Found multiple dbschemes in ${datasetFolder} during quick query; arbitrarily choosing the first, ${dbscheme}, to decide what library to use.`);
296+
}
297+
298+
const qlpack = await getQlPackForDbscheme(cliServer, dbscheme);
299+
return { dbscheme, qlpack };
300+
}

extensions/ql-vscode/src/quick-query.ts

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as fs from 'fs-extra';
2-
import * as glob from 'glob-promise';
32
import * as yaml from 'js-yaml';
43
import * as path from 'path';
54
import { ExtensionContext, window as Window, workspace, Uri } from 'vscode';
@@ -18,33 +17,6 @@ export function isQuickQueryPath(queryPath: string): boolean {
1817
return path.basename(queryPath) === QUICK_QUERY_QUERY_NAME;
1918
}
2019

21-
async function getQlPackFor(cliServer: CodeQLCliServer, dbschemePath: string): Promise<string> {
22-
const qlpacks = await cliServer.resolveQlpacks(helpers.getOnDiskWorkspaceFolders());
23-
const packs: { packDir: string | undefined; packName: string }[] =
24-
Object.entries(qlpacks).map(([packName, dirs]) => {
25-
if (dirs.length < 1) {
26-
logger.log(`In getQlPackFor ${dbschemePath}, qlpack ${packName} has no directories`);
27-
return { packName, packDir: undefined };
28-
}
29-
if (dirs.length > 1) {
30-
logger.log(`In getQlPackFor ${dbschemePath}, qlpack ${packName} has more than one directory; arbitrarily choosing the first`);
31-
}
32-
return {
33-
packName,
34-
packDir: dirs[0]
35-
}
36-
});
37-
for (const { packDir, packName } of packs) {
38-
if (packDir !== undefined) {
39-
const qlpack = yaml.safeLoad(await fs.readFile(path.join(packDir, 'qlpack.yml'), 'utf8'));
40-
if (qlpack.dbscheme !== undefined && path.basename(qlpack.dbscheme) === path.basename(dbschemePath)) {
41-
return packName;
42-
}
43-
}
44-
}
45-
throw new Error(`Could not find qlpack file for dbscheme ${dbschemePath}`);
46-
}
47-
4820
/**
4921
* `getBaseText` heuristically returns an appropriate import statement
5022
* prelude based on the filename of the dbscheme file given. TODO: add
@@ -128,19 +100,7 @@ export async function displayQuickQuery(ctx: ExtensionContext, cliServer: CodeQL
128100
}
129101

130102
const datasetFolder = await dbItem.getDatasetFolder(cliServer);
131-
const dbschemes = await glob(path.join(datasetFolder, '*.dbscheme'))
132-
133-
if (dbschemes.length < 1) {
134-
throw new Error(`Can't find dbscheme for current database in ${datasetFolder}`);
135-
}
136-
137-
dbschemes.sort();
138-
const dbscheme = dbschemes[0];
139-
if (dbschemes.length > 1) {
140-
Window.showErrorMessage(`Found multiple dbschemes in ${datasetFolder} during quick query; arbitrarily choosing the first, ${dbscheme}, to decide what library to use.`);
141-
}
142-
143-
const qlpack = await getQlPackFor(cliServer, dbscheme);
103+
const { qlpack, dbscheme } = await helpers.resolveDatasetFolder(cliServer, datasetFolder);
144104
const quickQueryQlpackYaml: any = {
145105
name: "quick-query",
146106
version: "1.0.0",

0 commit comments

Comments
 (0)