Files
azuredatastudio/src/sql/services/metadata/metadataService.ts
Kevin Cunnane 472233d9a7 Providers without metadata service or serverInfo shouldn't break dashboard (#1761)
- Fix a number of issues that arose while testing a provider without a metadata service or serverInfo object returned via DMP calls. These should be optional services/features and we should be resilient to them not existing. In most places we already have these checks
- This does not cover a number of "improvement" scenarios, such as filtering extension tabs by provider, and defaulting any tabs that don't specify a provider to be MSSQL. This and some other features to ensure things make sense will be implemented in separate PRs but this unblocked the scenario
2018-06-27 13:40:37 -07:00

104 lines
3.3 KiB
TypeScript

/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement';
import * as sqlops from 'sqlops';
export const SERVICE_ID = 'metadataService';
export const IMetadataService = createDecorator<IMetadataService>(SERVICE_ID);
export interface IMetadataService {
_serviceBrand: any;
getMetadata(connectionUri: string): Thenable<sqlops.ProviderMetadata>;
getDatabaseNames(connectionUri: string): Thenable<string[]>;
getTableInfo(connectionUri: string, metadata: sqlops.ObjectMetadata): Thenable<sqlops.ColumnMetadata[]>;
getViewInfo(connectionUri: string, metadata: sqlops.ObjectMetadata): Thenable<sqlops.ColumnMetadata[]>;
/**
* Register a metadata provider
*/
registerProvider(providerId: string, provider: sqlops.MetadataProvider): void;
}
export class MetadataService implements IMetadataService {
public _serviceBrand: any;
private _disposables: IDisposable[] = [];
private _providers: { [handle: string]: sqlops.MetadataProvider; } = Object.create(null);
constructor( @IConnectionManagementService private _connectionService: IConnectionManagementService) {
}
public getMetadata(connectionUri: string): Thenable<sqlops.ProviderMetadata> {
let providerId: string = this._connectionService.getProviderIdFromUri(connectionUri);
if (providerId) {
let provider = this._providers[providerId];
if (provider) {
return provider.getMetadata(connectionUri);
}
}
return Promise.resolve(undefined);
}
public getDatabaseNames(connectionUri: string): Thenable<string[]> {
let providerId: string = this._connectionService.getProviderIdFromUri(connectionUri);
if (providerId) {
let provider = this._providers[providerId];
if (provider) {
return provider.getDatabases(connectionUri);
}
}
return Promise.resolve([]);
}
public getTableInfo(connectionUri: string, metadata: sqlops.ObjectMetadata): Thenable<sqlops.ColumnMetadata[]> {
let providerId: string = this._connectionService.getProviderIdFromUri(connectionUri);
if (providerId) {
let provider = this._providers[providerId];
if (provider) {
return provider.getTableInfo(connectionUri, metadata);
}
}
return Promise.resolve(undefined);
}
public getViewInfo(connectionUri: string, metadata: sqlops.ObjectMetadata): Thenable<sqlops.ColumnMetadata[]> {
let providerId: string = this._connectionService.getProviderIdFromUri(connectionUri);
if (providerId) {
let provider = this._providers[providerId];
if (provider) {
return provider.getViewInfo(connectionUri, metadata);
}
}
return Promise.resolve(undefined);
}
/**
* Register a metadata provider
*/
public registerProvider(providerId: string, provider: sqlops.MetadataProvider): void {
this._providers[providerId] = provider;
}
public dispose(): void {
this._disposables = dispose(this._disposables);
}
}