SQL Operations Studio Public Preview 1 (0.23) release source code

This commit is contained in:
Karl Burtram
2017-11-09 14:30:27 -08:00
parent b88ecb8d93
commit 3cdac41339
8829 changed files with 759707 additions and 286 deletions

View File

@@ -0,0 +1,166 @@
/*---------------------------------------------------------------------------------------------
* 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 { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo';
import * as Constants from 'sql/common/constants';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import data = require('data');
import Event, { Emitter } from 'vs/base/common/event';
import { Action } from 'vs/base/common/actions';
import { Deferred } from 'sql/base/common/promise';
export const SERVICE_ID = 'capabilitiesService';
export const HOST_NAME = 'sqlops';
export const HOST_VERSION = '1.0';
export const ICapabilitiesService = createDecorator<ICapabilitiesService>(SERVICE_ID);
/**
* Interface for managing provider capabilities
*/
export interface ICapabilitiesService {
_serviceBrand: any;
/**
* Retrieve a list of registered capabilities providers
*/
getCapabilities(): data.DataProtocolServerCapabilities[];
/**
* Register a capabilities provider
*/
registerProvider(provider: data.CapabilitiesProvider): void;
/**
* Returns true if the feature is available for given connection
*/
isFeatureAvailable(action: Action, connectionManagementInfo: ConnectionManagementInfo): boolean;
/**
* Event raised when a provider is registered
*/
onProviderRegisteredEvent: Event<data.DataProtocolServerCapabilities>;
/**
* Promise fulfilled when Capabilities are ready
*/
onCapabilitiesReady(): Promise<void>;
}
/**
* Capabilities service implementation class. This class provides the ability
* to discover the DMP capabilties that a DMP provider offers.
*/
export class CapabilitiesService implements ICapabilitiesService {
public _serviceBrand: any;
private _providers: data.CapabilitiesProvider[] = [];
private _capabilities: data.DataProtocolServerCapabilities[] = [];
private _onProviderRegistered: Emitter<data.DataProtocolServerCapabilities>;
private _clientCapabilties: data.DataProtocolClientCapabilities = {
hostName: HOST_NAME,
hostVersion: HOST_VERSION
};
private disposables: IDisposable[] = [];
private _onCapabilitiesReady: Deferred<void>;
// Due to absence of a way to infer the number of expected data tools extensions from the package.json, this is being hard-coded
// TODO: a better mechanism to populate the expected number of capabilities
private _expectedCapabilitiesCount: number = 1;
private _registeredCapabilities: number = 0;
constructor() {
this._onProviderRegistered = new Emitter<data.DataProtocolServerCapabilities>();
this.disposables.push(this._onProviderRegistered);
this._onCapabilitiesReady = new Deferred();
}
public onCapabilitiesReady(): Promise<void> {
return this._onCapabilitiesReady.promise;
}
/**
* Retrieve a list of registered server capabilities
*/
public getCapabilities(): data.DataProtocolServerCapabilities[] {
return this._capabilities;
}
/**
* Register the capabilities provider and query the provider for its capabilities
* @param provider
*/
public registerProvider(provider: data.CapabilitiesProvider): void {
this._providers.push(provider);
// request the capabilities from server
provider.getServerCapabilities(this._clientCapabilties).then(serverCapabilities => {
this._capabilities.push(serverCapabilities);
this._onProviderRegistered.fire(serverCapabilities);
this._registeredCapabilities++;
this.resolveCapabilitiesIfReady();
});
}
private resolveCapabilitiesIfReady(): void {
if (this._registeredCapabilities === this._expectedCapabilitiesCount) {
this._onCapabilitiesReady.resolve();
}
}
/**
* Returns true if the feature is available for given connection
* @param featureComponent a component which should have the feature name
* @param connectionManagementInfo connectionManagementInfo
*/
public isFeatureAvailable(action: Action, connectionManagementInfo: ConnectionManagementInfo): boolean {
let isCloud = connectionManagementInfo && connectionManagementInfo.serverInfo && connectionManagementInfo.serverInfo.isCloud;
let isMssql = connectionManagementInfo.connectionProfile.providerName === 'MSSQL';
// TODO: The logic should from capabilities service.
if (action) {
let featureName: string = action.id;
switch (featureName) {
case Constants.BackupFeatureName:
if (isMssql) {
return connectionManagementInfo.connectionProfile.databaseName && !isCloud;
} else {
return !!connectionManagementInfo.connectionProfile.databaseName;
}
case Constants.RestoreFeatureName:
if (isMssql) {
return !isCloud;
} else {
return !!connectionManagementInfo.connectionProfile.databaseName;
}
default:
return true;
}
} else {
return true;
}
}
// Event Emitters
public get onProviderRegisteredEvent(): Event<data.DataProtocolServerCapabilities> {
return this._onProviderRegistered.event;
}
public dispose(): void {
this.disposables = dispose(this.disposables);
}
}