Skip to content

Commit 33d60e0

Browse files
committed
5.0.0-preview019 - Fixed bug in ShardingConnection
1 parent ecf3e6d commit 33d60e0

File tree

6 files changed

+43
-29
lines changed

6 files changed

+43
-29
lines changed

AuthPermissions.AspNetCore/CreateNuGetDebug.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
33
<metadata>
44
<id>AuthPermissions.AspNetCore</id>
5-
<version>5.0.0-preview017debug</version>
5+
<version>5.0.0-preview019debug</version>
66
<authors>Jon P Smith</authors>
77
<product>AuthPermissions.AspNetCore</product>
88
<copyright>Copyright (c) 2021 Jon P Smith</copyright>

AuthPermissions.AspNetCore/MultiProjPack.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<!-- See documentation for all the possible values -->
55
<metadata>
66
<id>AuthPermissions.AspNetCore</id>
7-
<version>5.0.0-preview017debug</version>
7+
<version>5.0.0-preview019debug</version>
88
<authors>Jon P Smith</authors>
99
<product>AuthPermissions.AspNetCore</product>
1010
<copyright>Copyright (c) 2021 Jon P Smith</copyright>

AuthPermissions.AspNetCore/ShardingServices/ShardingConnectionsJsonFile.cs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ public class ShardingConnectionsJsonFile : IShardingConnections
2626
private readonly AuthPermissionsDbContext _context;
2727
private readonly IDefaultLocalizer _localizeDefault;
2828
private readonly AuthPermissionsOptions _options;
29-
private readonly ShardingSettingsOption _shardingSettings;
29+
30+
/// <summary>
31+
/// This contains the most up to date data in the shardingsettings json file
32+
/// </summary>
33+
private List<DatabaseInformation> _databaseInformation;
3034

3135
/// <summary>
3236
/// This contains the methods with are specific to a database provider
@@ -48,26 +52,21 @@ public class ShardingConnectionsJsonFile : IShardingConnections
4852
/// <param name="databaseProviderMethods"></param>
4953
/// <param name="localizeProvider">Provides the used to localize any errors or messages</param>
5054
public ShardingConnectionsJsonFile(IOptionsSnapshot<ConnectionStringsOption> connectionsAccessor,
51-
IOptionsSnapshot<ShardingSettingsOption> shardingSettingsAccessor,
55+
IOptionsMonitor<ShardingSettingsOption> shardingSettingsAccessor,
5256
AuthPermissionsDbContext context, AuthPermissionsOptions options,
5357
IEnumerable<IDatabaseSpecificMethods> databaseProviderMethods,
5458
IAuthPDefaultLocalizer localizeProvider)
5559
{
5660
//thanks to https://stackoverflow.com/questions/37287427/get-multiple-connection-strings-in-appsettings-json-without-ef
5761
_connectionDict = connectionsAccessor.Value;
58-
_shardingSettings = shardingSettingsAccessor.Value;
5962
_context = context;
6063
_options = options;
64+
SetDatabaseInformation(shardingSettingsAccessor.CurrentValue);
65+
shardingSettingsAccessor.OnChange(SetDatabaseInformation);
66+
6167
DatabaseProviderMethods = databaseProviderMethods.ToDictionary(x => x.AuthPDatabaseType);
6268
ShardingDatabaseProviders = DatabaseProviderMethods.Values.ToDictionary(x => x.DatabaseProviderShortName);
6369
_localizeDefault = localizeProvider.DefaultLocalizer;
64-
65-
//If no sharding settings file, then we provide one default sharding settings data
66-
//NOTE that the DatabaseInformation class has default values linked to a
67-
_shardingSettings.ShardingDatabases ??= new List<DatabaseInformation>
68-
{
69-
DatabaseInformation.FormDefaultDatabaseInfo(options, _context)
70-
};
7170
}
7271

