Schema compare publish (#5127)

* adding publish command
This commit is contained in:
kisantia
2019-04-25 10:37:40 +12:00
committed by GitHub
parent 5c2cbc9d29
commit d63f07d29a
11 changed files with 85 additions and 6 deletions

View File

@@ -1,6 +1,6 @@
{ {
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}", "downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
"version": "1.5.0-alpha.85", "version": "1.5.0-alpha.87",
"downloadFileNames": { "downloadFileNames": {
"Windows_86": "win-x86-netcoreapp2.2.zip", "Windows_86": "win-x86-netcoreapp2.2.zip",
"Windows_64": "win-x64-netcoreapp2.2.zip", "Windows_64": "win-x64-netcoreapp2.2.zip",

View File

@@ -448,6 +448,13 @@ export interface SchemaCompareGenerateScriptParams {
taskExecutionMode: TaskExecutionMode; taskExecutionMode: TaskExecutionMode;
} }
export interface SchemaComparePublishChangesParams {
operationId: string;
targetServerName: string;
targetDatabaseName: string;
taskExecutionMode: TaskExecutionMode;
}
export namespace SchemaCompareRequest { export namespace SchemaCompareRequest {
export const type = new RequestType<SchemaCompareParams, azdata.SchemaCompareResult, void, void>('schemaCompare/compare'); export const type = new RequestType<SchemaCompareParams, azdata.SchemaCompareResult, void, void>('schemaCompare/compare');
} }
@@ -455,4 +462,8 @@ export namespace SchemaCompareRequest {
export namespace SchemaCompareGenerateScriptRequest { export namespace SchemaCompareGenerateScriptRequest {
export const type = new RequestType<SchemaCompareGenerateScriptParams, azdata.ResultStatus, void, void>('schemaCompare/generateScript'); export const type = new RequestType<SchemaCompareGenerateScriptParams, azdata.ResultStatus, void, void>('schemaCompare/generateScript');
} }
export namespace SchemaComparePublishChangesRequest {
export const type = new RequestType<SchemaComparePublishChangesParams, azdata.ResultStatus, void, void>('schemaCompare/publish');
}
// ------------------------------- <Schema Compare> ----------------------------- // ------------------------------- <Schema Compare> -----------------------------

View File

@@ -178,7 +178,7 @@ export class SchemaCompareServicesFeature extends SqlOpsFeature<undefined> {
); );
}; };
let schemaCompareGenerateScript = (operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.DacFxResult> => { let schemaCompareGenerateScript = (operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> => {
let params: contracts.SchemaCompareGenerateScriptParams = { operationId: operationId, targetDatabaseName: targetDatabaseName, scriptFilePath: scriptFilePath, taskExecutionMode: taskExecutionMode }; let params: contracts.SchemaCompareGenerateScriptParams = { operationId: operationId, targetDatabaseName: targetDatabaseName, scriptFilePath: scriptFilePath, taskExecutionMode: taskExecutionMode };
return client.sendRequest(contracts.SchemaCompareGenerateScriptRequest.type, params).then( return client.sendRequest(contracts.SchemaCompareGenerateScriptRequest.type, params).then(
r => { r => {
@@ -191,10 +191,24 @@ export class SchemaCompareServicesFeature extends SqlOpsFeature<undefined> {
); );
}; };
let schemaComparePublishChanges = (operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> => {
let params: contracts.SchemaComparePublishChangesParams = { operationId: operationId, targetServerName: targetServerName, targetDatabaseName: targetDatabaseName, taskExecutionMode: taskExecutionMode };
return client.sendRequest(contracts.SchemaComparePublishChangesRequest.type, params).then(
r => {
return r;
},
e => {
client.logFailedRequest(contracts.SchemaComparePublishChangesRequest.type, e);
return Promise.resolve(undefined);
}
);
};
return azdata.dataprotocol.registerSchemaCompareServicesProvider({ return azdata.dataprotocol.registerSchemaCompareServicesProvider({
providerId: client.providerId, providerId: client.providerId,
schemaCompare, schemaCompare,
schemaCompareGenerateScript schemaCompareGenerateScript,
schemaComparePublishChanges
}); });
} }
} }

View File

@@ -82,6 +82,7 @@ export class SchemaCompareDialog {
sourceName = this.sourceTextBox.value; sourceName = this.sourceTextBox.value;
sourceEndpointInfo = { sourceEndpointInfo = {
endpointType: azdata.SchemaCompareEndpointType.dacpac, endpointType: azdata.SchemaCompareEndpointType.dacpac,
serverName: '',
databaseName: '', databaseName: '',
ownerUri: '', ownerUri: '',
packageFilePath: this.sourceTextBox.value packageFilePath: this.sourceTextBox.value
@@ -92,6 +93,7 @@ export class SchemaCompareDialog {
sourceEndpointInfo = { sourceEndpointInfo = {
endpointType: azdata.SchemaCompareEndpointType.database, endpointType: azdata.SchemaCompareEndpointType.database,
serverName: (this.sourceServerDropdown.value as ConnectionDropdownValue).name,
databaseName: (<azdata.CategoryValue>this.sourceDatabaseDropdown.value).name, databaseName: (<azdata.CategoryValue>this.sourceDatabaseDropdown.value).name,
ownerUri: ownerUri, ownerUri: ownerUri,
packageFilePath: '' packageFilePath: ''
@@ -103,6 +105,7 @@ export class SchemaCompareDialog {
targetName = this.targetTextBox.value; targetName = this.targetTextBox.value;
targetEndpointInfo = { targetEndpointInfo = {
endpointType: azdata.SchemaCompareEndpointType.dacpac, endpointType: azdata.SchemaCompareEndpointType.dacpac,
serverName: '',
databaseName: '', databaseName: '',
ownerUri: '', ownerUri: '',
packageFilePath: this.targetTextBox.value packageFilePath: this.targetTextBox.value
@@ -113,6 +116,7 @@ export class SchemaCompareDialog {
targetEndpointInfo = { targetEndpointInfo = {
endpointType: azdata.SchemaCompareEndpointType.database, endpointType: azdata.SchemaCompareEndpointType.database,
serverName: (this.targetServerDropdown.value as ConnectionDropdownValue).name,
databaseName: (<azdata.CategoryValue>this.targetDatabaseDropdown.value).name, databaseName: (<azdata.CategoryValue>this.targetDatabaseDropdown.value).name,
ownerUri: ownerUri, ownerUri: ownerUri,
packageFilePath: '' packageFilePath: ''

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14 8L4 15V1L14 8Z" fill="#4894FE"/>
</svg>

After

Width:  |  Height:  |  Size: 149 B

View File

@@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M14 8L4 15V1L14 8Z" fill="#015CDA"/>
</svg>

After

Width:  |  Height:  |  Size: 149 B

View File

@@ -22,6 +22,7 @@ export class SchemaCompareResult {
private switchButton: azdata.ButtonComponent; private switchButton: azdata.ButtonComponent;
private compareButton: azdata.ButtonComponent; private compareButton: azdata.ButtonComponent;
private generateScriptButton: azdata.ButtonComponent; private generateScriptButton: azdata.ButtonComponent;
private applyButton: azdata.ButtonComponent;
private SchemaCompareActionMap: Map<Number, string>; private SchemaCompareActionMap: Map<Number, string>;
private comparisonResult: azdata.SchemaCompareResult; private comparisonResult: azdata.SchemaCompareResult;
private sourceNameComponent: azdata.TableComponent; private sourceNameComponent: azdata.TableComponent;
@@ -65,16 +66,18 @@ export class SchemaCompareResult {
this.createSwitchButton(view); this.createSwitchButton(view);
this.createCompareButton(view); this.createCompareButton(view);
this.createGenerateScriptButton(view); this.createGenerateScriptButton(view);
this.createApplyButton(view);
this.resetButtons(); this.resetButtons();
let toolBar = view.modelBuilder.toolbarContainer(); let toolBar = view.modelBuilder.toolbarContainer();
toolBar.addToolbarItems([{ toolBar.addToolbarItems([{
component: this.compareButton component: this.compareButton
}, { }, {
component: this.generateScriptButton, component: this.generateScriptButton
}, {
component: this.applyButton,
toolbarSeparatorAfter: true toolbarSeparatorAfter: true
}, }, {
{
component: this.switchButton component: this.switchButton
}]); }]);
@@ -192,8 +195,10 @@ export class SchemaCompareResult {
// only enable generate script button if the target is a db // only enable generate script button if the target is a db
if (this.targetEndpointInfo.endpointType === azdata.SchemaCompareEndpointType.database) { if (this.targetEndpointInfo.endpointType === azdata.SchemaCompareEndpointType.database) {
this.generateScriptButton.enabled = true; this.generateScriptButton.enabled = true;
this.applyButton.enabled = true;
} else { } else {
this.generateScriptButton.title = localize('schemaCompare.generateScriptButtonDisabledTitle', 'Generate script is enabled when the target is a database'); this.generateScriptButton.title = localize('schemaCompare.generateScriptButtonDisabledTitle', 'Generate script is enabled when the target is a database');
this.applyButton.title = localize('schemaCompare.applyButtonDisabledTitle', 'Apply is enabled when the target is a database');
} }
} else { } else {
this.flexModel.addItem(this.noDifferencesLabel, { CSSStyles: { 'margin': 'auto' } }); this.flexModel.addItem(this.noDifferencesLabel, { CSSStyles: { 'margin': 'auto' } });
@@ -310,11 +315,33 @@ export class SchemaCompareResult {
}); });
} }
private createApplyButton(view: azdata.ModelView) {
this.applyButton = view.modelBuilder.button().withProperties({
label: localize('schemaCompare.updateButton', 'Apply'),
iconPath: {
light: path.join(__dirname, 'media', 'start.svg'),
dark: path.join(__dirname, 'media', 'start-inverse.svg')
},
}).component();
this.applyButton.onDidClick(async (click) => {
let service = await SchemaCompareResult.getService('MSSQL');
let result = await service.schemaComparePublishChanges(this.comparisonResult.operationId, this.targetEndpointInfo.serverName, this.targetEndpointInfo.databaseName, azdata.TaskExecutionMode.execute);
if (!result || !result.success) {
vscode.window.showErrorMessage(
localize('schemaCompare.updateErrorMessage', "Schema Compare Apply failed '{0}'", result.errorMessage ? result.errorMessage : 'Unknown'));
}
});
}
private resetButtons(): void { private resetButtons(): void {
this.compareButton.enabled = false; this.compareButton.enabled = false;
this.switchButton.enabled = false; this.switchButton.enabled = false;
this.generateScriptButton.enabled = false; this.generateScriptButton.enabled = false;
this.applyButton.enabled = false;
this.generateScriptButton.title = localize('schemaCompare.generateScriptEnabledButton', 'Generate script to deploy changes to target'); this.generateScriptButton.title = localize('schemaCompare.generateScriptEnabledButton', 'Generate script to deploy changes to target');
this.applyButton.title = localize('schemaCompare.applyButtonEnabledTitle', 'Apply changes to target');
} }
private createSwitchButton(view: azdata.ModelView): void { private createSwitchButton(view: azdata.ModelView): void {

View File

@@ -1737,6 +1737,7 @@ declare module 'azdata' {
export interface SchemaCompareEndpointInfo { export interface SchemaCompareEndpointInfo {
endpointType: SchemaCompareEndpointType; endpointType: SchemaCompareEndpointType;
packageFilePath: string; packageFilePath: string;
serverName: string;
databaseName: string; databaseName: string;
ownerUri: string; ownerUri: string;
} }
@@ -1744,6 +1745,7 @@ declare module 'azdata' {
export interface SchemaCompareServicesProvider extends DataProvider { export interface SchemaCompareServicesProvider extends DataProvider {
schemaCompare(sourceEndpointInfo: SchemaCompareEndpointInfo, targetEndpointInfo: SchemaCompareEndpointInfo, taskExecutionMode: TaskExecutionMode): Thenable<SchemaCompareResult>; schemaCompare(sourceEndpointInfo: SchemaCompareEndpointInfo, targetEndpointInfo: SchemaCompareEndpointInfo, taskExecutionMode: TaskExecutionMode): Thenable<SchemaCompareResult>;
schemaCompareGenerateScript(operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: TaskExecutionMode): Thenable<ResultStatus>; schemaCompareGenerateScript(operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: TaskExecutionMode): Thenable<ResultStatus>;
schemaComparePublishChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: TaskExecutionMode): Thenable<ResultStatus>;
} }
// Security service interfaces ------------------------------------------------------------------------ // Security service interfaces ------------------------------------------------------------------------

View File

@@ -19,6 +19,7 @@ export interface ISchemaCompareService {
registerProvider(providerId: string, provider: azdata.SchemaCompareServicesProvider): void; registerProvider(providerId: string, provider: azdata.SchemaCompareServicesProvider): void;
schemaCompare(sourceEndpointInfo: azdata.SchemaCompareEndpointInfo, targetEndpointInfo: azdata.SchemaCompareEndpointInfo, taskExecutionMode: azdata.TaskExecutionMode): void; schemaCompare(sourceEndpointInfo: azdata.SchemaCompareEndpointInfo, targetEndpointInfo: azdata.SchemaCompareEndpointInfo, taskExecutionMode: azdata.TaskExecutionMode): void;
schemaCompareGenerateScript(operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): void; schemaCompareGenerateScript(operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): void;
schemaComparePublishChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): void;
} }
export class SchemaCompareService implements ISchemaCompareService { export class SchemaCompareService implements ISchemaCompareService {
@@ -43,6 +44,12 @@ export class SchemaCompareService implements ISchemaCompareService {
}); });
} }
schemaComparePublishChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> {
return this._runAction('', (runner) => {
return runner.schemaComparePublishChanges(operationId, targetServerName, targetDatabaseName, taskExecutionMode);
});
}
private _runAction<T>(uri: string, action: (handler: azdata.SchemaCompareServicesProvider) => Thenable<T>): Thenable<T> { private _runAction<T>(uri: string, action: (handler: azdata.SchemaCompareServicesProvider) => Thenable<T>): Thenable<T> {
let providerId: string = this._connectionService.getProviderIdFromUri(uri); let providerId: string = this._connectionService.getProviderIdFromUri(uri);

View File

@@ -462,6 +462,9 @@ export class MainThreadDataProtocol implements MainThreadDataProtocolShape {
}, },
schemaCompareGenerateScript(operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> { schemaCompareGenerateScript(operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> {
return self._proxy.$schemaCompareGenerateScript(handle, operationId, targetDatabaseName, scriptFilePath, taskExecutionMode); return self._proxy.$schemaCompareGenerateScript(handle, operationId, targetDatabaseName, scriptFilePath, taskExecutionMode);
},
schemaComparePublishChanges(operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> {
return self._proxy.$schemaComparePublishChanges(handle, operationId, targetServerName, targetDatabaseName, taskExecutionMode);
} }
}); });

View File

@@ -463,6 +463,11 @@ export abstract class ExtHostDataProtocolShape {
* Schema compare generate script * Schema compare generate script
*/ */
$schemaCompareGenerateScript(handle: number, operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> { throw ni(); } $schemaCompareGenerateScript(handle: number, operationId: string, targetDatabaseName: string, scriptFilePath: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.ResultStatus> { throw ni(); }
/**
* Schema compare publish changes
*/
$schemaComparePublishChanges(handle: number, operationId: string, targetServerName: string, targetDatabaseName: string, taskExecutionMode: azdata.TaskExecutionMode): Thenable<azdata.SchemaCompareResult> { throw ni(); }
} }
/** /**