Skip to content

Commit b69da75

Browse files
authored
Cleanup | DbConnectionOptions (#3436)
* Lazily merge the platform specific code into DbConnectionOptions.cs * Remove SqlConnectionString.DEFAULT class and replace usages with DbConnectionStringDefaults * Rename DbConnectionStringDefaults to match naming conventions * Remove SqlConnectionString.KEY and replace with DbConnectionStringKeywords * Rename DbConnectionStringKeywords to match naming conventions, remove dead OLEDB and ODBC keywords * Remove SqlConnectionString.SYNONYMS and replace with DbConnectionStringSynonyms * Rename DbConnectionStringSynonyms to match naming conventions * Statically build dictionary of keyword mappings. This should be cleaner than the old version. * Synonym comparison is supposed to be case-insensitive * Fixing typos as per @paulmedynski's comments
1 parent dc75c40 commit b69da75

17 files changed

+429
-622
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft.Data.SqlClient.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,7 @@
816816
<Compile Include="Microsoft\Data\SqlClient\TdsParserStateObjectManaged.cs" />
817817
<Compile Include="Microsoft.Data.SqlClient.TypeForwards.cs" />
818818
</ItemGroup>
819+
819820
<!-- Windows only -->
820821
<ItemGroup Condition="'$(TargetsWindows)' == 'true'">
821822
<Compile Include="$(CommonSourceRoot)\Interop\Windows\Handles\SafeLibraryHandle.netcore.cs">
@@ -962,9 +963,11 @@
962963
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlTypes\SqlFileStream.Windows.cs">
963964
<Link>Microsoft\Data\SqlTypes\SqlFileStream.Windows.cs</Link>
964965
</Compile>
966+
965967
<Compile Include="Microsoft\Data\SqlClient\TdsParser.Windows.cs" />
966968
<Compile Include="Microsoft\Data\SqlClient\TdsParserStateObjectNative.cs" />
967969
</ItemGroup>
970+
968971
<!-- Unix only -->
969972
<ItemGroup Condition="'$(TargetsUnix)' == 'true'">
970973
<Compile Include="$(CommonSourceRoot)Microsoft\Data\Common\AdapterUtil.Unix.cs">
@@ -1003,8 +1006,10 @@
10031006
<Compile Include="$(CommonSourceRoot)Microsoft\Data\SqlTypes\SqlFileStream.netcore.Unix.cs">
10041007
<Link>Microsoft\Data\SqlTypes\SqlFileStream.netcore.Unix.cs</Link>
10051008
</Compile>
1009+
10061010
<Compile Include="Microsoft\Data\SqlClient\TdsParser.Unix.cs" />
10071011
</ItemGroup>
1012+
10081013
<!-- Resources -->
10091014
<ItemGroup>
10101015
<Compile Include="$(CommonSourceRoot)Resources\StringsHelper.cs">
@@ -1032,6 +1037,7 @@
10321037
<Link>Resources\Microsoft.Data.SqlClient.SqlMetaData.xml</Link>
10331038
</EmbeddedResource>
10341039
</ItemGroup>
1040+
10351041
<!-- Package References Etc -->
10361042
<ItemGroup>
10371043
<PackageReference Include="Azure.Identity" />

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlConnection.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ public override int ConnectionTimeout
663663
get
664664
{
665665
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
666-
return constr != null ? constr.ConnectTimeout : SqlConnectionString.DEFAULT.Connect_Timeout;
666+
return constr != null ? constr.ConnectTimeout : DbConnectionStringDefaults.ConnectTimeout;
667667
}
668668
}
669669

@@ -675,7 +675,7 @@ public int CommandTimeout
675675
get
676676
{
677677
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
678-
return constr != null ? constr.CommandTimeout : SqlConnectionString.DEFAULT.Command_Timeout;
678+
return constr != null ? constr.CommandTimeout : DbConnectionStringDefaults.CommandTimeout;
679679
}
680680
}
681681

