Skip to content

Commit 9cbd3bb

Browse files
authored
[release][minor] Add sqlc.slice support for mysql (#203)
1 parent 41c04f5 commit 9cbd3bb

File tree

17 files changed

+352
-121
lines changed

17 files changed

+352
-121
lines changed

Drivers/Generators/CommonGen.cs

+19-5
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,25 @@ public static string GetMethodParameterList(string argInterface, IEnumerable<Par
2121

2222
public static string GetParameterListForDapper(IList<Parameter> parameters)
2323
{
24-
var parametersStr = parameters
25-
.Select(p => p.Column.Name + "=args." + p.Column.Name.ToPascalCase() + "");
26-
return parameters.Count > 0
27-
? ", new { " + string.Join(", ", parametersStr) + "}"
28-
: string.Empty;
24+
if (!parameters.Any()) return string.Empty;
25+
var dapperParamsCommands = new List<string>
26+
{
27+
$"var {Variable.DapperParams.AsVarName()} = new Dictionary<string, object>();"
28+
};
29+
foreach (var p in parameters)
30+
{
31+
var param = p.Column.Name.ToPascalCase();
32+
if (p.Column.IsSqlcSlice)
33+
{
34+
dapperParamsCommands.Add($$"""
35+
for (int i = 0; i < {{Variable.Args.AsVarName()}}.{{param}}.Length; i++)
36+
{{Variable.DapperParams.AsVarName()}}.Add($"@{{param}}Arg{i}", {{Variable.Args.AsVarName()}}.{{param}}[i]);
37+
""");
38+
continue;
39+
}
40+
dapperParamsCommands.Add($"{Variable.DapperParams.AsVarName()}.Add(\"{p.Column.Name}\", {Variable.Args.AsVarName()}.{param});");
41+
}
42+
return Environment.NewLine + dapperParamsCommands.JoinByNewLine();
2943
}
3044

3145
public static string InitDataReader()

Drivers/Generators/ExecDeclareGen.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,30 @@ 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 sqlTextTrasformation = CommonGen.GetSqlTransformations(query, queryTextConstant);
2627
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
2728

2829
string GetAsDapper()
2930
{
30-
var args = CommonGen.GetParameterListForDapper(query.Params);
31+
var dapperParamsSection = CommonGen.GetParameterListForDapper(query.Params);
32+
var dapperArgs = dapperParamsSection != string.Empty ? $", {Variable.DapperParams.AsVarName()}" : string.Empty;
3133
return $$"""
3234
using ({{establishConnection}})
33-
{
34-
await connection.ExecuteAsync({{queryTextConstant}}{{args}});
35+
{{{sqlTextTrasformation}}{{dapperParamsSection}}
36+
await connection.ExecuteAsync({{queryTextConstant}}{{dapperArgs}});
3537
}
3638
""";
3739
}
3840

3941
string GetAsDriver()
4042
{
4143
var commandParameters = CommonGen.GetCommandParameters(query.Params);
42-
var sqlcSliceSection = CommonGen.GetSqlTransformations(query, queryTextConstant);
43-
var createSqlCommand = dbDriver.CreateSqlCommand(sqlcSliceSection != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
44+
var createSqlCommand = dbDriver.CreateSqlCommand(sqlTextTrasformation != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
4445
var executeScalar = $"await {Variable.Command.AsVarName()}.ExecuteScalarAsync();";
4546
return $$"""
4647
using ({{establishConnection}})
4748
{
48-
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlcSliceSection}}
49+
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlTextTrasformation}}
4950
using ({{createSqlCommand}})
5051
{
5152
{{commandParameters.JoinByNewLine()}}

Drivers/Generators/ExecLastIdDeclareGen.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,31 @@ public MemberDeclarationSyntax Generate(string queryTextConstant, string argInte
2525
private string GetMethodBody(string queryTextConstant, Query query)
2626
{
2727
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
28+
var sqlTextTrasformation = CommonGen.GetSqlTransformations(query, queryTextConstant);
2829
connectionOpen = connectionOpen.AppendSemicolonUnlessEmpty();
2930
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
3031

3132
string GetAsDapper()
3233
{
33-
var args = CommonGen.GetParameterListForDapper(query.Params);
34+
var dapperParamsSection = CommonGen.GetParameterListForDapper(query.Params);
35+
var dapperArgs = dapperParamsSection != string.Empty ? $", {Variable.DapperParams.AsVarName()}" : string.Empty;
3436
return $$"""
3537
using ({{establishConnection}})
36-
{
37-
return await connection.QuerySingleAsync<{{dbDriver.GetIdColumnType()}}>({{queryTextConstant}}{{args}});
38+
{{{sqlTextTrasformation}}{{dapperParamsSection}}
39+
return await connection.QuerySingleAsync<{{dbDriver.GetIdColumnType()}}>({{queryTextConstant}}{{dapperArgs}});
3840
}
3941
""";
4042
}
4143

4244
string GetAsDriver()
4345
{
44-
var sqlcSliceSection = CommonGen.GetSqlTransformations(query, queryTextConstant);
45-
var createSqlCommand = dbDriver.CreateSqlCommand(sqlcSliceSection != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
46+
var createSqlCommand = dbDriver.CreateSqlCommand(sqlTextTrasformation != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
4647
var commandParameters = CommonGen.GetCommandParameters(query.Params).JoinByNewLine();
4748
var returnLastId = ((IExecLastId)dbDriver).GetLastIdStatement().JoinByNewLine();
4849
return $$"""
4950
using ({{establishConnection}})
5051
{
51-
{{connectionOpen}}{{sqlcSliceSection}}
52+
{{connectionOpen}}{{sqlTextTrasformation}}
5253
using ({{createSqlCommand}})
5354
{
5455
{{commandParameters}}

Drivers/Generators/ExecRowsDeclareGen.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,29 @@ public MemberDeclarationSyntax Generate(string queryTextConstant, string argInte
2424
private string GetMethodBody(string queryTextConstant, Query query)
2525
{
2626
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
27+
var sqlTextTrasformation = CommonGen.GetSqlTransformations(query, queryTextConstant);
2728
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
2829

2930
string GetAsDapper()
3031
{
31-
var args = CommonGen.GetParameterListForDapper(query.Params);
32+
var dapperParamsSection = CommonGen.GetParameterListForDapper(query.Params);
33+
var dapperArgs = dapperParamsSection != string.Empty ? $", {Variable.DapperParams.AsVarName()}" : string.Empty;
3234
return $$"""
3335
using ({{establishConnection}})
34-
{
35-
return await connection.ExecuteAsync({{queryTextConstant}}{{args}});
36+
{{{sqlTextTrasformation}}{{dapperParamsSection}}
37+
return await connection.ExecuteAsync({{queryTextConstant}}{{dapperArgs}});
3638
}
3739
""";
3840
}
3941

4042
string GetAsDriver()
4143
{
42-
var sqlcSliceSection = CommonGen.GetSqlTransformations(query, queryTextConstant);
43-
var createSqlCommand = dbDriver.CreateSqlCommand(sqlcSliceSection != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
44+
var createSqlCommand = dbDriver.CreateSqlCommand(sqlTextTrasformation != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
4445
var commandParameters = CommonGen.GetCommandParameters(query.Params);
4546
return $$"""
4647
using ({{establishConnection}})
4748
{
48-
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlcSliceSection}}
49+
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlTextTrasformation}}
4950
using ({{createSqlCommand}})
5051
{
5152
{{commandParameters.JoinByNewLine()}}

Drivers/Generators/ManyDeclareGen.cs

+8-6
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,27 @@ 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 sqlTextTrasformation = CommonGen.GetSqlTransformations(query, queryTextConstant);
2829
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
2930

3031
string GetAsDapper()
3132
{
32-
var args = CommonGen.GetParameterListForDapper(query.Params);
33+
var dapperParamsSection = CommonGen.GetParameterListForDapper(query.Params);
34+
var dapperArgs = dapperParamsSection != string.Empty ? $", {Variable.DapperParams.AsVarName()}" : string.Empty;
3335
var returnType = dbDriver.AddNullableSuffix(returnInterface, true);
36+
var sqlQuery = sqlTextTrasformation != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant;
3437
return $$"""
3538
using ({{establishConnection}})
36-
{
37-
var results = await connection.QueryAsync<{{returnType}}>({{queryTextConstant}}{{args}});
39+
{{{sqlTextTrasformation}}{{dapperParamsSection}}
40+
var results = await connection.QueryAsync<{{returnType}}>({{sqlQuery}}{{dapperArgs}});
3841
return results.AsList();
3942
}
4043
""";
4144
}
4245

4346
string GetAsDriver()
4447
{
45-
var sqlcSliceSection = CommonGen.GetSqlTransformations(query, queryTextConstant);
46-
var createSqlCommand = dbDriver.CreateSqlCommand(sqlcSliceSection != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
48+
var createSqlCommand = dbDriver.CreateSqlCommand(sqlTextTrasformation != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
4749
var commandParameters = CommonGen.GetCommandParameters(query.Params);
4850
var initDataReader = CommonGen.InitDataReader();
4951
var awaitReaderRow = CommonGen.AwaitReaderRow();
@@ -57,7 +59,7 @@ string GetAsDriver()
5759
return $$"""
5860
using ({{establishConnection}})
5961
{
60-
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlcSliceSection}}
62+
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlTextTrasformation}}
6163
using ({{createSqlCommand}})
6264
{
6365
{{commandParameters.JoinByNewLine()}}

Drivers/Generators/OneDeclareGen.cs

+7-7
Original file line numberDiff line numberDiff line change
@@ -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 sqlTextTrasformation = CommonGen.GetSqlTransformations(query, queryTextConstant);
2829
return dbDriver.Options.UseDapper ? GetAsDapper() : GetAsDriver();
2930

3031
string GetAsDapper()
3132
{
32-
var args = CommonGen.GetParameterListForDapper(query.Params);
33+
var dapperParamsSection = CommonGen.GetParameterListForDapper(query.Params);
34+
var dapperArgs = dapperParamsSection != string.Empty ? $", {Variable.DapperParams.AsVarName()}" : string.Empty;
3335
var returnType = dbDriver.AddNullableSuffix(returnInterface, false);
3436
return $$"""
3537
using ({{establishConnection}})
36-
{
37-
var result = await connection.QueryFirstOrDefaultAsync<{{returnType}}>(
38-
{{queryTextConstant}}{{args}});
38+
{{{sqlTextTrasformation}}{{dapperParamsSection}}
39+
var result = await connection.QueryFirstOrDefaultAsync<{{returnType}}>({{queryTextConstant}}{{dapperArgs}});
3940
return result;
4041
}
4142
""";
4243
}
4344

4445
string GetAsDriver()
4546
{
46-
var sqlcSliceSection = CommonGen.GetSqlTransformations(query, queryTextConstant);
47-
var createSqlCommand = dbDriver.CreateSqlCommand(sqlcSliceSection != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
47+
var createSqlCommand = dbDriver.CreateSqlCommand(sqlTextTrasformation != string.Empty ? Variable.TransformedSql.AsVarName() : queryTextConstant);
4848
var commandParameters = CommonGen.GetCommandParameters(query.Params);
4949
var initDataReader = CommonGen.InitDataReader();
5050
var awaitReaderRow = CommonGen.AwaitReaderRow();
5151
var returnDataclass = CommonGen.InstantiateDataclass(query.Columns, returnInterface);
5252
return $$"""
5353
using ({{establishConnection}})
5454
{
55-
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlcSliceSection}}
55+
{{connectionOpen.AppendSemicolonUnlessEmpty()}}{{sqlTextTrasformation}}
5656
using ({{createSqlCommand}})
5757
{
5858
{{commandParameters.JoinByNewLine()}}

Drivers/Variable.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public enum Variable
1313
Result,
1414
Args,
1515
Loader,
16-
TransformedSql
16+
TransformedSql,
17+
DapperParams
1718
}
1819

1920
public static class VariablesExtensions

end2end/EndToEndTests/MySqlConnectorDapperTester.cs

+40
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using MySqlConnectorDapperExampleGen;
22
using NUnit.Framework;
3+
using NUnit.Framework.Legacy;
34
using System;
45
using System.Threading.Tasks;
56

67
namespace SqlcGenCsharpTests;
78

9+
[TestFixture]
810
public partial class MySqlConnectorDapperTester
911
{
1012
private QuerySql QuerySql { get; } = new(
@@ -15,4 +17,42 @@ public async Task EmptyTestsTable()
1517
{
1618
await QuerySql.TruncateAuthors();
1719
}
20+
21+
[Test]
22+
public async Task TestSliceIds()
23+
{
24+
var args = new QuerySql.CreateAuthorReturnIdArgs
25+
{
26+
Name = DataGenerator.GenericAuthor,
27+
Bio = DataGenerator.GenericQuote1
28+
};
29+
var insertedId1 = await QuerySql.CreateAuthorReturnId(args);
30+
var insertedId2 = await QuerySql.CreateAuthorReturnId(args);
31+
await QuerySql.CreateAuthorReturnId(args);
32+
33+
var actual = await QuerySql.SelectAuthorsWithSlice(new QuerySql.SelectAuthorsWithSliceArgs { Ids = [insertedId1, insertedId2] });
34+
35+
ClassicAssert.AreEqual(2, actual.Count);
36+
}
37+
38+
[Test]
39+
public async Task TestTwoSlices()
40+
{
41+
var args = new QuerySql.CreateAuthorReturnIdArgs
42+
{
43+
Name = DataGenerator.GenericAuthor,
44+
Bio = DataGenerator.GenericQuote1
45+
};
46+
var insertedId1 = await QuerySql.CreateAuthorReturnId(args);
47+
var insertedId2 = await QuerySql.CreateAuthorReturnId(new QuerySql.CreateAuthorReturnIdArgs
48+
{
49+
Name = DataGenerator.BojackAuthor,
50+
Bio = DataGenerator.GenericQuote1
51+
});
52+
await QuerySql.CreateAuthorReturnId(args);
53+
54+
var actual = await QuerySql.SelectAuthorsWithTwoSlices(new QuerySql.SelectAuthorsWithTwoSlicesArgs { Ids = [insertedId1, insertedId2], Names = [DataGenerator.GenericAuthor] });
55+
56+
ClassicAssert.AreEqual(1, actual.Count);
57+
}
1858
}

end2end/EndToEndTests/MySqlConnectorTester.cs

+9-19
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,14 @@ QuerySql.CopyToTestsArgs GenerateRandom()
4949
[Test]
5050
public async Task TestSliceIds()
5151
{
52-
var insertedId1 = await QuerySql.CreateAuthorReturnId(new QuerySql.CreateAuthorReturnIdArgs
52+
var args = new QuerySql.CreateAuthorReturnIdArgs
5353
{
5454
Name = DataGenerator.GenericAuthor,
5555
Bio = DataGenerator.GenericQuote1
56-
});
57-
var insertedId2 = await QuerySql.CreateAuthorReturnId(new QuerySql.CreateAuthorReturnIdArgs
58-
{
59-
Name = DataGenerator.GenericAuthor,
60-
Bio = DataGenerator.GenericQuote1
61-
});
62-
await QuerySql.CreateAuthor(new QuerySql.CreateAuthorArgs
63-
{
64-
Name = DataGenerator.GenericAuthor,
65-
Bio = DataGenerator.GenericQuote1
66-
});
56+
};
57+
var insertedId1 = await QuerySql.CreateAuthorReturnId(args);
58+
var insertedId2 = await QuerySql.CreateAuthorReturnId(args);
59+
await QuerySql.CreateAuthorReturnId(args);
6760

6861
var actual = await QuerySql.SelectAuthorsWithSlice(new QuerySql.SelectAuthorsWithSliceArgs { Ids = [insertedId1, insertedId2] });
6962

@@ -73,21 +66,18 @@ await QuerySql.CreateAuthor(new QuerySql.CreateAuthorArgs
7366
[Test]
7467
public async Task TestTwoSlices()
7568
{
76-
var insertedId1 = await QuerySql.CreateAuthorReturnId(new QuerySql.CreateAuthorReturnIdArgs
69+
var args = new QuerySql.CreateAuthorReturnIdArgs
7770
{
7871
Name = DataGenerator.GenericAuthor,
7972
Bio = DataGenerator.GenericQuote1
80-
});
73+
};
74+
var insertedId1 = await QuerySql.CreateAuthorReturnId(args);
8175
var insertedId2 = await QuerySql.CreateAuthorReturnId(new QuerySql.CreateAuthorReturnIdArgs
8276
{
8377
Name = DataGenerator.BojackAuthor,
8478
Bio = DataGenerator.GenericQuote1
8579
});
86-
await QuerySql.CreateAuthor(new QuerySql.CreateAuthorArgs
87-
{
88-
Name = DataGenerator.GenericAuthor,
89-
Bio = DataGenerator.GenericQuote1
90-
});
80+
await QuerySql.CreateAuthorReturnId(args);
9181

9282
var actual = await QuerySql.SelectAuthorsWithTwoSlices(new QuerySql.SelectAuthorsWithTwoSlicesArgs { Ids = [insertedId1, insertedId2], Names = [DataGenerator.GenericAuthor] });
9383

end2end/EndToEndTestsLegacy/MySqlConnectorDapperTester.cs

+39
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using MySqlConnectorDapperLegacyExampleGen;
22
using NUnit.Framework;
3+
using NUnit.Framework.Legacy;
34
using System;
45
using System.Threading.Tasks;
56

@@ -16,5 +17,43 @@ public async Task EmptyTestsTable()
1617
{
1718
await QuerySql.TruncateAuthors();
1819
}
20+
21+
[Test]
22+
public async Task TestSliceIds()
23+
{
24+
var sqlArgs = new QuerySql.CreateAuthorReturnIdArgs
25+
{
26+
Name = DataGenerator.GenericAuthor,
27+
Bio = DataGenerator.GenericQuote1
28+
};
29+
var insertedId1 = await QuerySql.CreateAuthorReturnId(sqlArgs);
30+
var insertedId2 = await QuerySql.CreateAuthorReturnId(sqlArgs);
31+
await QuerySql.CreateAuthorReturnId(sqlArgs);
32+
33+
var actual = await QuerySql.SelectAuthorsWithSlice(new QuerySql.SelectAuthorsWithSliceArgs { Ids = new[] { insertedId1, insertedId2 } });
34+
35+
ClassicAssert.AreEqual(2, actual.Count);
36+
}
37+
38+
[Test]
39+
public async Task TestTwoSlices()
40+
{
41+
var sqlArgs = new QuerySql.CreateAuthorReturnIdArgs
42+
{
43+
Name = DataGenerator.GenericAuthor,
44+
Bio = DataGenerator.GenericQuote1
45+
};
46+
var insertedId1 = await QuerySql.CreateAuthorReturnId(sqlArgs);
47+
var insertedId2 = await QuerySql.CreateAuthorReturnId(new QuerySql.CreateAuthorReturnIdArgs
48+
{
49+
Name = DataGenerator.BojackAuthor,
50+
Bio = DataGenerator.GenericQuote1
51+
});
52+
await QuerySql.CreateAuthorReturnId(sqlArgs);
53+
54+
var actual = await QuerySql.SelectAuthorsWithTwoSlices(new QuerySql.SelectAuthorsWithTwoSlicesArgs { Ids = new[] { insertedId1, insertedId2 }, Names = new[] { DataGenerator.GenericAuthor } });
55+
56+
ClassicAssert.AreEqual(1, actual.Count);
57+
}
1958
}
2059
}

0 commit comments

Comments
 (0)