Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
67c3819
Introduce partial for SqlInternalConnectionTds
benrr101 Oct 27, 2025
b7df614
Merge MaxNumberOfRedirectRoute, MsalHttpRetryStatusCode, _accessToken…
benrr101 Oct 27, 2025
67848e4
Merge accessTokenExpirationBufferTime
benrr101 Oct 27, 2025
da2c73f
Merge _dnsCachingBeforeRedirect, _SQLDNSRetryEnabled, IsSqlDnsCaching…
benrr101 Oct 27, 2025
161f254
Merging _forceMsalRetry, _forceExpiryLocked, _forceExpiryUnLocked, Is…
benrr101 Oct 27, 2025
1ea8e58
Merge _dbAuthenticationContextLockedRefreshTimeSpan, _dbAuthenticatio…
benrr101 Oct 28, 2025
73d8cb2
Merge _asyncCommandCount, _fConnectionOpen, _currentLanguage, _curren…
benrr101 Oct 28, 2025
93debea
Merge _clientConnectionId, _originalClientConnectionId, _routingDesti…
benrr101 Oct 28, 2025
d46aee8
Merge AvailableInternalTransaction, ClientConnectionid, CurrentTransa…
benrr101 Oct 28, 2025
8581a51
Merge ServerVersion (rewrite using string interpolation), InstanceNam…
benrr101 Oct 28, 2025
5d74b87
Merge IsAccesTokenExpired, UnbindOnTransactionCompletion
benrr101 Oct 29, 2025
144a9cd
Merge IgnoreEnvChange, ThreadHasParserLockForClose
benrr101 Oct 29, 2025
282ecee
Merge ChangeDatabaseInternal
benrr101 Oct 29, 2025
8f9dab8
Merge Dispose
benrr101 Oct 29, 2025
3e0649a
Merge ValidateConnectionForExecute
benrr101 Oct 29, 2025
89fa5ea
Merge CheckEnlistedTransactionBinding
benrr101 Oct 29, 2025
7deca1b
Merge IsConnectionAlive, Activate
benrr101 Oct 29, 2025
ae0f909
Merge InternalDeactivate
benrr101 Oct 29, 2025
8cec5c7
Merge ResetConnection
benrr101 Oct 29, 2025
0e089f0
Merge DecrementAsyncCount, DisconnectTransaction, IncrementAsyncCount
benrr101 Oct 29, 2025
f809dce
Merge ExecuteTransaction, Remove unused ExecuteTransaction overload
benrr101 Oct 29, 2025
5f9143c
Merge ExecuteTransaction2005
benrr101 Oct 29, 2025
5a73c92
Merge GetDTCAddress, PropagateTransactionCookie; Remove DelegateTrans…
benrr101 Oct 29, 2025
05baf5c
Merge CompleteLogin
benrr101 Oct 29, 2025
cea5a8b
Merge Login
benrr101 Oct 29, 2025
d94c9f2
Merge LoginFailure
benrr101 Oct 29, 2025
842d13e
Merge OpenLoginEnlist
benrr101 Oct 29, 2025
3aeebc3
Merge IsDoNotRetryConnectError
benrr101 Nov 7, 2025
26d4599
Merge LoginNoFailure
benrr101 Nov 7, 2025
8e8f760
Merge ShouldDisableTnir from netframework
benrr101 Nov 7, 2025
9bb5b82
Merge AttemptRetryADAuthWithTimeoutError
benrr101 Nov 7, 2025
73b41ce
Merge LoginWithFailover
benrr101 Nov 7, 2025
a01200a
Merge ResolveExtendedServerName
benrr101 Nov 7, 2025
bfb58e5
Merge AttemptOneLogin (resolve conflicts), FailoverPermissionDemand (…
benrr101 Nov 7, 2025
d5987c3
Merge ObtainAdditionalLocksForClose, ReleaseAdditionalLocksForClose
benrr101 Nov 7, 2025
ed706b8
Merge GetSessionAndReconnectIfNeeded
benrr101 Nov 7, 2025
901b0f6
Merge BreakConnection
benrr101 Nov 7, 2025
faaf384
Merge OnEnvChange
benrr101 Nov 8, 2025
a948fb3
Merge OnLoginAck
benrr101 Nov 8, 2025
3d3744e
Merge OnFedAuthInfo
benrr101 Nov 8, 2025
a2e5e42
Merge TryGetFedAuthTokenLocked
benrr101 Nov 8, 2025
40edcfb
Introduce SqlException overload for single error scenarios (ie, the m…
benrr101 Nov 8, 2025
80053e1
Merge GetFedAuthToken
benrr101 Nov 8, 2025
ee8f95e
Merge OnFeatureExtAck
benrr101 Nov 11, 2025
484e96f
Merge constructor and TryReplaceConnection
benrr101 Nov 11, 2025
07e4ece
Start merging the SyncAsyncLock
benrr101 Nov 11, 2025
55aeb40
Merge SyncAsyncLock._semaphor, SyncAsyncLock.CanBeReleasedFromAnyThre…
benrr101 Nov 11, 2025
ff352f0
Merge SyncAsyncLock.Release, SyncAsyncLock.Wait
benrr101 Nov 11, 2025
7d887d6
Finishing merge of SqlInternalConnectionTds.cs, removing stub
benrr101 Nov 11, 2025
11f9839
Move SessionStateRecord into new Connection namespace
benrr101 Nov 11, 2025
8ac4724
Introduce partial for SessionData in Connection folder
benrr101 Nov 11, 2025
11e1b71
Merge the SessionData class
benrr101 Nov 12, 2025
ef412fc
Merge ServerInfo class
benrr101 Nov 12, 2025
3f49af6
Remove (now empty) SqlInternalConnectionTds files
benrr101 Nov 12, 2025
bef6043
Put the little classes in the connection namespace
benrr101 Nov 12, 2025
d40e98e
Address comments:
benrr101 Nov 13, 2025
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 @@ -348,111 +348,6 @@ internal SqlInternalConnectionTds(
// PARSER CALLBACKS
////////////////////////////////////////////////////////////////////////////////////////

internal void OnEnvChange(SqlEnvChange rec)
{
Debug.Assert(!IgnoreEnvChange, "This function should not be called if IgnoreEnvChange is set!");
switch (rec._type)
{
case TdsEnums.ENV_DATABASE:
// If connection is not open and recovery is not in progress, store the server value as the original.
if (!_fConnectionOpen && _recoverySessionData == null)
{
_originalDatabase = rec._newValue;
}

CurrentDatabase = rec._newValue;
break;

case TdsEnums.ENV_LANG:
// If connection is not open and recovery is not in progress, store the server value as the original.
if (!_fConnectionOpen && _recoverySessionData == null)
{
_originalLanguage = rec._newValue;
}

_currentLanguage = rec._newValue;
break;

case TdsEnums.ENV_PACKETSIZE:
_currentPacketSize = int.Parse(rec._newValue, CultureInfo.InvariantCulture);
break;

case TdsEnums.ENV_COLLATION:
if (_currentSessionData != null)
{
_currentSessionData._collation = rec._newCollation;
}
break;

case TdsEnums.ENV_CHARSET:
case TdsEnums.ENV_LOCALEID:
case TdsEnums.ENV_COMPFLAGS:
case TdsEnums.ENV_BEGINTRAN:
case TdsEnums.ENV_COMMITTRAN:
case TdsEnums.ENV_ROLLBACKTRAN:
case TdsEnums.ENV_ENLISTDTC:
case TdsEnums.ENV_DEFECTDTC:
// only used on parser
break;

case TdsEnums.ENV_LOGSHIPNODE:
if (ConnectionOptions.ApplicationIntent == ApplicationIntent.ReadOnly)
{
throw SQL.ROR_FailoverNotSupportedServer(this);
}

ServerProvidedFailoverPartner = rec._newValue;
break;

case TdsEnums.ENV_PROMOTETRANSACTION:
byte[] dtcToken;
if (rec._newBinRented)
{
dtcToken = new byte[rec._newLength];
Buffer.BlockCopy(rec._newBinValue, 0, dtcToken, 0, dtcToken.Length);
}
else
{
dtcToken = rec._newBinValue;
rec._newBinValue = null;
}
PromotedDtcToken = dtcToken;
break;

case TdsEnums.ENV_TRANSACTIONENDED:
break;

case TdsEnums.ENV_TRANSACTIONMANAGERADDRESS:
// For now we skip these 2005 only env change notifications
break;

case TdsEnums.ENV_SPRESETCONNECTIONACK:
// connection is being reset
if (_currentSessionData != null)
{
_currentSessionData.Reset();
}
break;

case TdsEnums.ENV_USERINSTANCE:
_instanceName = rec._newValue;
break;

case TdsEnums.ENV_ROUTING:
SqlClientEventSource.Log.TryAdvancedTraceEvent("<sc.SqlInternalConnectionTds.OnEnvChange|ADV> {0}, Received routing info", ObjectID);
if (string.IsNullOrEmpty(rec._newRoutingInfo.ServerName) || rec._newRoutingInfo.Protocol != 0 || rec._newRoutingInfo.Port == 0)
{
throw SQL.ROR_InvalidRoutingInfo(this);
}
RoutingInfo = rec._newRoutingInfo;
break;

default:
Debug.Fail("Missed token in EnvChange!");
break;
}
}

internal void OnLoginAck(SqlLoginAck rec)
{
_loginAck = rec;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -346,106 +346,6 @@ internal SqlInternalConnectionTds(
// PARSER CALLBACKS
////////////////////////////////////////////////////////////////////////////////////////

internal void OnEnvChange(SqlEnvChange rec)
{
Debug.Assert(!IgnoreEnvChange, "This function should not be called if IgnoreEnvChange is set!");
switch (rec._type)
{
case TdsEnums.ENV_DATABASE:
// If connection is not open and recovery is not in progress, store the server value as the original.
if (!_fConnectionOpen && _recoverySessionData == null)
{
_originalDatabase = rec._newValue;
}

CurrentDatabase = rec._newValue;
break;

case TdsEnums.ENV_LANG:
// If connection is not open and recovery is not in progress, store the server value as the original.
if (!_fConnectionOpen && _recoverySessionData == null)
{
_originalLanguage = rec._newValue;
}

_currentLanguage = rec._newValue;
break;

case TdsEnums.ENV_PACKETSIZE:
_currentPacketSize = int.Parse(rec._newValue, CultureInfo.InvariantCulture);
break;

case TdsEnums.ENV_COLLATION:
if (_currentSessionData != null)
{
_currentSessionData._collation = rec._newCollation;
}
break;

case TdsEnums.ENV_CHARSET:
case TdsEnums.ENV_LOCALEID:
case TdsEnums.ENV_COMPFLAGS:
case TdsEnums.ENV_BEGINTRAN:
case TdsEnums.ENV_COMMITTRAN:
case TdsEnums.ENV_ROLLBACKTRAN:
case TdsEnums.ENV_ENLISTDTC:
case TdsEnums.ENV_DEFECTDTC:
// only used on parser
break;

case TdsEnums.ENV_LOGSHIPNODE:
ServerProvidedFailoverPartner = rec._newValue;
break;

case TdsEnums.ENV_PROMOTETRANSACTION:
byte[] dtcToken;
if (rec._newBinRented)
{
dtcToken = new byte[rec._newLength];
Buffer.BlockCopy(rec._newBinValue, 0, dtcToken, 0, dtcToken.Length);
}
else
{
dtcToken = rec._newBinValue;
rec._newBinValue = null;
}
PromotedDtcToken = dtcToken;
break;

case TdsEnums.ENV_TRANSACTIONENDED:
break;

case TdsEnums.ENV_TRANSACTIONMANAGERADDRESS:
// For now we skip these 2005 only env change notifications
break;

case TdsEnums.ENV_SPRESETCONNECTIONACK:
// connection is being reset
if (_currentSessionData != null)
{
_currentSessionData.Reset();
}
break;

case TdsEnums.ENV_USERINSTANCE:
_instanceName = rec._newValue;
break;

case TdsEnums.ENV_ROUTING:
SqlClientEventSource.Log.TryAdvancedTraceEvent("<sc.SqlInternalConnectionTds.OnEnvChange|ADV> {0}, Received routing info", ObjectID);
if (string.IsNullOrEmpty(rec._newRoutingInfo.ServerName) || rec._newRoutingInfo.Protocol != 0 || rec._newRoutingInfo.Port == 0)
{
throw SQL.ROR_InvalidRoutingInfo(this);
}
RoutingInfo = rec._newRoutingInfo;
break;

default:
Debug.Fail("Missed token in EnvChange!");
break;
}
}

internal void OnLoginAck(SqlLoginAck rec)
{
_loginAck = rec;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Security;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -722,6 +723,122 @@ internal void IncrementAsyncCount()
internal override bool IsConnectionAlive(bool throwOnException) =>
_parser._physicalStateObj.IsConnectionAlive(throwOnException);

// @TODO: It seems fishy to have an entire environment change processor in here. Maybe either have specialized callbacks for specific scenarios, or maybe have the connection register with the parser what env changes it can handle? Idk, just seems a bit weird to do low-level stuff up here.
Comment thread
mdaigle marked this conversation as resolved.
internal void OnEnvChange(SqlEnvChange rec)
{
Debug.Assert(!IgnoreEnvChange, "This function should not be called if IgnoreEnvChange is set!");

switch (rec._type)
{
case TdsEnums.ENV_DATABASE:
// If connection is not open and recovery is not in progress, store the server
// value as the original.
if (!_fConnectionOpen && _recoverySessionData == null)
{
_originalDatabase = rec._newValue;
}

CurrentDatabase = rec._newValue;
break;

case TdsEnums.ENV_LANG:
// If connection is not open and recovery is not in progress, store the server
// value as the original.
if (!_fConnectionOpen && _recoverySessionData == null)
{
_originalLanguage = rec._newValue;
}

_currentLanguage = rec._newValue;
break;

case TdsEnums.ENV_PACKETSIZE:
_currentPacketSize = int.Parse(rec._newValue, CultureInfo.InvariantCulture);
break;

case TdsEnums.ENV_COLLATION:
if (_currentSessionData != null)
{
_currentSessionData._collation = rec._newCollation;
}
break;

case TdsEnums.ENV_CHARSET:
case TdsEnums.ENV_LOCALEID:
case TdsEnums.ENV_COMPFLAGS:
case TdsEnums.ENV_BEGINTRAN:
case TdsEnums.ENV_COMMITTRAN:
case TdsEnums.ENV_ROLLBACKTRAN:
case TdsEnums.ENV_ENLISTDTC:
case TdsEnums.ENV_DEFECTDTC:
// Only used on parser
// @TODO: Well ... why do they have cases here? Why are they in the middle of everything? Why aren't other skipped cases handled here??
break;

case TdsEnums.ENV_LOGSHIPNODE:
#if NET
if (ConnectionOptions.ApplicationIntent == ApplicationIntent.ReadOnly)
{
throw SQL.ROR_FailoverNotSupportedServer(this);
}
#endif

ServerProvidedFailoverPartner = rec._newValue;
break;

case TdsEnums.ENV_PROMOTETRANSACTION:
byte[] dtcToken;
if (rec._newBinRented)
{
dtcToken = new byte[rec._newLength];
Buffer.BlockCopy(rec._newBinValue, 0, dtcToken, 0, dtcToken.Length);
}
else
{
dtcToken = rec._newBinValue;
rec._newBinValue = null;
}
PromotedDtcToken = dtcToken;
break;

case TdsEnums.ENV_TRANSACTIONENDED:
break;

case TdsEnums.ENV_TRANSACTIONMANAGERADDRESS:
// For now, we skip these 2005 only env change notifications
break;

case TdsEnums.ENV_SPRESETCONNECTIONACK:
// Connection is being reset
_currentSessionData?.Reset();
break;

case TdsEnums.ENV_USERINSTANCE:
_instanceName = rec._newValue;
break;

case TdsEnums.ENV_ROUTING:
SqlClientEventSource.Log.TryAdvancedTraceEvent(
$"SqlInternalConnectionTds.OnEnvChange | ADV | " +
$"Object ID {ObjectID}, " +
$"Received routing info");

if (string.IsNullOrEmpty(rec._newRoutingInfo.ServerName) ||
rec._newRoutingInfo.Protocol != 0 ||
rec._newRoutingInfo.Port == 0)
{
throw SQL.ROR_InvalidRoutingInfo(this);
}

RoutingInfo = rec._newRoutingInfo;
break;

default:
Debug.Fail("Missed token in EnvChange!");
break;
}
}

internal override void ValidateConnectionForExecute(SqlCommand command)
{
TdsParser parser = _parser;
Expand Down