Skip to content

Commit 84a93fd

Browse files
authored
Merge pull request #308 from netcorepal/copilot/add-gaussdb-support
Add GaussDB support for CAP distributed transactions
2 parents 484f062 + 2da17b9 commit 84a93fd

File tree

13 files changed

+282
-22
lines changed

13 files changed

+282
-22
lines changed

Directory.Packages.props

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<PomeloVersion>8.0.2</PomeloVersion>
1212
<ShardingCoreVersion>7.8.1.24</ShardingCoreVersion>
1313
<CapVersion>8.3.5</CapVersion>
14+
<GaussDBEntityFrameworkCoreVersion>8.0.2</GaussDBEntityFrameworkCoreVersion>
1415
</PropertyGroup>
1516
<PropertyGroup Condition="'$(TargetFramework)' == 'net9.0'">
1617
<FrameworkVersion>9.0.0</FrameworkVersion>
@@ -20,6 +21,7 @@
2021
<PomeloVersion>9.0.0</PomeloVersion>
2122
<ShardingCoreVersion>7.9.1.24</ShardingCoreVersion>
2223
<CapVersion>8.4.1</CapVersion>
24+
<GaussDBEntityFrameworkCoreVersion>9.0.0</GaussDBEntityFrameworkCoreVersion>
2325
</PropertyGroup>
2426
<PropertyGroup Condition="'$(TargetFramework)' == 'net10.0'">
2527
<FrameworkVersion>10.0.0</FrameworkVersion>
@@ -29,6 +31,7 @@
2931
<PomeloVersion>9.0.0</PomeloVersion>
3032
<ShardingCoreVersion>7.9.1.24</ShardingCoreVersion>
3133
<CapVersion>8.4.1</CapVersion>
34+
<GaussDBEntityFrameworkCoreVersion>9.0.0</GaussDBEntityFrameworkCoreVersion>
3235
</PropertyGroup>
3336
<ItemGroup>
3437
<!--microsoft extensions -->
@@ -76,6 +79,7 @@
7679
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="$(EntityFrameworkVersion)" PrivateAssets="All"/>
7780
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="$(NpgsqlEntityFrameworkCorePostgreSQLVersion)" />
7881
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="$(PomeloVersion)"/>
82+
<PackageVersion Include="DotNetCore.EntityFrameworkCore.GaussDB" Version="$(GaussDBEntityFrameworkCoreVersion)" />
7983
<PackageVersion Include="ShardingCore" Version="$(ShardingCoreVersion)"/>
8084
<PackageVersion Include="StackExchange.Redis" Version="2.6.122"/>
8185
<PackageVersion Include="DotNetCore.CAP" Version="$(CapVersion)"/>

docker/docker-compose.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,18 @@ services:
8484
volumes:
8585
- ${DATA_DIR}/pgsql/data:/var/lib/postgresql/data
8686

87+
gaussdb:
88+
container_name: gaussdb
89+
image: opengauss/opengauss:latest
90+
restart: always
91+
environment:
92+
GS_PASSWORD: Test@123
93+
ports:
94+
- 5433:5432
95+
volumes:
96+
- ${DATA_DIR}/gaussdb/data:/var/lib/opengauss
97+
privileged: true
98+
8799
redis:
88100
container_name: redis
89101
image: redis:latest

docker/gaussdb/.gitkeep

Whitespace-only changes.

