Skip to content

Commit

Permalink
Merge pull request #344 from svetrivel/issue-343
Browse files Browse the repository at this point in the history
Return new connection string builder instance if connection string changes
  • Loading branch information
azygis committed Feb 21, 2024
2 parents 3a47370 + e49e547 commit 97158c5
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 2 deletions.
14 changes: 13 additions & 1 deletion src/Hangfire.PostgreSql/Factories/NpgsqlConnectionFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public sealed class NpgsqlConnectionFactory : NpgsqlInstanceConnectionFactoryBas
{
private readonly string _connectionString;
[CanBeNull] private readonly Action<NpgsqlConnection> _connectionSetup;
[CanBeNull] private readonly Func<string> _getConnectionString;

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

public NpgsqlConnectionFactory(Func<string> getConnectionString, PostgreSqlStorageOptions options, [CanBeNull] Action<NpgsqlConnection> connectionSetup = null) : this(getConnectionString.Invoke(), options, connectionSetup)
{
_getConnectionString = getConnectionString;
}

/// <inheritdoc />
public override NpgsqlConnection GetOrCreateConnection()
{
NpgsqlConnection connection = new(_connectionString);
var connectionString = _connectionString;
if (_getConnectionString != null)
{
connectionString = SetupConnectionStringBuilder(_getConnectionString.Invoke()).ConnectionString;
}

NpgsqlConnection connection = new(connectionString);
_connectionSetup?.Invoke(connection);
return connection;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public abstract class NpgsqlInstanceConnectionFactoryBase : IConnectionFactory
{
private readonly PostgreSqlStorageOptions _options;
[CanBeNull] private NpgsqlConnectionStringBuilder _connectionStringBuilder;
[CanBeNull] private string _connectionString;

protected NpgsqlInstanceConnectionFactoryBase(PostgreSqlStorageOptions options)
{
Expand All @@ -23,13 +24,14 @@ protected NpgsqlInstanceConnectionFactoryBase(PostgreSqlStorageOptions options)

protected NpgsqlConnectionStringBuilder SetupConnectionStringBuilder(string connectionString)
{
if (_connectionStringBuilder != null)
if (_connectionStringBuilder != null && string.Equals(_connectionString, connectionString, StringComparison.OrdinalIgnoreCase))
{
return _connectionStringBuilder;
}

try
{
_connectionString = connectionString;
NpgsqlConnectionStringBuilder builder = new(connectionString);

// The connection string must not be modified when transaction enlistment is enabled, otherwise it will cause
Expand Down
5 changes: 5 additions & 0 deletions src/Hangfire.PostgreSql/PostgreSqlBootstrapperOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public PostgreSqlBootstrapperOptions UseNpgsqlConnection(string connectionString
return UseConnectionFactory(new NpgsqlConnectionFactory(connectionString, _options, connectionSetup));
}

public PostgreSqlBootstrapperOptions UseNpgsqlConnection(Func<string> getConnectionString, [CanBeNull] Action<NpgsqlConnection> connectionSetup = null)
{
return UseConnectionFactory(new NpgsqlConnectionFactory(getConnectionString, _options, connectionSetup));
}

/// <summary>
/// Configures the bootstrapper to use the existing <see cref="NpgsqlConnection"/> for each database action.
/// </summary>
Expand Down

0 comments on commit 97158c5

Please sign in to comment.