@@ -757,7 +757,7 @@ public override string Database
757757
else
758758
{
759759
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
760-
result = constr != null ? constr.InitialCatalog : SqlConnectionString.DEFAULT.Initial_Catalog;
760+
result = constr != null ? constr.InitialCatalog : DbConnectionStringDefaults.InitialCatalog;
761761
}
762762
return result;
763763
}
@@ -830,7 +830,7 @@ public override string DataSource
830830
else
831831
{
832832
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
833-
result = constr != null ? constr.DataSource : SqlConnectionString.DEFAULT.Data_Source;
833+
result = constr != null ? constr.DataSource : DbConnectionStringDefaults.DataSource;
834834
}
835835
return result;
836836
}
@@ -857,7 +857,7 @@ public int PacketSize
857857
else
858858
{
859859
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
860-
result = constr != null ? constr.PacketSize : SqlConnectionString.DEFAULT.Packet_Size;
860+
result = constr != null ? constr.PacketSize : DbConnectionStringDefaults.PacketSize;
861861
}
862862
return result;
863863
}
@@ -2272,7 +2272,7 @@ public static void ChangePassword(string connectionString, string newPassword)
22722272
}
22732273
if (!string.IsNullOrEmpty(connectionOptions.AttachDBFilename))
22742274
{
2275-
throw SQL.ChangePasswordUseOfUnallowedKey(SqlConnectionString.KEY.AttachDBFilename);
2275+
throw SQL.ChangePasswordUseOfUnallowedKey(DbConnectionStringKeywords.AttachDbFilename);
22762276
}
22772277

22782278
ChangePassword(connectionString, connectionOptions, null, newPassword, null);
@@ -2329,7 +2329,7 @@ public static void ChangePassword(string connectionString, SqlCredential credent
23292329

23302330
if (!string.IsNullOrEmpty(connectionOptions.AttachDBFilename))
23312331
{
2332-
throw SQL.ChangePasswordUseOfUnallowedKey(SqlConnectionString.KEY.AttachDBFilename);
2332+
throw SQL.ChangePasswordUseOfUnallowedKey(DbConnectionStringKeywords.AttachDbFilename);
23332333
}
23342334

23352335
ChangePassword(connectionString, connectionOptions, credential, null, newSecurePassword);

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlConnection.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ public override int ConnectionTimeout
657657
get
658658
{
659659
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
660-
return constr != null ? constr.ConnectTimeout : SqlConnectionString.DEFAULT.Connect_Timeout;
660+
return constr != null ? constr.ConnectTimeout : DbConnectionStringDefaults.ConnectTimeout;
661661
}
662662
}
663663

@@ -669,7 +669,7 @@ public int CommandTimeout
669669
get
670670
{
671671
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
672-
return constr != null ? constr.CommandTimeout : SqlConnectionString.DEFAULT.Command_Timeout;
672+
return constr != null ? constr.CommandTimeout : DbConnectionStringDefaults.CommandTimeout;
673673
}
674674
}
675675

@@ -750,7 +750,7 @@ public override string Database
750750
else
751751
{
752752
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
753-
result = constr != null ? constr.InitialCatalog : SqlConnectionString.DEFAULT.Initial_Catalog;
753+
result = constr != null ? constr.InitialCatalog : DbConnectionStringDefaults.InitialCatalog;
754754
}
755755
return result;
756756
}
@@ -822,7 +822,7 @@ public override string DataSource
822822
else
823823
{
824824
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
825-
result = constr != null ? constr.DataSource : SqlConnectionString.DEFAULT.Data_Source;
825+
result = constr != null ? constr.DataSource : DbConnectionStringDefaults.DataSource;
826826
}
827827
return result;
828828
}
@@ -847,7 +847,7 @@ public int PacketSize
847847
else
848848
{
849849
SqlConnectionString constr = (SqlConnectionString)ConnectionOptions;
850-
result = constr != null ? constr.PacketSize : SqlConnectionString.DEFAULT.Packet_Size;
850+
result = constr != null ? constr.PacketSize : DbConnectionStringDefaults.PacketSize;
851851
}
852852

853853
return result;
@@ -2195,7 +2195,7 @@ public static void ChangePassword(string connectionString, string newPassword)
21952195
}
21962196
if (!string.IsNullOrEmpty(connectionOptions.AttachDBFilename))
21972197
{
2198-
throw SQL.ChangePasswordUseOfUnallowedKey(SqlConnectionString.KEY.AttachDBFilename);
2198+
throw SQL.ChangePasswordUseOfUnallowedKey(DbConnectionStringKeywords.AttachDbFilename);
21992199
}
22002200

