77using System . Data ;
88using System . Data . Common ;
99using System . Security ;
10+ using System . Threading ;
11+ using System . Threading . Tasks ;
1012using MySql . Data . MySqlClient ;
1113
1214namespace Xtensive . Sql . Drivers . MySql
@@ -17,23 +19,14 @@ internal class Connection : SqlConnection
1719 private MySqlTransaction activeTransaction ;
1820
1921 /// <inheritdoc/>
20- public override DbConnection UnderlyingConnection
21- {
22- get { return underlyingConnection ; }
23- }
22+ public override DbConnection UnderlyingConnection => underlyingConnection ;
2423
2524 /// <inheritdoc/>
26- public override DbTransaction ActiveTransaction
27- {
28- get { return activeTransaction ; }
29- }
25+ public override DbTransaction ActiveTransaction => activeTransaction ;
3026
3127 /// <inheritdoc/>
3228 [ SecuritySafeCritical ]
33- public override DbParameter CreateParameter ( )
34- {
35- return new MySqlParameter ( ) ;
36- }
29+ public override DbParameter CreateParameter ( ) => new MySqlParameter ( ) ;
3730
3831 /// <inheritdoc/>
3932 [ SecuritySafeCritical ]
@@ -58,46 +51,76 @@ public override void BeginTransaction(IsolationLevel isolationLevel)
5851 /// <inheritdoc/>
5952 public override void MakeSavepoint ( string name )
6053 {
61- EnsureIsNotDisposed ( ) ;
62- EnsureTransactionIsActive ( ) ;
54+ var commandText = GetCreateSavepointCommandText ( name ) ;
55+ ExecuteNonQuery ( commandText ) ;
56+ }
6357
64- string commandText = string . Format ( "SAVEPOINT {0}" , name ) ;
65- using ( DbCommand command = CreateCommand ( commandText ) )
66- command . ExecuteNonQuery ( ) ;
58+ /// <inheritdoc/>
59+ public override Task MakeSavepointAsync ( string name , CancellationToken token = default )
60+ {
61+ var commandText = GetCreateSavepointCommandText ( name ) ;
62+ return ExecuteNonQueryAsync ( commandText , token ) ;
6763 }
6864
6965 /// <inheritdoc/>
7066 public override void RollbackToSavepoint ( string name )
7167 {
72- EnsureIsNotDisposed ( ) ;
73- EnsureTransactionIsActive ( ) ;
68+ var commandText = GetRollbackToSavepointCommandText ( name ) ;
69+ ExecuteNonQuery ( commandText ) ;
70+ }
7471
75- string commandText = string . Format ( "ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};" , name ) ;
76- using ( DbCommand command = CreateCommand ( commandText ) )
77- command . ExecuteNonQuery ( ) ;
72+ /// <inheritdoc/>
73+ public override Task RollbackToSavepointAsync ( string name , CancellationToken token = default )
74+ {
75+ var commandText = GetRollbackToSavepointCommandText ( name ) ;
76+ return ExecuteNonQueryAsync ( commandText , token ) ;
7877 }
7978
8079 /// <inheritdoc/>
8180 public override void ReleaseSavepoint ( string name )
8281 {
83- EnsureIsNotDisposed ( ) ;
84- EnsureTransactionIsActive ( ) ;
85-
86- string commandText = string . Format ( "RELEASE SAVEPOINT {0}" , name ) ;
87- using ( DbCommand command = CreateCommand ( commandText ) )
88- command . ExecuteNonQuery ( ) ;
82+ var commandText = GetReleaseSavepointCommandText ( name ) ;
83+ ExecuteNonQuery ( commandText ) ;
8984 }
9085
9186 /// <inheritdoc/>
92- protected override void ClearActiveTransaction ( )
87+ public override Task ReleaseSavepointAsync ( string name , CancellationToken token = default )
9388 {
94- activeTransaction = null ;
89+ var commandText = GetReleaseSavepointCommandText ( name ) ;
90+ return ExecuteNonQueryAsync ( commandText , token ) ;
9591 }
9692
9793 /// <inheritdoc/>
98- protected override void ClearUnderlyingConnection ( )
94+ protected override void ClearActiveTransaction ( ) => activeTransaction = null ;
95+
96+ /// <inheritdoc/>
97+ protected override void ClearUnderlyingConnection ( ) => underlyingConnection = null ;
98+
99+ private static string GetCreateSavepointCommandText ( string name ) => $ "SAVEPOINT { name } ";
100+
101+ private static string GetRollbackToSavepointCommandText ( string name ) =>
102+ string . Format ( "ROLLBACK TO SAVEPOINT {0}; RELEASE SAVEPOINT {0};" , name ) ;
103+
104+ private static string GetReleaseSavepointCommandText ( string name ) => $ "RELEASE SAVEPOINT { name } ";
105+
106+ private void ExecuteNonQuery ( string commandText )
99107 {
100- underlyingConnection = null ;
108+ EnsureIsNotDisposed ( ) ;
109+ EnsureTransactionIsActive ( ) ;
110+
111+ using var command = CreateCommand ( commandText ) ;
112+ command . ExecuteNonQuery ( ) ;
113+ }
114+
115+ private async Task ExecuteNonQueryAsync ( string commandText , CancellationToken token )
116+ {
117+ EnsureIsNotDisposed ( ) ;
118+ EnsureTransactionIsActive ( ) ;
119+
120+ var command = CreateCommand ( commandText ) ;
121+ await using ( command . ConfigureAwait ( false ) ) {
122+ await command . ExecuteNonQueryAsync ( token ) . ConfigureAwait ( false ) ;
123+ }
101124 }
102125
103126 // Constructors
0 commit comments