Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
20135b2
fix: move sqlc config files to be have generated indicator + refactor
SockworkOrange Jul 12, 2025
15d8c2e
fix: more code refactoring
SockworkOrange Jul 12, 2025
0238e11
fix: columns mapping refactoring
SockworkOrange Jul 12, 2025
c64b31d
fix: more TODOs
SockworkOrange Jul 13, 2025
a97b56c
fix: refactor id column type logic
SockworkOrange Jul 13, 2025
22f221f
feat: added option to override field for all queries
SockworkOrange Jul 13, 2025
e4c9ca4
fix: update override field for all queries doc
SockworkOrange Jul 13, 2025
50d30d9
fix: add Postgres JSON types
SockworkOrange Jul 14, 2025
31a8b0d
feat: add tests for :copyfrom geo types in Postgres
SockworkOrange Jul 14, 2025
9761e78
fix: geo postgres types docs
SockworkOrange Jul 14, 2025
440817b
feat: add support for bpchar Postgres type
SockworkOrange Jul 14, 2025
2efe6bc
feat: add support for JSONB Postgres field
SockworkOrange Jul 14, 2025
44feb44
feat: support more array types in Postgres
SockworkOrange Jul 14, 2025
11afe81
fix: indicate no support for time with time zone Postgres data type
SockworkOrange Jul 15, 2025
58880ae
feat: support uuid Postgres data type
SockworkOrange Jul 15, 2025
c319c6b
feat: support uuid Postgres data type in :copyfrom
SockworkOrange Jul 15, 2025
cca3dda
feat: support interval Postgres data type with and without :copyfrom
SockworkOrange Jul 15, 2025
458cd12
feat: support JSONPATH Postgres data type
SockworkOrange Jul 15, 2025
bbc8445
feat: support Postgres network data types
SockworkOrange Jul 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,4 @@ jobs:
- name: Verify pushed codegen requests are synced
run: |
dotnet publish LocalRunner -c release --output dist/
sqlc -f sqlc.requests.yaml diff
sqlc -f sqlc.request.generated.yaml diff
15 changes: 7 additions & 8 deletions CodeGenerator/CodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,6 @@ private Dictionary<string, Dictionary<string, Table>> ConstructTablesLookup(Cata

/// <summary>
/// Enums in the request exist only in the default schema (in mysql), this remaps enums to their original schema.
/// Unusual behavior we might have to fix in the future - TODO
/// </summary>
/// <param name="catalog"></param>
/// <returns></returns>
Expand Down Expand Up @@ -180,12 +179,13 @@ public Task<GenerateResponse> Generate(GenerateRequest generateRequest)
}
});

var fileQueries = GetFileQueries();
var files = fileQueries
var files = GetFileQueries()
.Select(fq => QueriesGen.GenerateFile(fq.Value, fq.Key))
.Append(ModelsGen.GenerateFile(Tables, Enums))
.AppendIfNotNull(UtilsGen.GenerateFile())
.AppendIf(CsprojGen.GenerateFile(), Options.GenerateCsproj);
.AddRangeExcludeNulls([
ModelsGen.GenerateFile(Tables, Enums),
UtilsGen.GenerateFile()
])
.AddRangeIf([CsprojGen.GenerateFile()], Options.GenerateCsproj);

return Task.FromResult(new GenerateResponse { Files = { files } });

Expand All @@ -211,10 +211,9 @@ private static ByteString GetOptionsWithoutDebugRequest(GenerateRequest request)
var text = Encoding.UTF8.GetString(request.PluginOptions.ToByteArray());
var rawOptions = JsonSerializer.Deserialize<RawOptions>(text) ?? throw new InvalidOperationException();
var newOptions = rawOptions with { DebugRequest = false };
return ByteString.CopyFromUtf8(JsonSerializer.Serialize(request));
return ByteString.CopyFromUtf8(JsonSerializer.Serialize(newOptions));
}


