@@ -20,9 +20,9 @@ internal partial class DbConnectionOptions
2020 + "(?<key>([^=\\ s\\ p{Cc}]|\\ s+[^=\\ s\\ p{Cc}]|\\ s+==|==)+)" // allow any visible character for keyname except '=' which must quoted as '=='
2121 + "\\ s*=(?!=)\\ s*" // the equal sign divides the key and value parts
2222 + "(?<value>"
23- + "(\" ([^\" \u0000 ]|\" \" )*\" )" // double quoted string, " must be quoted as ""
23+ + "(\" ([^\" \u0000 ]|\" \" )*\" )" // double- quoted string, " must be quoted as ""
2424 + "|"
25- + "('([^'\u0000 ]|'')*')" // single quoted string, ' must be quoted as ''
25+ + "('([^'\u0000 ]|'')*')" // single- quoted string, ' must be quoted as ''
2626 + "|"
2727 + "((?![\" '\\ s])" // unquoted value must not start with " or ' or space, would also like = but too late to change
2828 + "([^;\\ 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
7373 }
7474 }
7575
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 )
7783 {
7884 try
7985 {
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 )
8288 {
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 } >") ;
8894 Debug . Assert ( value1 == value2 , $ "{ nameof ( ParseInternal ) } code vs. regex mismatch keyvalue <{ value1 } > <{ value2 } >") ;
8995 }
9096 }
@@ -97,38 +103,46 @@ private static void ParseComparison(Dictionary<string, string> parsetable, strin
97103
98104 const string KeywordNotSupportedMessagePrefix = "Keyword not supported:" ;
99105 const string WrongFormatMessagePrefix = "Format of the initialization string" ;
100- bool isEquivalent = ( msg1 == msg2 ) ;
106+ bool isEquivalent = msg1 == msg2 ;
101107 if ( ! isEquivalent )
102108 {
103109 // We also accept cases were Regex parser (debug only) reports "wrong format" and
104110 // retail parsing code reports format exception in different location or "keyword not supported"
105111 if ( msg2 . StartsWith ( WrongFormatMessagePrefix , StringComparison . Ordinal ) )
106112 {
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 ) )
108115 {
109116 isEquivalent = true ;
110117 }
111118 }
112119 }
120+
113121 Debug . Assert ( isEquivalent , "ParseInternal code vs regex message mismatch: <" + msg1 + "> <" + msg2 + ">" ) ;
114122 }
115123 else
116124 {
117125 Debug . Fail ( "ParseInternal code vs regex throw mismatch " + f . Message ) ;
118126 }
127+
119128 e = null ;
120129 }
130+
121131 if ( e != null )
122132 {
123133 Debug . Fail ( "ParseInternal code threw exception vs regex mismatch" ) ;
124134 }
125135 }
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 )
129143 {
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 ;
132146
133147 const int KeyIndex = 1 , ValueIndex = 2 ;
134148 Debug . Assert ( KeyIndex == parser . GroupNumberFromName ( "key" ) , "wrong key index" ) ;
@@ -137,27 +151,28 @@ private static Dictionary<string, string> SplitConnectionString(string connectio
137151 if ( connectionString != null )
138152 {
139153 Match match = parser . Match ( connectionString ) ;
140- if ( ! match . Success || ( match . Length != connectionString . Length ) )
154+ if ( ! match . Success || match . Length != connectionString . Length )
141155 {
142156 throw ADP . ConnectionStringSyntax ( match . Length ) ;
143157 }
158+
144159 int indexValue = 0 ;
145- CaptureCollection keyvalues = match . Groups [ ValueIndex ] . Captures ;
160+ CaptureCollection keyValues = match . Groups [ ValueIndex ] . Captures ;
146161 foreach ( Capture keypair in match . Groups [ KeyIndex ] . Captures )
147162 {
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 )
151166 {
152167 if ( ! firstKey )
153168 {
154- switch ( keyvalue [ 0 ] )
169+ switch ( keyValue [ 0 ] )
155170 {
156171 case '\" ' :
157- keyvalue = keyvalue . Substring ( 1 , keyvalue . Length - 2 ) . Replace ( "\" \" " , "\" " ) ;
172+ keyValue = keyValue . Substring ( 1 , keyValue . Length - 2 ) . Replace ( "\" \" " , "\" " ) ;
158173 break ;
159174 case '\' ' :
160- keyvalue = keyvalue . Substring ( 1 , keyvalue . Length - 2 ) . Replace ( "\' \' " , "\' " ) ;
175+ keyValue = keyValue . Substring ( 1 , keyValue . Length - 2 ) . Replace ( "\' \' " , "\' " ) ;
161176 break ;
162177 default :
163178 break ;
@@ -166,25 +181,28 @@ private static Dictionary<string, string> SplitConnectionString(string connectio
166181 }
167182 else
168183 {
169- keyvalue = null ;
184+ keyValue = null ;
170185 }
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 ;
176191
177- if ( ! IsKeyNameValid ( realkeyname ) )
192+ if ( ! IsKeyNameValid ( realKeyName ) )
178193 {
179- throw ADP . KeywordNotSupported ( keyname ) ;
194+ throw ADP . KeywordNotSupported ( keyName ) ;
180195 }
181- if ( ! firstKey || ! parsetable . ContainsKey ( realkeyname ) )
196+
197+ if ( ! firstKey || ! parseTable . ContainsKey ( realKeyName ) )
182198 {
183- parsetable [ realkeyname ] = keyvalue ; // last key-value pair wins (or first)
199+ parseTable [ realKeyName ] = keyValue ; // last key-value pair wins (or first)
184200 }
185201 }
186202 }
187- return parsetable ;
203+
204+ return parseTable ;
188205 }
206+ #endif
189207 }
190208}
0 commit comments