void SetConnectionString (string connectionString)
{
SetDefaultConnectionParameters ();
if ((connectionString == null) || (connectionString.Trim().Length == 0)) {
this.connectionString = connectionString;
return;
}
connectionString += ";";
bool inQuote = false;
bool inDQuote = false;
bool inName = true;
string name = String.Empty;
string value = String.Empty;
StringBuilder sb = new StringBuilder ();
for (int i = 0; i < connectionString.Length; i += 1) {
char c = connectionString [i];
char peek;
if (i == connectionString.Length - 1)
peek = '\0';
else
peek = connectionString [i + 1];
switch (c) {
case '\'':
if (inDQuote)
sb.Append (c);
else if (peek.Equals (c)) {
sb.Append (c);
i += 1;
}
else
inQuote = !inQuote;
break;
case '"':
if (inQuote)
sb.Append (c);
else if (peek.Equals (c)) {
sb.Append (c);
i += 1;
}
else
inDQuote = !inDQuote;
break;
case ';':
if (inDQuote || inQuote)
sb.Append (c);
else {
if (name != String.Empty && name != null) {
value = sb.ToString ();
SetProperties (name.ToLower ().Trim() , value);
}
else if (sb.Length != 0)
throw new ArgumentException ("Format of initialization string does not conform to specifications");
inName = true;
name = String.Empty;
value = String.Empty;
sb = new StringBuilder ();
}
break;
case '=':
if (inDQuote || inQuote || !inName)
sb.Append (c);
else if (peek.Equals (c)) {
sb.Append (c);
i += 1;
}
else {
name = sb.ToString ();
sb = new StringBuilder ();
inName = false;
}
break;
case ' ':
if (inQuote || inDQuote)
sb.Append (c);
else if (sb.Length > 0 && !peek.Equals (';'))
sb.Append (c);
break;
default:
sb.Append (c);
break;
}
}
if (minPoolSize > maxPoolSize)
throw new ArgumentException ("Invalid value for "
+ "'min pool size' or 'max pool size'; "
+ "'min pool size' must not be greater "
+ "than 'max pool size'.");
connectionString = connectionString.Substring (0 , connectionString.Length-1);
this.connectionString = connectionString;
}