Skip to content

Commit 6fc567b

Browse files
authored
Merge pull request #3066 from github/koesie10/add-database-source
Add origin metadata to database items
2 parents a271f7b + 7fe707a commit 6fc567b

File tree

20 files changed

+219
-14
lines changed

20 files changed

+219
-14
lines changed

extensions/ql-vscode/src/databases/config/db-config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Contains models and consts for the data we want to store in the database config.
22
// Changes to these models should be done carefully and account for backwards compatibility of data.
33

4+
import { DatabaseOrigin } from "../local-databases/database-origin";
5+
46
export const DB_CONFIG_VERSION = 1;
57

68
export interface DbConfig {
@@ -88,6 +90,7 @@ export interface LocalDatabase {
8890
name: string;
8991
dateAdded: number;
9092
language: string;
93+
origin: DatabaseOrigin;
9194
storagePath: string;
9295
}
9396

extensions/ql-vscode/src/databases/database-fetcher.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { addDatabaseSourceToWorkspace, allowHttp } from "../config";
3333
import { showAndLogInformationMessage } from "../common/logging";
3434
import { AppOctokit } from "../common/octokit";
3535
import { getLanguageDisplayName } from "../common/query-language";
36+
import { DatabaseOrigin } from "./local-databases/database-origin";
3637

3738
/**
3839
* Prompts a user to fetch a database from a remote location. Database is assumed to be an archive file.
@@ -62,6 +63,10 @@ export async function promptImportInternetDatabase(
6263
databaseManager,
6364
storagePath,
6465
undefined,
66+
{
67+
type: "url",
68+
url: databaseUrl,
69+
},
6570
progress,
6671
cli,
6772
);
@@ -199,7 +204,8 @@ export async function downloadGitHubDatabase(
199204
return;
200205
}
201206

202-
const { databaseUrl, name, owner } = result;
207+
const { databaseUrl, name, owner, databaseId, databaseCreatedAt, commitOid } =
208+
result;
203209

204210
/**
205211
* The 'token' property of the token object returned by `octokit.auth()`.
@@ -221,6 +227,13 @@ export async function downloadGitHubDatabase(
221227
databaseManager,
222228
storagePath,
223229
`${owner}/${name}`,
230+
{
231+
type: "github",
232+
repository: nwo,
233+
databaseId,
234+
databaseCreatedAt,
235+
commitOid,
236+
},
224237
progress,
225238
cli,
226239
makeSelected,
@@ -250,6 +263,10 @@ export async function importArchiveDatabase(
250263
databaseManager,
251264
storagePath,
252265
undefined,
266+
{
267+
type: "archive",
268+
path: databaseUrl,
269+
},
253270
progress,
254271
cli,
255272
);
@@ -282,6 +299,7 @@ export async function importArchiveDatabase(
282299
* @param databaseManager the DatabaseManager
283300
* @param storagePath where to store the unzipped database.
284301
* @param nameOverride a name for the database that overrides the default
302+
* @param origin the origin of the database
285303
* @param progress callback to send progress messages to
286304
* @param makeSelected make the new database selected in the databases panel (default: true)
287305
* @param addSourceArchiveFolder whether to add a workspace folder containing the source archive to the workspace
@@ -292,6 +310,7 @@ async function databaseArchiveFetcher(
292310
databaseManager: DatabaseManager,
293311
storagePath: string,
294312
nameOverride: string | undefined,
313+
origin: DatabaseOrigin,
295314
progress: ProgressCallback,
296315
cli?: CodeQLCliServer,
297316
makeSelected = true,
@@ -336,6 +355,7 @@ async function databaseArchiveFetcher(
336355

337356
const item = await databaseManager.openDatabase(
338357
Uri.file(dbPath),
358+
origin,
339359
makeSelected,
340360
nameOverride,
341361
{
@@ -533,6 +553,9 @@ export async function convertGithubNwoToDatabaseUrl(
533553
databaseUrl: string;
534554
owner: string;
535555
name: string;
556+
databaseId: number;
557+
databaseCreatedAt: string;
558+
commitOid: string | null;
536559
}
537560
| undefined
538561
> {
@@ -553,10 +576,20 @@ export async function convertGithubNwoToDatabaseUrl(
553576
}
554577
}
555578

579+
const databaseForLanguage = response.data.find(
580+
(db: any) => db.language === language,
581+
);
582+
if (!databaseForLanguage) {
583+
throw new Error(`No database found for language '${language}'`);
584+
}
585+
556586
return {
557587
databaseUrl: `https://api.github.com/repos/${owner}/${repo}/code-scanning/codeql/databases/${language}`,
558588
owner,
559589
name: repo,
590+
databaseId: databaseForLanguage.id,
591+
databaseCreatedAt: databaseForLanguage.created_at,
592+
commitOid: databaseForLanguage.commit_oid,
560593
};
561594
} catch (e) {
562595
void extLogger.log(`Error: ${getErrorMessage(e)}`);

extensions/ql-vscode/src/databases/db-item.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// This file contains models that are used to represent the databases.
22

3+
import { DatabaseOrigin } from "./local-databases/database-origin";
4+
35
export enum DbItemKind {
46
RootLocal = "RootLocal",
57
LocalList = "LocalList",
@@ -38,6 +40,7 @@ export interface LocalDatabaseDbItem {
3840
databaseName: string;
3941
dateAdded: number;
4042
language: string;
43+
origin: DatabaseOrigin;
4144
storagePath: string;
4245
parentListName?: string;
4346
}

extensions/ql-vscode/src/databases/db-tree-creator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ function createLocalDb(
197197
databaseName: db.name,
198198
dateAdded: db.dateAdded,
199199
language: db.language,
200+
origin: db.origin,
200201
storagePath: db.storagePath,
201202
selected: !!selected,
202203
parentListName: listName,

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,9 @@ export class DatabaseUI extends DisposableObject {
367367

368368
await this.databaseManager.openDatabase(
369369
uri,
370+
{
371+
type: "folder",
372+
},
370373
makeSelected,
371374
nameOverride,
372375
{
@@ -704,7 +707,9 @@ export class DatabaseUI extends DisposableObject {
704707
this.queryServer?.cliServer,
705708
);
706709
} else {
707-
await this.databaseManager.openDatabase(uri);
710+
await this.databaseManager.openDatabase(uri, {
711+
type: "folder",
712+
});
708713
}
709714
} catch (e) {
710715
// rethrow and let this be handled by default error handling.
@@ -819,7 +824,9 @@ export class DatabaseUI extends DisposableObject {
819824
if (byFolder) {
820825
const fixedUri = await this.fixDbUri(uri);
821826
// we are selecting a database folder
822-
return await this.databaseManager.openDatabase(fixedUri);
827+
return await this.databaseManager.openDatabase(fixedUri, {
828+
type: "folder",
829+
});
823830
} else {
824831
// we are selecting a database archive. Must unzip into a workspace-controlled area
825832
// before importing.

extensions/ql-vscode/src/databases/local-databases/database-item-impl.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { isLikelyDatabaseRoot } from "./db-contents-heuristics";
1414
import { stat } from "fs-extra";
1515
import { containsPath, pathsEqual } from "../../common/files";
1616
import { DatabaseContents } from "./database-contents";
17+
import { DatabaseOrigin } from "./database-origin";
1718

1819
export class DatabaseItemImpl implements DatabaseItem {
1920
// These are only public in the implementation, they are readonly in the interface
@@ -61,6 +62,10 @@ export class DatabaseItemImpl implements DatabaseItem {
6162
return this.options.dateAdded;
6263
}
6364

65+
public get origin(): DatabaseOrigin | undefined {
66+
return this.options.origin;
67+
}
68+
6469
public resolveSourceFile(uriStr: string | undefined): vscode.Uri {
6570
const sourceArchive = this.sourceArchive;
6671
const uri = uriStr ? vscode.Uri.parse(uriStr, true) : undefined;

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import vscode from "vscode";
22
import * as cli from "../../codeql-cli/cli";
33
import { DatabaseContents } from "./database-contents";
44
import { DatabaseOptions } from "./database-options";
5+
import { DatabaseOrigin } from "./database-origin";
56

67
/** An item in the list of available databases */
78
export interface DatabaseItem {
@@ -25,6 +26,11 @@ export interface DatabaseItem {
2526
*/
2627
readonly dateAdded: number | undefined;
2728

29+
/**
30+
* The origin this database item was retrieved from or undefined if unknown.
31+
*/
32+
readonly origin: DatabaseOrigin | undefined;
33+
2834
/** If the database is invalid, describes why. */
2935
readonly error: Error | undefined;
3036

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { DatabaseChangedEvent, DatabaseEventKind } from "./database-events";
3535
import { DatabaseResolver } from "./database-resolver";
3636
import { telemetryListener } from "../../common/vscode/telemetry";
3737
import { LanguageContextStore } from "../../language-context-store";
38+
import { DatabaseOrigin } from "./database-origin";
3839

3940
/**
4041
* The name of the key in the workspaceState dictionary in which we
@@ -132,14 +133,19 @@ export class DatabaseManager extends DisposableObject {
132133
*/
133134
public async openDatabase(
134135
uri: vscode.Uri,
136+
origin: DatabaseOrigin | undefined,
135137
makeSelected = true,
136138
displayName?: string,
137139
{
138140
isTutorialDatabase = false,
139141
addSourceArchiveFolder = addDatabaseSourceToWorkspace(),
140142
}: OpenDatabaseOptions = {},
141143
): Promise<DatabaseItem> {
142-
const databaseItem = await this.createDatabaseItem(uri, displayName);
144+
const databaseItem = await this.createDatabaseItem(
145+
uri,
146+
origin,
147+
displayName,
148+
);
143149

144150
return await this.addExistingDatabaseItem(
145151
databaseItem,
@@ -190,6 +196,7 @@ export class DatabaseManager extends DisposableObject {
190196
*/
191197
private async createDatabaseItem(
192198
uri: vscode.Uri,
199+
origin: DatabaseOrigin | undefined,
193200
displayName: string | undefined,
194201
): Promise<DatabaseItemImpl> {
195202
const contents = await DatabaseResolver.resolveDatabaseContents(uri);
@@ -198,6 +205,7 @@ export class DatabaseManager extends DisposableObject {
198205
displayName,
199206
dateAdded: Date.now(),
200207
language: await this.getPrimaryLanguage(uri.fsPath),
208+
origin,
201209
};
202210
const databaseItem = new DatabaseItemImpl(uri, contents, fullOptions);
203211

@@ -213,6 +221,7 @@ export class DatabaseManager extends DisposableObject {
213221
*/
214222
public async createOrOpenDatabaseItem(
215223
uri: vscode.Uri,
224+
origin: DatabaseOrigin | undefined,
216225
): Promise<DatabaseItem> {
217226
const existingItem = this.findDatabaseItem(uri);
218227
if (existingItem !== undefined) {
@@ -221,7 +230,7 @@ export class DatabaseManager extends DisposableObject {
221230
}
222231

223232
// We don't add this to the list automatically, but the user can add it later.
224-
return this.createDatabaseItem(uri, undefined);
233+
return this.createDatabaseItem(uri, origin, undefined);
225234
}
226235

227236
public async createSkeletonPacks(databaseItem: DatabaseItem) {
@@ -356,6 +365,7 @@ export class DatabaseManager extends DisposableObject {
356365
let displayName: string | undefined = undefined;
357366
let dateAdded = undefined;
358367
let language = undefined;
368+
let origin = undefined;
359369
if (state.options) {
360370
if (typeof state.options.displayName === "string") {
361371
displayName = state.options.displayName;
@@ -364,6 +374,7 @@ export class DatabaseManager extends DisposableObject {
364374
dateAdded = state.options.dateAdded;
365375
}
366376
language = state.options.language;
377+
origin = state.options.origin;
367378
}
368379

369380
const dbBaseUri = vscode.Uri.parse(state.uri, true);
@@ -376,6 +387,7 @@ export class DatabaseManager extends DisposableObject {
376387
displayName,
377388
dateAdded,
378389
language,
390+
origin,
379391
};
380392
const item = new DatabaseItemImpl(dbBaseUri, undefined, fullOptions);
381393

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
import { DatabaseOrigin } from "./database-origin";
2+
13
export interface DatabaseOptions {
24
displayName?: string;
35
dateAdded?: number | undefined;
46
language?: string;
7+
origin?: DatabaseOrigin;
58
}
69

710
export interface FullDatabaseOptions extends DatabaseOptions {
811
dateAdded: number | undefined;
912
language: string | undefined;
13+
origin: DatabaseOrigin | undefined;
1014
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
interface DatabaseOriginFolder {
2+
type: "folder";
3+
}
4+
5+
interface DatabaseOriginArchive {
6+
type: "archive";
7+
path: string;
8+
}
9+
10+
interface DatabaseOriginGitHub {
11+
type: "github";
12+
repository: string;
13+
databaseId: number;
14+
databaseCreatedAt: string;
15+
commitOid: string | null;
16+
}
17+
18+
interface DatabaseOriginInternet {
19+
type: "url";
20+
url: string;
21+
}
22+
23+
interface DatabaseOriginDebugger {
24+
type: "debugger";
25+
}
26+
27+
export type DatabaseOrigin =
28+
| DatabaseOriginFolder
29+
| DatabaseOriginArchive
30+
| DatabaseOriginGitHub
31+
| DatabaseOriginInternet
32+
| DatabaseOriginDebugger;

0 commit comments

Comments
 (0)