From 0e29b181c97b770b59c35aede60692202b6c8e64 Mon Sep 17 00:00:00 2001 From: Benjamin Russell Date: Wed, 11 Jan 2017 13:50:46 -0800 Subject: [PATCH] Reinstating the batch HasError property (#214) --- .../QueryExecution/Batch.cs | 11 ++++++++++- .../QueryExecution/Contracts/BatchSummary.cs | 5 +++++ .../QueryExecution/Execution/BatchTests.cs | 19 ++++++++++++------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Batch.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Batch.cs index 718eea7b..b77e936f 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Batch.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Batch.cs @@ -142,6 +142,11 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution /// public string ExecutionStartTimeStamp { get { return executionStartTime.ToString("o"); } } + /// + /// Whether or not this batch encountered an error that halted execution + /// + public bool HasError { get; set; } + /// /// Whether or not this batch has been executed, regardless of success or failure /// @@ -186,7 +191,8 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution { Id = Id, Selection = Selection, - ExecutionStart = ExecutionStartTimeStamp + ExecutionStart = ExecutionStartTimeStamp, + HasError = HasError }; // Add on extra details if we finished executing it @@ -302,15 +308,18 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution } catch (DbException dbe) { + HasError = true; await UnwrapDbException(dbe); } catch (TaskCanceledException) { + // Cancellation isn't considered an error condition await SendMessage(SR.QueryServiceQueryCancelled, false); throw; } catch (Exception e) { + HasError = true; await SendMessage(SR.QueryServiceQueryFailed(e.Message), true); throw; } diff --git a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/BatchSummary.cs b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/BatchSummary.cs index f9404039..a2c3f0b1 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/BatchSummary.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/QueryExecution/Contracts/BatchSummary.cs @@ -25,6 +25,11 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution.Contracts /// public string ExecutionStart { get; set; } + /// + /// Whether or not the batch encountered an error that halted execution + /// + public bool HasError { get; set; } + /// /// The ID of the result set within the query results /// diff --git a/test/Microsoft.SqlTools.ServiceLayer.Test/QueryExecution/Execution/BatchTests.cs b/test/Microsoft.SqlTools.ServiceLayer.Test/QueryExecution/Execution/BatchTests.cs index 64133fa0..0b010c5a 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.Test/QueryExecution/Execution/BatchTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.Test/QueryExecution/Execution/BatchTests.cs @@ -31,6 +31,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution // ... It should not have executed and no error Assert.False(batch.HasExecuted, "The query should not have executed."); + Assert.False(batch.HasError); // ... The results should be empty Assert.Empty(batch.ResultSets); @@ -78,7 +79,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution Assert.Equal(0, resultSetCalls); // ... The batch and the summary should be correctly assigned - ValidateBatch(batch, 0); + ValidateBatch(batch, 0, false); ValidateBatchSummary(batch); ValidateMessages(batch, 1, messages); } @@ -114,7 +115,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution Assert.Equal(1, resultSetCalls); // ... There should be exactly one result set - ValidateBatch(batch, resultSets); + ValidateBatch(batch, resultSets, false); ValidateBatchSummary(batch); ValidateMessages(batch, 1, messages); } @@ -150,7 +151,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution Assert.Equal(2, resultSetCalls); // ... It should have executed without error - ValidateBatch(batch, resultSets); + ValidateBatch(batch, resultSets, false); ValidateBatchSummary(batch); ValidateMessages(batch, 1, messages); } @@ -180,8 +181,8 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution Assert.Equal(1, batchStartCalls); Assert.Equal(1, batchEndCalls); - // ... It should have executed without error - ValidateBatch(batch, 0); + // ... It should have executed with error + ValidateBatch(batch, 0, true); ValidateBatchSummary(batch); // ... There should be one error message returned @@ -221,7 +222,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution () => batch.Execute(GetConnection(ci), CancellationToken.None)); // ... The data should still be available without error - ValidateBatch(batch, resultSets); + ValidateBatch(batch, resultSets, false); ValidateBatchSummary(batch); } @@ -284,7 +285,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution } [SuppressMessage("ReSharper", "UnusedParameter.Local")] - private static void ValidateBatch(Batch batch, int expectedResultSets) + private static void ValidateBatch(Batch batch, int expectedResultSets, bool isError) { // The batch should be executed Assert.True(batch.HasExecuted, "The query should have been marked executed."); @@ -296,6 +297,9 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution // Make sure the number of result sets matches Assert.Equal(expectedResultSets, batch.ResultSets.Count); Assert.Equal(expectedResultSets, batch.ResultSummaries.Length); + + // Make sure that the error state is set properly + Assert.Equal(isError, batch.HasError); } private static void ValidateBatchSummary(Batch batch) @@ -306,6 +310,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.QueryExecution.Execution Assert.Equal(batch.Id, batchSummary.Id); Assert.Equal(batch.ResultSets.Count, batchSummary.ResultSetSummaries.Length); Assert.Equal(batch.Selection, batchSummary.Selection); + Assert.Equal(batch.HasError, batchSummary.HasError); // Something other than default date is provided for start and end times Assert.True(DateTime.Parse(batchSummary.ExecutionStart) > default(DateTime));