22012201
PermissionSet permissionSet = connectionOptions.CreatePermissionSet();
@@ -2255,7 +2255,7 @@ public static void ChangePassword(string connectionString, SqlCredential credent
22552255

22562256
if (!string.IsNullOrEmpty(connectionOptions.AttachDBFilename))
22572257
{
2258-
throw SQL.ChangePasswordUseOfUnallowedKey(SqlConnectionString.KEY.AttachDBFilename);
2258+
throw SQL.ChangePasswordUseOfUnallowedKey(DbConnectionStringKeywords.AttachDbFilename);
22592259
}
22602260

22612261
PermissionSet permissionSet = connectionOptions.CreatePermissionSet();

src/Microsoft.Data.SqlClient/netfx/src/Microsoft/Data/SqlClient/SqlInternalConnectionTds.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1799,7 +1799,7 @@ private bool ShouldDisableTnir(SqlConnectionString connectionOptions)
17991799

18001800
// Check if the user had explicitly specified the TNIR option in the connection string or the connection string builder.
18011801
// If the user has specified the option in the connection string explicitly, then we shouldn't disable TNIR.
1802-
bool isTnirExplicitlySpecifiedInConnectionOptions = connectionOptions.Parsetable.ContainsKey(SqlConnectionString.KEY.TransparentNetworkIPResolution);
1802+
bool isTnirExplicitlySpecifiedInConnectionOptions = connectionOptions.Parsetable.ContainsKey(DbConnectionStringKeywords.TransparentNetworkIpResolution);
18031803

18041804
return isTnirExplicitlySpecifiedInConnectionOptions ? false : (isAzureEndPoint || isFedAuthEnabled);
18051805
}

src/Microsoft.Data.SqlClient/src/Microsoft/Data/Common/ConnectionString/DbConnectionOptions.Debug.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ internal partial class DbConnectionOptions
5050
#endif
5151

