Skip to content

Commit 4ccfcd7

Browse files
authored
Fix Npgsql{Slim}DataSourceBuilder name translator (#5348)
Fixes #5345
1 parent f723a24 commit 4ccfcd7

File tree

4 files changed

+56
-11
lines changed

4 files changed

+56
-11
lines changed

src/Npgsql/NpgsqlDataSourceBuilder.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,12 @@
33
using System.Diagnostics.CodeAnalysis;
44
using System.Net.Security;
55
using System.Security.Cryptography.X509Certificates;
6-
using System.Text.Json;
7-
using System.Text.Json.Nodes;
86
using System.Threading;
97
using System.Threading.Tasks;
108
using Microsoft.Extensions.Logging;
119
using Npgsql.Internal;
1210
using Npgsql.Internal.Resolvers;
1311
using Npgsql.TypeMapping;
14-
using NpgsqlTypes;
1512

1613
namespace Npgsql;
1714

src/Npgsql/NpgsqlSlimDataSourceBuilder.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33
using System.Diagnostics.CodeAnalysis;
44
using System.Net.Security;
55
using System.Security.Cryptography.X509Certificates;
6-
using System.Text.Json;
76
using System.Threading;
87
using System.Threading.Tasks;
98
using Microsoft.Extensions.Logging;
109
using Npgsql.Internal;
1110
using Npgsql.Internal.Resolvers;
1211
using Npgsql.Properties;
1312
using Npgsql.TypeMapping;
14-
using NpgsqlTypes;
1513

1614
namespace Npgsql;
1715

@@ -72,7 +70,7 @@ static NpgsqlSlimDataSourceBuilder()
7270
public NpgsqlSlimDataSourceBuilder(string? connectionString = null)
7371
{
7472
ConnectionStringBuilder = new NpgsqlConnectionStringBuilder(connectionString);
75-
_userTypeMapper = new();
73+
_userTypeMapper = new() { DefaultNameTranslator = GlobalTypeMapper.Instance.DefaultNameTranslator };
7674
// Reverse order
7775
AddTypeInfoResolver(UnsupportedTypeInfoResolver);
7876
AddTypeInfoResolver(new AdoTypeInfoResolver());
@@ -257,7 +255,11 @@ public NpgsqlSlimDataSourceBuilder UsePeriodicPasswordProvider(
257255
#region Type mapping
258256

259257
/// <inheritdoc />
260-
public INpgsqlNameTranslator DefaultNameTranslator { get; set; } = GlobalTypeMapper.Instance.DefaultNameTranslator;
258+
public INpgsqlNameTranslator DefaultNameTranslator
259+
{
260+
get => _userTypeMapper.DefaultNameTranslator;
261+
set => _userTypeMapper.DefaultNameTranslator = value;
262+
}
261263

262264
/// <inheritdoc />
263265
public INpgsqlTypeMapper MapEnum<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] TEnum>(string? pgName = null, INpgsqlNameTranslator? nameTranslator = null)

src/Npgsql/TypeMapping/GlobalTypeMapper.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@
22
using System.Collections.Generic;
33
using System.Diagnostics.CodeAnalysis;
44
using System.Linq;
5-
using System.Text.Json;
6-
using System.Text.Json.Nodes;
75
using System.Threading;
86
using Npgsql.Internal;
97
using Npgsql.Internal.Postgres;
10-
using Npgsql.Internal.Resolvers;
11-
using NpgsqlTypes;
128

139
namespace Npgsql.TypeMapping;
1410

test/Npgsql.Tests/Types/CompositeTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,56 @@ await AssertType(
3131
npgsqlDbType: null);
3232
}
3333

34+
[Test]
35+
public async Task Basic_with_custom_default_translator()
36+
{
37+
await using var adminConnection = await OpenConnectionAsync();
38+
var type = await GetTempTypeName(adminConnection);
39+
40+
await adminConnection.ExecuteNonQueryAsync($"CREATE TYPE {type} AS (x int, s text)");
41+
42+
var dataSourceBuilder = CreateDataSourceBuilder();
43+
dataSourceBuilder.DefaultNameTranslator = new CustomTranslator();
44+
dataSourceBuilder.MapComposite<SomeComposite>(type);
45+
await using var dataSource = dataSourceBuilder.Build();
46+
await using var connection = await dataSource.OpenConnectionAsync();
47+
48+
await AssertType(
49+
connection,
50+
new SomeComposite { SomeText = "foo", X = 8 },
51+
"(8,foo)",
52+
type,
53+
npgsqlDbType: null);
54+
}
55+
56+
[Test]
57+
public async Task Basic_with_custom_translator()
58+
{
59+
await using var adminConnection = await OpenConnectionAsync();
60+
var type = await GetTempTypeName(adminConnection);
61+
62+
await adminConnection.ExecuteNonQueryAsync($"CREATE TYPE {type} AS (x int, s text)");
63+
64+
var dataSourceBuilder = CreateDataSourceBuilder();
65+
dataSourceBuilder.MapComposite<SomeComposite>(type, new CustomTranslator());
66+
await using var dataSource = dataSourceBuilder.Build();
67+
await using var connection = await dataSource.OpenConnectionAsync();
68+
69+
await AssertType(
70+
connection,
71+
new SomeComposite { SomeText = "foo", X = 8 },
72+
"(8,foo)",
73+
type,
74+
npgsqlDbType: null);
75+
}
76+
77+
class CustomTranslator : INpgsqlNameTranslator
78+
{
79+
public string TranslateTypeName(string clrName) => throw new NotImplementedException();
80+
81+
public string TranslateMemberName(string clrName) => clrName[0].ToString().ToLowerInvariant();
82+
}
83+
3484
#pragma warning disable CS0618 // GlobalTypeMapper is obsolete
3585
[Test, NonParallelizable]
3686
public async Task Global_mapping()

0 commit comments

Comments
 (0)