diff --git a/extensions/mssql/src/constants.ts b/extensions/mssql/src/constants.ts index 1fe08cf20d..71bba4f78c 100644 --- a/extensions/mssql/src/constants.ts +++ b/extensions/mssql/src/constants.ts @@ -16,6 +16,7 @@ export const sqlProviderName = 'MSSQL'; export const ObjectExplorerService = 'objectexplorer'; export const CmsService = 'cmsService'; export const DacFxService = 'dacfxService'; +export const SqlProjectsService = 'sqlProjectsService'; export const SchemaCompareService = 'schemaCompareService'; export const LanguageExtensionService = 'languageExtensionService'; export const objectExplorerPrefix: string = 'objectexplorer://'; diff --git a/extensions/mssql/src/contracts.ts b/extensions/mssql/src/contracts.ts index f31099f6c3..3874c58999 100644 --- a/extensions/mssql/src/contracts.ts +++ b/extensions/mssql/src/contracts.ts @@ -601,6 +601,22 @@ export namespace SavePublishProfileRequest { // ------------------------------- ------------------------------------ +// ------------------------------- < Sql Projects > ------------------------------------ + +export namespace OpenSqlProjectRequest { + export const type = new RequestType('sqlProjects/openProject'); +} + +export namespace GetCrossPlatformCompatiblityRequest { + export const type = new RequestType('sqlProjects/getCrossPlatformCompatibility'); +} + +export interface SqlProjectParams { + projectUri: string; +} + +// ------------------------------- ----------------------------------- + // ------------------------------- ---------------------------------------- diff --git a/extensions/mssql/src/mssql.d.ts b/extensions/mssql/src/mssql.d.ts index c2be549dba..6e4900fd3b 100644 --- a/extensions/mssql/src/mssql.d.ts +++ b/extensions/mssql/src/mssql.d.ts @@ -40,6 +40,8 @@ declare module 'mssql' { readonly dacFx: IDacFxService; + readonly sqlProjects: ISqlProjectsService; + readonly sqlAssessment: ISqlAssessmentService; readonly sqlMigration: ISqlMigrationService; @@ -314,6 +316,19 @@ declare module 'mssql' { //#endregion + //#region --- Sql Projects + + export interface ISqlProjectsService { + openProject(projectUri: string): Promise; + getCrossPlatformCompatiblityRequest(projectUri: string): Promise; + } + + export interface GetCrossPlatformCompatiblityResult extends azdata.ResultStatus { + isCrossPlatformCompatible: boolean; + } + + //#endregion + //#region --- Language Extensibility export interface ExternalLanguageContent { pathToExtension: string; diff --git a/extensions/mssql/src/mssqlApiFactory.ts b/extensions/mssql/src/mssqlApiFactory.ts index ad678e85ab..f78878429a 100644 --- a/extensions/mssql/src/mssqlApiFactory.ts +++ b/extensions/mssql/src/mssqlApiFactory.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { AppContext } from './appContext'; -import { IExtension, ICmsService, IDacFxService, ISchemaCompareService, ILanguageExtensionService, ISqlAssessmentService, ISqlMigrationService, IAzureBlobService, ITdeMigrationService } from 'mssql'; +import { IExtension, ICmsService, IDacFxService, ISqlProjectsService, ISchemaCompareService, ILanguageExtensionService, ISqlAssessmentService, ISqlMigrationService, IAzureBlobService, ITdeMigrationService } from 'mssql'; import * as constants from './constants'; import { SqlToolsServer } from './sqlToolsServer'; @@ -19,6 +19,9 @@ export function createMssqlApi(context: AppContext, sqlToolsServer: SqlToolsServ get dacFx() { return context.getService(constants.DacFxService); }, + get sqlProjects() { + return context.getService(constants.SqlProjectsService); + }, get schemaCompare() { return context.getService(constants.SchemaCompareService); }, diff --git a/extensions/mssql/src/sqlProjects/sqlProjectsService.ts b/extensions/mssql/src/sqlProjects/sqlProjectsService.ts new file mode 100644 index 0000000000..a920da8588 --- /dev/null +++ b/extensions/mssql/src/sqlProjects/sqlProjectsService.ts @@ -0,0 +1,57 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as mssql from 'mssql'; +import * as constants from '../constants'; +import * as Utils from '../utils'; +import * as azdata from 'azdata'; +import * as contracts from '../contracts'; +import { AppContext } from '../appContext'; +import { ISqlOpsFeature, SqlOpsDataClient } from 'dataprotocol-client'; +import { ClientCapabilities } from 'vscode-languageclient'; + +export class SqlProjectsService implements mssql.ISqlProjectsService { + public static asFeature(context: AppContext): ISqlOpsFeature { + return class extends SqlProjectsService { + constructor(client: SqlOpsDataClient) { + super(context, client); + } + + fillClientCapabilities(capabilities: ClientCapabilities): void { + Utils.ensure(capabilities, 'sqlProjects')!.sqlProjects = true; + } + + initialize(): void { + } + }; + } + + private constructor(context: AppContext, protected readonly client: SqlOpsDataClient) { + context.registerService(constants.SqlProjectsService, this); + } + + + public async openProject(projectUri: string): Promise { + const params: contracts.SqlProjectParams = { projectUri }; + try { + const result = await this.client.sendRequest(contracts.OpenSqlProjectRequest.type, params); + return result; + } catch (e) { + this.client.logFailedRequest(contracts.OpenSqlProjectRequest.type, e); + throw e; + } + } + + public async getCrossPlatformCompatiblityRequest(projectUri: string): Promise { + const params: contracts.SqlProjectParams = { projectUri }; + try { + const result = await this.client.sendRequest(contracts.GetCrossPlatformCompatiblityRequest.type, params); + return result; + } catch (e) { + this.client.logFailedRequest(contracts.GetCrossPlatformCompatiblityRequest.type, e); + throw e; + } + } +} diff --git a/extensions/mssql/src/sqlToolsServer.ts b/extensions/mssql/src/sqlToolsServer.ts index 7136aced2c..3139020e79 100644 --- a/extensions/mssql/src/sqlToolsServer.ts +++ b/extensions/mssql/src/sqlToolsServer.ts @@ -30,6 +30,7 @@ import { SqlCredentialService } from './credentialstore/sqlCredentialService'; import { AzureBlobService } from './azureBlob/azureBlobService'; import { ErrorDiagnosticsProvider } from './errorDiagnostics/errorDiagnosticsProvider'; import { TdeMigrationService } from './tdeMigration/tdeMigrationService'; +import { SqlProjectsService } from './sqlProjects/sqlProjectsService'; const localize = nls.loadMessageBundle(); const outputChannel = vscode.window.createOutputChannel(Constants.serviceName); @@ -188,6 +189,7 @@ function getClientOptions(context: AppContext): ClientOptions { SchemaCompareService.asFeature(context), LanguageExtensionService.asFeature(context), DacFxService.asFeature(context), + SqlProjectsService.asFeature(context), CmsService.asFeature(context), SqlAssessmentService.asFeature(context), NotebookConvertService.asFeature(context), diff --git a/extensions/sql-database-projects/src/common/utils.ts b/extensions/sql-database-projects/src/common/utils.ts index f52c4472de..dc9341d863 100644 --- a/extensions/sql-database-projects/src/common/utils.ts +++ b/extensions/sql-database-projects/src/common/utils.ts @@ -302,6 +302,14 @@ export async function getSchemaCompareService(): Promise } } +export async function getSqlProjectsService(): Promise { + const ext = vscode.extensions.getExtension(mssql.extension.name) as vscode.Extension; + const api = await ext.activate(); + return api.sqlProjects; + + // TODO: add vscode-mssql support +} + export async function getVscodeMssqlApi(): Promise { const ext = vscode.extensions.getExtension(vscodeMssql.extension.name) as vscode.Extension; return ext.activate();