5252
[Conditional("DEBUG")]
53-
private static void DebugTraceKeyValuePair(string keyname, string keyvalue, Dictionary<string, string> synonyms)
53+
private static void DebugTraceKeyValuePair(string keyname, string keyvalue, IReadOnlyDictionary<string, string> synonyms)
5454
{
5555
if (SqlClientEventSource.Log.IsAdvancedTraceOn())
5656
{
@@ -77,7 +77,7 @@ private static void DebugTraceKeyValuePair(string keyname, string keyvalue, Dict
7777
private static void ParseComparison(
7878
Dictionary<string, string> parseTable,
7979
string connectionString,
80-
Dictionary<string, string> synonyms,
80+
IReadOnlyDictionary<string, string> synonyms,
8181
bool firstKey,
8282
Exception e)
8383
{
@@ -138,7 +138,7 @@ private static void ParseComparison(
138138
#if DEBUG
139139
private static Dictionary<string, string> SplitConnectionString(
140140
string connectionString,
141-
Dictionary<string, string> synonyms,
141+
IReadOnlyDictionary<string, string> synonyms,
142142
bool firstKey)
143143
{
144144
var parseTable = new Dictionary<string, string>();

src/Microsoft.Data.SqlClient/src/Microsoft/Data/Common/ConnectionString/DbConnectionOptions.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ internal partial class DbConnectionOptions
4545
internal Dictionary<string, string> Parsetable => _parsetable;
4646
public bool IsEmpty => _keyChain == null;
4747

48-
public DbConnectionOptions(string connectionString, Dictionary<string, string> synonyms)
48+
public DbConnectionOptions(string connectionString, IReadOnlyDictionary<string, string> synonyms)
4949
{
5050
_parsetable = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
5151
_usersConnectionString = connectionString ?? "";
@@ -56,8 +56,8 @@ public DbConnectionOptions(string connectionString, Dictionary<string, string> s
5656
_keyChain = ParseInternal(_parsetable, _usersConnectionString, true, synonyms, false);
5757
_hasPasswordKeyword = _parsetable.ContainsKey(DbConnectionStringKeywords.Password) ||
5858
_parsetable.ContainsKey(DbConnectionStringSynonyms.Pwd);
59-
_hasUserIdKeyword = _parsetable.ContainsKey(DbConnectionStringKeywords.UserID) ||
60-
_parsetable.ContainsKey(DbConnectionStringSynonyms.UID);
59+
_hasUserIdKeyword = _parsetable.ContainsKey(DbConnectionStringKeywords.UserId) ||
60+
_parsetable.ContainsKey(DbConnectionStringSynonyms.Uid);
6161
}
6262
}
6363

@@ -462,7 +462,12 @@ private static bool IsKeyNameValid(string keyname)
462462
return false;
463463
}
464464

465-
private static NameValuePair ParseInternal(Dictionary<string, string> parsetable, string connectionString, bool buildChain, Dictionary<string, string> synonyms, bool firstKey)
465+
private static NameValuePair ParseInternal(
466+
Dictionary<string, string> parsetable,
467+
string connectionString,
468+
bool buildChain,
469+
IReadOnlyDictionary<string, string> synonyms,
470+
bool firstKey)
466471
{
467472
Debug.Assert(connectionString != null, "null connectionstring");
468473
StringBuilder buffer = new StringBuilder();
@@ -573,7 +578,7 @@ internal NameValuePair ReplacePasswordPwd(out string constr, bool fakePassword)
573578
constr = builder.ToString();
574579
return head;
575580
}
576-
581+
577582
// SxS notes:
578583
// * this method queries "DataDirectory" value from the current AppDomain.
579584
// This string is used for to replace "!DataDirectory!" values in the connection string, it is not considered as an "exposed resource".
@@ -628,7 +633,7 @@ internal string ExpandAttachDbFileName(string replacementValue)
628633
StringBuilder builder = new(_usersConnectionString.Length);
629634
for (NameValuePair current = _keyChain; current != null; current = current.Next)
630635
{
631-
if (string.Equals(current.Name, DbConnectionStringKeywords.AttachDBFilename, StringComparison.InvariantCultureIgnoreCase))
636+
if (string.Equals(current.Name, DbConnectionStringKeywords.AttachDbFilename, StringComparison.InvariantCultureIgnoreCase))
632637
{
633638
builder.Append($"{current.Name}={replacementValue};");
634639
}
@@ -644,7 +649,7 @@ internal string ExpandAttachDbFileName(string replacementValue)
644649

645650
#endif
646651
#endregion
647-
652+
648653
#region NetFx Methods
649654
#if NETFRAMEWORK
650655

@@ -679,8 +684,8 @@ internal bool HasBlankPassword
679684
return string.IsNullOrEmpty(value); // MDAC 83097
680685
}
681686

682-
return (_parsetable.TryGetValue(DbConnectionStringKeywords.UserID, out value) && !string.IsNullOrEmpty(value)) ||
683-
(_parsetable.TryGetValue(DbConnectionStringSynonyms.UID, out value) && !string.IsNullOrEmpty(value));
687+
return (_parsetable.TryGetValue(DbConnectionStringKeywords.UserId, out value) && !string.IsNullOrEmpty(value)) ||
688+
(_parsetable.TryGetValue(DbConnectionStringSynonyms.Uid, out value) && !string.IsNullOrEmpty(value));
684689
}
685690
return false;
686691
}
@@ -770,6 +775,5 @@ internal static void AppendKeyValuePairBuilder(StringBuilder builder, string key
770775
}
771776
#endif
772777
#endregion
773-
774778
}
775779
}

src/Microsoft.Data.SqlClient/src/Microsoft/Data/Common/ConnectionString/DbConnectionString.netfx.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,12 @@ internal sealed class DbConnectionString
4747
readonly private string _encryptedActualConnectionString;
4848
#pragma warning restore 169
4949

50-
internal DbConnectionString(string value, string restrictions, KeyRestrictionBehavior behavior, Dictionary<string, string> synonyms, bool useOdbcRules)
50+
internal DbConnectionString(
51+
string value,
52+
string restrictions,
53+
KeyRestrictionBehavior behavior,
54+
IReadOnlyDictionary<string, string> synonyms,
55+
bool useOdbcRules)
5156
: this(new DbConnectionOptions(value, synonyms), restrictions, behavior, synonyms, false)
5257
{
5358
// useOdbcRules is only used to parse the connection string, not to parse restrictions because values don't apply there
@@ -61,8 +66,14 @@ internal DbConnectionString(DbConnectionOptions connectionOptions)
6166
// since backward compatibility requires Everett level classes
6267
}
6368

64-
private DbConnectionString(DbConnectionOptions connectionOptions, string restrictions, KeyRestrictionBehavior behavior, Dictionary<string, string> synonyms, bool mustCloneDictionary)
65-
{ // used by DBDataPermission
69+
private DbConnectionString(
70+
DbConnectionOptions connectionOptions,
71+
string restrictions,
72+
KeyRestrictionBehavior behavior,
73+
IReadOnlyDictionary<string, string> synonyms,
74+
bool mustCloneDictionary)
75+
{
76+
// used by DBDataPermission
6677
Debug.Assert(connectionOptions != null, "null connectionOptions");
6778
switch (behavior)
6879
{
@@ -117,7 +128,10 @@ private DbConnectionString(DbConnectionOptions connectionOptions, string restric
117128
}
118129
}
119130

120-
private DbConnectionString(DbConnectionString connectionString, string[] restrictionValues, KeyRestrictionBehavior behavior)
131+
private DbConnectionString(
132+
DbConnectionString connectionString,
133+
string[] restrictionValues,
134+
KeyRestrictionBehavior behavior)
121135
{
122136
// used by intersect for two equal connection strings with different restrictions
123137
_encryptedUsersConnectionString = connectionString._encryptedUsersConnectionString;

src/Microsoft.Data.SqlClient/src/Microsoft/Data/Common/ConnectionString/DbConnectionStringDefaults.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ internal static class DbConnectionStringDefaults
1515
#else
1616
"Core Microsoft SqlClient Data Provider";
1717
#endif
18-
internal const string AttachDBFilename = "";
18+
internal const string AttachDbFilename = "";
1919
internal const SqlConnectionAttestationProtocol AttestationProtocol = SqlConnectionAttestationProtocol.NotSpecified;
2020
internal static readonly SqlAuthenticationMethod Authentication = SqlAuthenticationMethod.NotSpecified;
2121
internal const SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Disabled;
@@ -30,11 +30,11 @@ internal static class DbConnectionStringDefaults
3030
internal static readonly SqlConnectionEncryptOption Encrypt = SqlConnectionEncryptOption.Mandatory;
3131
internal const bool Enlist = true;
3232
internal const string FailoverPartner = "";
33-
internal const string FailoverPartnerSPN = "";
33+
internal const string FailoverPartnerSpn = "";
3434
internal const string HostNameInCertificate = "";
3535
internal const string InitialCatalog = "";
3636
internal const bool IntegratedSecurity = false;
37-
internal const SqlConnectionIPAddressPreference IPAddressPreference = SqlConnectionIPAddressPreference.IPv4First;
37+
internal const SqlConnectionIPAddressPreference IpAddressPreference = SqlConnectionIPAddressPreference.IPv4First;
3838
internal const int LoadBalanceTimeout = 0; // default of 0 means don't use
3939
internal const int MaxPoolSize = 100;
4040
internal const int MinPoolSize = 0;
@@ -47,17 +47,17 @@ internal static class DbConnectionStringDefaults
4747
internal const bool Pooling = true;
4848
internal const bool Replication = false;
4949
internal const string ServerCertificate = "";
50-
internal const string ServerSPN = "";
50+
internal const string ServerSpn = "";
5151
internal const string TransactionBinding = "Implicit Unbind";
5252
internal const bool TrustServerCertificate = false;
5353
internal const string TypeSystemVersion = "Latest";
54-
internal const string UserID = "";
54+
internal const string UserId = "";
5555
internal const bool UserInstance = false;
56-
internal const string WorkstationID = "";
56+
internal const string WorkstationId = "";
5757

5858
#if NETFRAMEWORK
5959
internal const bool ConnectionReset = true;
60-
internal static readonly bool TransparentNetworkIPResolution = !LocalAppContextSwitches.DisableTnirByDefault;
60+
internal static readonly bool TransparentNetworkIpResolution = !LocalAppContextSwitches.DisableTnirByDefault;
6161
internal const string NetworkLibrary = "";
6262
#endif
6363
}

0 commit comments

Comments
 (0)