Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private string GetConnectionString(string localDbInstance)
int result = localDBStartInstanceFunc(localDbInstance, 0, localDBConnectionString, ref sizeOfbuffer);
if (result != TdsEnums.SNI_SUCCESS)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBErrorCode, Strings.SNI_ERROR_50);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBErrorCode, Strings.SNI_ERROR_50);
SqlClientEventSource.Log.TrySNITraceEvent(nameof(LocalDB), EventType.ERR, "Unsuccessful 'LocalDBStartInstance' method call with {0} result to start '{1}' localDb instance", args0: result, args1: localDbInstance);
localDBConnectionString = null;
}
Expand Down Expand Up @@ -134,15 +134,15 @@ private bool LoadUserInstanceDll()
// If there was no DLL path found, then there is an error.
if (dllPath == null)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, MapLocalDBErrorStateToCode(registryQueryErrorState), MapLocalDBErrorStateToErrorMessage(registryQueryErrorState));
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, MapLocalDBErrorStateToCode(registryQueryErrorState), MapLocalDBErrorStateToErrorMessage(registryQueryErrorState));
SqlClientEventSource.Log.TrySNITraceEvent(nameof(LocalDB), EventType.ERR, "User instance DLL path is null.");
return false;
}

// In case the registry had an empty path for dll
if (string.IsNullOrWhiteSpace(dllPath))
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBInvalidSqlUserInstanceDllPath, Strings.SNI_ERROR_55);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBInvalidSqlUserInstanceDllPath, Strings.SNI_ERROR_55);
SqlClientEventSource.Log.TrySNITraceEvent(nameof(LocalDB), EventType.ERR, "User instance DLL path is invalid. DLL path = {0}", dllPath);
return false;
}
Expand All @@ -152,7 +152,7 @@ private bool LoadUserInstanceDll()

if (libraryHandle.IsInvalid)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBFailedToLoadDll, Strings.SNI_ERROR_56);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBFailedToLoadDll, Strings.SNI_ERROR_56);
SqlClientEventSource.Log.TrySNITraceEvent(nameof(LocalDB), EventType.ERR, "Library Handle is invalid. Could not load the dll.");
libraryHandle.Dispose();
return false;
Expand All @@ -163,7 +163,7 @@ private bool LoadUserInstanceDll()

if (_startInstanceHandle == IntPtr.Zero)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBBadRuntime, Strings.SNI_ERROR_57);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBBadRuntime, Strings.SNI_ERROR_57);
SqlClientEventSource.Log.TrySNITraceEvent(nameof(LocalDB), EventType.ERR, "Was not able to load the PROC from DLL. Bad Runtime.");
libraryHandle.Dispose();
return false;
Expand All @@ -174,7 +174,7 @@ private bool LoadUserInstanceDll()

