Skip to content

Commit 20135b2

Browse files
fix: move sqlc config files to be have generated indicator + refactor
1 parent a672655 commit 20135b2

40 files changed

Lines changed: 149 additions & 166 deletions

File tree

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,4 @@ jobs:
126126
- name: Verify pushed codegen requests are synced
127127
run: |
128128
dotnet publish LocalRunner -c release --output dist/
129-
sqlc -f sqlc.requests.yaml diff
129+
sqlc -f sqlc.request.generated.yaml diff

CodeGenerator/Generators/ModelsGen.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Plugin;
33
using SqlcGenCsharp.Drivers;
44
using System.Collections.Generic;
5+
using System.Collections.Immutable;
56
using System.Linq;
67
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
78

@@ -25,6 +26,7 @@ public File GenerateFile(
2526
{
2627
var usingDirectives = dbDriver
2728
.GetUsingDirectivesForModels()
29+
.OrderBy(x => x)
2830
.Select(x => UsingDirective(ParseName(x)))
2931
.ToArray();
3032
var dataclassModels = GenerateDataClasses(tables);

CodeGenerator/Generators/QueriesGen.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ private static CompilationUnitSyntax AddResharperDisables(CompilationUnitSyntax
5151
{
5252
var usingDirectives = dbDriver
5353
.GetUsingDirectivesForQueries()
54+
.OrderBy(x => x)
5455
.Select(x => UsingDirective(ParseName(x)))
5556
.ToArray();
5657
var classMembers = queries.SelectMany(GetMembersForSingleQuery);

CodeGenerator/Generators/UtilsGen.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ internal class UtilsGen(DbDriver dbDriver, string namespaceName)
2222

2323
var usingDirectives = dbDriver
2424
.GetUsingDirectivesForUtils()
25+
.OrderBy(x => x)
2526
.Select(x => UsingDirective(ParseName(x)))
2627
.ToArray();
2728
var root = RootGen.CompilationRootGen(

Drivers/DbDriver.cs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ public abstract class DbDriver
2626
private HashSet<string> NullableTypesInDotnetCore { get; } =
2727
[
2828
"string",
29-
"object",
30-
"byte[]"
31-
]; // TODO add arrays in here in a non hard-coded manner
29+
"object"
30+
];
3231

3332
private HashSet<string> NullableTypes { get; } =
3433
[
@@ -54,7 +53,7 @@ public abstract class DbDriver
5453

5554
public abstract Dictionary<string, ColumnMapping> ColumnMappings { get; }
5655

57-
private Dictionary<string, Tuple<string, string>> KnownMappings { get; } = new()
56+
protected virtual Dictionary<string, Tuple<string, string?>> KnownMappings { get; } = new()
5857
{
5958
{
6059
"JsonElement",
@@ -121,26 +120,14 @@ protected DbDriver(
121120

122121
public virtual ISet<string> GetUsingDirectivesForQueries()
123122
{
124-
var usingDirectives = new HashSet<string>
123+
return new HashSet<string>
125124
{
126125
"System",
127126
"System.Collections.Generic",
128127
"System.Threading.Tasks"
129-
}.AddIf("Dapper", Options.UseDapper);
130-
131-
foreach (var query in Queries)
132-
{
133-
foreach (var column in query.Columns)
134-
{
135-
var csharpType = GetCsharpTypeWithoutNullableSuffix(column, query);
136-
if (!ColumnMappings.ContainsKey(csharpType))
137-
continue;
138-
139-
var columnMapping = ColumnMappings[GetCsharpTypeWithoutNullableSuffix(column, query)];
140-
usingDirectives.AddIfNotNull(columnMapping.UsingDirective);
141128
}
142-
}
143-
return usingDirectives;
129+
.AddIf("Dapper", Options.UseDapper)
130+
.AddRange(GetUsingDirectivesForColumnMappings());
144131
}
145132

146133
public virtual ISet<string> GetUsingDirectivesForModels()
@@ -214,8 +201,8 @@ public virtual MemberDeclarationSyntax[] GetMemberDeclarationsForUtils()
214201
return [.. memberDeclarations];
215202

216203
memberDeclarations.AddRange(KnownMappings
217-
.Where(m => TypeExistsInQueries(m.Key))
218-
.Select(m => ParseMemberDeclaration(m.Value.Item2)!));
204+
.Where(m => TypeExistsInQueries(m.Key) && m.Value.Item2 is not null)
205+
.Select(m => ParseMemberDeclaration(m.Value.Item2!)!));
219206

220207
return [.. memberDeclarations,
221208
ParseMemberDeclaration($$"""

Drivers/NpgsqlDriver.cs

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.CodeAnalysis.CSharp.Syntax;
22
using Plugin;
33
using SqlcGenCsharp.Drivers.Generators;
4+
using System;
45
using System.Collections.Generic;
56
using System.Linq;
67
using System.Text.RegularExpressions;
@@ -14,7 +15,7 @@ public NpgsqlDriver(
1415
Options options,
1516
string defaultSchema,
1617
Dictionary<string, Dictionary<string, Table>> tables,
17-
Dictionary<string, Dictionary<string, Enum>> enums,
18+
Dictionary<string, Dictionary<string, Plugin.Enum>> enums,
1819
IList<Query> queries) :
1920
base(options, defaultSchema, tables, enums, queries)
2021
{
@@ -153,51 +154,58 @@ public NpgsqlDriver(
153154
{
154155
{ "point", new DbTypeInfo(NpgsqlTypeOverride: "NpgsqlDbType.Point") }
155156
},
156-
ordinal => $"reader.GetFieldValue<NpgsqlPoint>({ordinal})"
157+
ordinal => $"reader.GetFieldValue<NpgsqlPoint>({ordinal})",
158+
usingDirective: "NpgsqlTypes"
157159
),
158160
["NpgsqlLine"] = new ColumnMapping(
159161
new Dictionary<string, DbTypeInfo>
160162
{
161163
{ "line", new DbTypeInfo(NpgsqlTypeOverride: "NpgsqlDbType.Line") }
162164
},
163-
ordinal => $"reader.GetFieldValue<NpgsqlLine>({ordinal})"
165+
ordinal => $"reader.GetFieldValue<NpgsqlLine>({ordinal})",
166+
usingDirective: "NpgsqlTypes"
164167
),
165168
["NpgsqlLSeg"] = new ColumnMapping(
166169
new Dictionary<string, DbTypeInfo>
167170
{
168171
{ "lseg", new DbTypeInfo(NpgsqlTypeOverride: "NpgsqlDbType.LSeg") }
169172
},
170-
ordinal => $"reader.GetFieldValue<NpgsqlLSeg>({ordinal})"
173+
ordinal => $"reader.GetFieldValue<NpgsqlLSeg>({ordinal})",
174+
usingDirective: "NpgsqlTypes"
171175
),
172176
["NpgsqlBox"] = new ColumnMapping(
173177
new Dictionary<string, DbTypeInfo>
174178
{
175179
{ "box", new DbTypeInfo(NpgsqlTypeOverride: "NpgsqlDbType.Box") }
176180
},
177-
ordinal => $"reader.GetFieldValue<NpgsqlBox>({ordinal})"
181+
ordinal => $"reader.GetFieldValue<NpgsqlBox>({ordinal})",
182+
usingDirective: "NpgsqlTypes"
178183
),
179184
["NpgsqlPath"] = new ColumnMapping(
180185
new Dictionary<string, DbTypeInfo>
181186
{
182187
{ "path", new DbTypeInfo(NpgsqlTypeOverride: "NpgsqlDbType.Path") }
183188
},
184-
ordinal => $"reader.GetFieldValue<NpgsqlPath>({ordinal})"
189+
ordinal => $"reader.GetFieldValue<NpgsqlPath>({ordinal})",
190+
usingDirective: "NpgsqlTypes"
185191
),
186192
["NpgsqlPolygon"] = new ColumnMapping(
187193
new Dictionary<string, DbTypeInfo>
188194
{
189195
{ "polygon", new DbTypeInfo(NpgsqlTypeOverride: "NpgsqlDbType.Polygon") }
190196
},
191-
ordinal => $"reader.GetFieldValue<NpgsqlPolygon>({ordinal})"
197+
ordinal => $"reader.GetFieldValue<NpgsqlPolygon>({ordinal})",
198+
usingDirective: "NpgsqlTypes"
192199
),
193200
["NpgsqlCircle"] = new ColumnMapping(
194201
new Dictionary<string, DbTypeInfo>
195202
{
196203
{ "circle", new DbTypeInfo(NpgsqlTypeOverride: "NpgsqlDbType.Circle") }
197204
},
198-
ordinal => $"reader.GetFieldValue<NpgsqlCircle>({ordinal})"
205+
ordinal => $"reader.GetFieldValue<NpgsqlCircle>({ordinal})",
206+
usingDirective: "NpgsqlTypes"
199207
),
200-
["object[]"] = new ColumnMapping(
208+
["object"] = new ColumnMapping(
201209
new Dictionary<string, DbTypeInfo>
202210
{
203211
{ "anyarray", new DbTypeInfo() }
@@ -206,14 +214,45 @@ public NpgsqlDriver(
206214
)
207215
};
208216

217+
protected sealed override Dictionary<string, Tuple<string, string?>> KnownMappings { get; } = new()
218+
{
219+
{
220+
"NpgsqlPoint",
221+
new("RegisterNpgsqlTypeHandler<NpgsqlPoint>();", null)
222+
},
223+
{
224+
"NpgsqlLine",
225+
new("RegisterNpgsqlTypeHandler<NpgsqlLine>();", null)
226+
},
227+
{
228+
"NpgsqlLSeg",
229+
new("RegisterNpgsqlTypeHandler<NpgsqlLSeg>();", null)
230+
},
231+
{
232+
"NpgsqlBox",
233+
new("RegisterNpgsqlTypeHandler<NpgsqlBox>();", null)
234+
},
235+
{
236+
"NpgsqlPath",
237+
new("RegisterNpgsqlTypeHandler<NpgsqlPath>();", null)
238+
},
239+
{
240+
"NpgsqlPolygon",
241+
new("RegisterNpgsqlTypeHandler<NpgsqlPolygon>();", null)
242+
},
243+
{
244+
"NpgsqlCircle",
245+
new("RegisterNpgsqlTypeHandler<NpgsqlCircle>();", null)
246+
}
247+
};
248+
209249
public override string TransactionClassName => "NpgsqlTransaction";
210250

211251
public override ISet<string> GetUsingDirectivesForQueries()
212252
{
213253
return base.GetUsingDirectivesForQueries().AddRange(
214254
[
215255
"Npgsql",
216-
"NpgsqlTypes",
217256
"System.Data"
218257
]);
219258
}
@@ -222,7 +261,6 @@ public override ISet<string> GetUsingDirectivesForModels()
222261
{
223262
return base.GetUsingDirectivesForModels().AddRange(
224263
[
225-
"NpgsqlTypes",
226264
"System"
227265
]);
228266
}
@@ -280,17 +318,7 @@ private static void RegisterNpgsqlTypeHandler<T>(){{optionalDotnetCoreSuffix}}
280318

281319
protected override ISet<string> GetConfigureSqlMappings()
282320
{
283-
return base.GetConfigureSqlMappings().AddRange(
284-
[
285-
"RegisterNpgsqlTypeHandler<NpgsqlPoint>();",
286-
"RegisterNpgsqlTypeHandler<NpgsqlLine>();",
287-
"RegisterNpgsqlTypeHandler<NpgsqlLSeg>();",
288-
"RegisterNpgsqlTypeHandler<NpgsqlBox>();",
289-
"RegisterNpgsqlTypeHandler<NpgsqlPath>();",
290-
"RegisterNpgsqlTypeHandler<NpgsqlPolygon>();",
291-
"RegisterNpgsqlTypeHandler<NpgsqlCircle>();",
292-
"SqlMapper.AddTypeHandler(typeof(JsonElement), new JsonElementTypeHandler());"
293-
]);
321+
return base.GetConfigureSqlMappings().AddRange(KnownMappings.Values.Select(x => x.Item1));
294322
}
295323

296324
// TODO different operations require different types of connections - improve code and docs to make it clearer

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ sync-sqlc-options:
2323
./scripts/sync_sqlc_options.sh
2424

2525
sqlc-generate-requests: dotnet-publish-process
26-
SQLCCACHE=./; sqlc -f sqlc.requests.yaml generate
26+
SQLCCACHE=./; sqlc -f sqlc.request.generated.yaml generate
2727

2828
sqlc-generate: sync-sqlc-options dotnet-publish-process sqlc-generate-requests
29-
SQLCCACHE=./; sqlc -f sqlc.local.yaml generate
29+
SQLCCACHE=./; sqlc -f sqlc.local.generated.yaml generate
3030

3131
test-plugin: unit-tests sqlc-generate generate-end2end-tests dotnet-build run-end2end-tests
3232

examples/MySqlConnectorDapperExample/Models.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// auto-generated by sqlc - do not edit
2-
using System.Text.Json;
32
using System;
43
using System.Collections.Generic;
4+
using System.Text.Json;
55

66
namespace MySqlConnectorDapperExampleGen;
77
public class Author

examples/MySqlConnectorDapperExample/QuerySql.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@
44
// ReSharper disable ConvertToUsingDeclaration
55
// ReSharper disable NotAccessedPositionalProperty.Global
66
// ReSharper disable UnusedAutoPropertyAccessor.Global
7-
using System;
8-
using System.Collections.Generic;
9-
using System.Threading.Tasks;
7+
using CsvHelper;
8+
using CsvHelper.Configuration;
9+
using CsvHelper.TypeConversion;
1010
using Dapper;
11-
using System.Text.Json;
1211
using MySqlConnector;
12+
using System;
13+
using System.Collections.Generic;
1314
using System.Globalization;
1415
using System.IO;
15-
using CsvHelper;
16-
using CsvHelper.Configuration;
17-
using CsvHelper.TypeConversion;
1816
using System.Text;
17+
using System.Text.Json;
18+
using System.Threading.Tasks;
1919

2020
namespace MySqlConnectorDapperExampleGen;
2121
public class QuerySql

examples/MySqlConnectorDapperExample/Utils.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// auto-generated by sqlc - do not edit
2-
using System.Linq;
3-
using System.Data;
4-
using Dapper;
5-
using System.Text.Json;
6-
using CsvHelper.TypeConversion;
72
using CsvHelper;
83
using CsvHelper.Configuration;
4+
using CsvHelper.TypeConversion;
5+
using Dapper;
6+
using System.Data;
7+
using System.Linq;
8+
using System.Text.Json;
99

1010
namespace MySqlConnectorDapperExampleGen;
1111
public static class Utils

0 commit comments

Comments
 (0)