From 5ca4054582faf7784e9bcf1316cf485902837b4b Mon Sep 17 00:00:00 2001 From: Alan Ren Date: Tue, 21 Dec 2021 15:31:44 -0800 Subject: [PATCH] support save/script/report operations for table designer (#1348) * save changes * rename * new version of dacfx --- Packages.props | 2 +- .../Requests/GenerateReportRequest.cs | 21 +++++++ .../Requests/GenerateScriptRequest.cs | 21 +++++++ .../Requests/GetTableDesignerInfoRequest.cs | 6 +- .../ProcessTableDesignerEditRequest.cs | 2 - .../Requests/SaveTableChangesRequest.cs | 9 +-- .../TableDesigner/TableDesignerService.cs | 59 +++++++++++++------ 7 files changed, 88 insertions(+), 32 deletions(-) create mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateReportRequest.cs create mode 100644 src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateScriptRequest.cs diff --git a/Packages.props b/Packages.props index a5d44818..a34c0868 100644 --- a/Packages.props +++ b/Packages.props @@ -20,7 +20,7 @@ - + diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateReportRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateReportRequest.cs new file mode 100644 index 00000000..0056abd2 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateReportRequest.cs @@ -0,0 +1,21 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The service request to generate report for the changes. + /// + public class GenerateReportRequest + { + /// + /// Request definition + /// + public static readonly RequestType Type = RequestType.Create("tabledesigner/report"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateScriptRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateScriptRequest.cs new file mode 100644 index 00000000..bfdf2297 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GenerateScriptRequest.cs @@ -0,0 +1,21 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The service request to generate script for the changes. + /// + public class GenerateScriptRequest + { + /// + /// Request definition + /// + public static readonly RequestType Type = RequestType.Create("tabledesigner/script"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GetTableDesignerInfoRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GetTableDesignerInfoRequest.cs index 6ea8ea3b..ffe1e5f7 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GetTableDesignerInfoRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GetTableDesignerInfoRequest.cs @@ -8,13 +8,13 @@ using Microsoft.SqlTools.Hosting.Protocol.Contracts; namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { /// - /// The service request to get the designer information about a table. + /// The service request to initialize a table designer. /// - public class GetTableDesignerInfoRequest + public class InitializeTableDesignerRequest { /// /// Request definition /// - public static readonly RequestType Type = RequestType.Create("tabledesigner/gettabledesignerinfo"); + public static readonly RequestType Type = RequestType.Create("tabledesigner/initialize"); } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs index be548760..d1433dc2 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs @@ -13,8 +13,6 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts public TableInfo TableInfo { get; set; } public TableDesignerChangeInfo TableChangeInfo { get; set; } - - public TableViewModel ViewModel { get; set; } } public class ProcessTableDesignerEditResponse diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs index 15081777..3a77e52a 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs @@ -8,13 +8,6 @@ using Microsoft.SqlTools.Utility; namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts { - public class SaveTableChangesRequestParams : GeneralRequestDetails - { - public TableInfo TableInfo { get; set; } - - public TableViewModel ViewModel { get; set; } - } - public class SaveTableChangesResponse { } @@ -27,6 +20,6 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts /// /// Request definition /// - public static readonly RequestType Type = RequestType.Create("tabledesigner/savechanges"); + public static readonly RequestType Type = RequestType.Create("tabledesigner/save"); } } diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs index 88ff7218..6f728101 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs @@ -20,7 +20,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner /// public sealed class TableDesignerService : IDisposable { - private Dictionary idTableMap = new Dictionary(); + private Dictionary idTableMap = new Dictionary(); private bool disposed = false; private static readonly Lazy instance = new Lazy(() => new TableDesignerService()); @@ -51,9 +51,11 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner public void InitializeService(ServiceHost serviceHost) { this.ServiceHost = serviceHost; - this.ServiceHost.SetRequestHandler(GetTableDesignerInfoRequest.Type, HandleGetTableDesignerInfoRequest); + this.ServiceHost.SetRequestHandler(InitializeTableDesignerRequest.Type, HandleInitializeTableDesignerRequest); this.ServiceHost.SetRequestHandler(ProcessTableDesignerEditRequest.Type, HandleProcessTableDesignerEditRequest); this.ServiceHost.SetRequestHandler(SaveTableChangesRequest.Type, HandleSaveTableChangesRequest); + this.ServiceHost.SetRequestHandler(GenerateScriptRequest.Type, HandleGenerateScriptRequest); + this.ServiceHost.SetRequestHandler(GenerateReportRequest.Type, HandleGenerateReportRequest); this.ServiceHost.SetRequestHandler(DisposeTableDesignerRequest.Type, HandleDisposeTableDesignerRequest); } private Task HandleRequest(RequestContext requestContext, Func action) @@ -74,14 +76,14 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner return Task.CompletedTask; } - private Task HandleGetTableDesignerInfoRequest(TableInfo tableInfo, RequestContext requestContext) + private Task HandleInitializeTableDesignerRequest(TableInfo tableInfo, RequestContext requestContext) { return this.HandleRequest(requestContext, async () => { var connectinStringbuilder = new SqlConnectionStringBuilder(tableInfo.ConnectionString); connectinStringbuilder.InitialCatalog = tableInfo.Database; var connectionString = connectinStringbuilder.ToString(); - var table = new Dac.TableDesignerViewModel(connectionString, tableInfo.Schema, tableInfo.Name, tableInfo.IsNewTable); + var table = new Dac.TableDesigner(connectionString, tableInfo.Schema, tableInfo.Name, tableInfo.IsNewTable); this.idTableMap.Add(tableInfo.Id, table); var viewModel = this.GetTableViewModel(tableInfo); var view = this.GetDesignerViewInfo(tableInfo); @@ -122,15 +124,35 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner }); } - private Task HandleSaveTableChangesRequest(SaveTableChangesRequestParams requestParams, RequestContext requestContext) + private Task HandleSaveTableChangesRequest(TableInfo tableInfo, RequestContext requestContext) { return this.HandleRequest(requestContext, async () => { - // TODO: Handle the save changes request. + var tableDesigner = this.GetTableDesigner(tableInfo); + tableDesigner.CommitChanges(); await requestContext.SendResult(new SaveTableChangesResponse()); }); } + private Task HandleGenerateScriptRequest(TableInfo tableInfo, RequestContext requestContext) + { + return this.HandleRequest(requestContext, async () => + { + var table = this.GetTableDesigner(tableInfo); + var script = table.GenerateScript(); + await requestContext.SendResult(script); + }); + } + + private Task HandleGenerateReportRequest(TableInfo tableInfo, RequestContext requestContext) + { + return this.HandleRequest(requestContext, async () => + { + var table = this.GetTableDesigner(tableInfo); + var report = table.GenerateReport(); + await requestContext.SendResult(report); + }); + } private Task HandleDisposeTableDesignerRequest(TableInfo tableInfo, RequestContext requestContext) { @@ -143,7 +165,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner private void HandleAddItemRequest(ProcessTableDesignerEditRequestParams requestParams) { - var table = this.GetTable(requestParams.TableInfo); + var table = this.GetTableDesigner(requestParams.TableInfo).TableViewModel; var path = requestParams.TableChangeInfo.Path; // Handle the add item request on top level table properties, e.g. Columns, Indexes. if (path.Length == 1) @@ -166,7 +188,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner private void HandleRemoveItemRequest(ProcessTableDesignerEditRequestParams requestParams) { - var table = this.GetTable(requestParams.TableInfo); + var table = this.GetTableDesigner(requestParams.TableInfo).TableViewModel; var path = requestParams.TableChangeInfo.Path; // Handle the add item request on top level table properties, e.g. Columns, Indexes. if (path.Length == 2) @@ -175,7 +197,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner switch (propertyName) { case TablePropertyNames.Columns: - table.Columns.Items.RemoveAt(Convert.ToInt32(path[1])); + table.Columns.RemoveAt(Convert.ToInt32(path[1])); break; default: break; @@ -189,7 +211,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner private void HandleUpdateItemRequest(ProcessTableDesignerEditRequestParams requestParams) { - var table = this.GetTable(requestParams.TableInfo); + var table = this.GetTableDesigner(requestParams.TableInfo).TableViewModel; var path = requestParams.TableChangeInfo.Path; if (path.Length == 3) @@ -232,7 +254,8 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner private TableViewModel GetTableViewModel(TableInfo tableInfo) { - var table = this.GetTable(tableInfo); + var tableDesigner = this.GetTableDesigner(tableInfo); + var table = tableDesigner.TableViewModel; var tableViewModel = new TableViewModel(); tableViewModel.Name.Value = table.Name; tableViewModel.Schema.Value = table.Schema; @@ -276,7 +299,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner foreignKeyViewModel.OnUpdateAction.Value = SqlForeignKeyActionUtil.GetName(foreignKey.OnUpdateAction); foreignKeyViewModel.OnUpdateAction.Values = SqlForeignKeyActionUtil.ActionNames; foreignKeyViewModel.PrimaryKeyTable.Value = foreignKey.PrimaryKeyTable; - foreignKeyViewModel.PrimaryKeyTable.Values = table.AllTables.ToList(); + foreignKeyViewModel.PrimaryKeyTable.Values = tableDesigner.AllTables.ToList(); foreignKeyViewModel.IsNotForReplication.Checked = foreignKey.IsNotForReplication; for (int i = 0; i < foreignKey.ForeignKeyColumns.Count; i++) { @@ -286,7 +309,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner mapping.ForeignKeyColumn.Value = foreignKeyColumn; mapping.ForeignKeyColumn.Values = table.Columns.Items.Select(c => c.Name).ToList(); mapping.PrimaryKeyColumn.Value = primaryKeyColumn; - mapping.PrimaryKeyColumn.Values = table.GetColumnsForTable(foreignKey.PrimaryKeyTable).ToList(); + mapping.PrimaryKeyColumn.Values = tableDesigner.GetColumnsForTable(foreignKey.PrimaryKeyTable).ToList(); foreignKeyViewModel.Columns.Data.Add(mapping); } tableViewModel.ForeignKeys.Data.Add(foreignKeyViewModel); @@ -302,7 +325,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner } tableViewModel.Script.Enabled = false; - tableViewModel.Script.Value = table.Script; + tableViewModel.Script.Value = tableDesigner.Script; // TODO: set other properties of the table return tableViewModel; } @@ -384,12 +407,12 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner return view; } - private Dac.TableDesignerViewModel GetTable(TableInfo tableInfo) + private Dac.TableDesigner GetTableDesigner(TableInfo tableInfo) { - Dac.TableDesignerViewModel table; - if (this.idTableMap.TryGetValue(tableInfo.Id, out table)) + Dac.TableDesigner tableDesigner; + if (this.idTableMap.TryGetValue(tableInfo.Id, out tableDesigner)) { - return table; + return tableDesigner; } else {