From: Date: January 29 2008 5:32pm Subject: Connector/NET commit: r1153 - in branches/5.1: . Driver/Source Driver/Source/common List-Archive: http://lists.mysql.com/commits/41369 X-Bug: 34000 Message-Id: <200801291632.m0TGWC0B031597@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/5.1/CHANGES branches/5.1/Driver/Source/Connection.cs branches/5.1/Driver/Source/MySqlConnectionStringBuilder.cs branches/5.1/Driver/Source/common/Cache.cs Log: - Incorporated some connection string cache optimizations sent to us by Maxim Mass (bug #34000) Modified: branches/5.1/CHANGES =================================================================== --- branches/5.1/CHANGES 2008-01-29 15:41:41 UTC (rev 1152) +++ branches/5.1/CHANGES 2008-01-29 16:32:12 UTC (rev 1153) @@ -5,6 +5,7 @@ - Fixed nant compilation problem on mono (bug #33508) - Fixed problem where connection state reported through the state change handler was not showing Open (bug #34082) + - Incorporated some connection string cache optimizations sent to us by Maxim Mass (bug #34000) Version 5.1.4 - 11/12/2007 - Fixed issue where column name metadata was not using the charset given on the connection string Modified: branches/5.1/Driver/Source/Connection.cs =================================================================== --- branches/5.1/Driver/Source/Connection.cs 2008-01-29 15:41:41 UTC (rev 1152) +++ branches/5.1/Driver/Source/Connection.cs 2008-01-29 16:32:12 UTC (rev 1153) @@ -59,7 +59,8 @@ /// public event MySqlInfoMessageEventHandler InfoMessage; - private static Cache connectionStringCache = new Cache(0, 25); + private static Cache connectionStringCache = + new Cache(0, 25); /// public MySqlConnection() Modified: branches/5.1/Driver/Source/MySqlConnectionStringBuilder.cs =================================================================== --- branches/5.1/Driver/Source/MySqlConnectionStringBuilder.cs 2008-01-29 15:41:41 UTC (rev 1152) +++ branches/5.1/Driver/Source/MySqlConnectionStringBuilder.cs 2008-01-29 16:32:12 UTC (rev 1153) @@ -957,8 +957,8 @@ persistConnString.Remove(0, persistConnString.Length); // set all the proper defaults - foreach (Keyword k in defaultValues.Keys) - SetValue(k, defaultValues[k]); + foreach (KeyValuePair k in defaultValues) + SetValue(k.Key, k.Value); } private static Keyword GetKey(string key) Modified: branches/5.1/Driver/Source/common/Cache.cs =================================================================== --- branches/5.1/Driver/Source/common/Cache.cs 2008-01-29 15:41:41 UTC (rev 1152) +++ branches/5.1/Driver/Source/common/Cache.cs 2008-01-29 16:32:12 UTC (rev 1153) @@ -18,42 +18,59 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -using System.Collections.Specialized; using System; +using System.Collections.Generic; namespace MySql.Data.Common { - internal class Cache : NameObjectCollectionBase - { - private int capacity; + internal class Cache + { + private int _capacity; + private Queue _keyQ; + private Dictionary _contents; - public Cache(int initialCapacity, int capacity) : - base(initialCapacity, StringComparer.CurrentCulture) - { - this.capacity = capacity; - } + public Cache(int initialCapacity, int capacity) + { + _capacity = capacity; + _contents = new Dictionary(initialCapacity); - public object this[string key] - { - get { return BaseGet(key); } - set { InternalAdd(key, value); } - } + if (capacity > 0) + _keyQ = new Queue(initialCapacity); + } - public void Add(string key, object value) - { - InternalAdd(key, value); - } + public ValueType this[KeyType key] + { + get + { + ValueType val; + if (_contents.TryGetValue(key, out val)) + return val; + else + return default(ValueType); + } + set { InternalAdd(key, value); } + } - private void InternalAdd(string key, object value) - { - if (base.Count == capacity) - RemoveOldestItem(); - BaseAdd(key, value); - } + public void Add(KeyType key, ValueType value) + { + InternalAdd(key, value); + } - private void RemoveOldestItem() - { - BaseRemoveAt(0); - } - } -} \ No newline at end of file + private void InternalAdd(KeyType key, ValueType value) + { + if (!_contents.ContainsKey(key)) + { + + if (_capacity > 0) + { + _keyQ.Enqueue(key); + + if (_keyQ.Count > _capacity) + _contents.Remove(_keyQ.Dequeue()); + } + } + + _contents[key] = value; + } + } +}