Skip to content

Commit 70886f8

Browse files
test fixes
1 parent 3d494a3 commit 70886f8

16 files changed

+494
-462
lines changed

.env

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ SOURCE_WASM_FILE="WasmRunner/bin/Release/net8.0/wasi-wasm/AppBundle/WasmRunner.w
33
TESTS_CONTAINER_NAME="plugin-tests"
44
DB_NAME="tests"
55
DB_USER="root"
6-
DB_PASSWORD="pass"
6+
DB_PASS="pass"
77
MYSQL_HOST="mysqldb"
88
POSTGRES_HOST="postgresdb"
99
SQLC_CI_FILE="sqlc.ci.yaml"

CodeGenerator/CodeGenerator.cs

+10-14
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,6 @@ private DbDriver DbDriver
2828
set => _dbDriver = value;
2929
}
3030

31-
private void InitGenerators(GenerateRequest generateRequest)
32-
{
33-
Options = new Options(generateRequest);
34-
DbDriver = InstantiateDriver();
35-
}
36-
3731
private DbDriver InstantiateDriver()
3832
{
3933
return Options.DriverName switch
@@ -46,11 +40,12 @@ private DbDriver InstantiateDriver()
4640

4741
public Task<GenerateResponse> Generate(GenerateRequest generateRequest)
4842
{
49-
InitGenerators(generateRequest); // the request is necessary in order to know which generators are needed
43+
Options = new Options(generateRequest);
44+
DbDriver = InstantiateDriver();
5045
var fileQueries = GetFileQueries();
5146
var files = fileQueries
52-
.Select(fq => GenerateFile(fq.Value, fq.Key))
53-
.Append(GenerateGemfile());
47+
.Select(fq => GenerateFile(fq.Value, fq.Key));
48+
// .Append(GenerateGemfile());
5449

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

@@ -73,15 +68,15 @@ string QueryFilenameToClassName(string filenameWithExtension)
7368
Path.GetExtension(filenameWithExtension)[1..].FirstCharToUpper());
7469
}
7570
}
76-
71+
7772
private File GenerateFile(IEnumerable<Query> queries, string className)
7873
{
79-
var (requiredGems, classDeclaration) = GenerateClass(queries, className);
74+
var (requiredGems, moduleDeclaration) = GenerateModule(queries, className);
8075
var contents = $"""
8176
{Consts.AutoGeneratedComment}
8277
{requiredGems.Select(r => r.Build()).JoinByNewLine()}
8378
84-
{classDeclaration.Build()}
79+
{moduleDeclaration.Build()}
8580
""";
8681

8782
return new File { Name = $"{className.SnakeCase()}.rb", Contents = ByteString.CopyFromUtf8(contents) };
@@ -101,7 +96,7 @@ private File GenerateGemfile()
10196
};
10297
}
10398

104-
private (IEnumerable<RequireGem>, ClassDeclaration) GenerateClass(IEnumerable<Query> queries, string className)
99+
private (IEnumerable<RequireGem>, ModuleDeclaration) GenerateModule(IEnumerable<Query> queries, string className)
105100
{
106101
var requiredGems = DbDriver.GetRequiredGems();
107102
var initMethod = DbDriver.GetInitMethod();
@@ -116,7 +111,8 @@ private File GenerateGemfile()
116111
return members;
117112
});
118113
var classMembers = new[] { initMethod }.Concat(queryMembers);
119-
return (requiredGems, new ClassDeclaration(className, classMembers));
114+
return (requiredGems, new ModuleDeclaration($"{Options.DriverName.ToString()}Codegen",
115+
new[] { new ClassDeclaration(className, classMembers) }));
120116
}
121117

