Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
aafadcb
feat: add benchmark impl and results for Postgres + fix connection po…
SockworkOrange Nov 19, 2025
f52c44e
feat: add sqlite benchmark for SQLite
SockworkOrange Nov 28, 2025
e638529
fix: solution
SockworkOrange Nov 28, 2025
0c000a1
fix: all benchmarks working
SockworkOrange Dec 6, 2025
fb06915
Merge branch 'main' into add-performance-benchmark-with-efcore
SockworkOrange Dec 6, 2025
db3c1f3
fix: all benchmarks
SockworkOrange Dec 6, 2025
ea97eec
fix: lint
SockworkOrange Dec 6, 2025
23e4549
fix: update lint github action
SockworkOrange Dec 6, 2025
286aaee
fix: rerun benchmark
SockworkOrange Dec 6, 2025
29ebbec
fix: re-run benchmark
SockworkOrange Dec 7, 2025
953723a
fix: add newline in doc
SockworkOrange Dec 7, 2025
13f37ed
fix: newline
SockworkOrange Dec 7, 2025
8bd4359
fix: benchmark links
SockworkOrange Dec 7, 2025
a2cdd16
fix: re-run benchmarks
SockworkOrange Dec 7, 2025
7c144b9
fix: bugfix benchmarks
SockworkOrange Dec 7, 2025
c3e8ee4
fix: standardize read benchmarks across databases
SockworkOrange Dec 7, 2025
58b30e2
fix: re-run benchmarks
SockworkOrange Dec 8, 2025
b5c161b
fix: re-run benchmarks
SockworkOrange Dec 8, 2025
3132fab
fix: lint
SockworkOrange Dec 8, 2025
b4527c7
fix: have benchmark in CI
SockworkOrange Dec 8, 2025
2cabd43
fix: benchmark CI call
SockworkOrange Dec 8, 2025
8a630ae
fix: docker-compose service names
SockworkOrange Dec 8, 2025
8d223a7
fix: benchmarks
SockworkOrange Dec 8, 2025
92811fe
fix: benchmark workflow
SockworkOrange Dec 9, 2025
0f264c8
fix: lint
SockworkOrange Dec 9, 2025
4f4cfad
fix: benchmark workflow
SockworkOrange Dec 9, 2025
44927fd
fix: dotnet run command
SockworkOrange Dec 9, 2025
374af9e
fix: benchmark workflow 2
SockworkOrange Dec 9, 2025
a584685
fix: artifacts path
SockworkOrange Dec 9, 2025
d9f7492
fix: artifacts path
SockworkOrange Dec 9, 2025
9359d44
fix: Improve SqliteWriteBenchmark runtime
SockworkOrange Dec 9, 2025
03d30f4
fix: lint
SockworkOrange Dec 9, 2025
98040fa
fix: update benchmark doc path
SockworkOrange Dec 9, 2025
e204946
fix: read benchmarks logic
SockworkOrange Dec 9, 2025
9946029
fix: lint
SockworkOrange Dec 10, 2025
c9c1fb8
fix: adjust read benchmarks params
SockworkOrange Dec 11, 2025
b1ab921
fix: lint
SockworkOrange Dec 11, 2025
b41f377
fix: write benchmarks return type
SockworkOrange Dec 11, 2025
454f990
fix: read benchmarks
SockworkOrange Dec 11, 2025
dc29a5b
fix: upload results in github action
SockworkOrange Dec 11, 2025
2ca05be
fix: adjust benchmark parameters
SockworkOrange Dec 12, 2025
cdd075f
fix: adjust mysql and postgres benchmark settings
SockworkOrange Dec 12, 2025
d4bb8d5
fix: lint
SockworkOrange Dec 12, 2025
8f3442f
fix: build
SockworkOrange Dec 12, 2025
ea573a8
fix: adjust benchmark settings
SockworkOrange Dec 13, 2025
d870cfd
fix: add entity changes clear for EFCore batch inserts
SockworkOrange Dec 13, 2025
5a905f8
fix: update benchmark.yml
SockworkOrange Dec 13, 2025
856b04e
fix: switch logic
SockworkOrange Dec 13, 2025
5fd924a
fix: adjust benchmarks parameters
SockworkOrange Dec 13, 2025
53b0df7
fix: adjust benchmarks parameters
SockworkOrange Dec 14, 2025
1640852
fix: benchmark refactoring
SockworkOrange Dec 14, 2025
988c7e9
fix: remove redundant option + refactor benchmark
SockworkOrange Dec 14, 2025
650e288
fix: lint
SockworkOrange Dec 14, 2025
e30d12f
fix: accesibility of members
SockworkOrange Dec 14, 2025
6131132
fix: more benchmark refactoring
SockworkOrange Dec 14, 2025
753d701
fix: refactoring
SockworkOrange Dec 14, 2025
405a15c
fix: remove bad sealed modifiers
SockworkOrange Dec 14, 2025
9195b82
fix: have the database seed executed only once
SockworkOrange Dec 14, 2025
33d8149
fix: have the seed database called from outside the benchmark setup t…
SockworkOrange Dec 14, 2025
e260afa
fix: attempt fix sqlite
SockworkOrange Dec 14, 2025
c335beb
fix: sqlite schema.sql call
SockworkOrange Dec 14, 2025
a17d1ca
fix: remove sales.db
SockworkOrange Dec 14, 2025
8630e71
fix: sqlite benchmark schema setup
SockworkOrange Dec 15, 2025
ad26c2b
fix: sqlite setup logic refactoring
SockworkOrange Dec 15, 2025
426d610
fix: benchmark/scripts/run_single_benchmark.sh
SockworkOrange Dec 15, 2025
1e8d9f7
fix: conditionally run docker in run_single_benchmark.sh
SockworkOrange Dec 15, 2025
a5a7518
fix: env check
SockworkOrange Dec 15, 2025
25443dd
fix: negate env check
SockworkOrange Dec 15, 2025
ee6b876
fix: adjust benchmark parameters
SockworkOrange Dec 16, 2025
663db6b
fix: adjust benchmark parameters
SockworkOrange Dec 16, 2025
d2d6dba
fix: lint
SockworkOrange Dec 16, 2025
14efdb7
fix: convert [Param] to [Arguments] when required
SockworkOrange Dec 16, 2025
3d76f30
fix: add indexes for read benchmark queries
SockworkOrange Dec 16, 2025
4b6766d
fix: adjust TotalRecords for existence of indexes
SockworkOrange Dec 16, 2025
076be0a
fix: reduce number of records in write benchmarks
SockworkOrange Dec 16, 2025
0144a67
fix: refactor benchmark parameter configurations for readability
SockworkOrange Dec 16, 2025
b87bf54
fix: assertions
SockworkOrange Dec 16, 2025
2e43a76
fix: Postgres EFCore query implementation
SockworkOrange Dec 16, 2025
c614cef
fix: lint
SockworkOrange Dec 16, 2025
575d44a
fix: write benchmarks
SockworkOrange Dec 16, 2025
524332f
fix: lint
SockworkOrange Dec 16, 2025
cf994ed
fix: adjust read benchmark settings
SockworkOrange Dec 16, 2025
85a61ab
fix: increase total records
SockworkOrange Dec 16, 2025
3f60414
fix: attempt fix visualization of params in readme files
SockworkOrange Dec 16, 2025
ecad716
fix: string representation of WriteBenchmarkArgs & ReadBenchmarkParams
SockworkOrange Dec 17, 2025
1421ba3
fix: lint
SockworkOrange Dec 17, 2025
085bd48
fix: show large numbers
SockworkOrange Dec 17, 2025
ac3e013
fix: refactor show large numbers
SockworkOrange Dec 17, 2025
aa58d58
fix: WriteBenchmarkArgs and ReadBenchmarkParams toString
SockworkOrange Dec 17, 2025
43b7d86
fix: add benchmark legend
SockworkOrange Dec 17, 2025
f49b582
fix: benchmark params info
SockworkOrange Dec 17, 2025
df77a33
fix: cleanup
SockworkOrange Dec 17, 2025
187be51
Merge branch 'main' into add-performance-benchmark-with-efcore
SockworkOrange Dec 17, 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
10 changes: 8 additions & 2 deletions .env
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
SOURCE_WASM_FILE_UBUNTU="WasmRunner/obj/release/net8.0/wasi-wasm/wasm/for-publish/WasmRunner.wasm"
SOURCE_WASM_FILE="WasmRunner/bin/Release/net8.0/wasi-wasm/AppBundle/WasmRunner.wasm"

