Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor around special per DB methods (:copyfrom & :execlastid) #75

Merged
merged 1 commit into from
Jul 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 3 additions & 11 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,9 @@ jobs:
path: dist/plugin.wasm

codegen-tests:
name: Codegen Test
name: Codegen Tests
runs-on: ubuntu-latest
needs: [build]
strategy:
matrix:
generate-csproj: [ 'true', 'false' ]
target-framework: [ 'net8.0', 'netstandard2.0', 'netstandard2.1' ]

steps:
- uses: actions/checkout@v4
Expand All @@ -129,12 +125,8 @@ jobs:
- name: Updating plugin sha
run: ./scripts/wasm/update_sha.sh ${SQLC_CI_FILE}

- name: Codegen Test
run: ./scripts/tests/run_codegen.sh ${SQLC_CI_FILE} ${{ matrix.generate-csproj }} ${{ matrix.target-framework }}

- uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ matrix.target-framework == 'net8.0' && '8.0.x' || '3.1.x' }}
- name: Codegen Tests against matrix of configurations
run: ./scripts/tests/run_codegen_matrix.sh ${SQLC_CI_FILE}

end2end-tests:
name: End-to-End Tests
Expand Down
12 changes: 5 additions & 7 deletions CodeGenerator/CodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -233,13 +233,11 @@ private MemberDeclarationSyntax AddMethodDeclaration(Query query)

return query.Cmd switch
{
":exec" => DbDriver.ExecDeclare(query.Name, queryTextConstant, argInterface, query),
":one" => DbDriver.OneDeclare(query.Name, queryTextConstant, argInterface, returnInterface, query),
":many" => DbDriver.ManyDeclare(query.Name, queryTextConstant, argInterface, returnInterface, query),
":execlastid" => ((MySqlConnectorDriver)DbDriver)
.ExecLastIdDeclare(query.Name, queryTextConstant, argInterface, query),
":copyfrom" => ((NpgsqlDriver)DbDriver)
.CopyFromDeclare(query.Name, queryTextConstant, argInterface, query),
":exec" => DbDriver.ExecDeclare(queryTextConstant, argInterface, query),
":one" => DbDriver.OneDeclare(queryTextConstant, argInterface, returnInterface, query),
":many" => DbDriver.ManyDeclare(queryTextConstant, argInterface, returnInterface, query),
":execlastid" => ((IExecLastId)DbDriver).ExecLastIdDeclare(queryTextConstant, argInterface, query),
":copyfrom" => ((ICopyFrom)DbDriver).CopyFromDeclare(queryTextConstant, argInterface, query),
_ => throw new InvalidDataException()
};

Expand Down
8 changes: 4 additions & 4 deletions Drivers/DbDriver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,17 +59,17 @@ public string GetColumnReader(Column column, int ordinal)

public abstract string TransformQueryText(Query query);

public abstract (string, string) EstablishConnection(bool isCopyCommand = false); // TODO fix codesmell - should act upon the query object
public abstract (string, string) EstablishConnection(Query query);

public abstract string CreateSqlCommand(string sqlTextConstant);

