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
This commit is contained in:
Charles Gagnon
2022-07-06 15:26:06 -07:00
committed by GitHub
parent e64e31e487
commit ac9f88266c
21 changed files with 192 additions and 17 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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
{

View File

@@ -4,7 +4,7 @@
//
using System.Collections.Specialized;
using Microsoft.SqlTools.Utility;
using Microsoft.SqlTools.BatchParser.Utility;
namespace Microsoft.SqlTools.ServiceLayer.BatchParser.ExecutionEngineCode
{

View File

@@ -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()
{ }

View File

@@ -245,4 +245,8 @@
<value>Could not find included file {0}.</value>
<comment></comment>
</data>
<data name="NullEmptyOrWhitespaceString" xml:space="preserve">
<value>Parameter contains a null, empty, or whitespace string.</value>
<comment></comment>
</data>
</root>

View File

@@ -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.

View File

@@ -162,6 +162,11 @@
<target state="new">Could not find included file {0}.</target>
<note></note>
</trans-unit>
<trans-unit id="NullEmptyOrWhitespaceString">
<source>Parameter contains a null, empty, or whitespace string.</source>
<target state="new">Parameter contains a null, empty, or whitespace string.</target>
<note></note>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,5 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- Targeting netstandard2.0 so that other things such as PS cmdlets can use this which need to support a wider range of machines -->
<TargetFramework>netstandard2.0</TargetFramework>
<Nullable>disable</Nullable>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
<EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
@@ -12,12 +15,10 @@
<PackageReference Include="Microsoft.SqlServer.DACFx" />
<PackageReference Include="Microsoft.SqlServer.SqlManagementObjects" />
<PackageReference Include="Microsoft.SqlServer.Management.SmoMetadataProvider" />
<PackageReference Include="Newtonsoft.Json" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Localization\*.resx" />
<None Include="Localization\sr.strings" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Microsoft.SqlTools.Hosting\Microsoft.SqlTools.Hosting.csproj" />
</ItemGroup>
</Project>

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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;

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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
{
/// <summary>
/// Provides a simple logging interface built on top of .Net tracing frameworks
/// </summary>
/// <remarks>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.</remarks>
public static class Logger
{
/// <summary>
/// Writes a message to the log file with the Verbose event level
/// </summary>
/// <param name="logMessage">The message text to be written.</param>
public static void Verbose(string logMessage) => Write(TraceEventType.Verbose, logMessage);
/// <summary>
/// Writes a message to the log file with the Information event level
/// </summary>
/// <param name="logMessage">The message text to be written.</param>
public static void Information(string logMessage) => Write(TraceEventType.Information, logMessage);
/// <summary>
/// Writes a message to the log file with the Warning event level
/// </summary>
/// <param name="logMessage">The message text to be written.</param>
public static void Warning(string logMessage) => Write(TraceEventType.Warning, logMessage);
/// <summary>
/// Writes a message to the log file with the Error event level
/// </summary>
/// <param name="logMessage">The message text to be written.</param>
public static void Error(string logMessage) => Write(TraceEventType.Error, logMessage);
/// <summary>
/// Writes a message to the log file with the Critical event level
/// </summary>
/// <param name="logMessage">The message text to be written.</param>
public static void Critical(string logMessage) => Write(TraceEventType.Critical, logMessage);
/// <summary>
/// Writes a message to the log file.
/// </summary>
/// <param name="eventType">The level at which the message will be written.</param>
/// <param name="logEvent">The event id enumeration for the log event.</param>
/// <param name="logMessage">The message text to be written.</param>
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;
}
}
}
}

View File

@@ -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
{
/// <summary>
/// Provides common validation methods to simplify method
/// parameter checks.
/// </summary>
public static class Validate
{
/// <summary>
/// Throws ArgumentNullException if value is null.
/// </summary>
/// <param name="parameterName">The name of the parameter being validated.</param>
/// <param name="valueToCheck">The value of the parameter being validated.</param>
public static void IsNotNull(string parameterName, object valueToCheck)
{
if (valueToCheck == null)
{
throw new ArgumentNullException(parameterName);
}
}
/// <summary>
/// Throws ArgumentException if the value is null or an empty string.
/// </summary>
/// <param name="parameterName">The name of the parameter being validated.</param>
/// <param name="valueToCheck">The value of the parameter being validated.</param>
public static void IsNotNullOrEmptyString(string parameterName, string valueToCheck)
{
if (string.IsNullOrEmpty(valueToCheck))
{
throw new ArgumentException(
SR.NullEmptyOrWhitespaceString,
parameterName);
}
}
/// <summary>
/// Throws ArgumentException if the value is null, an empty string,
/// or a string containing only whitespace.
/// </summary>
/// <param name="parameterName">The name of the parameter being validated.</param>
/// <param name="valueToCheck">The value of the parameter being validated.</param>
public static void IsNotNullOrWhitespaceString(string parameterName, string valueToCheck)
{
if (string.IsNullOrWhiteSpace(valueToCheck))
{
throw new ArgumentException(
SR.NullEmptyOrWhitespaceString,
parameterName);
}
}
}
}