netcorepal-cloud-framework.slnx

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Solution>
1+
<Solution>
22
<Folder Name="/Solution Items/">
33
<File Path="Directory.Build.props" />
44
<File Path="Directory.Packages.props" />
@@ -8,24 +8,25 @@
88
<File Path="eng\versions.props" />
99
</Folder>
1010
<Folder Name="/src/">
11+
<Project Path="src/NetCorePal.Extensions.DistributedTransactions.CAP.GaussDB/NetCorePal.Extensions.DistributedTransactions.CAP.GaussDB.csproj" />
1112
<Project Path="src\NetCorePal.Attributes\NetCorePal.Attributes.csproj" />
1213
<Project Path="src\NetCorePal.Extensions.AspNetCore\NetCorePal.Extensions.AspNetCore.csproj" />
1314
<Project Path="src\NetCorePal.Extensions.CodeAnalysis.SourceGenerators\NetCorePal.Extensions.CodeAnalysis.SourceGenerators.csproj" />
1415
<Project Path="src\NetCorePal.Extensions.CodeAnalysis.Tools\NetCorePal.Extensions.CodeAnalysis.Tools.csproj" />
1516
<Project Path="src\NetCorePal.Extensions.CodeAnalysis\NetCorePal.Extensions.CodeAnalysis.csproj" />
1617
<Project Path="src\NetCorePal.Extensions.DistributedLocks.Abstractions\NetCorePal.Extensions.DistributedLocks.Abstractions.csproj" />
1718
<Project Path="src\NetCorePal.Extensions.DistributedLocks.Redis\NetCorePal.Extensions.DistributedLocks.Redis.csproj" />
18-
<Project Path="src\NetCorePal.Extensions.Dto\NetCorePal.Extensions.Dto.csproj" Type="Classic C#" />
19+
<Project Path="src\NetCorePal.Extensions.Dto\NetCorePal.Extensions.Dto.csproj" />
1920
<Project Path="src\NetCorePal.Extensions.Hangfire\NetCorePal.Extensions.Hangfire.csproj" />
20-
<Project Path="src\NetCorePal.Extensions.Jwt.EntityFrameworkCore\NetCorePal.Extensions.Jwt.EntityFrameworkCore.csproj" Type="Classic C#" />
21-
<Project Path="src\NetCorePal.Extensions.Jwt.StackExchangeRedis\NetCorePal.Extensions.Jwt.StackExchangeRedis.csproj" Type="Classic C#" />
22-
<Project Path="src\NetCorePal.Extensions.Jwt\NetCorePal.Extensions.Jwt.csproj" Type="Classic C#" />
21+
<Project Path="src\NetCorePal.Extensions.Jwt.EntityFrameworkCore\NetCorePal.Extensions.Jwt.EntityFrameworkCore.csproj" />
22+
<Project Path="src\NetCorePal.Extensions.Jwt.StackExchangeRedis\NetCorePal.Extensions.Jwt.StackExchangeRedis.csproj" />
23+
<Project Path="src\NetCorePal.Extensions.Jwt\NetCorePal.Extensions.Jwt.csproj" />
2324
<Project Path="src\NetCorePal.Extensions.Mappers\NetCorePal.Extensions.Mappers.csproj" />
2425
<Project Path="src\NetCorePal.Extensions.MultiEnv\NetCorePal.Extensions.MultiEnv.csproj" />
2526
<Project Path="src\NetCorePal.Extensions.NewtonsoftJson\NetCorePal.Extensions.NewtonsoftJson.csproj" />
2627
<Project Path="src\NetCorePal.Extensions.Primitives\NetCorePal.Extensions.Primitives.csproj" />
27-
<Project Path="src\NetCorePal.Extensions.ShardingCore.SourceGenerators\NetCorePal.Extensions.ShardingCore.SourceGenerators.csproj" Type="Classic C#" />
28-
<Project Path="src\NetCorePal.Extensions.ShardingCore\NetCorePal.Extensions.ShardingCore.csproj" Type="Classic C#" />
28+
<Project Path="src\NetCorePal.Extensions.ShardingCore.SourceGenerators\NetCorePal.Extensions.ShardingCore.SourceGenerators.csproj" />
29+
<Project Path="src\NetCorePal.Extensions.ShardingCore\NetCorePal.Extensions.ShardingCore.csproj" />
2930
<Project Path="src\NetCorePal.OpenTelemetry.Diagnostics\NetCorePal.OpenTelemetry.Diagnostics.csproj" />
3031
<Project Path="src\NetCorePal.SkyApm.Diagnostics\NetCorePal.SkyApm.Diagnostics.csproj" />
3132
</Folder>
@@ -60,41 +61,42 @@
6061
<Project Path="src\NetCorePal.Extensions.Snowflake\NetCorePal.Extensions.Snowflake.csproj" />
6162
</Folder>
6263
<Folder Name="/src/ServiceDiscovery/">
63-
<Project Path="src\NetCorePal.Extensions.MicrosoftServiceDiscovery\NetCorePal.Extensions.MicrosoftServiceDiscovery.csproj" Type="Classic C#" />
64+
<Project Path="src\NetCorePal.Extensions.MicrosoftServiceDiscovery\NetCorePal.Extensions.MicrosoftServiceDiscovery.csproj" />
6465
<Project Path="src\NetCorePal.Extensions.ServiceDiscovery.Abstractions\NetCorePal.Extensions.ServiceDiscovery.Abstractions.csproj" />
6566
<Project Path="src\NetCorePal.Extensions.ServiceDiscovery.K8s\NetCorePal.Extensions.ServiceDiscovery.K8s.csproj" />
6667
</Folder>
6768
<Folder Name="/test/">
69+
<Project Path="test/NetCorePal.Extensions.DistributedTransactions.CAP.GaussDB.UnitTests/NetCorePal.Extensions.DistributedTransactions.CAP.GaussDB.UnitTests.csproj" />
6870
<Project Path="test\ConsoleApp\NetCorePal.ConsoleApp.csproj" />
6971
<Project Path="test\NetCorePal.Context.AspNetCore.UnitTests\NetCorePal.Context.AspNetCore.UnitTests.csproj" />
7072
<Project Path="test\NetCorePal.Extensions.AspNetCore.UnitTests\NetCorePal.Extensions.AspNetCore.UnitTests.csproj" />
7173
<Project Path="test\NetCorePal.Extensions.CodeAnalysis.Tools.UnitTests\NetCorePal.Extensions.CodeAnalysis.Tools.UnitTests.csproj" />
7274
<Project Path="test\NetCorePal.Extensions.CodeAnalysis.UnitTests\NetCorePal.Extensions.CodeAnalysis.UnitTests.csproj" />
73-
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.CAP.MySql.UnitTests\NetCorePal.Extensions.DistributedTransactions.CAP.MySql.UnitTests.csproj" Type="Classic C#" />
75+
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.CAP.MySql.UnitTests\NetCorePal.Extensions.DistributedTransactions.CAP.MySql.UnitTests.csproj" />
7476
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.CAP.PostgreSql.UnitTests\NetCorePal.Extensions.DistributedTransactions.CAP.PostgreSql.UnitTests.csproj" />
7577
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.CAP.Sqlite.UnitTests\NetCorePal.Extensions.DistributedTransactions.CAP.Sqlite.UnitTests.csproj" />
76-
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.CAP.SqlServer.UnitTests\NetCorePal.Extensions.DistributedTransactions.CAP.SqlServer.UnitTests.csproj" Type="Classic C#" />
78+
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.CAP.SqlServer.UnitTests\NetCorePal.Extensions.DistributedTransactions.CAP.SqlServer.UnitTests.csproj" />
7779
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.CAP.UnitTests\NetCorePal.Extensions.DistributedTransactions.CAP.UnitTests.csproj" />
78-
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly1\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly1.csproj" Type="Classic C#" />
79-
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly2\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly2.csproj" Type="Classic C#" />
80+
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly1\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly1.csproj" />
81+
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly2\NetCorePal.Extensions.DistributedTransactions.UnitTests.Assembly2.csproj" />
8082
<Project Path="test\NetCorePal.Extensions.DistributedTransactions.UnitTests\NetCorePal.Extensions.DistributedTransactions.UnitTests.csproj" />
8183
<Project Path="test\NetCorePal.Extensions.Domain.Abstractions.UnitTests\NetCorePal.Extensions.Domain.Abstractions.UnitTests.csproj" />
82-
<Project Path="test\NetCorePal.Extensions.Dto.Tests\NetCorePal.Extensions.Dto.Tests.csproj" Type="Classic C#" />
83-
<Project Path="test\NetCorePal.Extensions.Jwt.EntityFrameworkCore.UnitTests\NetCorePal.Extensions.Jwt.EntityFrameworkCore.UnitTests.csproj" Type="Classic C#" />
84-
<Project Path="test\NetCorePal.Extensions.Jwt.StackExchangeRedis.UnitTests\NetCorePal.Extensions.Jwt.StackExchangeRedis.UnitTests.csproj" Type="Classic C#" />
85-
<Project Path="test\NetCorePal.Extensions.Jwt.UnitTests\NetCorePal.Extensions.Jwt.UnitTests.csproj" Type="Classic C#" />
84+
<Project Path="test\NetCorePal.Extensions.Dto.Tests\NetCorePal.Extensions.Dto.Tests.csproj" />
85+
<Project Path="test\NetCorePal.Extensions.Jwt.EntityFrameworkCore.UnitTests\NetCorePal.Extensions.Jwt.EntityFrameworkCore.UnitTests.csproj" />
86+
<Project Path="test\NetCorePal.Extensions.Jwt.StackExchangeRedis.UnitTests\NetCorePal.Extensions.Jwt.StackExchangeRedis.UnitTests.csproj" />
87+
<Project Path="test\NetCorePal.Extensions.Jwt.UnitTests\NetCorePal.Extensions.Jwt.UnitTests.csproj" />
8688
<Project Path="test\NetCorePal.Extensions.Mappers.UnitTests\NetCorePal.Extensions.Mappers.UnitTests.csproj" />
87-
<Project Path="test\NetCorePal.Extensions.MicrosoftServiceDiscovery.UnitTests\NetCorePal.Extensions.MicrosoftServiceDiscovery.UnitTests.csproj" Type="Classic C#" />
89+
<Project Path="test\NetCorePal.Extensions.MicrosoftServiceDiscovery.UnitTests\NetCorePal.Extensions.MicrosoftServiceDiscovery.UnitTests.csproj" />
8890
<Project Path="test\NetCorePal.Extensions.MultiEnv.UnitTests\NetCorePal.Extensions.MultiEnv.UnitTests.csproj" />
89-
<Project Path="test\NetCorePal.Extensions.Primitives.UnitTests\NetCorePal.Extensions.Primitives.UnitTests.csproj" Type="Classic C#" />
90-
<Project Path="test\NetCorePal.Extensions.Repository.EntityFrameworkCore.Identity.UnitTests\NetCorePal.Extensions.Repository.EntityFrameworkCore.Identity.UnitTests.csproj" Type="Classic C#" />
91-
<Project Path="test\NetCorePal.Extensions.Repository.EntityFrameworkCore.UnitTests\NetCorePal.Extensions.Repository.EntityFrameworkCore.UnitTests.csproj" Type="Classic C#" />
91+
<Project Path="test\NetCorePal.Extensions.Primitives.UnitTests\NetCorePal.Extensions.Primitives.UnitTests.csproj" />
92+
<Project Path="test\NetCorePal.Extensions.Repository.EntityFrameworkCore.Identity.UnitTests\NetCorePal.Extensions.Repository.EntityFrameworkCore.Identity.UnitTests.csproj" />
93+
<Project Path="test\NetCorePal.Extensions.Repository.EntityFrameworkCore.UnitTests\NetCorePal.Extensions.Repository.EntityFrameworkCore.UnitTests.csproj" />
9294
<Project Path="test\NetCorePal.Extensions.ServiceDiscovery.Abstractions.UnitTests\NetCorePal.Extensions.ServiceDiscovery.Abstractions.UnitTests.csproj" />
9395
<Project Path="test\NetCorePal.Extensions.ServiceDiscovery.K8s.UnitTests\NetCorePal.Extensions.ServiceDiscovery.K8s.UnitTests.csproj" />
94-
<Project Path="test\NetCorePal.Extensions.ShardingCore.UnitTests\NetCorePal.Extensions.ShardingCore.UnitTests.csproj" Type="Classic C#" />
96+
<Project Path="test\NetCorePal.Extensions.ShardingCore.UnitTests\NetCorePal.Extensions.ShardingCore.UnitTests.csproj" />
9597
<Project Path="test\NetCorePal.Extensions.Snowflake.Consul.UnitTests\NetCorePal.Extensions.Snowflake.Consul.UnitTests.csproj" />
9698
<Project Path="test\NetCorePal.Extensions.Snowflake.Redis.UnitTests\NetCorePal.Extensions.Snowflake.Redis.UnitTests.csproj" />
97-
<Project Path="test\NetCorePal.SourceGenerator.UnitTests\NetCorePal.SourceGenerator.UnitTests.csproj" Type="Classic C#" />
99+
<Project Path="test\NetCorePal.SourceGenerator.UnitTests\NetCorePal.SourceGenerator.UnitTests.csproj" />
98100
<Project Path="test\NetCorePal.Web.UnitTests\NetCorePal.Web.UnitTests.csproj" />
99101
<Project Path="test\NetCorePal.Web\NetCorePal.Web.csproj" />
100102
</Folder>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
3+
4+
namespace NetCorePal.Extensions.DistributedTransactions.CAP.Persistence;
5+
6+
public class CapLockConfiguration : IEntityTypeConfiguration<CapLock>
7+
{
8+
public void Configure(EntityTypeBuilder<CapLock> builder)
9+
{
10+
builder.ToTable(NetCorePalStorageOptions.LockTableName);
11+
builder.HasKey(e => e.Key);
12+
builder.Property(e => e.Key).HasMaxLength(128).IsRequired();
13+
builder.Property(e => e.Instance).HasMaxLength(256);
14+
builder.Property(e => e.LastLockTime).HasColumnType("TIMESTAMP");
15+
}
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
3+
4+
namespace NetCorePal.Extensions.DistributedTransactions.CAP.Persistence;
5+
6+
public class PublishedMessageConfiguration() : IEntityTypeConfiguration<PublishedMessage>
7+
{
8+
public void Configure(EntityTypeBuilder<PublishedMessage> builder)
9+
{
10+
builder.ToTable(NetCorePalStorageOptions.PublishedMessageTableName);
11+
builder.HasKey(e => e.Id);
12+
builder.Property(e => e.Id).IsRequired().ValueGeneratedNever();
13+
builder.Property(e => e.Version).HasMaxLength(20);
14+
builder.Property(e => e.Name).HasMaxLength(200).IsRequired();
15+
builder.Property(e => e.Content).HasColumnType("TEXT");
16+
builder.Property(e => e.Retries);
17+
builder.Property(e => e.Added).HasColumnType("TIMESTAMP").IsRequired();
18+
builder.Property(e => e.ExpiresAt).HasColumnType("TIMESTAMP");
19+
builder.Property(e => e.StatusName).HasMaxLength(40).IsRequired();
20+
if (NetCorePalStorageOptions.PublishedMessageShardingDatabaseEnabled)
21+
{
22+
builder.Property(e => e.DataSourceName)
23+
.HasMaxLength(50);
24+
}
25+
else
26+
{
27+
builder.Ignore(e => e.DataSourceName);
28+
}
29+
30+
builder.HasIndex(e => new { e.Version, e.ExpiresAt, e.StatusName }, "IX_Version_ExpiresAt_StatusName");
31+
builder.HasIndex(e => new { e.ExpiresAt, e.StatusName }, "IX_ExpiresAt_StatusName");
32+
}
33+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
3+
4+
namespace NetCorePal.Extensions.DistributedTransactions.CAP.Persistence;
5+
6+
public class ReceivedMessageConfiguration : IEntityTypeConfiguration<ReceivedMessage>
7+
{
8+
public void Configure(EntityTypeBuilder<ReceivedMessage> builder)
9+
{
10+
builder.ToTable(NetCorePalStorageOptions.ReceivedMessageTableName);
11+
builder.HasKey(e => e.Id);
12+
builder.Property(e => e.Id).IsRequired().ValueGeneratedNever();
13+
builder.Property(e => e.Version).HasMaxLength(20);
14+
builder.Property(e => e.Name).HasMaxLength(400).IsRequired();
15+
builder.Property(e => e.Group).HasMaxLength(200);
16+
builder.Property(e => e.Content).HasColumnType("TEXT");
17+
builder.Property(e => e.Retries);
18+
builder.Property(e => e.Added).HasColumnType("TIMESTAMP").IsRequired();
19+
builder.Property(e => e.ExpiresAt).HasColumnType("TIMESTAMP");
20+
builder.Property(e => e.StatusName).HasMaxLength(50).IsRequired();
21+
22+
builder.HasIndex(e => new { e.Version, e.ExpiresAt, e.StatusName }, "IX_Version_ExpiresAt_StatusName");
23+
builder.HasIndex(e => new { e.ExpiresAt, e.StatusName }, "IX_ExpiresAt_StatusName");
24+
}
25+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
namespace NetCorePal.Extensions.DistributedTransactions.CAP.Persistence;
2+
3+
public interface IGaussDBCapDataStorage : ICapDataStorage
4+
{
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
<RootNamespace>NetCorePal.Extensions.DistributedTransactions.CAP.GaussDB</RootNamespace>
8+
</PropertyGroup>
9+
<ItemGroup>
10+
<PackageReference Include="DotNetCore.EntityFrameworkCore.GaussDB" />
11+
</ItemGroup>
12+
<ItemGroup>
13+
<ProjectReference Include="..\NetCorePal.Extensions.DistributedTransactions.CAP\NetCorePal.Extensions.DistributedTransactions.CAP.csproj" />
14+
</ItemGroup>
15+
</Project>

src/NetCorePal.Extensions.DistributedTransactions.CAP.SourceGenerators/AppDbContextBaseCapDataStorageSourceGenerator.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
5050
{
5151
GenerateCapDataStorage(spc, namedTypeSymbol, "IPostgreSqlCapDataStorage");
5252
}
53+
else if (namedTypeSymbol.AllInterfaces.Any(i => i.Name == "IGaussDBCapDataStorage"))
54+
{
55+
GenerateCapDataStorage(spc, namedTypeSymbol, "IGaussDBCapDataStorage");
56+
}
5357
else if (namedTypeSymbol.AllInterfaces.Any(i => i.Name == "ISqliteCapDataStorage"))
5458
{
5559
GenerateCapDataStorage(spc, namedTypeSymbol, "ISqliteCapDataStorage");

0 commit comments

Comments
 (0)