@@ -20,9 +20,9 @@ internal partial class DbConnectionOptions
20
20
+ "(?<key>([^=\\ s\\ p{Cc}]|\\ s+[^=\\ s\\ p{Cc}]|\\ s+==|==)+)" // allow any visible character for keyname except '=' which must quoted as '=='
21
21
+ "\\ s*=(?!=)\\ s*" // the equal sign divides the key and value parts
22
22
+ "(?<value>"
23
- + "(\" ([^\" \u0000 ]|\" \" )*\" )" // double quoted string, " must be quoted as ""
23
+ + "(\" ([^\" \u0000 ]|\" \" )*\" )" // double- quoted string, " must be quoted as ""
24
24
+ "|"
25
- + "('([^'\u0000 ]|'')*')" // single quoted string, ' must be quoted as ''
25
+ + "('([^'\u0000 ]|'')*')" // single- quoted string, ' must be quoted as ''
26
26
+ "|"
27
27
+ "((?![\" '\\ s])" // unquoted value must not start with " or ' or space, would also like = but too late to change
28
28
+ "([^;\\ s\\ p{Cc}]|\\ s+[^;\\ s\\ p{Cc}])*" // control characters must be quoted
@@ -73,18 +73,24 @@ private static void DebugTraceKeyValuePair(string keyname, string keyvalue, Dict
73
73
}
74
74
}
75
75
76
- private static void ParseComparison ( Dictionary < string , string > parsetable , string connectionString , Dictionary < string , string > synonyms , bool firstKey , Exception e )
76
+ #if DEBUG
77
+ private static void ParseComparison (
78
+ Dictionary < string , string > parseTable ,
79
+ string connectionString ,
80
+ Dictionary < string , string > synonyms ,
81
+ bool firstKey ,
82
+ Exception e )
77
83
{
78
84
try
79
85
{
80
- var parsedvalues = SplitConnectionString ( connectionString , synonyms , firstKey ) ;
81
- foreach ( var entry in parsedvalues )
86
+ var parsedValues = SplitConnectionString ( connectionString , synonyms , firstKey ) ;
87
+ foreach ( var parsedValue in parsedValues )
82
88
{
83
- string keyname = entry . Key ;
84
- string value1 = entry . Value ;
85
- string value2 ;
86
- bool parsetableContainsKey = parsetable . TryGetValue ( keyname , out value2 ) ;
87
- Debug . Assert ( parsetableContainsKey , $ "{ nameof ( ParseInternal ) } code vs. regex mismatch keyname <{ keyname } >") ;
89
+ string key = parsedValue . Key ;
90
+ string value1 = parsedValue . Value ;
91
+
92
+ bool parseTableContainsKey = parseTable . TryGetValue ( key , out string value2 ) ;
93
+ Debug . Assert ( parseTableContainsKey , $ "{ nameof ( ParseInternal ) } code vs. regex mismatch keyname <{ key } >") ;
88
94
Debug . Assert ( value1 == value2 , $ "{ nameof ( ParseInternal ) } code vs. regex mismatch keyvalue <{ value1 } > <{ value2 } >") ;
89
95
}
90
96
}
@@ -97,38 +103,46 @@ private static void ParseComparison(Dictionary<string, string> parsetable, strin
97
103
98
104
const string KeywordNotSupportedMessagePrefix = "Keyword not supported:" ;
99
105
const string WrongFormatMessagePrefix = "Format of the initialization string" ;
100
- bool isEquivalent = ( msg1 == msg2 ) ;
106
+ bool isEquivalent = msg1 == msg2 ;
101
107
if ( ! isEquivalent )
102
108
{
103
109
// We also accept cases were Regex parser (debug only) reports "wrong format" and
104
110
// retail parsing code reports format exception in different location or "keyword not supported"
105
111
if ( msg2 . StartsWith ( WrongFormatMessagePrefix , StringComparison . Ordinal ) )
106
112
{
107
- if ( msg1 . StartsWith ( KeywordNotSupportedMessagePrefix , StringComparison . Ordinal ) || msg1 . StartsWith ( WrongFormatMessagePrefix , StringComparison . Ordinal ) )
113
+ if ( msg1 . StartsWith ( KeywordNotSupportedMessagePrefix , StringComparison . Ordinal ) ||
114
+ msg1 . StartsWith ( WrongFormatMessagePrefix , StringComparison . Ordinal ) )
108
115
{
109
116
isEquivalent = true ;
110
117
}
111
118
}
112
119
}
120
+
113
121
Debug . Assert ( isEquivalent , "ParseInternal code vs regex message mismatch: <" + msg1 + "> <" + msg2 + ">" ) ;
114
122
}
115
123
else
116
124
{
117
125
Debug . Fail ( "ParseInternal code vs regex throw mismatch " + f . Message ) ;
118
126
}
127
+
119
128
e = null ;
120
129
}
130
+
121
131
if ( e != null )
122
132
{
123
133
Debug . Fail ( "ParseInternal code threw exception vs regex mismatch" ) ;
124
134
}
125
135
}
126
-
127
-
128
- private static Dictionary < string , string > SplitConnectionString ( string connectionString , Dictionary < string , string > synonyms , bool firstKey )
136
+ #endif
137
+
138
+ #if DEBUG
139
+ private static Dictionary < string , string > SplitConnectionString (
140
+ string connectionString ,
141
+ Dictionary < string , string > synonyms ,
142
+ bool firstKey )
129
143
{
130
- var parsetable = new Dictionary < string , string > ( ) ;
131
- Regex parser = ( firstKey ? s_connectionStringRegexOdbc : s_connectionStringRegex ) ;
144
+ var parseTable = new Dictionary < string , string > ( ) ;
145
+ Regex parser = firstKey ? ConnectionStringRegexOdbc : ConnectionStringRegex ;
132
146
133
147
const int KeyIndex = 1 , ValueIndex = 2 ;
134
148
Debug . Assert ( KeyIndex == parser . GroupNumberFromName ( "key" ) , "wrong key index" ) ;
@@ -137,27 +151,28 @@ private static Dictionary<string, string> SplitConnectionString(string connectio
137
151
if ( connectionString != null )
138
152
{
139
153
Match match = parser . Match ( connectionString ) ;
140
- if ( ! match . Success || ( match . Length != connectionString . Length ) )
154
+ if ( ! match . Success || match . Length != connectionString . Length )
141
155
{
142
156
throw ADP . ConnectionStringSyntax ( match . Length ) ;
143
157
}
158
+
144
159
int indexValue = 0 ;
145
- CaptureCollection keyvalues = match . Groups [ ValueIndex ] . Captures ;
160
+ CaptureCollection keyValues = match . Groups [ ValueIndex ] . Captures ;
146
161
foreach ( Capture keypair in match . Groups [ KeyIndex ] . Captures )
147
162
{
148
- string keyname = ( firstKey ? keypair . Value : keypair . Value . Replace ( "==" , "=" ) ) . ToLower ( CultureInfo . InvariantCulture ) ;
149
- string keyvalue = keyvalues [ indexValue ++ ] . Value ;
150
- if ( 0 < keyvalue . Length )
163
+ string keyName = ( firstKey ? keypair . Value : keypair . Value . Replace ( "==" , "=" ) ) . ToLower ( CultureInfo . InvariantCulture ) ;
164
+ string keyValue = keyValues [ indexValue ++ ] . Value ;
165
+ if ( 0 < keyValue . Length )
151
166
{
152
167
if ( ! firstKey )
153
168
{
154
- switch ( keyvalue [ 0 ] )
169
+ switch ( keyValue [ 0 ] )
155
170
{
156
171
case '\" ' :
157
- keyvalue = keyvalue . Substring ( 1 , keyvalue . Length - 2 ) . Replace ( "\" \" " , "\" " ) ;
172
+ keyValue = keyValue . Substring ( 1 , keyValue . Length - 2 ) . Replace ( "\" \" " , "\" " ) ;
158
173
break ;
159
174
case '\' ' :
160
- keyvalue = keyvalue . Substring ( 1 , keyvalue . Length - 2 ) . Replace ( "\' \' " , "\' " ) ;
175
+ keyValue = keyValue . Substring ( 1 , keyValue . Length - 2 ) . Replace ( "\' \' " , "\' " ) ;
161
176
break ;
162
177
default :
163
178
break ;
@@ -166,25 +181,28 @@ private static Dictionary<string, string> SplitConnectionString(string connectio
166
181
}
167
182
else
168
183
{
169
- keyvalue = null ;
184
+ keyValue = null ;
170
185
}
171
- DebugTraceKeyValuePair ( keyname , keyvalue , synonyms ) ;
172
- string synonym ;
173
- string realkeyname = synonyms != null
174
- ? ( synonyms . TryGetValue ( keyname , out synonym ) ? synonym : null )
175
- : keyname ;
186
+
187
+ DebugTraceKeyValuePair ( keyName , keyValue , synonyms ) ;
188
+ string realKeyName = synonyms != null
189
+ ? synonyms . TryGetValue ( keyName , out string synonym ) ? synonym : null
190
+ : keyName ;
176
191
177
- if ( ! IsKeyNameValid ( realkeyname ) )
192
+ if ( ! IsKeyNameValid ( realKeyName ) )
178
193
{
179
- throw ADP . KeywordNotSupported ( keyname ) ;
194
+ throw ADP . KeywordNotSupported ( keyName ) ;
180
195
}
181
- if ( ! firstKey || ! parsetable . ContainsKey ( realkeyname ) )
196
+
197
+ if ( ! firstKey || ! parseTable . ContainsKey ( realKeyName ) )
182
198
{
183
- parsetable [ realkeyname ] = keyvalue ; // last key-value pair wins (or first)
199
+ parseTable [ realKeyName ] = keyValue ; // last key-value pair wins (or first)
184
200
}
185
201
}
186
202
}
187
- return parsetable ;
203
+
204
+ return parseTable ;
188
205
}
206
+ #endif
189
207
}
190
208
}
0 commit comments