Skip to content

Commit e81b12d

Browse files
authored
Introduce NpgsqlSlimDataSourceBuilder (#4967)
Part of #4965
1 parent 24c056f commit e81b12d

14 files changed

Lines changed: 607 additions & 296 deletions

Npgsql.sln.DotSettings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
<s:Boolean x:Key="/Default/UserDictionary/Words/=DDEX/@EntryIndexedValue">True</s:Boolean>
9292
<s:Boolean x:Key="/Default/UserDictionary/Words/=failover/@EntryIndexedValue">True</s:Boolean>
9393
<s:Boolean x:Key="/Default/UserDictionary/Words/=IANA/@EntryIndexedValue">True</s:Boolean>
94+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Instantiator/@EntryIndexedValue">True</s:Boolean>
9495
<s:Boolean x:Key="/Default/UserDictionary/Words/=lquery/@EntryIndexedValue">True</s:Boolean>
9596
<s:Boolean x:Key="/Default/UserDictionary/Words/=lseg/@EntryIndexedValue">True</s:Boolean>
9697
<s:Boolean x:Key="/Default/UserDictionary/Words/=ltree/@EntryIndexedValue">True</s:Boolean>

src/Npgsql/NpgsqlConnection.cs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,8 @@
1515
using System.Transactions;
1616
using Microsoft.Extensions.Logging;
1717
using Npgsql.Internal;
18-
using Npgsql.NameTranslation;
1918
using Npgsql.TypeMapping;
2019
using Npgsql.Util;
21-
using NpgsqlTypes;
2220
using IsolationLevel = System.Data.IsolationLevel;
2321

2422
namespace Npgsql;
@@ -92,6 +90,8 @@ internal NpgsqlDataSource NpgsqlDataSource
9290
public INpgsqlTypeMapper TypeMapper
9391
=> throw new NotSupportedException();
9492

93+
static ICloningInstantiator? _cloningInstantiator;
94+
9595
/// <summary>
9696
/// The default TCP/IP port for PostgreSQL.
9797
/// </summary>
@@ -219,6 +219,9 @@ void SetupDataSource()
219219
dataSourceBuilder.EnableParameterLogging(NpgsqlLoggingConfiguration.GlobalIsParameterLoggingEnabled);
220220
var newDataSource = dataSourceBuilder.Build();
221221

222+
// See Clone() on the following line:
223+
_cloningInstantiator = new CloningInstantiator();
224+
222225
_dataSource = PoolManager.Pools.GetOrAdd(canonical, newDataSource);
223226
if (_dataSource == newDataSource)
224227
{
@@ -1817,8 +1820,14 @@ object ICloneable.Clone()
18171820
{
18181821
CheckDisposed();
18191822

1823+
// For NativeAOT code size reduction, we avoid instantiating a connection here directly with
1824+
// `new NpgsqlConnection(_connectionString)`, since that would bring in the default data source builder, and with it various
1825+
// features which significantly increase binary size (ranges, System.Text.Json...). Instead, we pass through a "cloning
1826+
// instantiator" abstraction, where the implementation only ever gets set if SetupDataSource above is called (in which case the
1827+
// default data source is brought in anyway).
1828+
Debug.Assert(_dataSource is not null || _cloningInstantiator is not null);
18201829
var conn = _dataSource is null
1821-
? new NpgsqlConnection(_connectionString)
1830+
? _cloningInstantiator!.Instantiate(_connectionString)
18221831
: _dataSource.CreateConnection();
18231832

18241833
conn.ProvideClientCertificatesCallback = ProvideClientCertificatesCallback;
@@ -1859,6 +1868,17 @@ public NpgsqlConnection CloneWith(string connectionString)
18591868
};
18601869
}
18611870

1871+
interface ICloningInstantiator
1872+
{
1873+
public NpgsqlConnection Instantiate(string connectionString);
1874+
}
1875+
1876+
sealed class CloningInstantiator : ICloningInstantiator
1877+
{
1878+
public NpgsqlConnection Instantiate(string connectionString)
1879+
=> new(connectionString);
1880+
}
1881+
18621882
/// <summary>
18631883
/// This method changes the current database by disconnecting from the actual
18641884
/// database and connecting to the specified.

src/Npgsql/NpgsqlDataSource.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using System.Diagnostics;
55
using System.Diagnostics.CodeAnalysis;
66
using System.Net.Security;
7-
using System.Runtime.CompilerServices;
87
using System.Security.Cryptography.X509Certificates;
98
using System.Threading;
109
using System.Threading.Tasks;
@@ -14,7 +13,6 @@
1413
using Npgsql.Internal.TypeHandling;
1514
using Npgsql.Internal.TypeMapping;
1615
using Npgsql.Properties;
17-
using Npgsql.TypeMapping;
1816
using Npgsql.Util;
1917

2018
namespace Npgsql;

0 commit comments

Comments
 (0)