// ByteFX.Data data access components for .Net // Copyright (C) 2002-2003 ByteFX, Inc. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using System.Collections.Specialized; namespace ByteFX.Data.Common { /// /// Summary description for Utility. /// internal class ConnectionString { private StringDictionary elements; private string connString; public ConnectionString(string connString) { this.connString = connString; elements = new StringDictionary(); Parse( connString ); } public string Value { get { return connString; } } public string this[string key] { get { string val = elements[key]; return val; } } public int GetIntOption( string key, int defaultvalue ) { string val = this[ key ]; if (null == val) return defaultvalue; return Convert.ToInt32( val ); } public bool GetBoolOption( string key, bool defaultvalue ) { string val = this[ key ]; if (null == val) return defaultvalue; val = val.ToLower(); if (val == "true" || val == "yes") return true; return false; } public bool Contains( string key ) { return elements.ContainsKey(key); } public bool Equals( ConnectionString obj ) { foreach (string key in elements.Keys) { if (! obj.Contains(key)) return false; if ( ! this[key].Equals( obj[key] )) return false; } return true; } /// /// /// /// /// public bool PoolingEquals( ConnectionString obj ) { foreach (string key in elements.Keys) { // these connection string elements only affect pooling // so we don't check them when making sure connection strings // are alike if (key.Equals("connection lifetime")) continue; if (key.Equals("connection reset")) continue; if (key.Equals("enlist")) continue; if (key.Equals("max pool size")) continue; if (key.Equals("min pool size")) continue; if (key.Equals("pooling")) continue; if (! obj.Contains(key)) return false; if ( ! this[key].Equals( obj[key] )) return false; } return true; } /// /// /// /// public void Parse( String s ) { String[] keyvalues = s.Split( ';' ); String[] newkeyvalues = new String[keyvalues.Length]; int x = 0; elements.Clear(); // first run through the array and check for any keys that // have ; in their value foreach (String keyvalue in keyvalues) { // check for trailing ; at the end of the connection string if (keyvalue.Length == 0) continue; // this value has an '=' sign so we are ok if (keyvalue.IndexOf('=') >= 0) { newkeyvalues[x++] = keyvalue; } else { newkeyvalues[x-1] += ";"; newkeyvalues[x-1] += keyvalue; } } // now we run through our normalized key-values, splitting on equals for (int y=0; y < x; y++) { String[] parts = newkeyvalues[y].Split( '=' ); // first trim off any space and lowercase the key parts[0] = parts[0].Trim().ToLower(); parts[1] = parts[1].Trim(); // normalize the keys going in. We want to support the same synonyms that // SqlClient supports switch (parts[0]) { case "uid": parts[0] = "user id"; break; case "pwd": parts[0] = "password"; break; case "user": parts[0] = "user id"; break; case "initial catalog": parts[0] = "database"; break; case "server": parts[0] = "data source"; break; } // we also want to clear off any quotes String newvalue = parts[1].Trim( '\'' ); if (newvalue.Length == parts[1].Length) { newvalue = parts[1].Trim('"'); } parts[1] = newvalue; // make sure we don't get dupliate keys if (elements.ContainsKey(parts[0])) { throw new ArgumentException("Duplicate key in connection string", parts[0]); } elements.Add( parts[0], parts[1] ); // now put the correct parsed string into the connection string !! (AG 4/8/2003) connString=""; foreach(string key in elements.Keys) { connString=connString+key+"="+elements[key]+"; "; } connString=connString.Substring(0,connString.Length-2); } } } }