From e68b6d62aae83019487b23b29bf76227012d9aa1 Mon Sep 17 00:00:00 2001
From: kisantia <31145923+kisantia@users.noreply.github.com>
Date: Mon, 20 May 2019 14:14:50 -0700
Subject: [PATCH] Open schema compare generated script (#813)
---
.../SchemaCompareGenerateScriptRequest.cs | 4 ---
.../SchemaCompareGenerateScriptOperation.cs | 30 ++++++++++++-------
.../SchemaCompare/SchemaCompareService.cs | 6 ++--
.../SchemaCompareServiceOptionsTests.cs | 20 +++++--------
.../SchemaCompareServiceTests.cs | 23 ++++++--------
5 files changed, 39 insertions(+), 44 deletions(-)
diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareGenerateScriptRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareGenerateScriptRequest.cs
index a1613716..d4ec99d5 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareGenerateScriptRequest.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/Contracts/SchemaCompareGenerateScriptRequest.cs
@@ -15,10 +15,6 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare.Contracts
///
public class SchemaCompareGenerateScriptParams : SchemaComparePublishChangesParams
{
- ///
- /// Gets or sets the filepath where to save the generated script
- ///
- public string ScriptFilePath { get; set; }
}
///
diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs
index c7d064a0..0a5c3d7c 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareGenerateScriptOperation.cs
@@ -38,16 +38,23 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
public SchemaComparisonResult ComparisonResult { get; set; }
+ public SchemaCompareScriptGenerationResult ScriptGenerationResult { get; set; }
+
public SchemaCompareGenerateScriptOperation(SchemaCompareGenerateScriptParams parameters, SchemaComparisonResult comparisonResult)
{
Validate.IsNotNull("parameters", parameters);
- Validate.IsNotNull("scriptFilePath", parameters.ScriptFilePath);
this.Parameters = parameters;
Validate.IsNotNull("comparisonResult", comparisonResult);
this.ComparisonResult = comparisonResult;
}
public void Execute(TaskExecutionMode mode)
+ {
+ Execute();
+ AddScriptToTask();
+ }
+
+ public void Execute()
{
if (this.CancellationToken.IsCancellationRequested)
{
@@ -56,15 +63,7 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
try
{
- SchemaCompareScriptGenerationResult result = this.ComparisonResult.GenerateScript(this.Parameters.TargetDatabaseName);
- File.WriteAllText(this.Parameters.ScriptFilePath, result.Script);
-
- if (!string.IsNullOrEmpty(result.MasterScript))
- {
- // master script is only used if the target is Azure SQL db and the script contains all operations that must be done against the master database
- string masterScriptPath = Path.Combine(Path.GetDirectoryName(this.Parameters.ScriptFilePath), string.Concat("master_", Path.GetFileName(this.Parameters.ScriptFilePath)));
- File.WriteAllText(masterScriptPath, result.MasterScript);
- }
+ this.ScriptGenerationResult = this.ComparisonResult.GenerateScript(this.Parameters.TargetDatabaseName);
}
catch (Exception e)
{
@@ -74,6 +73,17 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCompare
}
}
+ // Separated from Execute() since tests don't create SqlTasks
+ public void AddScriptToTask()
+ {
+ this.SqlTask.AddScript(SqlTaskStatus.Succeeded, this.ScriptGenerationResult.Script);
+ if (!string.IsNullOrEmpty(this.ScriptGenerationResult.MasterScript))
+ {
+ // master script is only used if the target is Azure SQL db and the script contains all operations that must be done against the master database
+ this.SqlTask.AddScript(SqlTaskStatus.Succeeded, ScriptGenerationResult.MasterScript);
+ }
+ }
+
// The schema compare public api doesn't currently take a cancellation token so the operation can't be cancelled
public void Cancel()
{
diff --git a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs
index 9d7630b4..dba36f22 100644
--- a/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs
+++ b/src/Microsoft.SqlTools.ServiceLayer/SchemaCompare/SchemaCompareService.cs
@@ -117,9 +117,9 @@ namespace Microsoft.SqlTools.ServiceLayer.SchemaCopmare
SqlTask sqlTask = null;
TaskMetadata metadata = new TaskMetadata();
metadata.TaskOperation = operation;
- // want to show filepath in task history instead of server and database
- metadata.ServerName = parameters.ScriptFilePath;
- metadata.DatabaseName = string.Empty;
+ metadata.TaskExecutionMode = parameters.TaskExecutionMode;
+ metadata.ServerName = parameters.TargetServerName;
+ metadata.DatabaseName = parameters.TargetDatabaseName;
metadata.Name = SR.GenerateScriptTaskName;
sqlTask = SqlTaskManagerInstance.CreateAndRun(metadata);
diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs
index a63fa439..9c0c95f7 100644
--- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs
+++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceOptionsTests.cs
@@ -263,15 +263,13 @@ END
{
TargetDatabaseName = targetDb.DatabaseName,
OperationId = schemaCompareOperation1.OperationId,
- ScriptFilePath = Path.Combine(folderPath, string.Concat(sourceDb.DatabaseName, "_", "Update.publish1.sql"))
};
SchemaCompareGenerateScriptOperation generateScriptOperation1 = new SchemaCompareGenerateScriptOperation(generateScriptParams1, schemaCompareOperation1.ComparisonResult);
- generateScriptOperation1.Execute(TaskExecutionMode.Execute);
+ generateScriptOperation1.Execute();
- // validate script
- var filePath1 = Path.Combine(folderPath, string.Concat(sourceDb.DatabaseName, "_", "Update.publish1.sql"));
- Assert.True(File.Exists(filePath1) && string.IsNullOrEmpty(File.ReadAllText(filePath1)), "Should not be any differences");
+ // validate script generation failed because there were no differences
+ Assert.False(generateScriptOperation1.ScriptGenerationResult.Success);
var schemaCompareParams2 = new SchemaCompareParams
{
@@ -292,19 +290,15 @@ END
{
TargetDatabaseName = targetDb.DatabaseName,
OperationId = schemaCompareOperation1.OperationId,
- ScriptFilePath = Path.Combine(folderPath, string.Concat(sourceDb.DatabaseName, "_", "Update.publish2.sql"))
};
SchemaCompareGenerateScriptOperation generateScriptOperation2 = new SchemaCompareGenerateScriptOperation(generateScriptParams2, schemaCompareOperation2.ComparisonResult);
- generateScriptOperation2.Execute(TaskExecutionMode.Execute);
-
- // validate script
- var filePath2 = Path.Combine(folderPath, string.Concat(sourceDb.DatabaseName, "_", "Update.publish2.sql"));
- Assert.True(File.Exists(filePath2) && !string.IsNullOrEmpty(File.ReadAllText(filePath2)), "Should have differences differences");
+ generateScriptOperation2.Execute();
+ // validate script generation succeeded
+ Assert.True(generateScriptOperation2.ScriptGenerationResult.Success);
+ Assert.True(!string.IsNullOrEmpty(generateScriptOperation2.ScriptGenerationResult.Script), "Should have differences");
// cleanup
- SchemaCompareTestUtils.VerifyAndCleanup(generateScriptParams1.ScriptFilePath);
- SchemaCompareTestUtils.VerifyAndCleanup(generateScriptParams2.ScriptFilePath);
SchemaCompareTestUtils.VerifyAndCleanup(sourceDacpacFilePath);
}
finally
diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs
index 3dacc9a1..64bb84ec 100644
--- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs
+++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/SchemaCompare/SchemaCompareServiceTests.cs
@@ -174,8 +174,6 @@ CREATE TABLE [dbo].[table3]
SqlTestDb sourceDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, SourceScript, "SchemaCompareSource");
SqlTestDb targetDb = await SqlTestDb.CreateNewAsync(TestServerType.OnPrem, false, null, TargetScript, "SchemaCompareTarget");
- string folderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "SchemaCompareTest");
- Directory.CreateDirectory(folderPath);
try
{
@@ -200,13 +198,9 @@ CREATE TABLE [dbo].[table3]
{
TargetDatabaseName = targetDb.DatabaseName,
OperationId = schemaCompareOperation.OperationId,
- ScriptFilePath = Path.Combine(folderPath, string.Concat(sourceDb.DatabaseName, "_", "Update.publish.sql"))
};
ValidateSchemaCompareScriptGenerationWithExcludeIncludeResults(schemaCompareOperation, generateScriptParams);
-
- // cleanup
- SchemaCompareTestUtils.VerifyAndCleanup(generateScriptParams.ScriptFilePath);
}
finally
{
@@ -252,13 +246,11 @@ CREATE TABLE [dbo].[table3]
{
TargetDatabaseName = targetDb.DatabaseName,
OperationId = schemaCompareOperation.OperationId,
- ScriptFilePath = Path.Combine(folderPath, string.Concat(sourceDb.DatabaseName, "_", "Update.publish.sql"))
};
ValidateSchemaCompareScriptGenerationWithExcludeIncludeResults(schemaCompareOperation, generateScriptParams);
// cleanup
- SchemaCompareTestUtils.VerifyAndCleanup(generateScriptParams.ScriptFilePath);
SchemaCompareTestUtils.VerifyAndCleanup(sourceDacpacFilePath);
}
finally
@@ -456,9 +448,10 @@ CREATE TABLE [dbo].[table3]
Assert.NotNull(schemaCompareOperation.ComparisonResult.Differences);
SchemaCompareGenerateScriptOperation generateScriptOperation = new SchemaCompareGenerateScriptOperation(generateScriptParams, schemaCompareOperation.ComparisonResult);
- generateScriptOperation.Execute(TaskExecutionMode.Execute);
+ generateScriptOperation.Execute();
- string initialScript = File.ReadAllText(generateScriptParams.ScriptFilePath);
+ Assert.True(generateScriptOperation.ScriptGenerationResult.Success);
+ string initialScript = generateScriptOperation.ScriptGenerationResult.Script;
// create Diff Entry from on Difference
DiffEntry diff = SchemaCompareOperation.CreateDiffEntry(schemaCompareOperation.ComparisonResult.Differences.First(), null);
@@ -479,9 +472,10 @@ CREATE TABLE [dbo].[table3]
Assert.True(initial == afterExclude, $"Changes should be same again after excluding/including, before {initial}, now {afterExclude}");
generateScriptOperation = new SchemaCompareGenerateScriptOperation(generateScriptParams, schemaCompareOperation.ComparisonResult);
- generateScriptOperation.Execute(TaskExecutionMode.Execute);
+ generateScriptOperation.Execute();
- string afterExcludeScript = File.ReadAllText(generateScriptParams.ScriptFilePath);
+ Assert.True(generateScriptOperation.ScriptGenerationResult.Success);
+ string afterExcludeScript = generateScriptOperation.ScriptGenerationResult.Script;
Assert.True(initialScript.Length > afterExcludeScript.Length, $"Script should be affected (less statements) exclude operation, before {initialScript}, now {afterExcludeScript}");
SchemaCompareNodeParams schemaCompareincludeNodeParams = new SchemaCompareNodeParams()
@@ -499,9 +493,10 @@ CREATE TABLE [dbo].[table3]
Assert.True(initial == afterInclude, $"Changes should be same again after excluding/including:{initial}, now {afterInclude}");
generateScriptOperation = new SchemaCompareGenerateScriptOperation(generateScriptParams, schemaCompareOperation.ComparisonResult);
- generateScriptOperation.Execute(TaskExecutionMode.Execute);
+ generateScriptOperation.Execute();
- string afterIncludeScript = File.ReadAllText(generateScriptParams.ScriptFilePath);
+ Assert.True(generateScriptOperation.ScriptGenerationResult.Success);
+ string afterIncludeScript = generateScriptOperation.ScriptGenerationResult.Script;
Assert.True(initialScript.Length == afterIncludeScript.Length, $"Changes should be same as inital since we included what we excluded, before {initialScript}, now {afterIncludeScript}");
}