122118
private static SimpleStatement GenerateDataclass(string name, ClassMember classMember, IEnumerable<Column> columns,

Dockerfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
FROM ruby:3.0
1+
FROM ruby:3.2
22

33
# throw errors if Gemfile has been modified since Gemfile.lock
44
RUN bundle config --global frozen 1
55

66
WORKDIR /usr/src/app
77

8-
COPY Gemfile Gemfile.lock ./
8+
COPY Gemfile Gemfile.lock Rakefile ./
99
RUN bundle install
1010

1111
COPY examples examples

Drivers/DbDriver.cs

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ protected static IEnumerable<RequireGem> GetCommonGems()
1515

1616
public abstract MethodDeclaration GetInitMethod();
1717

18+
public abstract SimpleStatement PrepareStmt(string funcName, string queryTextConstant);
19+
20+
public abstract SimpleExpression ExecuteStmt(string funcName, SimpleStatement? queryParams);
21+
1822
public abstract MethodDeclaration OneDeclare(string name, string sqlTextConstant, string argInterface,
1923
string returnInterface, IList<Parameter> parameters, IList<Column> columns);
2024

Drivers/MethodGen.cs

+15-26
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace SqlcGenCsharp.Drivers;
77

88
public class MethodGen(DbDriver dbDriver)
99
{
10-
public static MethodDeclaration OneDeclare(string funcName, string queryTextConstant, string argInterface,
10+
public MethodDeclaration OneDeclare(string funcName, string queryTextConstant, string argInterface,
1111
string returnInterface, IList<Parameter> parameters, IList<Column> columns)
1212
{
1313
var newObjectExpression = new NewObject(returnInterface, GetColumnsInitExpressions(columns));
@@ -16,8 +16,8 @@ public static MethodDeclaration OneDeclare(string funcName, string queryTextCons
1616
withResourceBody = withResourceBody.AppendIfNotNull(queryParams);
1717
withResourceBody = withResourceBody.Concat(
1818
[
19-
PrepareQuery(queryTextConstant),
20-
ExecuteAndAssign(queryTextConstant, queryParams),
19+
dbDriver.PrepareStmt(funcName, queryTextConstant),
20+
ExecuteAndAssign(funcName, queryParams),
2121
new SimpleStatement(Variable.Row.AsVar(), new SimpleExpression($"{Variable.Result.AsVar()}.first")),
2222
new SimpleExpression($"return nil if {Variable.Row.AsVar()}.nil?"),
2323
new SimpleStatement($"{Variable.Entity.AsVar()}", newObjectExpression),
@@ -37,7 +37,7 @@ public static MethodDeclaration OneDeclare(string funcName, string queryTextCons
3737
return parameters.Count == 0 ? null : argInterface.SnakeCase();
3838
}
3939

40-
public static MethodDeclaration ManyDeclare(string funcName, string queryTextConstant, string argInterface,
40+
public MethodDeclaration ManyDeclare(string funcName, string queryTextConstant, string argInterface,
4141
string returnInterface, IList<Parameter> parameters, IList<Column> columns)
4242
{
4343
var listAppend = new ListAppend(Variable.Entities.AsVar(),
@@ -47,8 +47,8 @@ public static MethodDeclaration ManyDeclare(string funcName, string queryTextCon
4747
withResourceBody = withResourceBody.AppendIfNotNull(queryParams);
4848
withResourceBody = withResourceBody.Concat(
4949
[
50-
PrepareQuery(queryTextConstant),
51-
ExecuteAndAssign(queryTextConstant, queryParams),
50+
dbDriver.PrepareStmt(funcName, queryTextConstant),
51+
dbDriver.ExecuteStmt(funcName, queryParams),
5252
new SimpleStatement(Variable.Entities.AsVar(), new SimpleExpression("[]")),
5353
new ForeachLoop(Variable.Result.AsVar(), Variable.Row.AsVar(), new List<IComposable> { listAppend }),
5454
new SimpleExpression($"return {Variable.Entities.AsVar()}")
@@ -62,16 +62,16 @@ public static MethodDeclaration ManyDeclare(string funcName, string queryTextCon
6262
});
6363
}
6464

65-
public static MethodDeclaration ExecDeclare(string funcName, string queryTextConstant, string argInterface,
65+
public MethodDeclaration ExecDeclare(string funcName, string queryTextConstant, string argInterface,
6666
IList<Parameter> parameters)
6767
{
6868
IEnumerable<IComposable> withResourceBody = new List<IComposable>();
6969
var queryParams = GetQueryParams(argInterface, parameters);
7070
withResourceBody = withResourceBody.AppendIfNotNull(queryParams);
7171
withResourceBody = withResourceBody.Concat(
7272
[
73-
PrepareQuery(queryTextConstant),
74-
ExecuteStmt(queryTextConstant, queryParams)
73+
dbDriver.PrepareStmt(funcName, queryTextConstant),
74+
dbDriver.ExecuteStmt(funcName, queryParams)
7575
]
7676
);
7777
return new MethodDeclaration(funcName, GetMethodArgs(argInterface, parameters),
@@ -81,16 +81,16 @@ public static MethodDeclaration ExecDeclare(string funcName, string queryTextCon
8181
});
8282
}
8383

84-
public static MethodDeclaration ExecLastIdDeclare(string funcName, string queryTextConstant, string argInterface,
84+
public MethodDeclaration ExecLastIdDeclare(string funcName, string queryTextConstant, string argInterface,
8585
IList<Parameter> parameters)
8686
{
8787
IEnumerable<IComposable> withResourceBody = new List<IComposable>();
8888
var queryParams = GetQueryParams(argInterface, parameters);
8989
withResourceBody = withResourceBody.AppendIfNotNull(queryParams);
9090
withResourceBody = withResourceBody.Concat(
9191
[
92-
PrepareQuery(queryTextConstant),
93-
ExecuteStmt(queryTextConstant, queryParams),
92+
dbDriver.PrepareStmt(funcName, queryTextConstant),
93+
dbDriver.ExecuteStmt(funcName, queryParams),
9494
new SimpleExpression($"return {Variable.Client.AsVar()}.last_id")
9595
]
9696
);
@@ -109,25 +109,14 @@ public static MethodDeclaration ExecLastIdDeclare(string funcName, string queryT
109109
: new SimpleStatement(Variable.QueryParams.AsVar(), new SimpleExpression($"[{queryParams.JoinByComma()}]"));
110110
}
111111

112-
private static SimpleStatement PrepareQuery(string queryTextConstant)
113-
{
114-
return new SimpleStatement(Variable.Stmt.AsVar(),
115-
new SimpleExpression($"{Variable.Client.AsVar()}.prepare({queryTextConstant})"));
116-
}
117-
118-
private static SimpleExpression ExecuteStmt(string queryTextConstant, SimpleStatement? queryParams)
119-
{
120-
var queryParamsArg = queryParams is null ? string.Empty : $", {Variable.QueryParams.AsVar()}";
121-
return new SimpleExpression($"{Variable.Stmt.AsVar()}.execute({queryTextConstant}{queryParamsArg})");
122-
}
123-
124112
private static IEnumerable<SimpleExpression> GetColumnsInitExpressions(IEnumerable<Column> columns)
125113
{
126114
return columns.Select(c => new SimpleExpression($"{Variable.Row.AsVar()}['{c.Name}']"));
127115
}
128116

129-
private static SimpleStatement ExecuteAndAssign(string queryTextConstant, SimpleStatement? queryParams)
117+
private SimpleStatement ExecuteAndAssign(string funcName, SimpleStatement? queryParams)
130118
{
131-
return new SimpleStatement(Variable.Result.AsVar(), ExecuteStmt(queryTextConstant, queryParams));
119+
return new SimpleStatement(Variable.Result.AsVar(),
120+
dbDriver.ExecuteStmt(funcName, queryParams));
132121
}
133122
}

Drivers/Mysql2Driver.cs

+24-8
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,39 @@ namespace SqlcGenCsharp.Drivers;
77

88
public class Mysql2Driver : DbDriver
99
{
10+
private MethodGen MethodGen { get; }
11+
12+
public Mysql2Driver()
13+
{
14+
MethodGen = new MethodGen(this);
15+
}
16+
17+
public override IEnumerable<RequireGem> GetRequiredGems()
18+
{
19+
return GetCommonGems().Append(new RequireGem("mysql2"));
20+
}
21+
1022
public override MethodDeclaration GetInitMethod()
1123
{
1224
return new MethodDeclaration("initialize", "connection_pool_params, mysql2_params",
1325
[
14-
new NewObject("ConnectionPool", [new SimpleExpression("**connection_pool_params")],
15-
new SimpleStatement("@pool", new NewObject(
16-
"Mysql2::Client", [new SimpleExpression("**mysql2_params")]
17-
)
18-
)
19-
)
26+
new SimpleStatement(Variable.Pool.AsProperty(),
27+
new NewObject("ConnectionPool", [new SimpleExpression("**connection_pool_params")],
28+
new SimpleExpression("new Mysql2::Client(**mysql2_params)")))
2029
]
2130
);
2231
}
2332

24-
public override IEnumerable<RequireGem> GetRequiredGems()
33+
public override SimpleStatement PrepareStmt(string funcName, string queryTextConstant)
2534
{
26-
return GetCommonGems().Append(new RequireGem("mysql2"));
35+
return new SimpleStatement(Variable.Stmt.AsVar(),
36+
new SimpleExpression($"{Variable.Client.AsVar()}.prepare('{funcName}', {queryTextConstant})"));
37+
}
38+
39+
public override SimpleExpression ExecuteStmt(string funcName, SimpleStatement? queryParams)
40+
{
41+
var queryParamsArg = queryParams is null ? string.Empty : $", {Variable.QueryParams.AsVar()}";
42+
return new SimpleExpression($"{Variable.Stmt.AsVar()}.execute('{funcName}'{queryParamsArg})");
2743
}
2844

2945
public override MethodDeclaration OneDeclare(string funcName, string queryTextConstant, string argInterface,

Drivers/PgDriver.cs

+24-8
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,39 @@ namespace SqlcGenCsharp.Drivers;
77

88
public class PgDriver : DbDriver
99
{
10+
private MethodGen MethodGen { get; }
11+
12+
public PgDriver()
13+
{
14+
MethodGen = new MethodGen(this);
15+
}
16+
17+
public override IEnumerable<RequireGem> GetRequiredGems()
18+
{
19+
return GetCommonGems().Append(new RequireGem("pg"));
20+
}
21+
1022
public override MethodDeclaration GetInitMethod()
1123
{
1224
return new MethodDeclaration("initialize", "connection_pool_params, pg_params",
1325
[
14-
new NewObject("ConnectionPool", [new SimpleExpression("**connection_pool_params")],
15-
new SimpleStatement("@pool", new NewObject(
16-
"PG.connect", [new SimpleExpression("**pg_params")]
17-
)
18-
)
19-
)
26+
new SimpleStatement(Variable.Pool.AsProperty(),
27+
new NewObject("ConnectionPool", [new SimpleExpression("**connection_pool_params")],
28+
new SimpleExpression("PG.connect(**pg_params)")))
2029
]
2130
);
2231
}
2332

24-
public override IEnumerable<RequireGem> GetRequiredGems()
33+
public override SimpleStatement PrepareStmt(string funcName, string queryTextConstant)
2534
{
26-
return GetCommonGems().Append(new RequireGem("pg"));
35+
return new SimpleStatement(Variable.Stmt.AsVar(),
36+
new SimpleExpression($"{Variable.Client.AsVar()}.prepare('{funcName}', {queryTextConstant})"));
37+
}
38+
39+
public override SimpleExpression ExecuteStmt(string funcName, SimpleStatement? queryParams)
40+
{
41+
var queryParamsArg = queryParams is null ? string.Empty : $", {Variable.QueryParams.AsVar()}";
42+
return new SimpleExpression($"{Variable.Client.AsVar()}.exec_prepared('{funcName}'{queryParamsArg})");
2743
}
2844

2945
public override MethodDeclaration OneDeclare(string funcName, string queryTextConstant, string argInterface,

Rakefile

+18-10
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,24 @@
22
require 'rake'
33
require 'rake/testtask'
44

5-
task :dotnet_format do
6-
sh "dotnet format --exclude GeneratedProtobuf"
5+
# tests
6+
# Rake::TestTask.new(:codegen_tests) do |t|
7+
# t.pattern = "tests/end2end_*.rb"
8+
# end
9+
10+
Rake::TestTask.new(:end2end_tests) do |t|
11+
t.pattern = "tests/end2end_*.rb"
12+
end
13+
14+
task :run_end2end_tests do
15+
sh "./scripts/tests/run_end2end.sh" # rake end2end_tests is called from Docker
716
end
817

9-
task :dockerfile_generate do
10-
sh "./scripts/generate_dockerfile.sh Dockerfile"
18+
task :run_tests => [:run_end2end_tests]
19+
20+
# Other
21+
task :dotnet_format do
22+
sh "dotnet format --exclude GeneratedProtobuf"
1123
end
1224

1325
task :protobuf_generate do
@@ -22,7 +34,7 @@ task :sqlc_generate_process => :dotnet_publish_process do
2234
sh "sqlc -f sqlc.local.yaml generate"
2335
end
2436

25-
task :test_process_plugin => [:sqlc_generate_process, :dockerfile_generate, :run_tests]
37+
task :test_process_plugin => [:sqlc_generate_process, :run_tests]
2638

2739
task :dotnet_publish_wasm => :protobuf_generate do
2840
sh "dotnet publish WasmRunner -c release --output dist/"
@@ -38,8 +50,4 @@ task :sqlc_generate_wasm => [:dotnet_publish_wasm, :update_wasm_plugin] do
3850
sh "sqlc -f sqlc.ci.yaml generate"
3951
end
4052

41-
Rake::TestTask.new do |test|
42-
test.pattern = "tests/*.rb"
43-
end
44-
45-
task :test_wasm_plugin => [:sqlc_generate_wasm, :update_wasm_plugin, :dockerfile_generate, :run_tests]
53+
task :test_wasm_plugin => [:sqlc_generate_wasm, :update_wasm_plugin, :run_tests]

RubySyntax/Basic.cs

+12
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ public string GetName()
1515
}
1616
}
1717

18+
public class ModuleDeclaration(string name, IEnumerable<IComposable> members) : IComposable
19+
{
20+
public string Build()
21+
{
22+
var moduleBody = members
23+
.Select(m => m.Build())
24+
.JoinByNewLine()
25+
.Indent();
26+
return $"module {name}\n{moduleBody}\nend";
27+
}
28+
}
29+
1830
public class ClassDeclaration(string name, IEnumerable<IComposable> members) : IComposable
1931
{
2032
public string Build()

0 commit comments

Comments
 (0)