Skip to content

Commit 7335e37

Browse files
Merge branch 'main' into yer-an-input-box-query
2 parents 154fab8 + 467c2a5 commit 7335e37

File tree

5 files changed

+76
-57
lines changed

5 files changed

+76
-57
lines changed

extensions/ql-vscode/src/databaseFetcher.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,13 +317,15 @@ async function databaseArchiveFetcher(
317317
});
318318
await ensureZippedSourceLocation(dbPath);
319319

320+
const makeSelected = true;
321+
320322
const item = await databaseManager.openDatabase(
321323
progress,
322324
token,
323325
Uri.file(dbPath),
326+
makeSelected,
324327
nameOverride,
325328
);
326-
await databaseManager.setCurrentDatabaseItem(item);
327329
return item;
328330
} else {
329331
throw new Error("Database not found in archive.");

extensions/ql-vscode/src/local-databases-ui.ts

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -306,18 +306,21 @@ export class DatabaseUI extends DisposableObject {
306306
`${workspace.workspaceFolders[0].uri}/.tours/codeql-tutorial-database`,
307307
);
308308

309-
let databaseItem = this.databaseManager.findDatabaseItem(uri);
310-
const isTutorialDatabase = true;
309+
const databaseItem = this.databaseManager.findDatabaseItem(uri);
311310
if (databaseItem === undefined) {
312-
databaseItem = await this.databaseManager.openDatabase(
311+
const makeSelected = true;
312+
const nameOverride = "CodeQL Tutorial Database";
313+
const isTutorialDatabase = true;
314+
315+
await this.databaseManager.openDatabase(
313316
progress,
314317
token,
315318
uri,
316-
"CodeQL Tutorial Database",
319+
makeSelected,
320+
nameOverride,
317321
isTutorialDatabase,
318322
);
319323
}
320-
await this.databaseManager.setCurrentDatabaseItem(databaseItem);
321324
await this.handleTourDependencies();
322325
}
323326
} catch (e) {
@@ -630,7 +633,7 @@ export class DatabaseUI extends DisposableObject {
630633
this.queryServer?.cliServer,
631634
);
632635
} else {
633-
await this.setCurrentDatabase(progress, token, uri);
636+
await this.databaseManager.openDatabase(progress, token, uri);
634637
}
635638
} catch (e) {
636639
// rethrow and let this be handled by default error handling.
@@ -752,24 +755,6 @@ export class DatabaseUI extends DisposableObject {
752755
return this.databaseManager.currentDatabaseItem;
753756
}
754757

755-
private async setCurrentDatabase(
756-
progress: ProgressCallback,
757-
token: CancellationToken,
758-
uri: Uri,
759-
): Promise<DatabaseItem | undefined> {
760-
let databaseItem = this.databaseManager.findDatabaseItem(uri);
761-
if (databaseItem === undefined) {
762-
databaseItem = await this.databaseManager.openDatabase(
763-
progress,
764-
token,
765-
uri,
766-
);
767-
}
768-
await this.databaseManager.setCurrentDatabaseItem(databaseItem);
769-
770-
return databaseItem;
771-
}
772-
773758
/**
774759
* Ask the user for a database directory. Returns the chosen database, or `undefined` if the
775760
* operation was canceled.
@@ -789,7 +774,11 @@ export class DatabaseUI extends DisposableObject {
789774
if (byFolder) {
790775
const fixedUri = await this.fixDbUri(uri);
791776
// we are selecting a database folder
792-
return await this.setCurrentDatabase(progress, token, fixedUri);
777+
return await this.databaseManager.openDatabase(
778+
progress,
779+
token,
780+
fixedUri,
781+
);
793782
} else {
794783
// we are selecting a database archive. Must unzip into a workspace-controlled area
795784
// before importing.

extensions/ql-vscode/src/local-databases.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ export class DatabaseManager extends DisposableObject {
621621
progress: ProgressCallback,
622622
token: vscode.CancellationToken,
623623
uri: vscode.Uri,
624+
makeSelected = false,
624625
displayName?: string,
625626
isTutorialDatabase?: boolean,
626627
): Promise<DatabaseItem> {
@@ -629,6 +630,7 @@ export class DatabaseManager extends DisposableObject {
629630
return await this.addExistingDatabaseItem(
630631
databaseItem,
631632
progress,
633+
makeSelected,
632634
token,
633635
isTutorialDatabase,
634636
);
@@ -643,6 +645,7 @@ export class DatabaseManager extends DisposableObject {
643645
public async addExistingDatabaseItem(
644646
databaseItem: DatabaseItem,
645647
progress: ProgressCallback,
648+
makeSelected = true,
646649
token: vscode.CancellationToken,
647650
isTutorialDatabase?: boolean,
648651
): Promise<DatabaseItem> {
@@ -652,6 +655,9 @@ export class DatabaseManager extends DisposableObject {
652655
}
653656

654657
await this.addDatabaseItem(progress, token, databaseItem);
658+
if (makeSelected) {
659+
await this.setCurrentDatabaseItem(databaseItem);
660+
}
655661
await this.addDatabaseSourceArchiveFolder(databaseItem);
656662

657663
if (isCodespacesTemplate() && !isTutorialDatabase) {

extensions/ql-vscode/src/skeleton-query-wizard.ts

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,14 @@ export class SkeletonQueryWizard {
6969
if (skeletonPackAlreadyExists) {
7070
// just create a new example query file in skeleton QL pack
7171
await this.createExampleFile();
72-
// select existing database for language
73-
await this.selectExistingDatabase();
7472
} else {
7573
// generate a new skeleton QL pack with query file
7674
await this.createQlPack();
77-
// download database based on language and select it
78-
await this.downloadDatabase();
7975
}
8076

77+
// select existing database for language or download a new one
78+
await this.selectOrDownloadDatabase();
79+
8180
// open a query file
8281

8382
try {
@@ -253,41 +252,19 @@ export class SkeletonQueryWizard {
253252
);
254253
}
255254

256-
private async selectExistingDatabase() {
257-
if (this.language === undefined) {
258-
throw new Error("Language is undefined");
259-
}
260-
255+
private async selectOrDownloadDatabase() {
261256
if (this.qlPackStoragePath === undefined) {
262257
throw new Error("QL Pack storage path is undefined");
263258
}
264259

265-
const databaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
266-
267-
const existingDatabaseItem = await this.findDatabaseItemByNwo(
268-
this.language,
269-
databaseNwo,
270-
this.databaseManager.databaseItems,
271-
);
260+
const existingDatabaseItem = await this.findExistingDatabaseItem();
272261

273262
if (existingDatabaseItem) {
274263
// select the found database
275264
await this.databaseManager.setCurrentDatabaseItem(existingDatabaseItem);
276265
} else {
277-
const sameLanguageDatabaseItem = await this.findDatabaseItemByLanguage(
278-
this.language,
279-
this.databaseManager.databaseItems,
280-
);
281-
282-
if (sameLanguageDatabaseItem) {
283-
// select the found database
284-
await this.databaseManager.setCurrentDatabaseItem(
285-
sameLanguageDatabaseItem,
286-
);
287-
} else {
288-
// download new database and select it
289-
await this.downloadDatabase();
290-
}
266+
// download new database and select it
267+
await this.downloadDatabase();
291268
}
292269
}
293270

@@ -323,4 +300,27 @@ export class SkeletonQueryWizard {
323300
}
324301
return dbs[0];
325302
}
303+
304+
private async findExistingDatabaseItem() {
305+
if (this.language === undefined) {
306+
throw new Error("Language is undefined");
307+
}
308+
309+
const defaultDatabaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language];
310+
311+
const defaultDatabaseItem = await this.findDatabaseItemByNwo(
312+
this.language,
313+
defaultDatabaseNwo,
314+
this.databaseManager.databaseItems,
315+
);
316+
317+
if (defaultDatabaseItem !== undefined) {
318+
return defaultDatabaseItem;
319+
}
320+
321+
return await this.findDatabaseItemByLanguage(
322+
this.language,
323+
this.databaseManager.databaseItems,
324+
);
325+
}
326326
}

extensions/ql-vscode/test/vscode-tests/minimal-workspace/local-databases.test.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,7 @@ describe("local databases", () => {
708708
describe("openDatabase", () => {
709709
let createSkeletonPacksSpy: jest.SpyInstance;
710710
let resolveDatabaseContentsSpy: jest.SpyInstance;
711+
let setCurrentDatabaseItemSpy: jest.SpyInstance;
711712
let addDatabaseSourceArchiveFolderSpy: jest.SpyInstance;
712713
let mockDbItem: DatabaseItemImpl;
713714

@@ -722,6 +723,11 @@ describe("local databases", () => {
722723
.spyOn(DatabaseResolver, "resolveDatabaseContents")
723724
.mockResolvedValue({} as DatabaseContentsWithDbScheme);
724725

726+
setCurrentDatabaseItemSpy = jest.spyOn(
727+
databaseManager,
728+
"setCurrentDatabaseItem",
729+
);
730+
725731
addDatabaseSourceArchiveFolderSpy = jest.spyOn(
726732
databaseManager,
727733
"addDatabaseSourceArchiveFolder",
@@ -746,6 +752,19 @@ describe("local databases", () => {
746752
expect(resolveDatabaseContentsSpy).toBeCalledTimes(1);
747753
});
748754

755+
it("should set the database as the currently selected one", async () => {
756+
const makeSelected = true;
757+
758+
await databaseManager.openDatabase(
759+
{} as ProgressCallback,
760+
{} as CancellationToken,
761+
mockDbItem.databaseUri,
762+
makeSelected,
763+
);
764+
765+
expect(setCurrentDatabaseItemSpy).toBeCalledTimes(1);
766+
});
767+
749768
it("should add database source archive folder", async () => {
750769
await databaseManager.openDatabase(
751770
{} as ProgressCallback,
@@ -762,12 +781,15 @@ describe("local databases", () => {
762781
jest.spyOn(Setting.prototype, "getValue").mockReturnValue(true);
763782

764783
const isTutorialDatabase = true;
784+
const makeSelected = true;
785+
const nameOverride = "CodeQL Tutorial Database";
765786

766787
await databaseManager.openDatabase(
767788
{} as ProgressCallback,
768789
{} as CancellationToken,
769790
mockDbItem.databaseUri,
770-
"CodeQL Tutorial Database",
791+
makeSelected,
792+
nameOverride,
771793
isTutorialDatabase,
772794
);
773795

0 commit comments

Comments
 (0)