7372
/// <summary>
@@ -79,7 +78,7 @@ public ShardingConnectionsJsonFile(IOptionsSnapshot<ConnectionStringsOption> con
7978
/// <returns>A list of <see cref="DatabaseInformation"/> from the sharding settings file</returns>
8079
public List<DatabaseInformation> GetAllPossibleShardingData()
8180
{
82-
return _shardingSettings.ShardingDatabases;
81+
return _databaseInformation;
8382
}
8483

8584
/// <summary>
@@ -110,7 +109,7 @@ public IEnumerable<string> GetConnectionStringNames()
110109

111110
var result = new List<(string databaseInfoName, bool? hasOwnDb, List<string>)>();
112111
//Add sharding database names that have no tenants in them so that you can see all the connection string names
113-
foreach (var databaseInfoName in _shardingSettings.ShardingDatabases.Select(x => x.Name))
112+
foreach (var databaseInfoName in _databaseInformation.Select(x => x.Name))
114113
{
115114
result.Add(grouped.ContainsKey(databaseInfoName)
116115
? (databaseInfoName,
@@ -130,15 +129,16 @@ public IEnumerable<string> GetConnectionStringNames()
130129
/// This will provide the connection string for the entry with the given database info name
131130
/// </summary>
132131
/// <param name="databaseInfoName">The name of sharding database info we want to access</param>
133-
/// <returns>The connection string, or null if not found</returns>
132+
/// <returns>The connection string, or throw exception</returns>
134133
public string FormConnectionString(string databaseInfoName)
135134
{
136135
if (databaseInfoName == null)
137136
throw new AuthPermissionsException("The name of the database date can't be null");
138137

139-
var databaseData = _shardingSettings.ShardingDatabases.SingleOrDefault(x => x.Name == databaseInfoName);
138+
var databaseData = _databaseInformation.SingleOrDefault(x => x.Name == databaseInfoName);
140139
if (databaseData == null)
141-
return null;
140+
throw new AuthPermissionsException(
141+
$"The database information with the name of '{databaseInfoName}' wasn't founds.");
142142

143143
if (!_connectionDict.TryGetValue(databaseData.ConnectionName, out var connectionString))
144144
throw new AuthPermissionsException(
@@ -186,4 +186,18 @@ public IStatusGeneric TestFormingConnectionString(DatabaseInformation databaseIn
186186

187187
return status;
188188
}
189+
190+
//--------------------------------------------
191+
//private methods
192+
193+
/// <summary>
194+
/// This takes to information from the OptionsMonitor and sets the _databaseInformation parameter
195+
/// </summary>
196+
/// <returns></returns>
197+
private void SetDatabaseInformation(ShardingSettingsOption fromMonitor )
198+
{
199+
_databaseInformation = (fromMonitor.ShardingDatabases == null || !fromMonitor.ShardingDatabases.Any())
200+
? new List<DatabaseInformation> { DatabaseInformation.FormDefaultDatabaseInfo(_options, _context) }
201+
: fromMonitor.ShardingDatabases;
202+
}
189203
}

Test/TestData/shardingsettings.Test.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"Name": "PostgreSql1",
1717
"DatabaseName": "StubTest",
1818
"ConnectionName": "PostgreSqlConnection",
19-
"DatabaseType": "Postgres"
19+
"DatabaseType": "PostgreSQL"
2020
}
2121
]
2222
}

Test/UnitTests/TestSharding/TestAccessDatabaseInformation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void TestReadShardingSettingsFile()
9292
databaseInfo.Count.ShouldEqual(3);
9393
databaseInfo[0].ToString().ShouldEqual("Name: Default Database, DatabaseName: < null > , ConnectionName: UnitTestConnection, DatabaseType: SqlServer");
9494
databaseInfo[1].ToString().ShouldEqual("Name: Other Database, DatabaseName: MyDatabase1, ConnectionName: UnitTestConnection, DatabaseType: SqlServer");
95-
databaseInfo[2].ToString().ShouldEqual("Name: PostgreSql1, DatabaseName: StubTest, ConnectionName: PostgreSqlConnection, DatabaseType: Postgres");
95+
databaseInfo[2].ToString().ShouldEqual("Name: PostgreSql1, DatabaseName: StubTest, ConnectionName: PostgreSqlConnection, DatabaseType: PostgreSQL");
9696
}
9797

9898
[Fact]

Test/UnitTests/TestSharding/TestShardingConnectionString.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class TestShardingConnectionString
2121
{
2222
private readonly ITestOutputHelper _output;
2323
private readonly IOptionsSnapshot<ConnectionStringsOption> _connectSnapshot;
24-
private readonly IOptionsSnapshot<ShardingSettingsOption> _shardingSnapshot;
24+
private readonly IOptionsMonitor<ShardingSettingsOption> _shardingMonitor;
2525

2626
public TestShardingConnectionString(ITestOutputHelper output)
2727
{
@@ -34,7 +34,7 @@ public TestShardingConnectionString(ITestOutputHelper output)
3434
var serviceProvider = services.BuildServiceProvider();
3535

3636
_connectSnapshot = serviceProvider.GetRequiredService<IOptionsSnapshot<ConnectionStringsOption>>();
37-
_shardingSnapshot = serviceProvider.GetRequiredService<IOptionsSnapshot<ShardingSettingsOption>>();
37+
_shardingMonitor = serviceProvider.GetRequiredService<IOptionsMonitor<ShardingSettingsOption>>();
3838
}
3939

4040
private static AuthPermissionsOptions FormAuthOptionsForSharding(
@@ -110,7 +110,7 @@ public void TestDefaultShardingDatabaseData_CustomDatabase_NoContext()
110110
public void TestGetAllConnectionStrings()
111111
{
112112
//SETUP
113-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
113+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
114114
null, FormAuthOptionsForSharding(), ShardingHelpers.GetDatabaseSpecificMethods(),
115115
"en".SetupAuthPLoggingLocalizer());
116116

@@ -135,7 +135,7 @@ public void TestGetAllConnectionStrings()
135135
public void TestFormingConnectionString(string connectionName, bool isValid)
136136
{
137137
//SETUP
138-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
138+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
139139
null, FormAuthOptionsForSharding(), ShardingHelpers.GetDatabaseSpecificMethods(),
140140
"en".SetupAuthPLoggingLocalizer());
141141

@@ -158,7 +158,7 @@ public void TestFormingConnectionString(string connectionName, bool isValid)
158158
public void TestGetNamedConnectionStringSqlServer()
159159
{
160160
//SETUP
161-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
161+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
162162
null, FormAuthOptionsForSharding(), ShardingHelpers.GetDatabaseSpecificMethods(),
163163
"en".SetupAuthPLoggingLocalizer());
164164

@@ -173,7 +173,7 @@ public void TestGetNamedConnectionStringSqlServer()
173173
public void TestGetNamedConnectionStringSqlServer_NoDatabaseName()
174174
{
175175
//SETUP
176-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
176+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
177177
null, FormAuthOptionsForSharding(), ShardingHelpers.GetDatabaseSpecificMethods(),
178178
"en".SetupAuthPLoggingLocalizer());
179179

@@ -188,7 +188,7 @@ public void TestGetNamedConnectionStringSqlServer_NoDatabaseName()
188188
public void TestGetNamedConnectionStringDefaultDatabase()
189189
{
190190
//SETUP
191-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
191+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
192192
null, FormAuthOptionsForSharding(), ShardingHelpers.GetDatabaseSpecificMethods(),
193193
"en".SetupAuthPLoggingLocalizer());
194194

@@ -203,7 +203,7 @@ public void TestGetNamedConnectionStringDefaultDatabase()
203203
public void TestGetNamedConnectionStringPostgres()
204204
{
205205
//SETUP
206-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
206+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
207207
null, FormAuthOptionsForSharding(AuthPDatabaseTypes.PostgreSQL),
208208
ShardingHelpers.GetDatabaseSpecificMethods(),
209209
"en".SetupAuthPLoggingLocalizer());
@@ -238,7 +238,7 @@ public async Task TestQueryTenantsSingle()
238238
var services = new ServiceCollection();
239239
services.Configure<ConnectionStringsOption>(config.GetSection("ConnectionStrings"));
240240

241-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
241+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
242242
context, FormAuthOptionsForSharding(), ShardingHelpers.GetDatabaseSpecificMethods(),
243243
"en".SetupAuthPLoggingLocalizer());
244244

@@ -286,7 +286,7 @@ public async Task TestQueryTenantsSingleDefaultConnectionName(bool addTenantDefa
286286
var services = new ServiceCollection();
287287
services.Configure<ConnectionStringsOption>(config.GetSection("ConnectionStrings"));
288288

289-
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingSnapshot,
289+
var service = new ShardingConnectionsJsonFile(_connectSnapshot, _shardingMonitor,
290290
context, FormAuthOptionsForSharding(), ShardingHelpers.GetDatabaseSpecificMethods(),
291291
"en".SetupAuthPLoggingLocalizer());
292292

0 commit comments

Comments
 (0)