mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-20 01:25:37 -05:00
- 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
104 lines
3.3 KiB
TypeScript
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);
|
|
}
|
|
}
|