Skip to content

Commit a672655

Browse files
feat: support JSON data type in MySQL (#257)
* feat: support JSON data type in MySQL * fix: added more JSON overrides and a way to debug example codegen * fix: added JSON support in batch mysql * fix: docs and linting * fix: add TODO * fix: re-add make target * fix: revert Dapper DefaultTypeMap line * fix: revert ConfigureSqlMapper line
1 parent c4a5e29 commit a672655

91 files changed

Lines changed: 44207 additions & 761 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CodeGenerator/CodeGenerator.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.IO;
88
using System.Linq;
99
using System.Text;
10+
using System.Text.Json;
1011
using System.Threading.Tasks;
1112
using Enum = Plugin.Enum;
1213

@@ -172,7 +173,11 @@ public Task<GenerateResponse> Generate(GenerateRequest generateRequest)
172173
if (Options.DebugRequest)
173174
return Task.FromResult(new GenerateResponse
174175
{
175-
Files = { RequestToFile(generateRequest) }
176+
Files =
177+
{
178+
RequestToJsonFile(generateRequest),
179+
RequestToProtobufFile(generateRequest)
180+
}
176181
});
177182

178183
var fileQueries = GetFileQueries();
@@ -201,10 +206,25 @@ string QueryFilenameToClassName(string filenameWithExtension)
201206
}
202207
}
203208

204-
private static Plugin.File RequestToFile(GenerateRequest request)
209+
private static ByteString GetOptionsWithoutDebugRequest(GenerateRequest request)
210+
{
211+
var text = Encoding.UTF8.GetString(request.PluginOptions.ToByteArray());
212+
var rawOptions = JsonSerializer.Deserialize<RawOptions>(text) ?? throw new InvalidOperationException();
213+
var newOptions = rawOptions with { DebugRequest = false };
214+
return ByteString.CopyFromUtf8(JsonSerializer.Serialize(request));
215+
}
216+
217+
218+
private static Plugin.File RequestToJsonFile(GenerateRequest request)
205219
{
206220
var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithIndentation());
207-
request.PluginOptions = ByteString.CopyFrom("{}", Encoding.UTF8); // TODO this resets all of the options - should reset only DebugRequest option
221+
request.PluginOptions = GetOptionsWithoutDebugRequest(request);
208222
return new Plugin.File { Name = "request.json", Contents = ByteString.CopyFromUtf8(formatter.Format(request)) };
209223
}
224+
225+
private static Plugin.File RequestToProtobufFile(GenerateRequest request)
226+
{
227+
request.PluginOptions = GetOptionsWithoutDebugRequest(request);
228+
return new Plugin.File { Name = "request.message", Contents = request.ToByteString() };
229+
}
210230
}

CodeGenerator/Generators/CsprojGen.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ namespace SqlcGenCsharp.Generators;
77