SQLITE_CONNECTION_STRING="Data Source=tests.db;Mode=ReadWrite"
MYSQL_CONNECTION_STRING="server=localhost;database=tests;user=root;AllowLoadLocalInfile=true;ConvertZeroDateTime=True"
POSTGRES_CONNECTION_STRING="host=localhost;database=tests;username=postgres;password=pass;IncludeErrorDetail=true"

SQLITE_BENCHMARK_CONNECTION_STRING="Data Source=benchmark.db;Mode=ReadWrite"
MYSQL_BENCHMARK_CONNECTION_STRING="server=localhost;database=sales;user=root;AllowLoadLocalInfile=true;ConvertZeroDateTime=True"
POSTGRES_BENCHMARK_CONNECTION_STRING="host=localhost;database=tests;username=postgres;password=pass;IncludeErrorDetail=true"

POSTGRES_USER="postgres"
POSTGRES_PASSWORD="pass"
TESTS_DB="tests"
SQLITE_CONNECTION_STRING="Data Source=tests.db;Mode=ReadWriteCreate"
TESTS_DB="tests"
260 changes: 260 additions & 0 deletions .github/workflows/benchmark.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
name: Performance Benchmarks
defaults:
run:
shell: bash

permissions:
contents: write
pull-requests: write

env:
DOTNET_VERSION: '8.0.x'

