Skip to content

Commit 475464b

Browse files
- simplify dapper codegen (#177)
- support :execlastid directly in Dapper
1 parent ea9f928 commit 475464b

File tree

17 files changed

+214
-117
lines changed

17 files changed

+214
-117
lines changed

Drivers/Generators/CommonGen.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,20 @@ public static string AwaitReaderRow()
1111
return $"await {Variable.Reader.AsVarName()}.ReadAsync()";
1212
}
1313

14-
public static string GetParameterListAsString(string argInterface, IEnumerable<Parameter> parameters)
14+
public static string GetMethodParameterList(string argInterface, IEnumerable<Parameter> parameters)
1515
{
16-
return $"{(string.IsNullOrEmpty(argInterface) || !parameters.Any() ? string.Empty : $"{argInterface} args")}";
16+
return $"{(string.IsNullOrEmpty(argInterface) || !parameters.Any()
17+
? string.Empty
18+
: $"{argInterface} {Variable.Args.AsVarName()}")}";
19+
}
20+
21+
public static string GetParameterListForDapper(IList<Parameter> parameters)
22+
{
23+
var parametersStr = parameters
24+
.Select(p => p.Column.Name + "=args." + p.Column.Name.ToPascalCase() + "");
25+
return parameters.Count > 0
26+
? ", new { " + string.Join(", ", parametersStr) + "}"
27+
: string.Empty;
1728
}
1829

1930
public static string InitDataReader()

Drivers/Generators/ExecDeclareGen.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class ExecDeclareGen(DbDriver dbDriver)
1111