public abstract MemberDeclarationSyntax OneDeclare(string name, string sqlTextConstant, string argInterface,
public abstract MemberDeclarationSyntax OneDeclare(string sqlTextConstant, string argInterface,
string returnInterface, Query query);

public abstract MemberDeclarationSyntax ManyDeclare(string funcName, string sqlTextConstant, string argInterface,
public abstract MemberDeclarationSyntax ManyDeclare(string sqlTextConstant, string argInterface,
string returnInterface, Query query);

public abstract MemberDeclarationSyntax ExecDeclare(string funcName, string text, string argInterface, Query query);
public abstract MemberDeclarationSyntax ExecDeclare(string text, string argInterface, Query query);

public static bool IsCsharpPrimitive(string csharpType)
{
Expand Down
81 changes: 0 additions & 81 deletions Drivers/Generators/CopyFromDeclareGen.cs

This file was deleted.

14 changes: 6 additions & 8 deletions Drivers/Generators/ExecDeclareGen.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,27 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Plugin;
using System.Collections.Generic;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace SqlcGenCsharp.Drivers.Generators;

public class ExecDeclareGen(DbDriver dbDriver)
{
public MemberDeclarationSyntax Generate(string funcName, string queryTextConstant, string argInterface,
Query query)
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface, Query query)
{
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
return ParseMemberDeclaration($$"""
public async Task {{funcName}}({{parametersStr}})
public async Task {{query.Name}}({{parametersStr}})
{
{{GetMethodBody(queryTextConstant, query.Params)}}
{{GetMethodBody(queryTextConstant, query)}}
}
""")!;
}

private string GetMethodBody(string queryTextConstant, IEnumerable<Parameter> parameters)
private string GetMethodBody(string queryTextConstant, Query query)
{
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection();
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
var commandParameters = CommonGen.GetCommandParameters(parameters);
var commandParameters = CommonGen.GetCommandParameters(query.Params);
var executeScalar = $"await {Variable.Command.Name()}.ExecuteScalarAsync();";

return dbDriver.DotnetFramework.LatestDotnetSupported()
Expand Down
71 changes: 0 additions & 71 deletions Drivers/Generators/ExecLastIdDeclareGen.cs

This file was deleted.

8 changes: 3 additions & 5 deletions Drivers/Generators/ManyDeclareGen.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Plugin;
using System.Collections.Generic;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;


Expand All @@ -10,13 +9,12 @@ public class ManyDeclareGen(DbDriver dbDriver)
{
private CommonGen CommonGen { get; } = new(dbDriver);

public MemberDeclarationSyntax Generate(string funcName, string queryTextConstant, string argInterface,
string returnInterface, Query query)
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface, string returnInterface, Query query)
{
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
var returnType = $"Task<List<{returnInterface}>>";
return ParseMemberDeclaration($$"""
public async {{returnType}} {{funcName}}({{parametersStr}})
public async {{returnType}} {{query.Name}}({{parametersStr}})
{
{{GetMethodBody(queryTextConstant, returnInterface, query)}}
}
Expand All @@ -25,7 +23,7 @@ public MemberDeclarationSyntax Generate(string funcName, string queryTextConstan

private string GetMethodBody(string queryTextConstant, string returnInterface, Query query)
{
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection();
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
var commandParameters = CommonGen.GetCommandParameters(query.Params);
var initDataReader = CommonGen.InitDataReader();
Expand Down
16 changes: 7 additions & 9 deletions Drivers/Generators/OneDeclareGen.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Plugin;
using System.Collections.Generic;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;


Expand All @@ -10,28 +9,27 @@ public class OneDeclareGen(DbDriver dbDriver)
{
private CommonGen CommonGen { get; } = new(dbDriver);

public MemberDeclarationSyntax Generate(string funcName, string queryTextConstant, string argInterface,
public MemberDeclarationSyntax Generate(string queryTextConstant, string argInterface,
string returnInterface, Query query)
{
var returnType = $"Task<{dbDriver.AddNullableSuffix(returnInterface, false)}>";
var parametersStr = CommonGen.GetParameterListAsString(argInterface, query.Params);
return ParseMemberDeclaration($$"""
public async {{returnType}} {{funcName}}({{parametersStr}})
public async {{returnType}} {{query.Name}}({{parametersStr}})
{
{{GetMethodBody(queryTextConstant, returnInterface, query.Columns, query.Params)}}
{{GetMethodBody(queryTextConstant, returnInterface, query)}}
}
""")!;
}

private string GetMethodBody(string queryTextConstant, string returnInterface,
IEnumerable<Column> columns, IEnumerable<Parameter> parameters)
private string GetMethodBody(string queryTextConstant, string returnInterface, Query query)
{
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection();
var (establishConnection, connectionOpen) = dbDriver.EstablishConnection(query);
var createSqlCommand = dbDriver.CreateSqlCommand(queryTextConstant);
var commandParameters = CommonGen.GetCommandParameters(parameters);
var commandParameters = CommonGen.GetCommandParameters(query.Params);
var initDataReader = CommonGen.InitDataReader();
var awaitReaderRow = CommonGen.AwaitReaderRow();
var returnDataclass = CommonGen.InstantiateDataclass(columns, returnInterface);
var returnDataclass = CommonGen.InstantiateDataclass(query.Columns, returnInterface);

return dbDriver.DotnetFramework.LatestDotnetSupported()
? GetWithUsingAsStatement()
Expand Down
9 changes: 9 additions & 0 deletions Drivers/ICopyFrom.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Plugin;

namespace SqlcGenCsharp.Drivers;

public interface ICopyFrom
{
MemberDeclarationSyntax CopyFromDeclare(string queryTextConstant, string argInterface, Query query);
}
9 changes: 9 additions & 0 deletions Drivers/IExecLastId.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Plugin;

namespace SqlcGenCsharp.Drivers;

public interface IExecLastId
{
MemberDeclarationSyntax ExecLastIdDeclare(string queryTextConstant, string argInterface, Query query);
}
Loading
Loading