Skip to content

Commit 97158c5

Browse files
authored
Merge pull request #344 from svetrivel/issue-343
Return new connection string builder instance if connection string changes
2 parents 3a47370 + e49e547 commit 97158c5

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

src/Hangfire.PostgreSql/Factories/NpgsqlConnectionFactory.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public sealed class NpgsqlConnectionFactory : NpgsqlInstanceConnectionFactoryBas
1111
{
1212
private readonly string _connectionString;
1313
[CanBeNull] private readonly Action<NpgsqlConnection> _connectionSetup;
14+
[CanBeNull] private readonly Func<string> _getConnectionString;
1415

1516
/// <summary>
1617
/// Instantiates the factory using specified <paramref name="connectionString"/>.
@@ -25,10 +26,21 @@ public NpgsqlConnectionFactory(string connectionString, PostgreSqlStorageOptions
2526
_connectionSetup = connectionSetup;
2627
}
2728

29+
public NpgsqlConnectionFactory(Func<string> getConnectionString, PostgreSqlStorageOptions options, [CanBeNull] Action<NpgsqlConnection> connectionSetup = null) : this(getConnectionString.Invoke(), options, connectionSetup)
30+
{
31+
_getConnectionString = getConnectionString;
32+
}
33+
2834
/// <inheritdoc />
2935
public override NpgsqlConnection GetOrCreateConnection()
3036
{
31-
NpgsqlConnection connection = new(_connectionString);
37+
var connectionString = _connectionString;
38+
if (_getConnectionString != null)
39+
{
40+
connectionString = SetupConnectionStringBuilder(_getConnectionString.Invoke()).ConnectionString;
41+
}
42+
43+
NpgsqlConnection connection = new(connectionString);
3244
_connectionSetup?.Invoke(connection);
3345
return connection;
3446
}

src/Hangfire.PostgreSql/Factories/NpgsqlInstanceConnectionFactoryBase.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public abstract class NpgsqlInstanceConnectionFactoryBase : IConnectionFactory
88
{
99
private readonly PostgreSqlStorageOptions _options;
1010
[CanBeNull] private NpgsqlConnectionStringBuilder _connectionStringBuilder;
11+
[CanBeNull] private string _connectionString;
1112

1213
protected NpgsqlInstanceConnectionFactoryBase(PostgreSqlStorageOptions options)
1314
{
@@ -23,13 +24,14 @@ protected NpgsqlInstanceConnectionFactoryBase(PostgreSqlStorageOptions options)
2324

2425
protected NpgsqlConnectionStringBuilder SetupConnectionStringBuilder(string connectionString)
2526
{
26-
if (_connectionStringBuilder != null)
27+
if (_connectionStringBuilder != null && string.Equals(_connectionString, connectionString, StringComparison.OrdinalIgnoreCase))
2728
{
2829
return _connectionStringBuilder;
2930
}
3031

3132
try
3233
{
34+
_connectionString = connectionString;
3335
NpgsqlConnectionStringBuilder builder = new(connectionString);
3436

3537
// The connection string must not be modified when transaction enlistment is enabled, otherwise it will cause

src/Hangfire.PostgreSql/PostgreSqlBootstrapperOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public PostgreSqlBootstrapperOptions UseNpgsqlConnection(string connectionString
4242
return UseConnectionFactory(new NpgsqlConnectionFactory(connectionString, _options, connectionSetup));
4343
}
4444

45+
public PostgreSqlBootstrapperOptions UseNpgsqlConnection(Func<string> getConnectionString, [CanBeNull] Action<NpgsqlConnection> connectionSetup = null)
46+
{
47+
return UseConnectionFactory(new NpgsqlConnectionFactory(getConnectionString, _options, connectionSetup));
48+
}
49+
4550
/// <summary>
4651
/// Configures the bootstrapper to use the existing <see cref="NpgsqlConnection"/> for each database action.
4752
/// </summary>

0 commit comments

Comments
 (0)