on:
release:
types: [ published ]
workflow_dispatch:

jobs:
benchmark-mysql-reads:
name: MySQL Reads Benchmark
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Load .env file
uses: xom9ikk/[email protected]
with:
load-mode: strict

- name: Docker compose
uses: hoverkraft-tech/[email protected]
with:
services: mysqldb

- name: Run Benchmark
run: ./benchmark/scripts/run_single_benchmark.sh mysql reads

- name: Upload Results
uses: actions/upload-artifact@v4
if: success()
with:
name: mysql-reads-results
path: benchmark/BenchmarkDotNet.Artifacts/mysql/reads

benchmark-mysql-writes:
name: MySQL Writes Benchmark
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Load .env file
uses: xom9ikk/[email protected]
with:
load-mode: strict

- name: Docker compose
uses: hoverkraft-tech/[email protected]
with:
services: mysqldb

- name: Run Benchmark
run: ./benchmark/scripts/run_single_benchmark.sh mysql writes

- name: Upload Results
uses: actions/upload-artifact@v4
if: success()
with:
name: mysql-writes-results
path: benchmark/BenchmarkDotNet.Artifacts/mysql/writes

benchmark-postgresql-reads:
name: PostgreSQL Reads Benchmark
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Load .env file
uses: xom9ikk/[email protected]
with:
load-mode: strict

- name: Docker compose
uses: hoverkraft-tech/[email protected]
with:
services: postgresdb

- name: Run Benchmark
run: ./benchmark/scripts/run_single_benchmark.sh postgresql reads

- name: Upload Results
uses: actions/upload-artifact@v4
if: success()
with:
name: postgresql-reads-results
path: benchmark/BenchmarkDotNet.Artifacts/postgresql/reads

benchmark-postgresql-writes:
name: PostgreSQL Writes Benchmark
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Load .env file
uses: xom9ikk/[email protected]
with:
load-mode: strict

- name: Docker compose
uses: hoverkraft-tech/[email protected]
with:
services: postgresdb

- name: Run Benchmark
run: ./benchmark/scripts/run_single_benchmark.sh postgresql writes

- name: Upload Results
uses: actions/upload-artifact@v4
if: success()
with:
name: postgresql-writes-results
path: benchmark/BenchmarkDotNet.Artifacts/postgresql/writes

benchmark-sqlite-reads:
name: SQLite Reads Benchmark
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Load .env file
uses: xom9ikk/[email protected]
with:
load-mode: strict

- name: Run Benchmark
run: ./benchmark/scripts/run_single_benchmark.sh sqlite reads

- name: Upload Results
uses: actions/upload-artifact@v4
if: success()
with:
name: sqlite-reads-results
path: benchmark/BenchmarkDotNet.Artifacts/sqlite/reads

benchmark-sqlite-writes:
name: SQLite Writes Benchmark
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}