private static Plugin.File RequestToJsonFile(GenerateRequest request)
{
var formatter = new JsonFormatter(JsonFormatter.Settings.Default.WithIndentation());
Expand Down
2 changes: 2 additions & 0 deletions CodeGenerator/Generators/ModelsGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Plugin;
using SqlcGenCsharp.Drivers;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

Expand All @@ -25,6 +26,7 @@ public File GenerateFile(
{
var usingDirectives = dbDriver
.GetUsingDirectivesForModels()
.OrderBy(x => x)
.Select(x => UsingDirective(ParseName(x)))
.ToArray();
var dataclassModels = GenerateDataClasses(tables);
Expand Down
28 changes: 22 additions & 6 deletions CodeGenerator/Generators/QueriesGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ private static CompilationUnitSyntax AddResharperDisables(CompilationUnitSyntax
{
var usingDirectives = dbDriver
.GetUsingDirectivesForQueries()
.OrderBy(x => x)
.Select(x => UsingDirective(ParseName(x)))
.ToArray();
var classMembers = queries.SelectMany(GetMembersForSingleQuery);
Expand All @@ -59,16 +60,27 @@ private static CompilationUnitSyntax AddResharperDisables(CompilationUnitSyntax

private ClassDeclarationSyntax GetClassDeclaration(string className, IEnumerable<MemberDeclarationSyntax> classMembers)
{
var dapperStatements = dbDriver.Options.UseDapper
? $$"""
Utils.ConfigureSqlMapper();
Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
"""
: string.Empty;
var classDeclaration = (ClassDeclarationSyntax)ParseMemberDeclaration(
$$"""
public class {{className}}
{
public {{className}}(string {{Variable.ConnectionString.AsVarName()}})
public {{className}}()
{
{{dapperStatements}}
}

public {{className}}(string {{Variable.ConnectionString.AsVarName()}}) : this()
{
{{dbDriver.GetConstructorStatements().JoinByNewLine()}}
}

private {{className}}({{dbDriver.TransactionClassName}} {{Variable.Transaction.AsVarName()}})
private {{className}}({{dbDriver.TransactionClassName}} {{Variable.Transaction.AsVarName()}}) : this()
{
{{dbDriver.GetTransactionConstructorStatements().JoinByNewLine()}}
}
Expand All @@ -90,10 +102,14 @@ private IEnumerable<MemberDeclarationSyntax> GetMembersForSingleQuery(Query quer
try
{
return new List<MemberDeclarationSyntax>()
.AppendIfNotNull(GetQueryTextConstant(query))
.AppendIfNotNull(GetQueryColumnsDataclass(query))
.AppendIfNotNull(GetQueryParamsDataclass(query))
.Append(AddMethodDeclaration(query));
.AddRangeExcludeNulls(
[
GetQueryTextConstant(query),
GetQueryColumnsDataclass(query),
GetQueryParamsDataclass(query),
AddMethodDeclaration(query)
]
);
}
catch (NotSupportedException e)
{
Expand Down
1 change: 1 addition & 0 deletions CodeGenerator/Generators/UtilsGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ internal class UtilsGen(DbDriver dbDriver, string namespaceName)

var usingDirectives = dbDriver
.GetUsingDirectivesForUtils()
.OrderBy(x => x)
.Select(x => UsingDirective(ParseName(x)))
.ToArray();
var root = RootGen.CompilationRootGen(
Expand Down
4 changes: 2 additions & 2 deletions CodegenTests/CodegenSchemaTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class CodegenSchemaTests
[Test]
public void TestDefaultSchemaEnum()
{
const string filename = "DefaultSchemaEnum/request.json";
const string filename = "DefaultSchemaEnum/request.message";
var request = TestRequestHelper.ParseRequestFile(filename);
var response = CodeGenerator.Generate(request);

Expand All @@ -34,7 +34,7 @@ public void TestDefaultSchemaEnum()
[Test]
public void TestSchemaScopedEnum()
{
const string filename = "SchemaScopedEnum/request.json";
const string filename = "SchemaScopedEnum/request.message";
var request = TestRequestHelper.ParseRequestFile(filename);
var response = CodeGenerator.Generate(request);

Expand Down
11 changes: 2 additions & 9 deletions CodegenTests/TestRequestHelper.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,16 @@
using Google.Protobuf;
using Plugin;
using System;
using System.IO;
using File = System.IO.File;

namespace CodegenTests;

public static class TestRequestHelper
{
public static GenerateRequest ParseRequestFile(string filename)
public static Plugin.GenerateRequest ParseRequestFile(string filename)
{

var baseDirectory = AppContext.BaseDirectory;
var filePath = Path.Combine(baseDirectory, "test-requests", filename);

if (!File.Exists(filePath))
throw new FileNotFoundException("File not found", filePath);
var contents = File.ReadAllText(filePath);
var jsonParserSettings = JsonParser.Settings.Default.WithIgnoreUnknownFields(true);
return new JsonParser(jsonParserSettings).Parse<GenerateRequest>(contents);
return Plugin.GenerateRequest.Parser.ParseFrom(File.ReadAllBytes(filePath));
}
}
2 changes: 1 addition & 1 deletion CodegenTests/test-requests/DefaultSchemaEnum/request.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,5 +101,5 @@
}
],
"sqlc_version": "v1.27.0",
"plugin_options": "eyJTZXR0aW5ncyI6eyJWZXJzaW9uIjoiMiIsIkVuZ2luZSI6Im15c3FsIiwiU2NoZW1hIjpbIkNvZGVnZW5UZXN0cy90ZXN0LXJlcXVlc3RzL0RlZmF1bHRTY2hlbWFFbnVtL3NjaGVtYS5zcWwiXSwiUXVlcmllcyI6WyJDb2RlZ2VuVGVzdHMvdGVzdC1yZXF1ZXN0cy9EZWZhdWx0U2NoZW1hRW51bS9xdWVyeS5zcWwiXSwiQ29kZWdlbiI6eyJPdXQiOiIuL0NvZGVnZW5UZXN0cy90ZXN0LXJlcXVlc3RzL0RlZmF1bHRTY2hlbWFFbnVtIiwiUGx1Z2luIjoiY3NoYXJwIiwiT3B0aW9ucyI6WzEyMywzNCwxMDAsMTAxLDk4LDExNywxMDMsODIsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMzQsNTgsMTE2LDExNCwxMTcsMTAxLDEyNV0sIkVudiI6W10sIlByb2Nlc3MiOnsiQ21kIjoiLi9kaXN0L0xvY2FsUnVubmVyIn0sIldhc20iOm51bGx9fSwiQ2F0YWxvZyI6eyJDb21tZW50IjoiIiwiRGVmYXVsdFNjaGVtYSI6InB1YmxpYyIsIk5hbWUiOiIiLCJTY2hlbWFzIjpbeyJDb21tZW50IjoiIiwiTmFtZSI6InB1YmxpYyIsIlRhYmxlcyI6W3siUmVsIjp7IkNhdGFsb2ciOiIiLCJTY2hlbWEiOiIiLCJOYW1lIjoiZHVtbXlfdGFibGUifSwiQ29sdW1ucyI6W3siTmFtZSI6ImR1bW15X2NvbHVtbiIsIk5vdE51bGwiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiQ29tbWVudCI6IiIsIkxlbmd0aCI6MSwiSXNOYW1lZFBhcmFtIjpmYWxzZSwiSXNGdW5jQ2FsbCI6ZmFsc2UsIlNjb3BlIjoiIiwiVGFibGUiOnsiQ2F0YWxvZyI6IiIsIlNjaGVtYSI6IiIsIk5hbWUiOiJkdW1teV90YWJsZSJ9LCJUYWJsZUFsaWFzIjoiIiwiVHlwZSI6eyJDYXRhbG9nIjoiIiwiU2NoZW1hIjoiIiwiTmFtZSI6ImR1bW15X3RhYmxlX2R1bW15X2NvbHVtbiJ9LCJJc1NxbGNTbGljZSI6ZmFsc2UsIkVtYmVkVGFibGUiOm51bGwsIk9yaWdpbmFsTmFtZSI6IiIsIlVuc2lnbmVkIjpmYWxzZSwiQXJyYXlEaW1zIjowfV0sIkNvbW1lbnQiOiIifV0sIkVudW1zIjpbeyJOYW1lIjoiZHVtbXlfdGFibGVfZHVtbXlfY29sdW1uIiwiVmFscyI6WyJ4IiwieSJdLCJDb21tZW50IjoiIn1dLCJDb21wb3NpdGVUeXBlcyI6W119XX0sIlF1ZXJpZXMiOlt7IlRleHQiOiJTRUxFQ1QgZHVtbXlfY29sdW1uIEZST00gZHVtbXlfdGFibGUgTElNSVQgMSIsIk5hbWUiOiJUZXN0T25lIiwiQ21kIjoiOm9uZSIsIkNvbHVtbnMiOlt7Ik5hbWUiOiJkdW1teV9jb2x1bW4iLCJOb3ROdWxsIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIkNvbW1lbnQiOiIiLCJMZW5ndGgiOjEsIklzTmFtZWRQYXJhbSI6ZmFsc2UsIklzRnVuY0NhbGwiOmZhbHNlLCJTY29wZSI6IiIsIlRhYmxlIjp7IkNhdGFsb2ciOiIiLCJTY2hlbWEiOiIiLCJOYW1lIjoiZHVtbXlfdGFibGUifSwiVGFibGVBbGlhcyI6IiIsIlR5cGUiOnsiQ2F0YWxvZyI6IiIsIlNjaGVtYSI6IiIsIk5hbWUiOiJkdW1teV90YWJsZV9kdW1teV9jb2x1bW4ifSwiSXNTcWxjU2xpY2UiOmZhbHNlLCJFbWJlZFRhYmxlIjpudWxsLCJPcmlnaW5hbE5hbWUiOiJkdW1teV9jb2x1bW4iLCJVbnNpZ25lZCI6ZmFsc2UsIkFycmF5RGltcyI6MH1dLCJQYXJhbXMiOltdLCJDb21tZW50cyI6W10sIkZpbGVuYW1lIjoicXVlcnkuc3FsIiwiSW5zZXJ0SW50b1RhYmxlIjpudWxsfSx7IlRleHQiOiJJTlNFUlQgSU5UTyBkdW1teV90YWJsZSAoZHVtbXlfY29sdW1uKSBWQUxVRVMgKD8pIiwiTmFtZSI6IlRlc3RJbnNlcnQiLCJDbWQiOiI6ZXhlYyIsIkNvbHVtbnMiOltdLCJQYXJhbXMiOlt7Ik51bWJlciI6MSwiQ29sdW1uIjp7Ik5hbWUiOiJkdW1teV9jb2x1bW4iLCJOb3ROdWxsIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIkNvbW1lbnQiOiIiLCJMZW5ndGgiOjEsIklzTmFtZWRQYXJhbSI6ZmFsc2UsIklzRnVuY0NhbGwiOmZhbHNlLCJTY29wZSI6IiIsIlRhYmxlIjp7IkNhdGFsb2ciOiIiLCJTY2hlbWEiOiJwdWJsaWMiLCJOYW1lIjoiZHVtbXlfdGFibGUifSwiVGFibGVBbGlhcyI6IiIsIlR5cGUiOnsiQ2F0YWxvZyI6IiIsIlNjaGVtYSI6IiIsIk5hbWUiOiJkdW1teV90YWJsZV9kdW1teV9jb2x1bW4ifSwiSXNTcWxjU2xpY2UiOmZhbHNlLCJFbWJlZFRhYmxlIjpudWxsLCJPcmlnaW5hbE5hbWUiOiJkdW1teV9jb2x1bW4iLCJVbnNpZ25lZCI6ZmFsc2UsIkFycmF5RGltcyI6MH19XSwiQ29tbWVudHMiOltdLCJGaWxlbmFtZSI6InF1ZXJ5LnNxbCIsIkluc2VydEludG9UYWJsZSI6eyJDYXRhbG9nIjoiIiwiU2NoZW1hIjoiIiwiTmFtZSI6ImR1bW15X3RhYmxlIn19XSwiU3FsY1ZlcnNpb24iOiJ2MS4yNy4wIiwiUGx1Z2luT3B0aW9ucyI6WzEyMywzNCwxMDAsMTAxLDk4LDExNywxMDMsODIsMTAxLDExMywxMTcsMTAxLDExNSwxMTYsMzQsNTgsMTE2LDExNCwxMTcsMTAxLDEyNV0sIkdsb2JhbE9wdGlvbnMiOltdfQ=="
"plugin_options": "eyJvdmVycmlkZURyaXZlclZlcnNpb24iOiIiLCJnZW5lcmF0ZUNzcHJvaiI6dHJ1ZSwidGFyZ2V0RnJhbWV3b3JrIjoibmV0OC4wIiwibmFtZXNwYWNlTmFtZSI6IiIsInVzZURhcHBlciI6ZmFsc2UsIm92ZXJyaWRlRGFwcGVyVmVyc2lvbiI6IiIsIm92ZXJyaWRlcyI6bnVsbCwiZGVidWdSZXF1ZXN0IjpmYWxzZX0="
}
Loading