From ac9f88266c049fe8e4bca17ee5b21cf64ccdf0aa Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Wed, 6 Jul 2022 15:26:06 -0700 Subject: [PATCH] BatchParser target netstandard2.0 and remove Hosting dependency (#1564) * Remove Hosting dependency from BatchParser, wip for logging replacement * netstandard2.0 and fixes * comment + cleanup * comment * fix build * Update newtonsoft * localize errors --- .../BatchParser/BatchParserWrapper.cs | 2 +- .../BatchParser/ExecutionEngineCode/Batch.cs | 2 +- .../ExecutionEngineCode/ExecutionEngine.cs | 2 +- .../ExecutionEngineConditions.cs | 2 +- .../Localization/sr.cs | 11 +++ .../Localization/sr.resx | 4 + .../Localization/sr.strings | 2 + .../Localization/sr.xlf | 5 + ...crosoft.SqlTools.ManagedBatchParser.csproj | 7 +- .../ReliableConnection/AmbientSettings.cs | 2 +- .../ReliableConnection/CachedServerInfo.cs | 2 +- .../ReliableConnection/DbCommandWrapper.cs | 2 +- .../ReliableConnection/DbConnectionWrapper.cs | 2 +- .../ReliableConnectionHelper.cs | 2 +- .../ReliableSqlConnection.cs | 2 +- ...licy.DataTransferDetectionErrorStrategy.cs | 2 +- .../ReliableConnection/RetryPolicy.cs | 2 +- .../ReliableConnection/RetryPolicyFactory.cs | 2 +- .../ReliableConnection/RetryPolicyUtils.cs | 2 +- .../Utility/Logger.cs | 91 +++++++++++++++++++ .../Utility/Validate.cs | 61 +++++++++++++ 21 files changed, 192 insertions(+), 17 deletions(-) create mode 100644 src/Microsoft.SqlTools.ManagedBatchParser/Utility/Logger.cs create mode 100644 src/Microsoft.SqlTools.ManagedBatchParser/Utility/Validate.cs diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/BatchParserWrapper.cs b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/BatchParserWrapper.cs index bd3a336e..55f9bfc6 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/BatchParserWrapper.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/BatchParserWrapper.cs @@ -3,7 +3,7 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. // -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; using System; using System.Collections.Generic; using System.IO; diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/Batch.cs b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/Batch.cs index 1e1c6c5f..0728732b 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/Batch.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/Batch.cs @@ -10,7 +10,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; using Microsoft.SqlTools.ManagedBatchParser; namespace Microsoft.SqlTools.ServiceLayer.BatchParser.ExecutionEngineCode diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngine.cs b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngine.cs index b69ba9de..84c70dc8 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngine.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngine.cs @@ -14,7 +14,7 @@ using System.IO; using System.Text; using Microsoft.SqlTools.ManagedBatchParser; using Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.BatchParser.ExecutionEngineCode { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngineConditions.cs b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngineConditions.cs index b64667ed..546620cf 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngineConditions.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/BatchParser/ExecutionEngineCode/ExecutionEngineConditions.cs @@ -4,7 +4,7 @@ // using System.Collections.Specialized; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.BatchParser.ExecutionEngineCode { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.cs b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.cs index 5e724bec..f814a0b9 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.cs @@ -285,6 +285,14 @@ namespace Microsoft.SqlTools.ManagedBatchParser } } + public static string NullEmptyOrWhitespaceString + { + get + { + return Keys.GetString(Keys.NullEmptyOrWhitespaceString); + } + } + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class Keys { @@ -389,6 +397,9 @@ namespace Microsoft.SqlTools.ManagedBatchParser public const string SqlCmd_FailedInclude = "SqlCmd_FailedInclude"; + public const string NullEmptyOrWhitespaceString = "NullEmptyOrWhitespaceString"; + + private Keys() { } diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.resx b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.resx index c28140ae..773290c3 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.resx +++ b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.resx @@ -245,4 +245,8 @@ Could not find included file {0}. + + Parameter contains a null, empty, or whitespace string. + + diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.strings b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.strings index 73ea5b18..c656c384 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.strings +++ b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.strings @@ -88,3 +88,5 @@ SqlCmd_PathLong = Path too long. SqlCmd_FailedInclude = Could not find included file {0}. +NullEmptyOrWhitespaceString = Parameter contains a null, empty, or whitespace string. + diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.xlf b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.xlf index 7f323024..e2443ad1 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.xlf +++ b/src/Microsoft.SqlTools.ManagedBatchParser/Localization/sr.xlf @@ -162,6 +162,11 @@ Could not find included file {0}. + + Parameter contains a null, empty, or whitespace string. + Parameter contains a null, empty, or whitespace string. + + \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/Microsoft.SqlTools.ManagedBatchParser.csproj b/src/Microsoft.SqlTools.ManagedBatchParser/Microsoft.SqlTools.ManagedBatchParser.csproj index f964a3b2..88efc487 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/Microsoft.SqlTools.ManagedBatchParser.csproj +++ b/src/Microsoft.SqlTools.ManagedBatchParser/Microsoft.SqlTools.ManagedBatchParser.csproj @@ -1,5 +1,8 @@  + + netstandard2.0 + disable false false false @@ -12,12 +15,10 @@ + - - - diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/AmbientSettings.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/AmbientSettings.cs index c31e3c5d..d11807ed 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/AmbientSettings.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/AmbientSettings.cs @@ -7,7 +7,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/CachedServerInfo.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/CachedServerInfo.cs index 241ed73c..5d785ff6 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/CachedServerInfo.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/CachedServerInfo.cs @@ -11,7 +11,7 @@ using System.Diagnostics; using System.Linq; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Dmf; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbCommandWrapper.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbCommandWrapper.cs index c4736fd8..4ab56129 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbCommandWrapper.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbCommandWrapper.cs @@ -6,7 +6,7 @@ using System; using System.Data; using Microsoft.Data.SqlClient; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbConnectionWrapper.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbConnectionWrapper.cs index 18568915..18ef4885 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbConnectionWrapper.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/DbConnectionWrapper.cs @@ -6,7 +6,7 @@ using System; using System.Data; using Microsoft.Data.SqlClient; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableConnectionHelper.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableConnectionHelper.cs index 2a056b25..fd21b6b0 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableConnectionHelper.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableConnectionHelper.cs @@ -11,7 +11,7 @@ using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Security; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; using System.Linq; diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableSqlConnection.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableSqlConnection.cs index c092a881..e6b81a47 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableSqlConnection.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/ReliableSqlConnection.cs @@ -34,7 +34,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.SqlServer.Management.Common; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.DataTransferDetectionErrorStrategy.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.DataTransferDetectionErrorStrategy.cs index 1b095e8a..931f68a2 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.DataTransferDetectionErrorStrategy.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.DataTransferDetectionErrorStrategy.cs @@ -5,7 +5,7 @@ using Microsoft.Data.SqlClient; using System.Diagnostics; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.cs index 4dbc9633..ff15a1a4 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicy.cs @@ -29,7 +29,7 @@ using System.Diagnostics; using System.Diagnostics.Contracts; using System.Globalization; using System.Threading; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyFactory.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyFactory.cs index 984f9e79..7fb64e22 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyFactory.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyFactory.cs @@ -6,7 +6,7 @@ using System; using System.Diagnostics; using System.Globalization; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyUtils.cs b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyUtils.cs index 74fcefd1..8bf84dad 100644 --- a/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyUtils.cs +++ b/src/Microsoft.SqlTools.ManagedBatchParser/ReliableConnection/RetryPolicyUtils.cs @@ -8,7 +8,7 @@ using System.Collections.Generic; using Microsoft.Data.SqlClient; using System.Diagnostics; using System.Runtime.InteropServices; -using Microsoft.SqlTools.Utility; +using Microsoft.SqlTools.BatchParser.Utility; namespace Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection { diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/Utility/Logger.cs b/src/Microsoft.SqlTools.ManagedBatchParser/Utility/Logger.cs new file mode 100644 index 00000000..20242e3e --- /dev/null +++ b/src/Microsoft.SqlTools.ManagedBatchParser/Utility/Logger.cs @@ -0,0 +1,91 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System.Diagnostics; + +namespace Microsoft.SqlTools.BatchParser.Utility +{ + /// + /// Provides a simple logging interface built on top of .Net tracing frameworks + /// + /// This functionality is a simplified version of other similar implementations such as from Microsoft.SqlTools.Hosting, using + /// just pure Trace calls instead of setting up a TraceSource and/or listeners to keep this as simple as possible. + public static class Logger + { + /// + /// Writes a message to the log file with the Verbose event level + /// + /// The message text to be written. + public static void Verbose(string logMessage) => Write(TraceEventType.Verbose, logMessage); + + /// + /// Writes a message to the log file with the Information event level + /// + /// The message text to be written. + public static void Information(string logMessage) => Write(TraceEventType.Information, logMessage); + + /// + /// Writes a message to the log file with the Warning event level + /// + /// The message text to be written. + public static void Warning(string logMessage) => Write(TraceEventType.Warning, logMessage); + + /// + /// Writes a message to the log file with the Error event level + /// + /// The message text to be written. + public static void Error(string logMessage) => Write(TraceEventType.Error, logMessage); + + /// + /// Writes a message to the log file with the Critical event level + /// + /// The message text to be written. + public static void Critical(string logMessage) => Write(TraceEventType.Critical, logMessage); + + /// + /// Writes a message to the log file. + /// + /// The level at which the message will be written. + /// The event id enumeration for the log event. + /// The message text to be written. + public static void Write( + TraceEventType eventType, + string logMessage) + { + // Note that despite the more fine grained TraceEventType we expose in this class we currently are using just the default + // Trace methods available which only allow Error/Warning/Information. An improvement would be to fully implement a TraceSource/EventSource + // and use that instead, then ensure that users of this library are set up to consume events from that source. + switch (eventType) + { + case TraceEventType.Critical: + case TraceEventType.Error: + if (eventType == TraceEventType.Critical) + { + logMessage = $@"event={eventType}: {logMessage}"; + } + + Trace.TraceError(logMessage); + break; + case TraceEventType.Warning: + Trace.TraceWarning(logMessage); + break; + case TraceEventType.Information: + case TraceEventType.Resume: + case TraceEventType.Start: + case TraceEventType.Stop: + case TraceEventType.Suspend: + case TraceEventType.Transfer: + case TraceEventType.Verbose: + if (eventType != TraceEventType.Information) + { + logMessage = $@"event={eventType}: {logMessage}"; + } + + Trace.TraceInformation(logMessage); + break; + } + } + } +} diff --git a/src/Microsoft.SqlTools.ManagedBatchParser/Utility/Validate.cs b/src/Microsoft.SqlTools.ManagedBatchParser/Utility/Validate.cs new file mode 100644 index 00000000..620ea8b0 --- /dev/null +++ b/src/Microsoft.SqlTools.ManagedBatchParser/Utility/Validate.cs @@ -0,0 +1,61 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using Microsoft.SqlTools.ManagedBatchParser; + +namespace Microsoft.SqlTools.BatchParser.Utility +{ + /// + /// Provides common validation methods to simplify method + /// parameter checks. + /// + public static class Validate + { + /// + /// Throws ArgumentNullException if value is null. + /// + /// The name of the parameter being validated. + /// The value of the parameter being validated. + public static void IsNotNull(string parameterName, object valueToCheck) + { + if (valueToCheck == null) + { + throw new ArgumentNullException(parameterName); + } + } + + /// + /// Throws ArgumentException if the value is null or an empty string. + /// + /// The name of the parameter being validated. + /// The value of the parameter being validated. + public static void IsNotNullOrEmptyString(string parameterName, string valueToCheck) + { + if (string.IsNullOrEmpty(valueToCheck)) + { + throw new ArgumentException( + SR.NullEmptyOrWhitespaceString, + parameterName); + } + } + + /// + /// Throws ArgumentException if the value is null, an empty string, + /// or a string containing only whitespace. + /// + /// The name of the parameter being validated. + /// The value of the parameter being validated. + public static void IsNotNullOrWhitespaceString(string parameterName, string valueToCheck) + { + if (string.IsNullOrWhiteSpace(valueToCheck)) + { + throw new ArgumentException( + SR.NullEmptyOrWhitespaceString, + parameterName); + } + } + } +}