use dacfx to populate table information (#1298)

This commit is contained in:
Alan Ren
2021-11-11 16:59:36 -08:00
committed by GitHub
parent ffbc8a5c1a
commit 3fd400b0d6

View File

@@ -6,11 +6,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Linq;
using Microsoft.Data.SqlClient; using Microsoft.Data.SqlClient;
using Microsoft.SqlTools.Hosting.Protocol; using Microsoft.SqlTools.Hosting.Protocol;
using Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection;
using Microsoft.SqlTools.ServiceLayer.Hosting; using Microsoft.SqlTools.ServiceLayer.Hosting;
using Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts; using Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts;
using Table = Microsoft.Data.Tools.Sql.DesignServices.TableDesigner.TableDesignerViewModel;
namespace Microsoft.SqlTools.ServiceLayer.TableDesigner namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
{ {
@@ -19,9 +20,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
/// </summary> /// </summary>
public sealed class TableDesignerService : IDisposable public sealed class TableDesignerService : IDisposable
{ {
// The query is copied from SSMS table designer, sys and INFORMATION_SCHEMA can not be selected. private Dictionary<string, Table> idTableMap = new Dictionary<string, Table>();
const string GetSchemasQuery = "select name from sys.schemas where principal_id <> 3 and principal_id <> 4 order by name";
private bool disposed = false; private bool disposed = false;
private static readonly Lazy<TableDesignerService> instance = new Lazy<TableDesignerService>(() => new TableDesignerService()); private static readonly Lazy<TableDesignerService> instance = new Lazy<TableDesignerService>(() => new TableDesignerService());
@@ -79,15 +78,19 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
{ {
return this.HandleRequest<TableDesignerInfo>(requestContext, async () => return this.HandleRequest<TableDesignerInfo>(requestContext, async () =>
{ {
var schemas = this.GetSchemas(tableInfo); var connectinStringbuilder = new SqlConnectionStringBuilder(tableInfo.ConnectionString);
var viewModel = this.GetTableViewModel(tableInfo, schemas); connectinStringbuilder.InitialCatalog = tableInfo.Database;
var connectionString = connectinStringbuilder.ToString();
var table = new Table(connectionString, tableInfo.Schema, tableInfo.Name, tableInfo.IsNewTable);
this.idTableMap.Add(tableInfo.Id, table);
var viewModel = this.GetTableViewModel(tableInfo);
var view = this.GetDesignerViewInfo(tableInfo); var view = this.GetDesignerViewInfo(tableInfo);
await requestContext.SendResult(new TableDesignerInfo() await requestContext.SendResult(new TableDesignerInfo()
{ {
ViewModel = viewModel, ViewModel = viewModel,
View = view, View = view,
ColumnTypes = this.GetSupportedColumnTypes(tableInfo), ColumnTypes = table.DataTypes.ToList(),
Schemas = schemas Schemas = table.Schemas.ToList()
}); });
}); });
} }
@@ -111,7 +114,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
} }
await requestContext.SendResult(new ProcessTableDesignerEditResponse() await requestContext.SendResult(new ProcessTableDesignerEditResponse()
{ {
ViewModel = requestParams.ViewModel, ViewModel = this.GetTableViewModel(requestParams.TableInfo),
IsValid = true IsValid = true
}); });
}); });
@@ -131,13 +134,14 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
{ {
return this.HandleRequest<DisposeTableDesignerResponse>(requestContext, async () => return this.HandleRequest<DisposeTableDesignerResponse>(requestContext, async () =>
{ {
// TODO: Handle the save changes request. this.idTableMap.Remove(tableInfo.Id);
await requestContext.SendResult(new DisposeTableDesignerResponse()); await requestContext.SendResult(new DisposeTableDesignerResponse());
}); });
} }
private void HandleAddItemRequest(ProcessTableDesignerEditRequestParams requestParams) private void HandleAddItemRequest(ProcessTableDesignerEditRequestParams requestParams)
{ {
var table = this.GetTable(requestParams.TableInfo);
var path = requestParams.TableChangeInfo.Path; var path = requestParams.TableChangeInfo.Path;
// Handle the add item request on top level table properties, e.g. Columns, Indexes. // Handle the add item request on top level table properties, e.g. Columns, Indexes.
if (path.Length == 1) if (path.Length == 1)
@@ -146,7 +150,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
switch (propertyName) switch (propertyName)
{ {
case TablePropertyNames.Columns: case TablePropertyNames.Columns:
requestParams.ViewModel.Columns.AddNew(); table.Columns.AddNew();
break; break;
default: default:
break; break;
@@ -160,6 +164,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
private void HandleRemoveItemRequest(ProcessTableDesignerEditRequestParams requestParams) private void HandleRemoveItemRequest(ProcessTableDesignerEditRequestParams requestParams)
{ {
var table = this.GetTable(requestParams.TableInfo);
var path = requestParams.TableChangeInfo.Path; var path = requestParams.TableChangeInfo.Path;
// Handle the add item request on top level table properties, e.g. Columns, Indexes. // Handle the add item request on top level table properties, e.g. Columns, Indexes.
if (path.Length == 2) if (path.Length == 2)
@@ -168,7 +173,7 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
switch (propertyName) switch (propertyName)
{ {
case TablePropertyNames.Columns: case TablePropertyNames.Columns:
requestParams.ViewModel.Columns.Data.RemoveAt(Convert.ToInt32(path[1])); table.Columns.Items.RemoveAt(Convert.ToInt32(path[1]));
break; break;
default: default:
break; break;
@@ -180,32 +185,44 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
} }
} }
private List<string> GetSupportedColumnTypes(TableInfo tableInfo) private TableViewModel GetTableViewModel(TableInfo tableInfo)
{
//TODO: get the supported column types.
var columnTypes = new List<string>();
return columnTypes;
}
private TableViewModel GetTableViewModel(TableInfo tableInfo, List<string> schemas)
{ {
var table = this.GetTable(tableInfo);
var tableViewModel = new TableViewModel(); var tableViewModel = new TableViewModel();
// Schema tableViewModel.Name.Value = table.Name;
if (tableInfo.IsNewTable) tableViewModel.Schema.Value = table.Schema;
tableViewModel.Description.Value = table.Description;
foreach (var column in table.Columns.Items)
{ {
tableViewModel.Schema.Value = schemas.Contains("dbo") ? "dbo" : schemas[0]; var columnViewModel = new TableColumnViewModel();
} columnViewModel.Name.Value = column.Name;
else columnViewModel.Name.Enabled = column.CanEditName;
{ columnViewModel.Length.Value = column.Length;
tableViewModel.Schema.Value = tableInfo.Schema; columnViewModel.Length.Enabled = column.CanEditLength;
} columnViewModel.Scale.Value = column.Scale?.ToString();
columnViewModel.Scale.Enabled = column.CanEditScale;
// Table Name columnViewModel.Precision.Value = column.Precision?.ToString();
if (!tableInfo.IsNewTable) columnViewModel.Precision.Enabled = column.CanEditPrecision;
{ columnViewModel.AllowNulls.Checked = column.IsNullable;
tableViewModel.Name.Value = tableInfo.Name; columnViewModel.AllowNulls.Enabled = column.CanEditIsNullable;
columnViewModel.DefaultValue.Value = column.DefaultValue;
columnViewModel.DefaultValue.Enabled = column.CanEditDefaultValue;
columnViewModel.IsPrimaryKey.Checked = column.IsPrimaryKey;
columnViewModel.IsPrimaryKey.Enabled = column.CanEditIsPrimaryKey;
columnViewModel.Type.Value = column.DataType;
columnViewModel.Type.Enabled = column.CanEditDataType;
columnViewModel.IsIdentity.Enabled = column.CanEditIsIdentity;
columnViewModel.IsIdentity.Checked = column.IsIdentity;
columnViewModel.IdentitySeed.Enabled = column.CanEditIdentityValues;
columnViewModel.IdentitySeed.Value = column.IdentitySeed?.ToString();
columnViewModel.IdentityIncrement.Enabled = column.CanEditIdentityValues;
columnViewModel.IdentityIncrement.Value = column.IdentityIncrement?.ToString();
tableViewModel.Columns.Data.Add(columnViewModel);
} }
tableViewModel.Script.Enabled = false;
tableViewModel.Script.Value = table.Script;
// TODO: set other properties of the table // TODO: set other properties of the table
return tableViewModel; return tableViewModel;
} }
@@ -251,17 +268,17 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner
return view; return view;
} }
private List<string> GetSchemas(TableInfo tableInfo) private Table GetTable(TableInfo tableInfo)
{ {
var schemas = new List<string>(); Table table;
ReliableConnectionHelper.ExecuteReader(tableInfo.ConnectionString, GetSchemasQuery, (reader) => if (this.idTableMap.TryGetValue(tableInfo.Id, out table))
{ {
while (reader.Read()) return table;
{ }
schemas.Add(reader[0].ToString()); else
} {
}); throw new KeyNotFoundException(SR.TableNotInitializedException(tableInfo.Id));
return schemas; }
} }
/// <summary> /// <summary>