Add basic structure for publish project quickpick (#16008)

* Add basic structure for publish project quickpick

* fixes

* feedback
This commit is contained in:
Charles Gagnon
2021-07-07 22:00:44 -07:00
committed by GitHub
parent 1a32db1343
commit 922348b846
8 changed files with 527 additions and 32 deletions

View File

@@ -47,7 +47,7 @@ export default class MainController implements vscode.Disposable {
vscode.commands.registerCommand('sqlDatabaseProjects.properties', async (node: WorkspaceTreeItem) => { await vscode.window.showErrorMessage(`Properties not yet implemented: ${node.element.uri.path}`); }); // TODO
vscode.commands.registerCommand('sqlDatabaseProjects.build', async (node: WorkspaceTreeItem) => { await this.projectsController.buildProject(node); });
vscode.commands.registerCommand('sqlDatabaseProjects.publish', async (node: WorkspaceTreeItem) => { await this.projectsController.publishProject(node); });
vscode.commands.registerCommand('sqlDatabaseProjects.publish', async (node: WorkspaceTreeItem) => { this.projectsController.publishProject(node); });
vscode.commands.registerCommand('sqlDatabaseProjects.schemaCompare', async (node: WorkspaceTreeItem) => { await this.projectsController.schemaCompare(node); });
vscode.commands.registerCommand('sqlDatabaseProjects.createProjectFromDatabase', async (profile: azdataType.IConnectionProfile) => { await this.projectsController.createProjectFromDatabase(profile); });

View File

@@ -13,6 +13,7 @@ import * as templates from '../templates/templates';
import * as vscode from 'vscode';
import type * as azdataType from 'azdata';
import * as dataworkspace from 'dataworkspace';
import type * as mssqlVscode from 'vscode-mssql';
import { promises as fs } from 'fs';
import { PublishDatabaseDialog } from '../dialogs/publishDatabaseDialog';
@@ -33,9 +34,12 @@ import { CreateProjectFromDatabaseDialog } from '../dialogs/createProjectFromDat
import { TelemetryActions, TelemetryReporter, TelemetryViews } from '../common/telemetry';
import { IconPathHelper } from '../common/iconHelper';
import { DashboardData, PublishData, Status } from '../models/dashboardData/dashboardData';
import { launchPublishDatabaseQuickpick } from '../dialogs/publishDatabaseQuickpick';
const maxTableLength = 10;
export type IDacFxService = mssql.IDacFxService | mssqlVscode.IDacFxService;
/**
* Controller for managing lifecycle of projects
*/
@@ -231,17 +235,22 @@ export class ProjectsController {
* @param project Project to be built and published
*/
public publishProject(project: Project): PublishDatabaseDialog;
public publishProject(context: Project | dataworkspace.WorkspaceTreeItem): PublishDatabaseDialog {
public publishProject(context: Project | dataworkspace.WorkspaceTreeItem): PublishDatabaseDialog | undefined {
const project: Project = this.getProjectFromContext(context);
let publishDatabaseDialog = this.getPublishDialog(project);
if (utils.getAzdataApi()) {
let publishDatabaseDialog = this.getPublishDialog(project);
publishDatabaseDialog.publish = async (proj, prof) => await this.publishProjectCallback(proj, prof);
publishDatabaseDialog.generateScript = async (proj, prof) => await this.publishProjectCallback(proj, prof);
publishDatabaseDialog.readPublishProfile = async (profileUri) => await this.readPublishProfileCallback(profileUri);
publishDatabaseDialog.publish = async (proj, prof) => await this.publishProjectCallback(proj, prof);
publishDatabaseDialog.generateScript = async (proj, prof) => await this.publishProjectCallback(proj, prof);
publishDatabaseDialog.readPublishProfile = async (profileUri) => await this.readPublishProfileCallback(profileUri);
publishDatabaseDialog.openDialog();
publishDatabaseDialog.openDialog();
return publishDatabaseDialog;
return publishDatabaseDialog;
} else {
launchPublishDatabaseQuickpick(project);
return undefined;
}
}
public async publishProjectCallback(project: Project, settings: IPublishSettings | IGenerateScriptSettings): Promise<mssql.DacFxResult | undefined> {
@@ -284,13 +293,26 @@ export class ProjectsController {
}
try {
const azdataApi = utils.getAzdataApi();
if ((<IPublishSettings>settings).upgradeExisting) {
telemetryProps.publishAction = 'deploy';
result = await dacFxService.deployDacpac(tempPath, settings.databaseName, (<IPublishSettings>settings).upgradeExisting, settings.connectionUri, utils.getAzdataApi()!.TaskExecutionMode.execute, settings.sqlCmdVariables, settings.deploymentOptions);
if (azdataApi) {
result = await (dacFxService as mssql.IDacFxService).deployDacpac(tempPath, settings.databaseName, (<IPublishSettings>settings).upgradeExisting, settings.connectionUri, azdataApi.TaskExecutionMode.execute, settings.sqlCmdVariables, settings.deploymentOptions);
} else {
// TODO@chgagnon Fix typing
result = await (dacFxService as mssqlVscode.IDacFxService).deployDacpac(tempPath, settings.databaseName, (<IPublishSettings>settings).upgradeExisting, settings.connectionUri, <mssqlVscode.TaskExecutionMode><any>azdataApi!.TaskExecutionMode.execute, settings.sqlCmdVariables, <mssqlVscode.DeploymentOptions><any>settings.deploymentOptions);
}
}
else {
telemetryProps.publishAction = 'generateScript';
result = await dacFxService.generateDeployScript(tempPath, settings.databaseName, settings.connectionUri, utils.getAzdataApi()!.TaskExecutionMode.script, settings.sqlCmdVariables, settings.deploymentOptions);
if (azdataApi) {
result = await (dacFxService as mssql.IDacFxService).generateDeployScript(tempPath, settings.databaseName, settings.connectionUri, azdataApi.TaskExecutionMode.script, settings.sqlCmdVariables, settings.deploymentOptions);
} else {
// TODO@chgagnon Fix typing
result = await (dacFxService as mssqlVscode.IDacFxService).generateDeployScript(tempPath, settings.databaseName, settings.connectionUri, <any>undefined/*mssqlVscode.TaskExecutionMode.script*/, settings.sqlCmdVariables, <mssqlVscode.DeploymentOptions><any>settings.deploymentOptions);
}
}
} catch (err) {
const actionEndTime = new Date().getTime();
@@ -807,11 +829,17 @@ export class ProjectsController {
}
}
public async getDaxFxService(): Promise<mssql.IDacFxService> {
const ext: vscode.Extension<any> = vscode.extensions.getExtension(mssql.extension.name)!;
public async getDaxFxService(): Promise<IDacFxService> {
if (utils.getAzdataApi()) {
const ext: vscode.Extension<mssql.IExtension> = vscode.extensions.getExtension(mssql.extension.name)!;
const extensionApi = await ext.activate();
return extensionApi.dacFx;
} else {
const ext: vscode.Extension<mssqlVscode.IExtension> = vscode.extensions.getExtension(mssql.extension.name)!;
const extensionApi = await ext.activate();
return extensionApi.dacFx;
}
await ext.activate();
return (ext.exports as mssql.IExtension).dacFx;
}