if (localDBStartInstanceFunc == null)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBBadRuntime, Strings.SNI_ERROR_57);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBBadRuntime, Strings.SNI_ERROR_57);
libraryHandle.Dispose();
_startInstanceHandle = IntPtr.Zero;
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ internal static uint ReportSNIError(SniProviders provider, uint sniError, Except
/// <returns></returns>
internal static uint ReportSNIError(SniError error)
{
SniLoadHandle.SingletonInstance.LastError = error;
SniLoadHandle.LastError = error;
return TdsEnums.SNI_ERROR;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ internal class SniError
public readonly uint lineNumber;
public readonly Exception exception;

public static SniError Success { get; } = new(SniProviders.INVALID_PROV, 0, TdsEnums.SNI_SUCCESS, string.Empty);

public SniError(SniProviders provider, int nativeError, uint sniErrorCode, string errorMessage)
{
lineNumber = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,65 +4,51 @@

#if NET

using System.Threading;
using System;

#nullable enable

namespace Microsoft.Data.SqlClient.ManagedSni
{
/// <summary>
/// Global SNI settings and status
/// </summary>
internal class SniLoadHandle
internal static class SniLoadHandle
{
public static readonly SniLoadHandle SingletonInstance = new SniLoadHandle();

public readonly EncryptionOptions _encryptionOption = EncryptionOptions.OFF;
public ThreadLocal<SniError> _lastError = new ThreadLocal<SniError>(static () => new SniError(SniProviders.INVALID_PROV, 0, TdsEnums.SNI_SUCCESS, string.Empty));

private readonly uint _status = TdsEnums.SNI_SUCCESS;
[ThreadStatic]
private static SniError? s_lastError;

/// <summary>
/// Last SNI error
/// </summary>
public SniError LastError
public static SniError LastError
{
get
{
return _lastError.Value;
return s_lastError ??= SniError.Success;
}

set
{
_lastError.Value = value;
s_lastError = value;
}
}

/// <summary>
/// SNI library status
/// </summary>
public uint Status
{
get
{
return _status;
}
}
public const uint Status = TdsEnums.SNI_SUCCESS;

/// <summary>
/// Encryption options setting
/// </summary>
public EncryptionOptions Options
{
get
{
return _encryptionOption;
}
}
public const EncryptionOptions Options = EncryptionOptions.OFF;

/// <summary>
/// Verify client encryption possibility
/// </summary>
// TODO: by adding support ENCRYPT_NOT_SUP, it could be calculated.
public bool ClientOSEncryptionSupport => true;
public const bool ClientOSEncryptionSupport = true;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ public void HandleReceiveComplete(SniPacket packet, uint sniErrorCode)

if (!_sessions.ContainsKey(_currentHeader.sessionId))
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.SMUX_PROV, 0, SniCommon.InvalidParameterError, Strings.SNI_ERROR_5);
SniLoadHandle.LastError = new SniError(SniProviders.SMUX_PROV, 0, SniCommon.InvalidParameterError, Strings.SNI_ERROR_5);
HandleReceiveError(packet);
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniMarsConnection), EventType.ERR, "Current Header Session Id {0} not found, MARS Session Id {1} will be destroyed, New SNI error created: {2}", args0: _currentHeader?.sessionId, args1: _lowerHandle?.ConnectionId, args2: sniErrorCode);
_lowerHandle.Dispose();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ public void HandleReceiveError(SniPacket packet)

lock (_receivedPacketQueue)
{
_connectionError = SniLoadHandle.SingletonInstance.LastError;
_connectionError = SniLoadHandle.LastError;
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniMarsHandle), EventType.ERR, "MARS Session Id {0}, _connectionError to be handled: {1}", args0: ConnectionId, args1: _connectionError);
_packetEvent.Set();
}
Expand Down Expand Up @@ -520,7 +520,7 @@ public override uint Receive(out SniPacket packet, int timeoutInMilliseconds)
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniMarsHandle), EventType.INFO, "MARS Session Id {0}, _sequenceNumber {1}, _sendHighwater {2}, Waiting for packet event.", args0: ConnectionId, args1: _sequenceNumber, args2: _sendHighwater);
if (!_packetEvent.Wait(timeoutInMilliseconds))
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.SMUX_PROV, 0, SniCommon.ConnTimeoutError, Strings.SNI_ERROR_11);
SniLoadHandle.LastError = new SniError(SniProviders.SMUX_PROV, 0, SniCommon.ConnTimeoutError, Strings.SNI_ERROR_11);
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniMarsHandle), EventType.INFO, "MARS Session Id {0}, _sequenceNumber {1}, _sendHighwater {2}, _packetEvent wait timed out.", args0: ConnectionId, args1: _sequenceNumber, args2: _sendHighwater);
return TdsEnums.SNI_WAIT_TIMEOUT;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ private static void ReadFromStreamAsyncContinuation(Task<int> task, object state
Exception e = task.Exception?.InnerException;
if (e != null)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.TCP_PROV, SniCommon.InternalExceptionError, e);
SniLoadHandle.LastError = new SniError(SniProviders.TCP_PROV, SniCommon.InternalExceptionError, e);
#if DEBUG
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniPacket), EventType.ERR, "Connection Id {0}, Internal Exception occurred while reading data: {1}", args0: packet._owner?.ConnectionId, args1: e?.Message);
#endif
Expand All @@ -299,7 +299,7 @@ private static void ReadFromStreamAsyncContinuation(Task<int> task, object state
#endif
if (packet._dataLength == 0)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.TCP_PROV, 0, SniCommon.ConnTerminatedError, Strings.SNI_ERROR_2);
SniLoadHandle.LastError = new SniError(SniProviders.TCP_PROV, 0, SniCommon.ConnTerminatedError, Strings.SNI_ERROR_2);
#if DEBUG
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniPacket), EventType.ERR, "Connection Id {0}, No data read from stream, connection was terminated.", args0: packet._owner?.ConnectionId);
#endif
Expand Down Expand Up @@ -340,7 +340,7 @@ public async void WriteToStreamAsync(Stream stream, SniAsyncCallback callback, S
}
catch (Exception e)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(provider, SniCommon.InternalExceptionError, e);
SniLoadHandle.LastError = new SniError(provider, SniCommon.InternalExceptionError, e);
#if DEBUG
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniPacket), EventType.ERR, "Connection Id {0}, Internal Exception occurred while writing data: {1}", args0: _owner?.ConnectionId, args1: e?.Message);
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ internal static SniHandle CreateConnectionHandle(
}
catch (Exception e)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, SniCommon.ErrorSpnLookup, e);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, SniCommon.ErrorSpnLookup, e);
}
}

Expand Down Expand Up @@ -208,7 +208,7 @@ private static SniTcpHandle CreateTcpHandle(
string hostName = details.ServerName;
if (string.IsNullOrWhiteSpace(hostName))
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.TCP_PROV, 0, SniCommon.InvalidConnStringError, Strings.SNI_ERROR_25);
SniLoadHandle.LastError = new SniError(SniProviders.TCP_PROV, 0, SniCommon.InvalidConnStringError, Strings.SNI_ERROR_25);
return null;
}

