Skip to content

Commit 551d6c2

Browse files
committed
ConnectionInfoParser: supports connection strings as dictionary
1 parent 2999139 commit 551d6c2

1 file changed

Lines changed: 54 additions & 9 deletions

File tree

Orm/Xtensive.Orm/Orm/Configuration/Internals/ConnectionInfoParser.cs

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,61 @@
55
// Created: 2013.09.27
66

77
using System;
8+
using System.Collections;
9+
using System.Collections.Generic;
810
using System.Configuration;
11+
using System.Diagnostics.CodeAnalysis;
12+
using Microsoft.Extensions.Configuration;
913
using Xtensive.Core;
1014

1115
namespace Xtensive.Orm.Configuration
1216
{
1317
internal static class ConnectionInfoParser
1418
{
19+
private readonly struct UnifiedAccessor
20+
{
21+
private readonly IDictionary<string, string> connectionStringsAsDict;
22+
private readonly ConnectionStringSettingsCollection connectionStrings;
23+
24+
public string this[string key] {
25+
get {
26+
if (connectionStrings != null)
27+
return connectionStrings[key]?.ConnectionString;
28+
else if(connectionStringsAsDict!=null)
29+
return connectionStringsAsDict[key];
30+
return null;
31+
}
32+
}
33+
34+
public UnifiedAccessor(ConnectionStringSettingsCollection oldConnectionStrings)
35+
{
36+
connectionStringsAsDict = null;
37+
connectionStrings = oldConnectionStrings;
38+
}
39+
public UnifiedAccessor(IDictionary<string, string> connectionStrings)
40+
{
41+
connectionStringsAsDict = connectionStrings;
42+
this.connectionStrings = null;
43+
}
44+
}
45+
1546
public static ConnectionInfo GetConnectionInfo(System.Configuration.Configuration configuration,string connectionUrl, string provider, string connectionString)
1647
{
17-
bool connectionUrlSpecified = !string.IsNullOrEmpty(connectionUrl);
18-
bool connectionStringSpecified = !string.IsNullOrEmpty(connectionString) && !string.IsNullOrEmpty(provider);
48+
var accessor = new UnifiedAccessor(configuration.ConnectionStrings.ConnectionStrings);
49+
return GetConnectionInfoInternal(accessor, connectionUrl, provider, connectionString);
50+
}
51+
52+
public static ConnectionInfo GetConnectionInfo(IDictionary<string,string> connectionStrings, string connectionUrl, string provider, string connectionString)
53+
{
54+
var accessor = new UnifiedAccessor(connectionStrings);
55+
return GetConnectionInfoInternal(accessor, connectionUrl, provider, connectionString);
56+
}
57+
58+
private static ConnectionInfo GetConnectionInfoInternal(in UnifiedAccessor connectionStringAccessor,
59+
string connectionUrl, string provider, string connectionString)
60+
{
61+
var connectionUrlSpecified = !string.IsNullOrEmpty(connectionUrl);
62+
var connectionStringSpecified = !string.IsNullOrEmpty(connectionString) && !string.IsNullOrEmpty(provider);
1963

2064
if (connectionUrlSpecified && connectionStringSpecified)
2165
throw new InvalidOperationException(Strings.ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrProviderAndConnectionStringElements);
@@ -24,30 +68,31 @@ public static ConnectionInfo GetConnectionInfo(System.Configuration.Configuratio
2468
return new ConnectionInfo(connectionUrl);
2569

2670
if (connectionStringSpecified)
27-
return new ConnectionInfo(provider, ExpandConnectionString(configuration, connectionString));
71+
return new ConnectionInfo(provider,
72+
ExpandConnectionString(connectionStringAccessor, connectionString));
2873

2974
// Neither connection string, nor connection url specified.
3075
// Leave connection information undefined.
3176
return null;
3277
}
3378

34-
private static string ExpandConnectionString(System.Configuration.Configuration configuration, string connectionString)
79+
private static string ExpandConnectionString(in UnifiedAccessor connectionStrings, string connectionString)
3580
{
3681
const string prefix = "#";
3782

3883
if (!connectionString.StartsWith(prefix, StringComparison.Ordinal))
3984
return connectionString;
4085

41-
string connectionStringName = connectionString.Substring(prefix.Length);
86+
var connectionStringName = connectionString[prefix.Length..];
4287

43-
var connectionStringSetting = configuration.ConnectionStrings.ConnectionStrings[connectionStringName];
44-
if (connectionStringSetting==null)
88+
var connectionStringSetting = connectionStrings[connectionStringName];
89+
if (connectionStringSetting == null)
4590
throw new InvalidOperationException(string.Format(Strings.ExConnectionStringWithNameXIsNotFound, connectionStringName));
4691

47-
if (string.IsNullOrEmpty(connectionStringSetting.ConnectionString))
92+
if (string.IsNullOrEmpty(connectionStringSetting))
4893
throw new InvalidOperationException(string.Format(Strings.ExConnectionStringWithNameXIsNullOrEmpty, connectionStringName));
4994

50-
return connectionStringSetting.ConnectionString;
95+
return connectionStringSetting;
5196
}
5297
}
5398
}

0 commit comments

Comments
 (0)