Skip to content

Commit 3144915

Browse files
committed
Add version check for db registration
Database registration is available in versions >= 2.4.1
1 parent 4e2d60f commit 3144915

4 files changed

Lines changed: 49 additions & 10 deletions

File tree

extensions/ql-vscode/src/cli.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ export class CodeQLCliServer implements Disposable {
133133
nullBuffer: Buffer;
134134

135135
/** Version of current cli, lazily computed by the `getVersion()` method */
136-
_version: SemVer | undefined;
136+
private _version: SemVer | undefined;
137137

138138
/** Path to current codeQL executable, or undefined if not running yet. */
139139
codeQlPath: string | undefined;
@@ -699,7 +699,7 @@ export class CodeQLCliServer implements Disposable {
699699
);
700700
}
701701

702-
private async getVersion() {
702+
public async getVersion() {
703703
if (!this._version) {
704704
this._version = await this.refreshVersion();
705705
}

extensions/ql-vscode/src/databases.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ export class DatabaseManager extends DisposableObject {
622622
const databaseItem = await this.createDatabaseItemFromPersistedState(progress, token, database);
623623
try {
624624
await databaseItem.refresh();
625-
await this.registerDatabases(progress, token, databaseItem);
625+
await this.registerDatabase(progress, token, databaseItem);
626626
if (currentDatabaseUri === database.uri) {
627627
this.setCurrentDatabaseItem(databaseItem, true);
628628
}
@@ -697,7 +697,7 @@ export class DatabaseManager extends DisposableObject {
697697
// Database items reconstituted from persisted state
698698
// will not have their contents yet.
699699
if (item.contents?.datasetUri) {
700-
await this.registerDatabases(progress, token, item);
700+
await this.registerDatabase(progress, token, item);
701701
}
702702
// note that we use undefined as the item in order to reset the entire tree
703703
this._onDidChangeDatabaseItem.fire({
@@ -748,7 +748,7 @@ export class DatabaseManager extends DisposableObject {
748748
}
749749

750750
// Remove this database item from the allow-list
751-
await this.deregisterDatabases(progress, token, item);
751+
await this.deregisterDatabase(progress, token, item);
752752

753753
// note that we use undefined as the item in order to reset the entire tree
754754
this._onDidChangeDatabaseItem.fire({
@@ -757,12 +757,12 @@ export class DatabaseManager extends DisposableObject {
757757
});
758758
}
759759

760-
private async deregisterDatabases(
760+
private async deregisterDatabase(
761761
progress: ProgressCallback,
762762
token: vscode.CancellationToken,
763763
dbItem: DatabaseItem,
764764
) {
765-
if (dbItem.contents) {
765+
if (dbItem.contents && (await this.qs.supportsDatabaseRegistration())) {
766766
const databases: Dataset[] = [{
767767
dbDir: dbItem.contents.datasetUri.fsPath,
768768
workingSet: 'default'
@@ -771,12 +771,12 @@ export class DatabaseManager extends DisposableObject {
771771
}
772772
}
773773

774-
private async registerDatabases(
774+
private async registerDatabase(
775775
progress: ProgressCallback,
776776
token: vscode.CancellationToken,
777777
dbItem: DatabaseItem,
778778
) {
779-
if (dbItem.contents) {
779+
if (dbItem.contents && (await this.qs.supportsDatabaseRegistration())) {
780780
const databases: Dataset[] = [{
781781
dbDir: dbItem.contents.datasetUri.fsPath,
782782
workingSet: 'default'

extensions/ql-vscode/src/queryserver-client.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { QueryServerConfig } from './config';
88
import { Logger, ProgressReporter } from './logging';
99
import { completeQuery, EvaluationResult, progress, ProgressMessage, WithProgressId } from './pure/messages';
1010
import * as messages from './pure/messages';
11+
import { SemVer } from 'semver';
1112

1213
type ServerOpts = {
1314
logger: Logger;
@@ -47,6 +48,12 @@ type WithProgressReporting = (task: (progress: ProgressReporter, token: Cancella
4748
* to restart it (which disposes the existing process and starts a new one).
4849
*/
4950
export class QueryServerClient extends DisposableObject {
51+
52+
/**
53+
* Query Server version where database registration was introduced
54+
*/
55+
private static VERSION_WITH_DB_REGISTRATION = new SemVer('2.4.1');
56+
5057
serverProcess?: ServerProcess;
5158
evaluationResultCallbacks: { [key: number]: (res: EvaluationResult) => void };
5259
progressCallbacks: { [key: number]: ((res: ProgressMessage) => void) | undefined };
@@ -161,6 +168,10 @@ export class QueryServerClient extends DisposableObject {
161168
this.evaluationResultCallbacks = {};
162169
}
163170

171+
async supportsDatabaseRegistration() {
172+
return (await this.cliServer.getVersion()).compare(QueryServerClient.VERSION_WITH_DB_REGISTRATION) >= 0;
173+
}
174+
164175
registerCallback(callback: (res: EvaluationResult) => void): number {
165176
const id = this.nextCallback++;
166177
this.evaluationResultCallbacks[id] = callback;

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ describe('databases', () => {
3333
let getSpy: sinon.SinonStub;
3434
let dbChangedHandler: sinon.SinonSpy;
3535
let sendRequestSpy: sinon.SinonSpy;
36+
let supportsDatabaseRegistrationSpy: sinon.SinonStub;
3637

3738
let sandbox: sinon.SinonSandbox;
3839
let dir: tmp.DirResult;
@@ -48,6 +49,8 @@ describe('databases', () => {
4849
getSpy.returns([]);
4950
sendRequestSpy = sandbox.stub();
5051
dbChangedHandler = sandbox.spy();
52+
supportsDatabaseRegistrationSpy = sandbox.stub();
53+
supportsDatabaseRegistrationSpy.resolves(true);
5154
databaseManager = new DatabaseManager(
5255
{
5356
workspaceState: {
@@ -59,7 +62,8 @@ describe('databases', () => {
5962
storagePath: dir.name
6063
} as unknown as ExtensionContext,
6164
{
62-
sendRequest: sendRequestSpy
65+
sendRequest: sendRequestSpy,
66+
supportsDatabaseRegistration: supportsDatabaseRegistrationSpy
6367
} as unknown as QueryServerClient,
6468
{} as Logger,
6569
);
@@ -270,6 +274,30 @@ describe('databases', () => {
270274
// Should have deregistered this database
271275
expect(sendRequestSpy).to.have.been.calledWith(registerDatabases, registration, {}, {});
272276
});
277+
278+
it('should avoid registration when query server does not support it', async () => {
279+
// similar test as above, but now pretend query server doesn't support registration
280+
supportsDatabaseRegistrationSpy.resolves(false);
281+
const mockDbItem = createMockDB();
282+
sandbox.stub(fs, 'remove').resolves();
283+
284+
await (databaseManager as any).addDatabaseItem(
285+
{} as ProgressCallback,
286+
{} as CancellationToken,
287+
mockDbItem
288+
);
289+
// Should NOT have registered this database
290+
expect(sendRequestSpy).not.to.have.been.called;
291+
292+
await databaseManager.removeDatabaseItem(
293+
{} as ProgressCallback,
294+
{} as CancellationToken,
295+
mockDbItem
296+
);
297+
298+
// Should NOT have deregistered this database
299+
expect(sendRequestSpy).not.to.have.been.called;
300+
});
273301
});
274302

275303
describe('resolveSourceFile', () => {

0 commit comments

Comments
 (0)