diff --git a/extensions/integration-tests/src/test/schemaCompare.test.ts b/extensions/integration-tests/src/test/schemaCompare.test.ts index 11ca3df255..7c81b45ad7 100644 --- a/extensions/integration-tests/src/test/schemaCompare.test.ts +++ b/extensions/integration-tests/src/test/schemaCompare.test.ts @@ -54,6 +54,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: '', + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; let target: mssql.SchemaCompareEndpointInfo = { @@ -63,6 +67,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: '', + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; @@ -114,6 +122,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: server.serverName, databaseName: sourceDB, ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; let target: mssql.SchemaCompareEndpointInfo = { @@ -123,6 +135,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: server.serverName, databaseName: targetDB, ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; @@ -179,6 +195,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; let target: mssql.SchemaCompareEndpointInfo = { @@ -188,6 +208,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: server.serverName, databaseName: targetDB, ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; @@ -231,6 +255,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: '', + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; let target: mssql.SchemaCompareEndpointInfo = { @@ -240,6 +268,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: '', + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; @@ -297,6 +329,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; const target: mssql.SchemaCompareEndpointInfo = { @@ -306,6 +342,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: server.serverName, databaseName: targetDB, ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; @@ -323,7 +363,7 @@ suite('Schema compare integration test suite @DacFx@', () => { assertIncludeExcludeResult(includeResult, true, 0, 0); //publish the updated changes. Function1 should not be added to the target database - const publishChangesResult = await schemaCompareService.schemaComparePublishChanges(schemaCompareResult.operationId, server.serverName, targetDB, azdata.TaskExecutionMode.execute); + const publishChangesResult = await schemaCompareService.schemaComparePublishDatabaseChanges(schemaCompareResult.operationId, server.serverName, targetDB, azdata.TaskExecutionMode.execute); assert(publishChangesResult.success === true, `Publish changes should complete successfully. But it failed with error : ${publishChangesResult.errorMessage}`); //verify table Table3 is added @@ -372,6 +412,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; const target: mssql.SchemaCompareEndpointInfo = { @@ -381,6 +425,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: server.serverName, databaseName: targetDB, ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; @@ -390,7 +438,7 @@ suite('Schema compare integration test suite @DacFx@', () => { assertSchemaCompareResult(schemaCompareResult, operationId, 4); //publish all the changes - const publishChangesResult = await schemaCompareService.schemaComparePublishChanges(schemaCompareResult.operationId, server.serverName, targetDB, azdata.TaskExecutionMode.execute); + const publishChangesResult = await schemaCompareService.schemaComparePublishDatabaseChanges(schemaCompareResult.operationId, server.serverName, targetDB, azdata.TaskExecutionMode.execute); assert(publishChangesResult.success === true, `Publish changes should complete successfully. But it failed with error : ${publishChangesResult.errorMessage}`); //verify table Table3 is added @@ -435,6 +483,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: '', databaseName: '', ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; const target: mssql.SchemaCompareEndpointInfo = { @@ -444,6 +496,10 @@ suite('Schema compare integration test suite @DacFx@', () => { serverName: server.serverName, databaseName: targetDB, ownerUri: ownerUri, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '', connectionDetails: undefined }; diff --git a/extensions/mssql/src/contracts.ts b/extensions/mssql/src/contracts.ts index 12afcee081..773d6b9d35 100644 --- a/extensions/mssql/src/contracts.ts +++ b/extensions/mssql/src/contracts.ts @@ -628,13 +628,20 @@ export interface SchemaCompareGenerateScriptParams { taskExecutionMode: TaskExecutionMode; } -export interface SchemaComparePublishChangesParams { +export interface SchemaComparePublishDatabaseChangesParams { operationId: string; targetServerName: string; targetDatabaseName: string; taskExecutionMode: TaskExecutionMode; } +export interface SchemaComparePublishProjectChangesParams { + operationId: string; + targetProjectPath: string; + targetFolderStructure: mssql.ExtractTarget; + taskExecutionMode: TaskExecutionMode; +} + export interface SchemaCompareGetOptionsParams { } @@ -673,7 +680,15 @@ export namespace SchemaCompareGenerateScriptRequest { } export namespace SchemaComparePublishChangesRequest { - export const type = new RequestType('schemaCompare/publish'); + export const type = new RequestType('schemaCompare/publish'); +} + +export namespace SchemaComparePublishDatabaseChangesRequest { + export const type = new RequestType('schemaCompare/publishDatabase'); +} + +export namespace SchemaComparePublishProjectChangesRequest { + export const type = new RequestType('schemaCompare/publishProject'); } export namespace SchemaCompareGetDefaultOptionsRequest { diff --git a/extensions/mssql/src/mssql.d.ts b/extensions/mssql/src/mssql.d.ts index e63f65d618..9053c629ee 100644 --- a/extensions/mssql/src/mssql.d.ts +++ b/extensions/mssql/src/mssql.d.ts @@ -122,7 +122,10 @@ export const enum SchemaDifferenceType { export const enum SchemaCompareEndpointType { Database = 0, - Dacpac = 1 + Dacpac = 1, + Project = 2, + // must be kept in-sync with SchemaCompareEndpointType in SQL Tools Service + // located at \src\Microsoft.SqlTools.ServiceLayer\SchemaCompare\Contracts\SchemaCompareRequest.cs } export interface SchemaCompareEndpointInfo { @@ -134,6 +137,10 @@ export interface SchemaCompareEndpointInfo { ownerUri: string; connectionDetails: azdata.ConnectionInfo; connectionName?: string; + projectFilePath: string; + targetScripts: string[]; + folderStructure: string; + dataSchemaProvider: string; } export interface SchemaCompareObjectId { @@ -307,10 +314,11 @@ export interface SchemaCompareObjectId { } export interface ISchemaCompareService { - schemaCompare(operationId: string, sourceEndpointInfo: SchemaCompareEndpointInfo, targetEndpointInfo: SchemaCompareEndpointInfo, taskExecutionMode: azdata.TaskExecutionMode, deploymentOptions: DeploymentOptions): Thenable; schemaCompareGenerateScript(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable; schemaComparePublishChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable; + schemaComparePublishDatabaseChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable; + schemaComparePublishProjectChanges(operationId: string, targetProjectPath: string, targetFolderStructure: ExtractTarget, taskExecutionMode: azdata.TaskExecutionMode): Thenable; schemaCompareGetDefaultOptions(): Thenable; schemaCompareIncludeExcludeNode(operationId: string, diffEntry: DiffEntry, IncludeRequest: boolean, taskExecutionMode: azdata.TaskExecutionMode): Thenable; schemaCompareOpenScmp(filePath: string): Thenable; @@ -328,6 +336,12 @@ export interface SchemaCompareOpenScmpResult extends azdata.ResultStatus { excludedTargetElements: SchemaCompareObjectId[]; } +export interface SchemaComparePublishProjectResult extends azdata.ResultStatus { + changedFiles: string[]; + addedFiles: string[]; + deletedFiles: string[]; +} + //#endregion //#region --- dacfx diff --git a/extensions/mssql/src/schemaCompare/schemaCompareService.ts b/extensions/mssql/src/schemaCompare/schemaCompareService.ts index dfe2c31d6e..3fea7a6673 100644 --- a/extensions/mssql/src/schemaCompare/schemaCompareService.ts +++ b/extensions/mssql/src/schemaCompare/schemaCompareService.ts @@ -55,11 +55,31 @@ export class SchemaCompareService implements mssql.ISchemaCompareService { } public schemaComparePublishChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable { - const params: contracts.SchemaComparePublishChangesParams = { operationId: operationId, targetServerName: targetServerName, targetDatabaseName: targetDatabaseName, taskExecutionMode: taskExecutionMode }; - return this.client.sendRequest(contracts.SchemaComparePublishChangesRequest.type, params).then( + const params: contracts.SchemaComparePublishDatabaseChangesParams = { operationId: operationId, targetServerName: targetServerName, targetDatabaseName: targetDatabaseName, taskExecutionMode: taskExecutionMode }; + return this.client.sendRequest(contracts.SchemaComparePublishChangesRequest.type, params).then(undefined, + e => { + this.client.logFailedRequest(contracts.SchemaComparePublishChangesRequest.type, e); return Promise.resolve(undefined); + } + ); + } + + public schemaComparePublishDatabaseChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable { + const params: contracts.SchemaComparePublishDatabaseChangesParams = { operationId: operationId, targetServerName: targetServerName, targetDatabaseName: targetDatabaseName, taskExecutionMode: taskExecutionMode }; + return this.client.sendRequest(contracts.SchemaComparePublishDatabaseChangesRequest.type, params).then( undefined, e => { - this.client.logFailedRequest(contracts.SchemaComparePublishChangesRequest.type, e); + this.client.logFailedRequest(contracts.SchemaComparePublishDatabaseChangesRequest.type, e); + return Promise.resolve(undefined); + } + ); + } + + public schemaComparePublishProjectChanges(operationId: string, targetProjectPath: string, targetFolderStructure: mssql.ExtractTarget, taskExecutionMode: azdata.TaskExecutionMode): Thenable { + const params: contracts.SchemaComparePublishProjectChangesParams = { operationId: operationId, targetProjectPath: targetProjectPath, targetFolderStructure: targetFolderStructure, taskExecutionMode: taskExecutionMode }; + return this.client.sendRequest(contracts.SchemaComparePublishProjectChangesRequest.type, params).then( + undefined, + (e: any) => { + this.client.logFailedRequest(contracts.SchemaComparePublishProjectChangesRequest.type, e); return Promise.resolve(undefined); } ); diff --git a/extensions/schema-compare/src/dialogs/schemaCompareDialog.ts b/extensions/schema-compare/src/dialogs/schemaCompareDialog.ts index 43b002ab18..61ae9e9b7f 100644 --- a/extensions/schema-compare/src/dialogs/schemaCompareDialog.ts +++ b/extensions/schema-compare/src/dialogs/schemaCompareDialog.ts @@ -97,7 +97,11 @@ export class SchemaCompareDialog { databaseName: '', ownerUri: '', packageFilePath: this.sourceTextBox.value, - connectionDetails: undefined + connectionDetails: undefined, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; } else { const sourceServerDropdownValue = this.sourceServerDropdown.value as ConnectionDropdownValue; @@ -111,7 +115,11 @@ export class SchemaCompareDialog { ownerUri: ownerUri, packageFilePath: '', connectionDetails: undefined, - connectionName: sourceServerDropdownValue.connection.options.connectionName + connectionName: sourceServerDropdownValue.connection.options.connectionName, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; } @@ -123,7 +131,11 @@ export class SchemaCompareDialog { databaseName: '', ownerUri: '', packageFilePath: this.targetTextBox.value, - connectionDetails: undefined + connectionDetails: undefined, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; } else { const targetServerDropdownValue = this.targetServerDropdown.value as ConnectionDropdownValue; @@ -137,7 +149,11 @@ export class SchemaCompareDialog { ownerUri: ownerUri, packageFilePath: '', connectionDetails: undefined, - connectionName: targetServerDropdownValue.connection.options.connectionName + connectionName: targetServerDropdownValue.connection.options.connectionName, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; } diff --git a/extensions/schema-compare/src/schemaCompareMainWindow.ts b/extensions/schema-compare/src/schemaCompareMainWindow.ts index 70a8c15036..9abe6ff64f 100644 --- a/extensions/schema-compare/src/schemaCompareMainWindow.ts +++ b/extensions/schema-compare/src/schemaCompareMainWindow.ts @@ -104,7 +104,11 @@ export class SchemaCompareMainWindow { ownerUri: ownerUri, packageFilePath: '', connectionDetails: undefined, - connectionName: profile.connectionName + connectionName: profile.connectionName, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; } else if (sourceDacpac) { this.sourceEndpointInfo = { @@ -114,7 +118,11 @@ export class SchemaCompareMainWindow { databaseName: '', ownerUri: '', packageFilePath: sourceDacpac, - connectionDetails: undefined + connectionDetails: undefined, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; } @@ -776,7 +784,7 @@ export class SchemaCompareMainWindow { // disable apply and generate script buttons because the results are no longer valid after applying the changes this.setButtonsForRecompare(); - const service = await this.getService(); + const service: mssql.ISchemaCompareService = await this.getService(); const result = await service.schemaComparePublishChanges(this.comparisonResult.operationId, this.targetEndpointInfo.serverName, this.targetEndpointInfo.databaseName, azdata.TaskExecutionMode.execute); if (!result || !result.success) { TelemetryReporter.createErrorEvent(TelemetryViews.SchemaCompareMainWindow, 'SchemaCompareApplyFailed', undefined, getTelemetryErrorType(result.errorMessage)) diff --git a/extensions/schema-compare/src/test/testSchemaCompareService.ts b/extensions/schema-compare/src/test/testSchemaCompareService.ts index 7645cb954d..c496ae4bfa 100644 --- a/extensions/schema-compare/src/test/testSchemaCompareService.ts +++ b/extensions/schema-compare/src/test/testSchemaCompareService.ts @@ -24,6 +24,14 @@ export class SchemaCompareTestService implements mssql.ISchemaCompareService { throw new Error('Method not implemented.'); } + schemaComparePublishDatabaseChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable { + throw new Error('Method not implemented.'); + } + + schemaComparePublishProjectChanges(operationId: string, targetProjectPath: string, targetFolderStructure: mssql.ExtractTarget, taskExecutionMode: azdata.TaskExecutionMode): Thenable { + throw new Error('Method not implemented.'); + } + schemaCompareGetDefaultOptions(): Thenable { let result: mssql.SchemaCompareOptionsResult = { defaultDeploymentOptions: undefined, @@ -42,7 +50,6 @@ export class SchemaCompareTestService implements mssql.ISchemaCompareService { throw new Error('Method not implemented.'); } - schemaCompareSaveScmp(sourceEndpointInfo: mssql.SchemaCompareEndpointInfo, targetEndpointInfo: mssql.SchemaCompareEndpointInfo, taskExecutionMode: azdata.TaskExecutionMode, deploymentOptions: mssql.DeploymentOptions, scmpFilePath: string, excludedSourceObjects: mssql.SchemaCompareObjectId[], excludedTargetObjects: mssql.SchemaCompareObjectId[]): Thenable { throw new Error('Method not implemented.'); } diff --git a/extensions/schema-compare/src/test/testUtils.ts b/extensions/schema-compare/src/test/testUtils.ts index dfc9af8188..cd61b340d5 100644 --- a/extensions/schema-compare/src/test/testUtils.ts +++ b/extensions/schema-compare/src/test/testUtils.ts @@ -94,7 +94,11 @@ export const mockDacpacEndpoint: mssql.SchemaCompareEndpointInfo = { databaseName: '', ownerUri: '', packageFilePath: mockFilePath, - connectionDetails: undefined + connectionDetails: undefined, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; export const mockDatabaseEndpoint: mssql.SchemaCompareEndpointInfo = { @@ -104,7 +108,11 @@ export const mockDatabaseEndpoint: mssql.SchemaCompareEndpointInfo = { databaseName: '', ownerUri: '', packageFilePath: '', - connectionDetails: undefined + connectionDetails: undefined, + projectFilePath: '', + folderStructure: '', + targetScripts: [], + dataSchemaProvider: '' }; export async function shouldThrowSpecificError(block: Function, expectedMessage: string, details?: string) {