mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
add logic to clean up providers when appropriate (#1824)
This commit is contained in:
@@ -280,14 +280,12 @@ export class ConnectionDialogService implements IConnectionDialogService {
|
|||||||
|
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
// only create the provider maps first time the dialog gets called
|
// only create the provider maps first time the dialog gets called
|
||||||
let capabilitiesPromise: Promise<void> = Promise.resolve();
|
|
||||||
if (this._providerTypes.length === 0) {
|
if (this._providerTypes.length === 0) {
|
||||||
entries(this._capabilitiesService.providers).forEach(p => {
|
entries(this._capabilitiesService.providers).forEach(p => {
|
||||||
this._providerTypes.push(p[1].connection.displayName);
|
this._providerTypes.push(p[1].connection.displayName);
|
||||||
this._providerNameToDisplayNameMap[p[0]] = p[1].connection.displayName;
|
this._providerNameToDisplayNameMap[p[0]] = p[1].connection.displayName;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
capabilitiesPromise.then(s => {
|
|
||||||
this.updateModelServerCapabilities(model);
|
this.updateModelServerCapabilities(model);
|
||||||
// If connecting from a query editor set "save connection" to false
|
// If connecting from a query editor set "save connection" to false
|
||||||
if (params && params.input && params.connectionType === ConnectionType.editor) {
|
if (params && params.input && params.connectionType === ConnectionType.editor) {
|
||||||
@@ -299,7 +297,6 @@ export class ConnectionDialogService implements IConnectionDialogService {
|
|||||||
this.showErrorDialog(Severity.Error, this._connectionErrorTitle, connectionResult.errorMessage, connectionResult.callStack);
|
this.showErrorDialog(Severity.Error, this._connectionErrorTitle, connectionResult.errorMessage, connectionResult.callStack);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}, e => reject(e));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'
|
|||||||
import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle';
|
import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle';
|
||||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||||
import { Registry } from 'vs/platform/registry/common/platform';
|
import { Registry } from 'vs/platform/registry/common/platform';
|
||||||
|
import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement';
|
||||||
|
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
|
||||||
|
import { getIdFromLocalExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
|
||||||
|
|
||||||
export const SERVICE_ID = 'capabilitiesService';
|
export const SERVICE_ID = 'capabilitiesService';
|
||||||
export const HOST_NAME = 'sqlops';
|
export const HOST_NAME = 'sqlops';
|
||||||
@@ -101,7 +104,9 @@ export class CapabilitiesService extends Disposable implements ICapabilitiesServ
|
|||||||
public readonly onCapabilitiesRegistered = this._onCapabilitiesRegistered.event;
|
public readonly onCapabilitiesRegistered = this._onCapabilitiesRegistered.event;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@IStorageService private _storageService: IStorageService
|
@IStorageService private _storageService: IStorageService,
|
||||||
|
@IExtensionService extensionService: IExtensionService,
|
||||||
|
@IExtensionManagementService extentionManagementService: IExtensionManagementService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
@@ -114,12 +119,35 @@ export class CapabilitiesService extends Disposable implements ICapabilitiesServ
|
|||||||
this.handleConnectionProvider({ id: v[0], properties: v[1] });
|
this.handleConnectionProvider({ id: v[0], properties: v[1] });
|
||||||
});
|
});
|
||||||
// register for when new extensions are added
|
// register for when new extensions are added
|
||||||
connectionRegistry.onNewProvider(this.handleConnectionProvider, this);
|
this._register(connectionRegistry.onNewProvider(this.handleConnectionProvider, this));
|
||||||
|
|
||||||
// handle adding already known capabilities (could have caching problems)
|
// handle adding already known capabilities (could have caching problems)
|
||||||
Object.entries(this.capabilities.connectionProviderCache).map(v => {
|
Object.entries(this.capabilities.connectionProviderCache).map(v => {
|
||||||
this.handleConnectionProvider({ id: v[0], properties: v[1] }, false);
|
this.handleConnectionProvider({ id: v[0], properties: v[1] }, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
extensionService.whenInstalledExtensionsRegistered().then(() => {
|
||||||
|
this.cleanupProviders();
|
||||||
|
});
|
||||||
|
|
||||||
|
this._register(extentionManagementService.onDidUninstallExtension(({ identifier }) => {
|
||||||
|
let extensionid = getIdFromLocalExtensionId(identifier.id);
|
||||||
|
extensionService.getExtensions().then(i => {
|
||||||
|
let extension = i.find(c => c.id === extensionid);
|
||||||
|
let id = extension.contributes['connectionProvider'].providerId;
|
||||||
|
delete this.capabilities.connectionProviderCache[id];
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
private cleanupProviders(): void {
|
||||||
|
let knownProviders = Object.keys(connectionRegistry.providers);
|
||||||
|
for (let key in this.capabilities.connectionProviderCache) {
|
||||||
|
if (!knownProviders.includes(key)) {
|
||||||
|
this._providers.delete(key);
|
||||||
|
delete this.capabilities.connectionProviderCache[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleConnectionProvider(e: { id: string, properties: ConnectionProviderProperties }, isNew = true): void {
|
private handleConnectionProvider(e: { id: string, properties: ConnectionProviderProperties }, isNew = true): void {
|
||||||
|
|||||||
Reference in New Issue
Block a user