- name: Load .env file
uses: xom9ikk/[email protected]
with:
load-mode: strict

- name: Run Benchmark
run: ./benchmark/scripts/run_single_benchmark.sh sqlite writes

- name: Upload Results
uses: actions/upload-artifact@v4
if: success()
with:
name: sqlite-writes-results
path: benchmark/BenchmarkDotNet.Artifacts/sqlite/writes

push-results:
name: Push Results
runs-on: ubuntu-latest
if: always()
needs: [
benchmark-mysql-reads, benchmark-mysql-writes,
benchmark-postgresql-reads, benchmark-postgresql-writes,
benchmark-sqlite-reads, benchmark-sqlite-writes
]

steps:
- uses: actions/checkout@v4

- name: Download MySQL Reads Results
uses: actions/download-artifact@v4
with:
name: mysql-reads-results
path: benchmark/BenchmarkDotNet.Artifacts/mysql/reads

- name: Download MySQL Writes Results
uses: actions/download-artifact@v4
with:
name: mysql-writes-results
path: benchmark/BenchmarkDotNet.Artifacts/mysql/writes

- name: Download PostgreSQL Reads Results
uses: actions/download-artifact@v4
with:
name: postgresql-reads-results
path: benchmark/BenchmarkDotNet.Artifacts/postgresql/reads

- name: Download PostgreSQL Writes Results
uses: actions/download-artifact@v4
with:
name: postgresql-writes-results
path: benchmark/BenchmarkDotNet.Artifacts/postgresql/writes

- name: Download SQLite Reads Results
uses: actions/download-artifact@v4
with:
name: sqlite-reads-results
path: benchmark/BenchmarkDotNet.Artifacts/sqlite/reads

- name: Download SQLite Writes Results
uses: actions/download-artifact@v4
with:
name: sqlite-writes-results
path: benchmark/BenchmarkDotNet.Artifacts/sqlite/writes

- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
base: main
title: update benchmark results
commit-message: update benchmark results
branch: update-benchmark-results
branch-suffix: timestamp
delete-branch: true
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ jobs:
exclude: |
GeneratedProtobuf
examples
benchmark/*SqlcImpl

codegen-tests:
name: Codegen Tests
Expand Down
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,6 @@ dist
output/*
docker-upload/*

plugin.wasm
plugin.wasm
*.db
.env.bak
16 changes: 12 additions & 4 deletions CodeGenerator/Generators/QueriesGen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,16 @@ private ClassDeclarationSyntax GetClassDeclaration(string className, IEnumerable
var dapperStatements = dbDriver.Options.UseDapper
? $$"""
Utils.ConfigureSqlMapper();
Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
DefaultTypeMap.MatchNamesWithUnderscores = true;
"""
: string.Empty;

var baseTypes = dbDriver.GetClassBaseTypes();
var baseTypesStr = baseTypes.Length > 0 ? $" : {string.Join(", ", baseTypes)}" : string.Empty;

var classDeclaration = (ClassDeclarationSyntax)ParseMemberDeclaration(
$$"""
public class {{className}}
public class {{className}}{{baseTypesStr}}
{
public {{className}}()
{
Expand All @@ -94,8 +98,12 @@ public class {{className}}
private {{dbDriver.AddNullableSuffixIfNeeded(dbDriver.TransactionClassName, false)}} {{Variable.Transaction.AsPropertyName()}} { get; }
private {{dbDriver.AddNullableSuffixIfNeeded("string", false)}} {{Variable.ConnectionString.AsPropertyName()}} { get; }
}
""")!;
return classDeclaration.AddMembers(classMembers.ToArray());
""")!;

return classDeclaration.AddMembers(
[.. dbDriver.GetAdditionalClassMembers()
.AddRangeExcludeNulls(classMembers)]
);
}

private IEnumerable<MemberDeclarationSyntax> GetMembersForSingleQuery(Query query)
Expand Down
2 changes: 1 addition & 1 deletion Drivers/ColumnMapping.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace SqlcGenCsharp.Drivers;

public record DbTypeInfo(int? Length = null, string? NpgsqlTypeOverride = null);
public record DbTypeInfo(int? Length = null, string? DbTypeOverride = null);

public delegate string ReaderFn(int ordinal, string dbType);

Expand Down
Loading