From d57255152c77fb46b6680fdd51e2bb9b8c79057f Mon Sep 17 00:00:00 2001 From: Andrew Eisenberg Date: Sun, 17 Mar 2024 11:25:05 -0700 Subject: [PATCH 1/3] Safely check for out of date databases When checking to re-import test databases, if the target database is missing or otherwise unavailable, avoid the check and just continue. This avoids a bug where a user would delete a test database and there would be an error when trying to run a query. --- .../src/databases/local-databases/database-manager.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/extensions/ql-vscode/src/databases/local-databases/database-manager.ts b/extensions/ql-vscode/src/databases/local-databases/database-manager.ts index a1a7dc28be4..13e975a8743 100644 --- a/extensions/ql-vscode/src/databases/local-databases/database-manager.ts +++ b/extensions/ql-vscode/src/databases/local-databases/database-manager.ts @@ -227,8 +227,16 @@ export class DatabaseManager extends DisposableObject { "codeql-database.yml", ); + let originStat; + try { + originStat = await stat(originDbYml); + } catch (e) { + // if there is an error here, assume that the origin database + // is no longer available. Safely ignore and do not try to re-import. + return false; + } + try { - const originStat = await stat(originDbYml); const importedStat = await stat(importedDbYml); return originStat.mtimeMs > importedStat.mtimeMs; } catch (e) { From fe957db17aaeb3679ae3e29cb435d93c9674dd3d Mon Sep 17 00:00:00 2001 From: Andrew Eisenberg Date: Sun, 17 Mar 2024 11:27:35 -0700 Subject: [PATCH 2/3] When importing from a directory, check for testproj Use the testproj style import when using the folder icon to import a database. This means that if the database directory ends with `testproj` copy the database into workspace storage and make it available for re-importing when the origin database changes. --- extensions/ql-vscode/src/databases/local-databases-ui.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/ql-vscode/src/databases/local-databases-ui.ts b/extensions/ql-vscode/src/databases/local-databases-ui.ts index 81edbda186e..3b6f8127162 100644 --- a/extensions/ql-vscode/src/databases/local-databases-ui.ts +++ b/extensions/ql-vscode/src/databases/local-databases-ui.ts @@ -995,14 +995,15 @@ export class DatabaseUI extends DisposableObject { return undefined; } - if (byFolder) { + if (byFolder && !uri.fsPath.endsWith("testproj")) { const fixedUri = await this.fixDbUri(uri); // we are selecting a database folder return await this.databaseManager.openDatabase(fixedUri, { type: "folder", }); } else { - // we are selecting a database archive. Must unzip into a workspace-controlled area + // we are selecting a database archive or a testproj. + // Unzip archives (if an archive) and copy into a workspace-controlled area // before importing. return await importLocalDatabase( this.app.commands, From 31cfaebb598afb144b833beba85fc7ddc9d81dea Mon Sep 17 00:00:00 2001 From: Andrew Eisenberg Date: Sun, 17 Mar 2024 11:51:58 -0700 Subject: [PATCH 3/3] Ensure database sources are zipped on re-import --- extensions/ql-vscode/src/databases/database-fetcher.ts | 4 +++- .../src/databases/local-databases/database-manager.ts | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/extensions/ql-vscode/src/databases/database-fetcher.ts b/extensions/ql-vscode/src/databases/database-fetcher.ts index 995786dffa0..13f64e4f7fe 100644 --- a/extensions/ql-vscode/src/databases/database-fetcher.ts +++ b/extensions/ql-vscode/src/databases/database-fetcher.ts @@ -666,7 +666,9 @@ function isFile(databaseUrl: string) { * * @param databasePath The full path to the unzipped database */ -async function ensureZippedSourceLocation(databasePath: string): Promise { +export async function ensureZippedSourceLocation( + databasePath: string, +): Promise { const srcFolderPath = join(databasePath, "src"); const srcZipPath = `${srcFolderPath}.zip`; diff --git a/extensions/ql-vscode/src/databases/local-databases/database-manager.ts b/extensions/ql-vscode/src/databases/local-databases/database-manager.ts index 13e975a8743..f512e5f5df8 100644 --- a/extensions/ql-vscode/src/databases/local-databases/database-manager.ts +++ b/extensions/ql-vscode/src/databases/local-databases/database-manager.ts @@ -43,6 +43,7 @@ import { DatabaseResolver } from "./database-resolver"; import { telemetryListener } from "../../common/vscode/telemetry"; import type { LanguageContextStore } from "../../language-context-store"; import type { DatabaseOrigin } from "./database-origin"; +import { ensureZippedSourceLocation } from "../database-fetcher"; /** * The name of the key in the workspaceState dictionary in which we @@ -260,6 +261,7 @@ export class DatabaseManager extends DisposableObject { await this.removeDatabaseItem(dbItem); await copy(dbItem.origin.path, databaseUri.fsPath); + await ensureZippedSourceLocation(databaseUri.fsPath); const newDbItem = new DatabaseItemImpl(databaseUri, dbItem.contents, { dateAdded: Date.now(), language: dbItem.language,