1212
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface, Query query)
1313
{
14-
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
14+
var parametersStr = CommonGen.GetMethodParameterList(argInterface, query.Params);
1515
return ParseMemberDeclaration($$"""
1616
public async Task {{query.Name}}({{parametersStr}})
1717
{
@@ -23,24 +23,24 @@ public MemberDeclarationSyntax Generate(string queryTextConstant, string argInte
2323
private string GetMethodBody(string queryTextConstant, Query query)
2424
{
2525
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
26-
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
27-
var commandParameters = CommonGen.GetCommandParameters(query.Params);
28-
var executeScalar = $"await {Variable.Command.AsVarName()}.ExecuteScalarAsync();";
2926
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
3027

3128
string GetAsDapper()
3229
{
33-
var argsParams = query.Params.Count > 0 ? ", new { " + string.Join(", ", query.Params.Select(p => p.Column.Name + "=args." + p.Column.Name.ToPascalCase() + "")) + "}" : "";
30+
var args = CommonGen.GetParameterListForDapper(query.Params);
3431
return $$"""
3532
using ({{establishConnection}})
3633
{
37-
await connection.ExecuteAsync({{queryTextConstant}}{{argsParams}});
34+
await connection.ExecuteAsync({{queryTextConstant}}{{args}});
3835
}
3936
""";
4037
}
4138

4239
string GetAsDriver()
4340
{
41+
var commandParameters = CommonGen.GetCommandParameters(query.Params);
42+
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
43+
var executeScalar = $"await {Variable.Command.AsVarName()}.ExecuteScalarAsync();";
4444
return $$"""
4545
using ({{establishConnection}})
4646
{

Drivers/Generators/ExecLastIdDeclareGen.cs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ public class ExecLastIdDeclareGen(DbDriver dbDriver)
1212

1313
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface, Query query)
1414
{
15-
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
16-
17-
15+
var parametersStr = CommonGen.GetMethodParameterList(argInterface, query.Params);
1816
return ParseMemberDeclaration($$"""
1917
public async Task<long> {{query.Name}}({{parametersStr}})
2018
{
@@ -28,19 +26,35 @@ private string GetMethodBody(string queryTextConstant, Query query)
2826
{
2927
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
3028
connectionOpen = connectionOpen.AppendSemicolonUnlessEmpty();
31-
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
32-
var commandParameters = CommonGen.GetCommandParameters(query.Params).JoinByNewLine();
33-
var returnLastId = ((IExecLastId)dbDriver).GetLastIdStatement().JoinByNewLine();
34-
return $$"""
35-
using ({{establishConnection}})
36-
{
37-
{{connectionOpen}}
38-
using ({{createSqlCommand}})
29+
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
30+
31+
string GetAsDapper()
32+
{
33+
var args = CommonGen.GetParameterListForDapper(query.Params);
34+
return $$"""
35+
using ({{establishConnection}})
36+
{
37+
return await connection.QuerySingleAsync<long>({{queryTextConstant}}{{args}});
38+
}
39+
""";
40+
}
41+
42+
string GetAsDriver()
43+
{
44+
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
45+
var commandParameters = CommonGen.GetCommandParameters(query.Params).JoinByNewLine();
46+
var returnLastId = ((IExecLastId)dbDriver).GetLastIdStatement().JoinByNewLine();
47+
return $$"""
48+
using ({{establishConnection}})
3949
{
40-
{{commandParameters}}
41-
{{returnLastId}}
50+
{{connectionOpen}}
51+
using ({{createSqlCommand}})
52+
{
53+
{{commandParameters}}
54+
{{returnLastId}}
55+
}
4256
}
43-
}
44-
""";
57+
""";
58+
}
4559
}
4660
}

Drivers/Generators/ExecRowsDeclareGen.cs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ public class ExecRowsDeclareGen(DbDriver dbDriver)
1212

1313
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface, Query query)
1414
{
15-
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
16-
15+
var parametersStr = CommonGen.GetMethodParameterList(argInterface, query.Params);
1716
return ParseMemberDeclaration($$"""
1817
public async Task<long> {{query.Name}}({{parametersStr}})
1918
{
@@ -25,40 +24,34 @@ public MemberDeclarationSyntax Generate(string queryTextConstant, string argInte
2524
private string GetMethodBody(string queryTextConstant, Query query)
2625
{
2726
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
28-
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
29-
var commandParameters = CommonGen.GetCommandParameters(query.Params);
30-
var executeScalarAndReturnCreated = ExecuteScalarAndReturnCreated();
3127
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
3228

3329
string GetAsDapper()
3430
{
35-
var argsParams = query.Params.Count > 0 ? ", new { " + string.Join(", ", query.Params.Select(p => p.Column.Name + "=args." + p.Column.Name.ToPascalCase() + "")) + "}" : "";
31+
var args = CommonGen.GetParameterListForDapper(query.Params);
3632
return $$"""
3733
using ({{establishConnection}})
3834
{
39-
return await connection.ExecuteAsync({{queryTextConstant}}{{argsParams}});
35+
return await connection.ExecuteAsync({{queryTextConstant}}{{args}});
4036
}
4137
""";
4238
}
4339

4440
string GetAsDriver()
4541
{
42+
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
43+
var commandParameters = CommonGen.GetCommandParameters(query.Params);
4644
return $$"""
4745
using ({{establishConnection}})
4846
{
4947
{{connectionOpen.AppendSemicolonUnlessEmpty()}}
5048
using ({{createSqlCommand}})
5149
{
5250
{{commandParameters.JoinByNewLine()}}
53-
{{executeScalarAndReturnCreated.JoinByNewLine()}}
51+
return await {{Variable.Command.AsVarName()}}.ExecuteNonQueryAsync();
5452
}
5553
}
5654
""";
5755
}
58-
59-
IEnumerable<string> ExecuteScalarAndReturnCreated()
60-
{
61-
return [$"return await {Variable.Command.AsVarName()}.ExecuteNonQueryAsync();"];
62-
}
6356
}
6457
}

Drivers/Generators/ManyDeclareGen.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class ManyDeclareGen(DbDriver dbDriver)
1212

1313
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface, string returnInterface, Query query)
1414
{
15-
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
15+
var parametersStr = CommonGen.GetMethodParameterList(argInterface, query.Params);
1616
var returnType = $"Task<List<{returnInterface}>>";
1717
return ParseMemberDeclaration($$"""
1818
public async {{returnType}} {{query.Name}}({{parametersStr}})
@@ -25,34 +25,34 @@ public MemberDeclarationSyntax Generate(string queryTextConstant, string argInte
2525
private string GetMethodBody(string queryTextConstant, string returnInterface, Query query)
2626
{
2727
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
28-
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
29-
var commandParameters = CommonGen.GetCommandParameters(query.Params);
30-
var initDataReader = CommonGen.InitDataReader();
31-
var awaitReaderRow = CommonGen.AwaitReaderRow();
32-
var dataclassInit = CommonGen.InstantiateDataclass(query.Columns, returnInterface);
33-
var readWhileExists = $$"""
34-
while ({{awaitReaderRow}})
35-
{
36-
{{Variable.Result.AsVarName()}}.Add({{dataclassInit}});
37-
}
38-
""";
3928
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
4029

4130
string GetAsDapper()
4231
{
43-
var argsParams = query.Params.Count > 0 ? ", new { " + string.Join(", ", query.Params.Select(p => p.Column.Name + "=args." + p.Column.Name.ToPascalCase() + "")) + "}" : "";
32+
var args = CommonGen.GetParameterListForDapper(query.Params);
33+
var returnType = dbDriver.AddNullableSuffix(returnInterface, true);
4434
return $$"""
4535
using ({{establishConnection}})
4636
{
47-
var results = await connection.QueryAsync<{{dbDriver.AddNullableSuffix(returnInterface, true)}}>(
48-
{{queryTextConstant}}{{argsParams}});
37+
var results = await connection.QueryAsync<{{returnType}}>({{queryTextConstant}}{{args}});
4938
return results.AsList();
5039
}
5140
""";
5241
}
5342

5443
string GetAsDriver()
5544
{
45+
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
46+
var commandParameters = CommonGen.GetCommandParameters(query.Params);
47+
var initDataReader = CommonGen.InitDataReader();
48+
var awaitReaderRow = CommonGen.AwaitReaderRow();
49+
var dataclassInit = CommonGen.InstantiateDataclass(query.Columns, returnInterface);
50+
var readWhileExists = $$"""
51+
while ({{awaitReaderRow}})
52+
{
53+
{{Variable.Result.AsVarName()}}.Add({{dataclassInit}});
54+
}
55+
""";
5656
return $$"""
5757
using ({{establishConnection}})
5858
{

Drivers/Generators/OneDeclareGen.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class OneDeclareGen(DbDriver dbDriver)
1313
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface, string returnInterface, Query query)
1414
{
1515
var returnType = $"Task<{dbDriver.AddNullableSuffix(returnInterface, false)}>";
16-
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
16+
var parametersStr = CommonGen.GetMethodParameterList(argInterface, query.Params);
1717
return ParseMemberDeclaration($$"""
1818
public async {{returnType}} {{query.Name}}({{parametersStr}})
1919
{
@@ -25,28 +25,29 @@ public MemberDeclarationSyntax Generate(string queryTextConstant, string argInte
2525
private string GetMethodBody(string queryTextConstant, string returnInterface, Query query)
2626
{
2727
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
28-
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
29-
var commandParameters = CommonGen.GetCommandParameters(query.Params);
30-
var initDataReader = CommonGen.InitDataReader();
31-
var awaitReaderRow = CommonGen.AwaitReaderRow();
32-
var returnDataclass = CommonGen.InstantiateDataclass(query.Columns, returnInterface);
3328
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
3429

3530
string GetAsDapper()
3631
{
37-
var argsParams = query.Params.Count > 0 ? ", new { " + string.Join(", ", query.Params.Select(p => p.Column.Name + "=args." + p.Column.Name.ToPascalCase() + "")) + "}" : "";
32+
var args = CommonGen.GetParameterListForDapper(query.Params);
33+
var returnType = dbDriver.AddNullableSuffix(returnInterface, false);
3834
return $$"""
3935
using ({{establishConnection}})
4036
{
41-
var result = await connection.QueryFirstOrDefaultAsync<{{dbDriver.AddNullableSuffix(returnInterface, false)}}>(
42-
{{queryTextConstant}}{{argsParams}});
37+
var result = await connection.QueryFirstOrDefaultAsync<{{returnType}}>(
38+
{{queryTextConstant}}{{args}});
4339
return result;
4440
}
4541
""";
4642
}
4743

4844
string GetAsDriver()
4945
{
46+
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
47+
var commandParameters = CommonGen.GetCommandParameters(query.Params);
48+
var initDataReader = CommonGen.InitDataReader();
49+
var awaitReaderRow = CommonGen.AwaitReaderRow();
50+
var returnDataclass = CommonGen.InstantiateDataclass(query.Columns, returnInterface);
5051
return $$"""
5152
using ({{establishConnection}})
5253
{

Drivers/MySqlConnectorDriver.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ public override string CreateSqlCommand(string sqlTextConstant)
7878
public override string TransformQueryText(Query query)
7979
{
8080
var counter = 0;
81-
return QueryParamRegex().Replace(query.Text, _ => "@" + query.Params[counter++].Column.Name);
81+
var queryText = options.UseDapper ? $"{query.Text}; SELECT LAST_INSERT_ID()" : query.Text;
82+
return QueryParamRegex().Replace(queryText, _ => "@" + query.Params[counter++].Column.Name);
8283
}
8384

8485
public override MemberDeclarationSyntax OneDeclare(string queryTextConstant, string argInterface,

Drivers/NpgsqlDriver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public override ConnectionGenCommands EstablishConnection(Query query)
9090
$"var ds = NpgsqlDataSource.Create({connectionStringField})",
9191
$"var {Variable.Connection.AsVarName()} = ds.CreateConnection()"
9292
);
93-
if (Options.UseDapper && query.Cmd != ":execlastid") // TODO simplify
93+
if (Options.UseDapper)
9494
return new ConnectionGenCommands(
9595
$"var {Variable.Connection.AsVarName()} = new NpgsqlConnection({connectionStringField})",
9696
""

Drivers/Variable.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ public enum Variable
88
Row,
99
Writer,
1010
Command,
11-
Result
11+
Result,
12+
Args
1213
}
1314

1415
public static class VariablesExtensions

EndToEndTests/MySqlConnectorDapperTester.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace SqlcGenCsharpTests;
88

9-
public class MySqlConnectorDapperTester : IOneTester, IManyTester, IExecTester, IExecRowsTester
9+
public class MySqlConnectorDapperTester : IOneTester, IManyTester, IExecTester, IExecRowsTester, IExecLastIdTester
1010
{
1111
private QuerySql QuerySql { get; } = new(
1212
Environment.GetEnvironmentVariable(EndToEndCommon.MySqlConnectionStringEnv)!);
@@ -115,4 +115,26 @@ public async Task TestExecRows()
115115
var affectedRows = await QuerySql.UpdateAuthors(updateAuthorsArgs);
116116
ClassicAssert.AreEqual(2, affectedRows);
117117
}
118+
119+
[Test]
120+
public async Task TestExecLastId()
121+
{
122+
var bojackCreateAuthorArgs = new QuerySql.CreateAuthorReturnIdArgs
123+
{
124+
Name = DataGenerator.GenericAuthor,
125+
Bio = DataGenerator.GenericQuote1
126+
};
127+
var insertedId = await QuerySql.CreateAuthorReturnId(bojackCreateAuthorArgs);
128+
129+
var getAuthorByIdArgs = new QuerySql.GetAuthorByIdArgs
130+
{
131+
Id = insertedId
132+
};
133+
var actual = await QuerySql.GetAuthorById(getAuthorByIdArgs);
134+
Assert.That(actual is
135+
{
136+
Name: DataGenerator.GenericAuthor,
137+
Bio: DataGenerator.GenericQuote1
138+
});
139+
}
118140
}

0 commit comments

Comments
 (0)