@@ -23,7 +23,7 @@ namespace MySqlConnector.Core;
23
23
24
24
#pragma warning disable CA1001 // Types that own disposable fields should be disposable
25
25
26
- internal sealed partial class ServerSession
26
+ internal sealed partial class ServerSession : IServerCapabilities
27
27
{
28
28
public ServerSession ( ILogger logger )
29
29
: this ( logger , null , 0 , Interlocked . Increment ( ref s_lastId ) )
@@ -320,7 +320,7 @@ public void FinishQuerying()
320
320
SendAsync ( payload , IOBehavior . Synchronous , CancellationToken . None ) . GetAwaiter ( ) . GetResult ( ) ;
321
321
payload = ReceiveReplyAsync ( IOBehavior . Synchronous , CancellationToken . None ) . GetAwaiter ( ) . GetResult ( ) ;
322
322
#pragma warning restore CA2012
323
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
323
+ OkPayload . Verify ( payload . Span , this ) ;
324
324
}
325
325
326
326
lock ( m_lock )
@@ -532,19 +532,30 @@ public async Task DisposeAsync(IOBehavior ioBehavior, CancellationToken cancella
532
532
payload = await SwitchAuthenticationAsync ( cs , password , payload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
533
533
}
534
534
535
- var ok = OkPayload . Create ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
535
+ var ok = OkPayload . Create ( payload . Span , this ) ;
536
536
var statusInfo = ok . StatusInfo ;
537
537
538
538
if ( m_useCompression )
539
539
m_payloadHandler = new CompressedPayloadHandler ( m_payloadHandler . ByteHandler ) ;
540
540
541
- // set 'collation_connection' to the server default
542
- await SendAsync ( m_setNamesPayload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
543
- payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
544
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
541
+ // send 'SET NAMES' to set the character set and collation unless the server reports that it's already using the desired character set (e.g., MariaDB >= 11.5)
542
+ if ( ok . NewCharacterSet != ( ServerVersion . Version >= ServerVersions . SupportsUtf8Mb4 ? CharacterSet . Utf8Mb4Binary : CharacterSet . Utf8Mb3Binary ) )
543
+ {
544
+ // set 'collation_connection' to the server default
545
+ await SendAsync ( m_setNamesPayload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
546
+ payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
547
+ OkPayload . Verify ( payload . Span , this ) ;
548
+ }
545
549
546
550
if ( ShouldGetRealServerDetails ( cs ) )
551
+ {
547
552
await GetRealServerDetailsAsync ( ioBehavior , CancellationToken . None ) . ConfigureAwait ( false ) ;
553
+ }
554
+ else if ( ok . NewConnectionId is int newConnectionId && newConnectionId != ConnectionId )
555
+ {
556
+ Log . ChangingConnectionId ( m_logger , Id , ConnectionId , newConnectionId , ServerVersion . OriginalString , ServerVersion . OriginalString ) ;
557
+ ConnectionId = newConnectionId ;
558
+ }
548
559
549
560
m_payloadHandler . ByteHandler . RemainingTimeout = Constants . InfiniteTimeout ;
550
561
return statusInfo ;
@@ -584,18 +595,18 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, MySqlConn
584
595
585
596
// read two OK replies
586
597
payload = await ReceiveReplyAsync ( 1 , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
587
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
598
+ OkPayload . Verify ( payload . Span , this ) ;
588
599
589
600
payload = await ReceiveReplyAsync ( 1 , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
590
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
601
+ OkPayload . Verify ( payload . Span , this ) ;
591
602
592
603
return true ;
593
604
}
594
605
595
606
Log . SendingResetConnectionRequest ( m_logger , Id , ServerVersion . OriginalString ) ;
596
607
await SendAsync ( ResetConnectionPayload . Instance , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
597
608
payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
598
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
609
+ OkPayload . Verify ( payload . Span , this ) ;
599
610
}
600
611
else
601
612
{
@@ -619,13 +630,13 @@ public async Task<bool> TryResetConnectionAsync(ConnectionSettings cs, MySqlConn
619
630
Log . OptimisticReauthenticationFailed ( m_logger , Id ) ;
620
631
payload = await SwitchAuthenticationAsync ( cs , password , payload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
621
632
}
622
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
633
+ OkPayload . Verify ( payload . Span , this ) ;
623
634
}
624
635
625
636
// set 'collation_connection' to the server default
626
637
await SendAsync ( m_setNamesPayload , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
627
638
payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
628
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
639
+ OkPayload . Verify ( payload . Span , this ) ;
629
640
630
641
return true ;
631
642
}
@@ -684,7 +695,7 @@ private async Task<PayloadData> SwitchAuthenticationAsync(ConnectionSettings cs,
684
695
payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
685
696
686
697
// OK payload can be sent immediately (e.g., if password is empty) bypassing even the fast authentication path
687
- if ( OkPayload . IsOk ( payload . Span , SupportsDeprecateEof ) )
698
+ if ( OkPayload . IsOk ( payload . Span , this ) )
688
699
return payload ;
689
700
690
701
var cachingSha2ServerResponsePayload = CachingSha2ServerResponsePayload . Create ( payload . Span ) ;
@@ -824,7 +835,7 @@ public async ValueTask<bool> TryPingAsync(bool logInfo, IOBehavior ioBehavior, C
824
835
Log . PingingServer ( m_logger , Id ) ;
825
836
await SendAsync ( PingPayload . Instance , ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
826
837
var payload = await ReceiveReplyAsync ( ioBehavior , cancellationToken ) . ConfigureAwait ( false ) ;
827
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
838
+ OkPayload . Verify ( payload . Span , this ) ;
828
839
Log . SuccessfullyPingedServer ( m_logger , logInfo ? LogLevel . Information : LogLevel . Trace , Id ) ;
829
840
return true ;
830
841
}
@@ -1662,8 +1673,8 @@ static void ReadRow(ReadOnlySpan<byte> span, out int? connectionId, out ServerVe
1662
1673
1663
1674
// OK/EOF payload
1664
1675
payload = await ReceiveReplyAsync ( ioBehavior , CancellationToken . None ) . ConfigureAwait ( false ) ;
1665
- if ( OkPayload . IsOk ( payload . Span , SupportsDeprecateEof ) )
1666
- OkPayload . Verify ( payload . Span , SupportsDeprecateEof , SupportsSessionTrack ) ;
1676
+ if ( OkPayload . IsOk ( payload . Span , this ) )
1677
+ OkPayload . Verify ( payload . Span , this ) ;
1667
1678
else
1668
1679
EofPayload . Create ( payload . Span ) ;
1669
1680
0 commit comments