88
internal class CsprojGen(string outputDirectory, string projectName, string namespaceName, Options options)
99
{
10+
// TODO this logic needs to be moved to the Drivers project
1011
private const string DefaultDapperVersion = "2.1.66";
1112
private const string DefaultNpgsqlVersion = "8.0.6";
1213
private const string DefaultMysqlConnectorVersion = "2.4.0";
1314
private const string DefaultSqliteVersion = "9.0.0";
1415
private const string DefaultCsvHelperVersion = "33.0.1";
16+
private const string DefaultSystemTextJsonVersion = "9.0.6";
1517

1618
public File GenerateFile()
1719
{
@@ -48,18 +50,28 @@ string GetPackageReferences()
4850
{
4951
var optionalDapperPackageReference = options.UseDapper
5052
? Environment.NewLine + $""" <PackageReference Include="Dapper" Version="{GetDapperVersion(options)}"/>"""
51-
: "";
52-
var optionalCsvHelper = options.DriverName == DriverName.MySqlConnector
53+
: string.Empty;
54+
var optionalCsvHelper = options.DriverName is DriverName.MySqlConnector
5355
? Environment.NewLine + $""" <PackageReference Include="CsvHelper" Version="{DefaultCsvHelperVersion}"/>"""
54-
: "";
56+
: string.Empty;
57+
var optionalSystemTextJson = IsSystemTextJsonNeeded()
58+
? Environment.NewLine + $""" <PackageReference Include="System.Text.Json" Version="{DefaultSystemTextJsonVersion}"/>"""
59+
: string.Empty;
5560
return $"""
5661
<ItemGroup>
57-
<PackageReference Include="{options.DriverName.ToName()}" Version="{GetDriverVersion(options)}"/>{optionalDapperPackageReference}{optionalCsvHelper}
62+
<PackageReference Include="{options.DriverName.ToName()}" Version="{GetDriverVersion(options)}"/>{optionalDapperPackageReference}{optionalCsvHelper}{optionalSystemTextJson}
5863
</ItemGroup>
5964
""";
6065
}
6166
}
6267

68+
private bool IsSystemTextJsonNeeded()
69+
{
70+
if (options.DotnetFramework.IsDotnetCore())
71+
return false;
72+
return options.DriverName is DriverName.MySqlConnector or DriverName.Npgsql;
73+
}
74+
6375
private static string GetDriverVersion(Options options)
6476
{
6577
if (string.IsNullOrEmpty(options.OverrideDriverVersion))

CodeGenerator/Generators/ModelsGen.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ public File GenerateFile(
2323
Dictionary<string, Dictionary<string, Table>> tables,
2424
Dictionary<string, Dictionary<string, Enum>> enums)
2525
{
26-
var usingDirectives = dbDriver.GetUsingDirectivesForModels();
26+
var usingDirectives = dbDriver
27+
.GetUsingDirectivesForModels()
28+
.Select(x => UsingDirective(ParseName(x)))
29+
.ToArray();
2730
var dataclassModels = GenerateDataClasses(tables);
2831
var enumModels = GenerateEnums(enums);
32+
var models = dataclassModels.Concat(enumModels).ToArray();
2933

30-
var root = RootGen.CompilationRootGen(
31-
IdentifierName(namespaceName),
32-
usingDirectives,
33-
dataclassModels.Concat(enumModels).ToArray());
34+
var root = RootGen.CompilationRootGen(IdentifierName(namespaceName), usingDirectives, models);
3435
root = root.AddCommentOnTop(Consts.AutoGeneratedComment);
3536

3637
return new File

CodeGenerator/Generators/QueriesGen.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,10 @@ private static CompilationUnitSyntax AddResharperDisables(CompilationUnitSyntax
4949
private (UsingDirectiveSyntax[], MemberDeclarationSyntax) GenerateClass(IEnumerable<Query> queries,
5050
string className)
5151
{
52-
var usingDirectives = dbDriver.GetUsingDirectivesForQueries();
52+
var usingDirectives = dbDriver
53+
.GetUsingDirectivesForQueries()
54+
.Select(x => UsingDirective(ParseName(x)))
55+
.ToArray();
5356
var classMembers = queries.SelectMany(GetMembersForSingleQuery);
5457
return (usingDirectives, GetClassDeclaration(className, classMembers));
5558
}

CodeGenerator/Generators/UtilsGen.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.CodeAnalysis.CSharp.Syntax;
22
using SqlcGenCsharp.Drivers;
3+
using System.Linq;
34
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
45
using File = Plugin.File;
56

@@ -19,8 +20,12 @@ internal class UtilsGen(DbDriver dbDriver, string namespaceName)
1920
if (classImpl == null)
2021
return null;
2122

23+
var usingDirectives = dbDriver
24+
.GetUsingDirectivesForUtils()
25+
.Select(x => UsingDirective(ParseName(x)))
26+
.ToArray();
2227
var root = RootGen.CompilationRootGen(
23-
IdentifierName(NamespaceName), dbDriver.GetUsingDirectivesForUtils(), [classImpl]);
28+
IdentifierName(NamespaceName), usingDirectives, [classImpl]);
2429
root = root.AddCommentOnTop(Consts.AutoGeneratedComment);
2530

2631
return new File

CodegenTests/test-requests/DefaultSchemaEnum/request.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,5 @@
101101
}
102102
],
103103
"sqlc_version": "v1.27.0",
104-
"plugin_options": "e30="
104+
"plugin_options": "eyJTZXR0aW5ncyI6eyJWZXJzaW9uIjoiMiIsIkVuZ2luZSI6Im15c3FsIiwiU2NoZW1hIjpbIkNvZGVnZW5UZXN0cy90ZXN0LXJlcXVlc3RzL0RlZmF1bHRTY2hlbWFFbnVtL3NjaGVtYS5zcWwiXSwiUXVlcmllcyI6WyJDb2RlZ2VuVGVzdHMvdGVzdC1yZXF1ZXN0cy9EZWZhdWx0U2NoZW1hRW51bS9xdWVyeS5zcWwiXSwiQ29kZWdlbiI6eyJPdXQiOiIuL0NvZGVnZW5UZXN0cy90ZXN0LXJlcXVlc3RzL0RlZmF1bHRTY2hlbWFFbnVtIiwiUGx1Z2luIjoiY3NoYXJwIiwiT3B0aW9ucyI6WzEyMywzNCwxMDAsMTAxLDk4LDExNywxMDMsODIsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMzQsNTgsMTE2LDExNCwxMTcsMTAxLDEyNV0sIkVudiI6W10sIlByb2Nlc3MiOnsiQ21kIjoiLi9kaXN0L0xvY2FsUnVubmVyIn0sIldhc20iOm51bGx9fSwiQ2F0YWxvZyI6eyJDb21tZW50IjoiIiwiRGVmYXVsdFNjaGVtYSI6InB1YmxpYyIsIk5hbWUiOiIiLCJTY2hlbWFzIjpbeyJDb21tZW50IjoiIiwiTmFtZSI6InB1YmxpYyIsIlRhYmxlcyI6W3siUmVsIjp7IkNhdGFsb2ciOiIiLCJTY2hlbWEiOiIiLCJOYW1lIjoiZHVtbXlfdGFibGUifSwiQ29sdW1ucyI6W3siTmFtZSI6ImR1bW15X2NvbHVtbiIsIk5vdE51bGwiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiQ29tbWVudCI6IiIsIkxlbmd0aCI6MSwiSXNOYW1lZFBhcmFtIjpmYWxzZSwiSXNGdW5jQ2FsbCI6ZmFsc2UsIlNjb3BlIjoiIiwiVGFibGUiOnsiQ2F0YWxvZyI6IiIsIlNjaGVtYSI6IiIsIk5hbWUiOiJkdW1teV90YWJsZSJ9LCJUYWJsZUFsaWFzIjoiIiwiVHlwZSI6eyJDYXRhbG9nIjoiIiwiU2NoZW1hIjoiIiwiTmFtZSI6ImR1bW15X3RhYmxlX2R1bW15X2NvbHVtbiJ9LCJJc1NxbGNTbGljZSI6ZmFsc2UsIkVtYmVkVGFibGUiOm51bGwsIk9yaWdpbmFsTmFtZSI6IiIsIlVuc2lnbmVkIjpmYWxzZSwiQXJyYXlEaW1zIjowfV0sIkNvbW1lbnQiOiIifV0sIkVudW1zIjpbeyJOYW1lIjoiZHVtbXlfdGFibGVfZHVtbXlfY29sdW1uIiwiVmFscyI6WyJ4IiwieSJdLCJDb21tZW50IjoiIn1dLCJDb21wb3NpdGVUeXBlcyI6W119XX0sIlF1ZXJpZXMiOlt7IlRleHQiOiJTRUxFQ1QgZHVtbXlfY29sdW1uIEZST00gZHVtbXlfdGFibGUgTElNSVQgMSIsIk5hbWUiOiJUZXN0T25lIiwiQ21kIjoiOm9uZSIsIkNvbHVtbnMiOlt7Ik5hbWUiOiJkdW1teV9jb2x1bW4iLCJOb3ROdWxsIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIkNvbW1lbnQiOiIiLCJMZW5ndGgiOjEsIklzTmFtZWRQYXJhbSI6ZmFsc2UsIklzRnVuY0NhbGwiOmZhbHNlLCJTY29wZSI6IiIsIlRhYmxlIjp7IkNhdGFsb2ciOiIiLCJTY2hlbWEiOiIiLCJOYW1lIjoiZHVtbXlfdGFibGUifSwiVGFibGVBbGlhcyI6IiIsIlR5cGUiOnsiQ2F0YWxvZyI6IiIsIlNjaGVtYSI6IiIsIk5hbWUiOiJkdW1teV90YWJsZV9kdW1teV9jb2x1bW4ifSwiSXNTcWxjU2xpY2UiOmZhbHNlLCJFbWJlZFRhYmxlIjpudWxsLCJPcmlnaW5hbE5hbWUiOiJkdW1teV9jb2x1bW4iLCJVbnNpZ25lZCI6ZmFsc2UsIkFycmF5RGltcyI6MH1dLCJQYXJhbXMiOltdLCJDb21tZW50cyI6W10sIkZpbGVuYW1lIjoicXVlcnkuc3FsIiwiSW5zZXJ0SW50b1RhYmxlIjpudWxsfSx7IlRleHQiOiJJTlNFUlQgSU5UTyBkdW1teV90YWJsZSAoZHVtbXlfY29sdW1uKSBWQUxVRVMgKD8pIiwiTmFtZSI6IlRlc3RJbnNlcnQiLCJDbWQiOiI6ZXhlYyIsIkNvbHVtbnMiOltdLCJQYXJhbXMiOlt7Ik51bWJlciI6MSwiQ29sdW1uIjp7Ik5hbWUiOiJkdW1teV9jb2x1bW4iLCJOb3ROdWxsIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIkNvbW1lbnQiOiIiLCJMZW5ndGgiOjEsIklzTmFtZWRQYXJhbSI6ZmFsc2UsIklzRnVuY0NhbGwiOmZhbHNlLCJTY29wZSI6IiIsIlRhYmxlIjp7IkNhdGFsb2ciOiIiLCJTY2hlbWEiOiJwdWJsaWMiLCJOYW1lIjoiZHVtbXlfdGFibGUifSwiVGFibGVBbGlhcyI6IiIsIlR5cGUiOnsiQ2F0YWxvZyI6IiIsIlNjaGVtYSI6IiIsIk5hbWUiOiJkdW1teV90YWJsZV9kdW1teV9jb2x1bW4ifSwiSXNTcWxjU2xpY2UiOmZhbHNlLCJFbWJlZFRhYmxlIjpudWxsLCJPcmlnaW5hbE5hbWUiOiJkdW1teV9jb2x1bW4iLCJVbnNpZ25lZCI6ZmFsc2UsIkFycmF5RGltcyI6MH19XSwiQ29tbWVudHMiOltdLCJGaWxlbmFtZSI6InF1ZXJ5LnNxbCIsIkluc2VydEludG9UYWJsZSI6eyJDYXRhbG9nIjoiIiwiU2NoZW1hIjoiIiwiTmFtZSI6ImR1bW15X3RhYmxlIn19XSwiU3FsY1ZlcnNpb24iOiJ2MS4yNy4wIiwiUGx1Z2luT3B0aW9ucyI6WzEyMywzNCwxMDAsMTAxLDk4LDExNywxMDMsODIsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMzQsNTgsMTE2LDExNCwxMTcsMTAxLDEyNV0sIkdsb2JhbE9wdGlvbnMiOltdfQ=="
105105
}

0 commit comments

Comments
 (0)