Skip to content

Commit f05541c

Browse files
committed
WIP - test with transactions
1 parent 2da017f commit f05541c

2 files changed

Lines changed: 84 additions & 21 deletions

File tree

end2end/EndToEndTests/MySqlConnectorDapperTester.generated.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
using MySqlConnector;
12
using MySqlConnectorDapperExampleGen;
23
using NUnit.Framework;
34
using NUnit.Framework.Legacy;
45
using System;
56
using System.Collections.Generic;
7+
using System.Diagnostics;
68
using System.Linq;
79
using System.Threading.Tasks;
810

@@ -26,6 +28,30 @@ public async Task TestOne()
2628
Assert.That(SingularEquals(expected, actual));
2729
}
2830

31+
[Test]
32+
public async Task TestTransactionOne()
33+
{
34+
var connection = new MySqlConnection(Environment.GetEnvironmentVariable(EndToEndCommon.MySqlConnectionStringEnv)!);
35+
await connection.OpenAsync();
36+
var transaction = connection.BeginTransaction();
37+
38+
var sqlQueryWithTx = new QuerySql(transaction);
39+
await sqlQueryWithTx.CreateAuthor(new QuerySql.CreateAuthorArgs { Id = 1111, Name = "Bojack Horseman", Bio = "Back in the 90s he was in a very famous TV show" });
40+
41+
var actualNull = await this.QuerySql.GetAuthor(new QuerySql.GetAuthorArgs { Name = "Bojack Horseman" });
42+
Assert.That(actualNull == null, "there is author");
43+
await transaction.CommitAsync();
44+
45+
var expected = new QuerySql.GetAuthorRow
46+
{
47+
Id = 1111,
48+
Name = "Bojack Horseman",
49+
Bio = "Back in the 90s he was in a very famous TV show"
50+
};
51+
var actual = await this.QuerySql.GetAuthor(new QuerySql.GetAuthorArgs { Name = "Bojack Horseman" });
52+
Assert.That(SingularEquals(expected, actual));
53+
}
54+
2955
private static bool SingularEquals(QuerySql.GetAuthorRow x, QuerySql.GetAuthorRow y)
3056
{
3157
return x.Id.Equals(y.Id) && x.Name.Equals(y.Name) && x.Bio.Equals(y.Bio);
@@ -625,4 +651,4 @@ public async Task TestCopyFrom(int batchSize, MysqlTypesCEnum? cEnum)
625651
Assert.That(actual.CEnum, Is.EqualTo(expected.CEnum));
626652
}
627653
}
628-
}
654+
}

examples/MySqlConnectorDapperExample/QuerySql.cs

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
// auto-generated by sqlc - do not edit
2-
// ReSharper disable UseObjectOrCollectionInitializer
3-
// ReSharper disable UseAwaitUsing
4-
// ReSharper disable ConvertToUsingDeclaration
5-
// ReSharper disable NotAccessedPositionalProperty.Global
6-
// ReSharper disable UnusedAutoPropertyAccessor.Global
1+
// auto-generated by sqlc - do not edit
2+
// ReSharper disable UseObjectOrCollectionInitializer
3+
// ReSharper disable UseAwaitUsing
4+
// ReSharper disable ConvertToUsingDeclaration
5+
// ReSharper disable NotAccessedPositionalProperty.Global
6+
// ReSharper disable UnusedAutoPropertyAccessor.Global
77
using System;
88
using System.Collections.Generic;
99
using System.Threading.Tasks;
@@ -19,13 +19,24 @@
1919
namespace MySqlConnectorDapperExampleGen;
2020
public class QuerySql
2121
{
22-
public QuerySql(string connectionString)
22+
public QuerySql()
2323
{
24-
this.ConnectionString = connectionString;
2524
Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
2625
}
2726

28-
private string ConnectionString { get; }
27+
public QuerySql(string connectionString) : this()
28+
{
29+
this.ConnectionString = connectionString;
30+
}
31+
32+
public QuerySql(MySqlTransaction transaction) : this()
33+
{
34+
this.mySqlTransaction = transaction;
35+
}
36+
37+
private MySqlTransaction? mySqlTransaction { get; }
38+
39+
private string? ConnectionString { get; }
2940

3041
private const string GetAuthorSql = "SELECT id, name, bio FROM authors WHERE name = @name LIMIT 1; SELECT LAST_INSERT_ID()";
3142
public class GetAuthorRow
@@ -40,13 +51,26 @@ public class GetAuthorArgs
4051
};
4152
public async Task<GetAuthorRow?> GetAuthor(GetAuthorArgs args)
4253
{
43-
using (var connection = new MySqlConnection(ConnectionString))
54+
var queryParams = new Dictionary<string, object?>();
55+
queryParams.Add("name", args.Name);
56+
if (this.mySqlTransaction == null)
4457
{
45-
var queryParams = new Dictionary<string, object?>();
46-
queryParams.Add("name", args.Name);
47-
var result = await connection.QueryFirstOrDefaultAsync<GetAuthorRow?>(GetAuthorSql, queryParams);
48-
return result;
58+
using (var connection = new MySqlConnection(ConnectionString))
59+
{
60+
var result = await connection.QueryFirstOrDefaultAsync<GetAuthorRow?>(GetAuthorSql, queryParams);
61+
return result;
62+
}
63+
}
64+
65+
if (this.mySqlTransaction?.Connection == null || this.mySqlTransaction?.Connection.State != System.Data.ConnectionState.Open) {
66+
throw new InvalidOperationException("Transaction is provided, but its connection is null.");
4967
}
68+
69+
return await mySqlTransaction.Connection.QueryFirstOrDefaultAsync<GetAuthorRow?>(
70+
GetAuthorSql,
71+
queryParams,
72+
transaction: this.mySqlTransaction);
73+
5074
}
5175

5276
private const string ListAuthorsSql = "SELECT id, name, bio FROM authors ORDER BY name; SELECT LAST_INSERT_ID()";
@@ -74,14 +98,27 @@ public class CreateAuthorArgs
7498
};
7599
public async Task CreateAuthor(CreateAuthorArgs args)
76100
{
77-
using (var connection = new MySqlConnection(ConnectionString))
101+
var queryParams = new Dictionary<string, object?>();
102+
queryParams.Add("id", args.Id);
103+
queryParams.Add("name", args.Name);
104+
queryParams.Add("bio", args.Bio);
105+
if (this.mySqlTransaction == null)
78106
{
79-
var queryParams = new Dictionary<string, object?>();
80-
queryParams.Add("id", args.Id);
81-
queryParams.Add("name", args.Name);
82-
queryParams.Add("bio", args.Bio);
83-
await connection.ExecuteAsync(CreateAuthorSql, queryParams);
107+
using (var connection = new MySqlConnection(ConnectionString))
108+
{
109+
await connection.ExecuteAsync(CreateAuthorSql, queryParams);
110+
}
111+
}
112+
113+
if (this.mySqlTransaction?.Connection == null || this.mySqlTransaction?.Connection.State != System.Data.ConnectionState.Open)
114+
{
115+
throw new InvalidOperationException("Transaction is provided, but its connection is null.");
84116
}
117+
118+
await mySqlTransaction.Connection.ExecuteAsync(
119+
CreateAuthorSql,
120+
queryParams,
121+
transaction: this.mySqlTransaction);
85122
}
86123

87124
private const string CreateAuthorReturnIdSql = "INSERT INTO authors (name, bio) VALUES (@name, @bio); SELECT LAST_INSERT_ID()";

0 commit comments

Comments
 (0)