Expand All @@ -224,7 +224,7 @@ private static SniTcpHandle CreateTcpHandle(
}
catch (SocketException se)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.TCP_PROV, SniCommon.ErrorLocatingServerInstance, se);
SniLoadHandle.LastError = new SniError(SniProviders.TCP_PROV, SniCommon.ErrorLocatingServerInstance, se);
return null;
}
}
Expand Down Expand Up @@ -268,7 +268,7 @@ private static SniNpHandle CreateNpHandle(DataSource details, TimeoutTimer timeo
/// <returns></returns>
internal SniError GetLastError()
{
return SniLoadHandle.SingletonInstance.LastError;
return SniLoadHandle.LastError;
}

/// <summary>
Expand Down Expand Up @@ -448,7 +448,7 @@ internal static string GetLocalDBInstance(string dataSource, out bool error)
}
else if (index > 0)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.ErrorLocatingServerInstance, Strings.SNI_ERROR_26);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.ErrorLocatingServerInstance, Strings.SNI_ERROR_26);
SqlClientEventSource.Log.TrySNITraceEvent(nameof(SniProxy), EventType.ERR, "Incompatible use of prefix with LocalDb: '{0}'", dataSource);
error = true;
}
Expand All @@ -467,7 +467,7 @@ internal static string GetLocalDBInstance(string dataSource, out bool error)
}
else
{
SniLoadHandle.SingletonInstance.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBNoInstanceName, Strings.SNI_ERROR_51);
SniLoadHandle.LastError = new SniError(SniProviders.INVALID_PROV, 0, SniCommon.LocalDBNoInstanceName, Strings.SNI_ERROR_51);
error = true;
}
}
Expand Down Expand Up @@ -594,7 +594,7 @@ private bool InferConnectionDetails()

private void ReportSNIError(SniProviders provider)
{
SniLoadHandle.SingletonInstance.LastError = new SniError(provider, 0, SniCommon.InvalidConnStringError, Strings.SNI_ERROR_25);
SniLoadHandle.LastError = new SniError(provider, 0, SniCommon.InvalidConnStringError, Strings.SNI_ERROR_25);
IsBadDataSource = true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ internal sealed class TdsParserStateObjectFactory
{
public static readonly TdsParserStateObjectFactory Singleton = new TdsParserStateObjectFactory();

public EncryptionOptions EncryptionOptions => ManagedSni.SniLoadHandle.SingletonInstance.Options;
public EncryptionOptions EncryptionOptions => ManagedSni.SniLoadHandle.Options;

public uint SNIStatus => ManagedSni.SniLoadHandle.SingletonInstance.Status;
public uint SNIStatus => ManagedSni.SniLoadHandle.Status;

/// <summary>
/// Verify client encryption possibility.
/// </summary>
public bool ClientOSEncryptionSupport => ManagedSni.SniLoadHandle.SingletonInstance.ClientOSEncryptionSupport;
public bool ClientOSEncryptionSupport => ManagedSni.SniLoadHandle.ClientOSEncryptionSupport;

public TdsParserStateObject CreateTdsParserStateObject(TdsParser parser)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ internal sealed class TdsParserStateObjectFactory

public EncryptionOptions EncryptionOptions =>
#if NET
LocalAppContextSwitches.UseManagedNetworking ? ManagedSni.SniLoadHandle.SingletonInstance.Options : SNILoadHandle.SingletonInstance.Options;
LocalAppContextSwitches.UseManagedNetworking ? ManagedSni.SniLoadHandle.Options : SNILoadHandle.SingletonInstance.Options;
#else
SNILoadHandle.SingletonInstance.Options;
#endif

public uint SNIStatus =>
#if NET
LocalAppContextSwitches.UseManagedNetworking ? ManagedSni.SniLoadHandle.SingletonInstance.Status : SNILoadHandle.SingletonInstance.Status;
LocalAppContextSwitches.UseManagedNetworking ? ManagedSni.SniLoadHandle.Status : SNILoadHandle.SingletonInstance.Status;
#else
SNILoadHandle.SingletonInstance.Status;
#endif
Expand All @@ -32,7 +32,7 @@ internal sealed class TdsParserStateObjectFactory
/// </summary>
public bool ClientOSEncryptionSupport =>
#if NET
LocalAppContextSwitches.UseManagedNetworking ? ManagedSni.SniLoadHandle.SingletonInstance.ClientOSEncryptionSupport : SNILoadHandle.SingletonInstance.ClientOSEncryptionSupport;
LocalAppContextSwitches.UseManagedNetworking ? ManagedSni.SniLoadHandle.ClientOSEncryptionSupport : SNILoadHandle.SingletonInstance.ClientOSEncryptionSupport;
#else
SNILoadHandle.SingletonInstance.ClientOSEncryptionSupport;
#endif
Expand Down
Loading