mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-02-17 02:51:45 -05:00
Update openScmp to read file structure (#1952)
* Update openScmp to read file structure (and dsp) information from the scmp file. * Address comments
This commit is contained in:
@@ -10,6 +10,7 @@ using System.Diagnostics;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
|
using Microsoft.SqlServer.Dac;
|
||||||
using Microsoft.SqlServer.Dac.Compare;
|
using Microsoft.SqlServer.Dac.Compare;
|
||||||
using Microsoft.SqlTools.ServiceLayer.DacFx.Contracts;
|
using Microsoft.SqlTools.ServiceLayer.DacFx.Contracts;
|
||||||
using Microsoft.SqlTools.ServiceLayer.SchemaCompare.Contracts;
|
using Microsoft.SqlTools.ServiceLayer.SchemaCompare.Contracts;
|
||||||
@@ -102,23 +103,19 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
|
|||||||
{
|
{
|
||||||
SchemaCompareEndpointInfo endpointInfo = new SchemaCompareEndpointInfo();
|
SchemaCompareEndpointInfo endpointInfo = new SchemaCompareEndpointInfo();
|
||||||
|
|
||||||
// if the endpoint is a dacpac or a project, we don't need to parse the xml
|
// if the endpoint is a dacpac, we don't need to parse the xml
|
||||||
if (endpoint is SchemaCompareDacpacEndpoint dacpacEndpoint)
|
if (endpoint is SchemaCompareDacpacEndpoint dacpacEndpoint)
|
||||||
{
|
{
|
||||||
endpointInfo.EndpointType = SchemaCompareEndpointType.Dacpac;
|
endpointInfo.EndpointType = SchemaCompareEndpointType.Dacpac;
|
||||||
endpointInfo.PackageFilePath = dacpacEndpoint.FilePath;
|
endpointInfo.PackageFilePath = dacpacEndpoint.FilePath;
|
||||||
}
|
}
|
||||||
else if (endpoint is SchemaCompareProjectEndpoint projectEndpoint)
|
|
||||||
{
|
|
||||||
endpointInfo.EndpointType = SchemaCompareEndpointType.Project;
|
|
||||||
endpointInfo.ProjectFilePath = projectEndpoint.ProjectFilePath;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// need to parse xml to get connection string of database
|
bool isProjectEndpoint = endpoint is SchemaCompareProjectEndpoint;
|
||||||
var result = this.scmpInfo.Descendants("ConnectionBasedModelProvider");
|
IEnumerable<XElement> result = isProjectEndpoint ? this.scmpInfo.Descendants("ProjectBasedModelProvider"): this.scmpInfo.Descendants("ConnectionBasedModelProvider");
|
||||||
string searchingFor = source ? "Source" : "Target";
|
string searchingFor = source ? "Source" : "Target";
|
||||||
|
|
||||||
|
// need to parse xml
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (result != null)
|
if (result != null)
|
||||||
@@ -127,17 +124,24 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
|
|||||||
{
|
{
|
||||||
if (node.Parent.Name.ToString().Contains(searchingFor))
|
if (node.Parent.Name.ToString().Contains(searchingFor))
|
||||||
{
|
{
|
||||||
endpointInfo.ConnectionDetails = SchemaCompareService.ConnectionServiceInstance.ParseConnectionString(node.Value);
|
if(isProjectEndpoint)
|
||||||
endpointInfo.ConnectionDetails.ConnectionString = node.Value;
|
{
|
||||||
endpointInfo.DatabaseName = endpointInfo.ConnectionDetails.DatabaseName;
|
SetProjectEndpointInfoFromXML(result, endpointInfo, ((SchemaCompareProjectEndpoint)endpoint).ProjectFilePath);
|
||||||
endpointInfo.EndpointType = SchemaCompareEndpointType.Database;
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetDatabaseEndpointInfoFromXML(node, endpointInfo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
ErrorMessage = string.Format(SR.OpenScmpConnectionBasedModelParsingError, ((SchemaCompareDatabaseEndpoint)endpoint).DatabaseName, e.Message);
|
string info = isProjectEndpoint ? ((SchemaCompareProjectEndpoint)endpoint).ProjectFilePath : ((SchemaCompareDatabaseEndpoint)endpoint).DatabaseName;
|
||||||
|
ErrorMessage = string.Format(SR.OpenScmpConnectionBasedModelParsingError, info, e.Message);
|
||||||
Logger.Write(TraceEventType.Error, string.Format("Schema compare open scmp operation failed during xml parsing with exception {0}", e.Message));
|
Logger.Write(TraceEventType.Error, string.Format("Schema compare open scmp operation failed during xml parsing with exception {0}", e.Message));
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@@ -146,6 +150,39 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
|
|||||||
return endpointInfo;
|
return endpointInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetDatabaseEndpointInfoFromXML(XElement node, SchemaCompareEndpointInfo endpointInfo)
|
||||||
|
{
|
||||||
|
// get connection string of database
|
||||||
|
endpointInfo.ConnectionDetails = SchemaCompareService.ConnectionServiceInstance.ParseConnectionString(node.Value);
|
||||||
|
endpointInfo.ConnectionDetails.ConnectionString = node.Value;
|
||||||
|
endpointInfo.DatabaseName = endpointInfo.ConnectionDetails.DatabaseName;
|
||||||
|
endpointInfo.EndpointType = SchemaCompareEndpointType.Database;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetProjectEndpointInfoFromXML(IEnumerable<XElement> result, SchemaCompareEndpointInfo endpointInfo, string filePath)
|
||||||
|
{
|
||||||
|
// get dsp information
|
||||||
|
IEnumerable<XElement> dsp = result.Descendants("Dsp");
|
||||||
|
if (dsp != null)
|
||||||
|
{
|
||||||
|
endpointInfo.DataSchemaProvider = dsp.FirstOrDefault().Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get folder structure information
|
||||||
|
IEnumerable<XElement> fs = result.Descendants("FolderStructure");
|
||||||
|
if (fs != null)
|
||||||
|
{
|
||||||
|
DacExtractTarget extractTarget;
|
||||||
|
if (Enum.TryParse<DacExtractTarget>(fs.FirstOrDefault().Value, out extractTarget))
|
||||||
|
{
|
||||||
|
endpointInfo.ExtractTarget = extractTarget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
endpointInfo.EndpointType = SchemaCompareEndpointType.Project;
|
||||||
|
endpointInfo.ProjectFilePath = filePath;
|
||||||
|
}
|
||||||
|
|
||||||
private List<SchemaCompareObjectId> GetExcludedElements(IList<SchemaComparisonExcludedObjectId> excludedObjects)
|
private List<SchemaCompareObjectId> GetExcludedElements(IList<SchemaComparisonExcludedObjectId> excludedObjects)
|
||||||
{
|
{
|
||||||
List<SchemaCompareObjectId> excludedElements = new List<SchemaCompareObjectId>();
|
List<SchemaCompareObjectId> excludedElements = new List<SchemaCompareObjectId>();
|
||||||
|
|||||||
@@ -1859,17 +1859,19 @@ WITH VALUES
|
|||||||
if (resultEndpoint.EndpointType == SchemaCompareEndpointType.Dacpac)
|
if (resultEndpoint.EndpointType == SchemaCompareEndpointType.Dacpac)
|
||||||
{
|
{
|
||||||
SchemaCompareDacpacEndpoint dacpacEndpoint = originalEndpoint as SchemaCompareDacpacEndpoint;
|
SchemaCompareDacpacEndpoint dacpacEndpoint = originalEndpoint as SchemaCompareDacpacEndpoint;
|
||||||
Assert.AreEqual(dacpacEndpoint.FilePath, resultEndpoint.PackageFilePath);
|
Assert.AreEqual(dacpacEndpoint.FilePath, resultEndpoint.PackageFilePath, "Package filepath didn't match");
|
||||||
}
|
}
|
||||||
else if (resultEndpoint.EndpointType == SchemaCompareEndpointType.Project)
|
else if (resultEndpoint.EndpointType == SchemaCompareEndpointType.Project)
|
||||||
{
|
{
|
||||||
SchemaCompareProjectEndpoint projectEndpoint = originalEndpoint as SchemaCompareProjectEndpoint;
|
SchemaCompareProjectEndpoint projectEndpoint = originalEndpoint as SchemaCompareProjectEndpoint;
|
||||||
Assert.AreEqual(projectEndpoint.ProjectFilePath, resultEndpoint.ProjectFilePath);
|
Assert.AreEqual(projectEndpoint.ProjectFilePath, resultEndpoint.ProjectFilePath, "ProjectFilePath didn't match");
|
||||||
|
Assert.AreEqual(resultEndpoint.ExtractTarget, DacExtractTarget.ObjectType, "Extract target didn't match");
|
||||||
|
Assert.AreEqual(resultEndpoint.DataSchemaProvider, "150", "Dsp didn't match");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SchemaCompareDatabaseEndpoint databaseEndpoint = originalEndpoint as SchemaCompareDatabaseEndpoint;
|
SchemaCompareDatabaseEndpoint databaseEndpoint = originalEndpoint as SchemaCompareDatabaseEndpoint;
|
||||||
Assert.AreEqual(databaseEndpoint.DatabaseName, resultEndpoint.DatabaseName);
|
Assert.AreEqual(databaseEndpoint.DatabaseName, resultEndpoint.DatabaseName, "Database name didn't match");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2057,6 +2059,7 @@ WITH VALUES
|
|||||||
result.ProjectFilePath = comparisonObjectPath;
|
result.ProjectFilePath = comparisonObjectPath;
|
||||||
result.TargetScripts = targetScripts;
|
result.TargetScripts = targetScripts;
|
||||||
result.DataSchemaProvider = "160";
|
result.DataSchemaProvider = "160";
|
||||||
|
result.ExtractTarget = DacExtractTarget.Schema;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentException($"Unexpected endpoint type: {type}");
|
throw new ArgumentException($"Unexpected endpoint type: {type}");
|
||||||
|
|||||||
Reference in New Issue
Block a user