Author: suresh Date: 2005-06-23 09:13:04 -0400 (Thu, 23 Jun 2005) New Revision: 46422
Modified: trunk/mcs/class/System.Data/System.Data.SqlClient/ChangeLog trunk/mcs/class/System.Data/System.Data.SqlClient/SqlConnectionStringBuilder.cs trunk/mcs/class/System.Data/Test/System.Data.SqlClient/ChangeLog trunk/mcs/class/System.Data/Test/System.Data.SqlClient/SqlConnectionStringBuilderTest.cs Log: 2005-06-23 Sureshkumar T <[EMAIL PROTECTED]> * System.Data.SqlClient/SqlConnectionStringBuilder.cs: simplified multiple keyword mappings and allowed-key checking. fixed Item, Remove, ContainsKey, ShoudSerialize, TryGetValue implementations. * Test/System.Data.SqlClient/SqlConnectionStringBuilderTest.cs: Added few more tests. Modified: trunk/mcs/class/System.Data/System.Data.SqlClient/ChangeLog =================================================================== --- trunk/mcs/class/System.Data/System.Data.SqlClient/ChangeLog 2005-06-23 13:05:46 UTC (rev 46421) +++ trunk/mcs/class/System.Data/System.Data.SqlClient/ChangeLog 2005-06-23 13:13:04 UTC (rev 46422) @@ -1,3 +1,9 @@ +2005-06-23 Sureshkumar T <[EMAIL PROTECTED]> + + * SqlConnectionStringBuilder.cs: simplified multiple keyword + mappings and allowed-key checking. fixed Item, Remove, + ContainsKey, ShoudSerialize, TryGetValue implementations. + 2005-06-21 Sureshkumar T <[EMAIL PROTECTED]> * SqlConnectionStringBuilder.cs: Connection String Builder class Modified: trunk/mcs/class/System.Data/System.Data.SqlClient/SqlConnectionStringBuilder.cs =================================================================== --- trunk/mcs/class/System.Data/System.Data.SqlClient/SqlConnectionStringBuilder.cs 2005-06-23 13:05:46 UTC (rev 46421) +++ trunk/mcs/class/System.Data/System.Data.SqlClient/SqlConnectionStringBuilder.cs 2005-06-23 13:13:04 UTC (rev 46422) @@ -30,6 +30,7 @@ using System; using System.Text; using System.Collections; +using System.Collections.Generic; using System.Data; using System.Data.Common; @@ -39,6 +40,32 @@ public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder { + private const string DEF_APPLICATIONNAME = ".NET SqlClient Data Provider"; + private const bool DEF_ASYNCHRONOUSPROCESSING = false; + private const string DEF_ATTACHDBFILENAME = ""; + private const bool DEF_CONNECTIONRESET = true; + private const int DEF_CONNECTTIMEOUT = 15; + private const string DEF_CURRENTLANGUAGE = ""; + private const string DEF_DATASOURCE = ""; + private const bool DEF_ENCRYPT = false; + private const bool DEF_ENLIST = false; + private const string DEF_FAILOVERPARTNER = ""; + private const string DEF_INITIALCATALOG = ""; + private const bool DEF_INTEGRATEDSECURITY = false; + private const int DEF_LOADBALANCETIMEOUT = 0; + private const int DEF_MAXPOOLSIZE = 100; + private const int DEF_MINPOOLSIZE = 0; + private const bool DEF_MULTIPLEACTIVERESULTSETS = false; + private const string DEF_NETWORKLIBRARY = ""; + private const int DEF_PACKETSIZE = 8000; + private const string DEF_PASSWORD = ""; + private const bool DEF_PERSISTSECURITYINFO = false; + private const bool DEF_POOLING = true; + private const bool DEF_REPLICATION = false; + private const string DEF_USERID = ""; + private const string DEF_WORKSTATIONID = ""; + + #region // Fields private string _applicationName; private bool _asynchronousProcessing; @@ -64,6 +91,8 @@ private bool _replication; private string _userID; private string _workstationID; + + private static Dictionary <string, string> _keywords; // for mapping duplicate keywords #endregion // Fields #region Constructors @@ -76,6 +105,53 @@ Init (); base.ConnectionString = connectionString; } + + static SqlConnectionStringBuilder () + { + _keywords = new Dictionary <string, string> (); + _keywords ["APP"] = "Application Name"; + _keywords ["APPLICATION NAME"] = "Application Name"; + _keywords ["ATTACHDBFILENAME"] = "AttachDBFilename"; + _keywords ["EXTENDED PROPERTIES"] = "Extended Properties"; + _keywords ["INITIAL FILE NAME"] = "Initial File Name"; + _keywords ["TIMEOUT"] = "Connect Timeout"; + _keywords ["CONNECT TIMEOUT"] = "Connect Timeout"; + _keywords ["CONNECTION TIMEOUT"] = "Connect Timeout"; + _keywords ["CONNECTION RESET"] = "Connection Reset"; + _keywords ["LANGUAGE"] = "Current Language"; + _keywords ["CURRENT LANGUAGE"] = "Current Language"; + _keywords ["DATA SOURCE"] = "Data Source"; + _keywords ["SERVER"] = "Data Source"; + _keywords ["ADDRESS"] = "Data Source"; + _keywords ["ADDR"] = "Data Source"; + _keywords ["NETWORK ADDRESS"] = "Data Source"; + _keywords ["ENCRYPT"] = "Encrypt"; + _keywords ["ENLIST"] = "Enlist"; + _keywords ["INITIAL CATALOG"] = "Initial Catalog"; + _keywords ["DATABASE"] = "Initial Catalog"; + _keywords ["INTEGRATED SECURITY"] = "Integrated Security"; + _keywords ["TRUSTED_CONNECTION"] = "Integrated Security"; + _keywords ["MAX POOL SIZE"] = "Max Pool Size"; + _keywords ["MIN POOL SIZE"] = "Min Pool Size"; + _keywords ["MULTIPLEACTIVERESULTSETS"] = "Multipleactiveresultset"; + _keywords ["ASYNCHRONOUS PROCESSING"] = "Asynchronous Processing"; + _keywords ["ASYNC"] = "Async"; + _keywords ["NET"] = "Network Library"; + _keywords ["NETWORK"] = "Network Library"; + _keywords ["NETWORK LIBRARY"] = "Network Library"; + _keywords ["PACKET SIZE"] = "Packet Size"; + _keywords ["PASSWORD"] = "Password"; + _keywords ["PWD"] = "Password"; + _keywords ["PERSISTSECURITYINFO"] = "Persist Security Info"; + _keywords ["PERSIST SECURITY INFO"] = "Persist Security Info"; + _keywords ["POOLING"] = "Pooling"; + _keywords ["UID"] = "User Id"; + _keywords ["USER"] = "User Id"; + _keywords ["USER ID"] = "User Id"; + _keywords ["WSID"] = "Workstation Id"; + _keywords ["WORKSTATION ID"] = "Workstation Id"; + + } #endregion // Constructors #region Properties @@ -180,8 +256,11 @@ } public override object this [string keyword] { - get { return base [keyword]; } - set { SetValue (keyword, value); } + get { + string mapped = MapKeyword (keyword); + return base [mapped]; + } + set {SetValue (keyword, value);} } public override ICollection Keys { @@ -275,7 +354,7 @@ _userID = value; } } - + public override ICollection Values { get { return base.Values; } } @@ -292,30 +371,30 @@ #region Methods private void Init () { - _applicationName = ".NET SqlClient Data Provider"; - _asynchronousProcessing = false; - _attachDBFilename = String.Empty; - _connectionReset = true; - _connectTimeout = 15; - _currentLanguage = String.Empty; - _dataSource = String.Empty; - _encrypt = false; - _enlist = true; - _failoverPartner = String.Empty; - _initialCatalog = String.Empty; - _integratedSecurity = false; - _loadBalanceTimeout = 0; - _maxPoolSize = 100; - _minPoolSize = 0; - _multipleActiveResultSets= true; - _networkLibrary = String.Empty; - _packetSize = 8000; - _password = String.Empty; - _persistSecurityInfo = false; - _pooling = true; - _replication = false; - _userID = String.Empty; - _workstationID = String.Empty; + _applicationName = DEF_APPLICATIONNAME; + _asynchronousProcessing = DEF_ASYNCHRONOUSPROCESSING; + _attachDBFilename = DEF_ATTACHDBFILENAME; + _connectionReset = DEF_CONNECTIONRESET; + _connectTimeout = DEF_CONNECTTIMEOUT; + _currentLanguage = DEF_CURRENTLANGUAGE; + _dataSource = DEF_DATASOURCE; + _encrypt = DEF_ENCRYPT; + _enlist = DEF_ENLIST; + _failoverPartner = DEF_FAILOVERPARTNER; + _initialCatalog = DEF_INITIALCATALOG; + _integratedSecurity = DEF_INTEGRATEDSECURITY; + _loadBalanceTimeout = DEF_LOADBALANCETIMEOUT; + _maxPoolSize = DEF_MAXPOOLSIZE; + _minPoolSize = DEF_MINPOOLSIZE; + _multipleActiveResultSets= DEF_MULTIPLEACTIVERESULTSETS; + _networkLibrary = DEF_NETWORKLIBRARY; + _packetSize = DEF_PACKETSIZE; + _password = DEF_PASSWORD; + _persistSecurityInfo = DEF_PERSISTSECURITYINFO; + _pooling = DEF_POOLING; + _replication = DEF_REPLICATION; + _userID = DEF_USERID; + _workstationID = DEF_WORKSTATIONID; } public override void Clear () @@ -326,128 +405,211 @@ public override bool ContainsKey (string keyword) { - return base.ContainsKey (keyword); + keyword = keyword.ToUpper ().Trim (); + if (_keywords.ContainsKey (keyword)) + return base.ContainsKey (_keywords [keyword]); + return false; } public override bool Remove (string keyword) { - return base.Remove (keyword); + if (!ContainsKey (keyword)) + return false; + this [keyword] = null; + return true; } public override bool ShouldSerialize (string keyword) { - return base.ShouldSerialize (keyword); + if (!ContainsKey (keyword)) + return false; + keyword = keyword.ToUpper ().Trim (); + // Assuming passwords cannot be serialized. + if (_keywords [keyword] == "Password") + return false; + return base.ShouldSerialize (_keywords [keyword]); } public override bool TryGetValue (string keyword, out object value) { - return base.TryGetValue (keyword, out value); + if (! ContainsKey (keyword)) { + value = String.Empty; + return false; + } + return base.TryGetValue (_keywords [keyword.ToUpper ().Trim ()], out value); } #endregion // Methods #region Private Methods + private string MapKeyword (string keyword) + { + keyword = keyword.ToUpper ().Trim (); + if (! _keywords.ContainsKey (keyword)) + throw new ArgumentException("Keyword not supported :" + keyword); + return _keywords [keyword]; + } + private void SetValue (string key, object value) { if (key == null) throw new ArgumentNullException ("key cannot be null!"); - switch (key.ToUpper ().Trim ()) { - case "APP" : + string mappedKey = MapKeyword (key); + + switch (mappedKey.ToUpper ().Trim ()) { case "APPLICATION NAME" : - this.ApplicationName = value.ToString (); + if (value == null) { + _applicationName = DEF_APPLICATIONNAME; + base.Remove (mappedKey); + } else + this.ApplicationName = value.ToString (); break; case "ATTACHDBFILENAME" : - case "EXTENDED PROPERTIES" : - case "INITIAL FILE NAME" : throw new NotImplementedException ("Attachable database support is " + "not implemented."); - case "TIMEOUT" : case "CONNECT TIMEOUT" : - case "CONNECTION TIMEOUT" : - this.ConnectTimeout = DbConnectionStringBuilderHelper.ConvertToInt32 (value); + if (value == null) { + _connectTimeout = DEF_CONNECTTIMEOUT; + base.Remove (mappedKey); + } else + this.ConnectTimeout = DbConnectionStringBuilderHelper.ConvertToInt32 (value); break; case "CONNECTION LIFETIME" : break; case "CONNECTION RESET" : - this.ConnectionReset = DbConnectionStringBuilderHelper.ConvertToBoolean (value); + if (value == null) { + _connectionReset = DEF_CONNECTIONRESET; + base.Remove (mappedKey); + } else + this.ConnectionReset = DbConnectionStringBuilderHelper.ConvertToBoolean (value); break; - case "LANGUAGE" : case "CURRENT LANGUAGE" : - this.CurrentLanguage = value.ToString (); + if (value == null) { + _currentLanguage = DEF_CURRENTLANGUAGE; + base.Remove (mappedKey); + } else + this.CurrentLanguage = value.ToString (); break; case "DATA SOURCE" : - case "SERVER" : - case "ADDRESS" : - case "ADDR" : - case "NETWORK ADDRESS" : - this.DataSource = value.ToString (); + if (value == null) { + _dataSource = DEF_DATASOURCE; + base.Remove (mappedKey); + } else + this.DataSource = value.ToString (); break; case "ENCRYPT": - if (DbConnectionStringBuilderHelper.ConvertToBoolean(value)) + if (value == null) { + _encrypt = DEF_ENCRYPT; + base.Remove (mappedKey); + }else if (DbConnectionStringBuilderHelper.ConvertToBoolean(value)) throw new NotImplementedException("SSL encryption for" + " data sent between client and server is not" + " implemented."); break; case "ENLIST" : - if ( ! DbConnectionStringBuilderHelper.ConvertToBoolean(value)) + if (value == null) { + _enlist = DEF_ENLIST; + base.Remove (mappedKey); + } else if ( ! DbConnectionStringBuilderHelper.ConvertToBoolean(value)) throw new NotImplementedException("Disabling the automatic" + " enlistment of connections in the thread's current" + " transaction context is not implemented."); break; case "INITIAL CATALOG" : - case "DATABASE" : - this.InitialCatalog = value.ToString (); + if (value == null) { + _initialCatalog = DEF_INITIALCATALOG; + base.Remove (mappedKey); + } else + this.InitialCatalog = value.ToString (); break; case "INTEGRATED SECURITY" : - case "TRUSTED_CONNECTION" : - this.IntegratedSecurity = DbConnectionStringBuilderHelper.ConvertToBoolean (value); + if (value == null) { + _integratedSecurity = DEF_INTEGRATEDSECURITY; + base.Remove (mappedKey); + } else + this.IntegratedSecurity = DbConnectionStringBuilderHelper.ConvertToBoolean (value); break; case "MAX POOL SIZE" : - this.MaxPoolSize = DbConnectionStringBuilderHelper.ConvertToInt32 (value); + if (value == null) { + _maxPoolSize = DEF_MAXPOOLSIZE; + base.Remove (mappedKey); + } else + this.MaxPoolSize = DbConnectionStringBuilderHelper.ConvertToInt32 (value); break; case "MIN POOL SIZE" : - this.MinPoolSize = DbConnectionStringBuilderHelper.ConvertToInt32 (value); + if (value == null) { + _minPoolSize = DEF_MINPOOLSIZE; + base.Remove (mappedKey); + } else + this.MinPoolSize = DbConnectionStringBuilderHelper.ConvertToInt32 (value); break; case "MULTIPLEACTIVERESULTSETS": - if ( DbConnectionStringBuilderHelper.ConvertToBoolean (value)) + if (value == null) { + _multipleActiveResultSets = DEF_MULTIPLEACTIVERESULTSETS; + base.Remove (mappedKey); + } else if ( DbConnectionStringBuilderHelper.ConvertToBoolean (value)) throw new NotImplementedException ("MARS is not yet implemented!"); break; case "ASYNCHRONOUS PROCESSING" : - case "ASYNC" : - this.AsynchronousProcessing = DbConnectionStringBuilderHelper.ConvertToBoolean (value); + if (value == null) { + _asynchronousProcessing = DEF_ASYNCHRONOUSPROCESSING; + base.Remove (mappedKey); + } else + this.AsynchronousProcessing = DbConnectionStringBuilderHelper.ConvertToBoolean (value); break; - case "NET" : - case "NETWORK" : case "NETWORK LIBRARY" : - if (!value.ToString ().ToUpper ().Equals ("DBMSSOCN")) - throw new ArgumentException ("Unsupported network library."); - this.NetworkLibrary = value.ToString ().ToLower (); + if (value == null) { + _networkLibrary = DEF_NETWORKLIBRARY; + base.Remove (mappedKey); + } else { + if (!value.ToString ().ToUpper ().Equals ("DBMSSOCN")) + throw new ArgumentException ("Unsupported network library."); + this.NetworkLibrary = value.ToString ().ToLower (); + } break; case "PACKET SIZE" : - this.PacketSize = DbConnectionStringBuilderHelper.ConvertToInt32 (value); + if (value == null) { + _packetSize = DEF_PACKETSIZE; + base.Remove (mappedKey); + } else + this.PacketSize = DbConnectionStringBuilderHelper.ConvertToInt32 (value); break; case "PASSWORD" : - case "PWD" : - this.Password = value.ToString (); + if (value == null) { + _password = DEF_PASSWORD; + base.Remove (mappedKey); + } else + this.Password = value.ToString (); break; - case "PERSISTSECURITYINFO" : case "PERSIST SECURITY INFO" : - if (DbConnectionStringBuilderHelper.ConvertToBoolean (value)) + if (value == null) { + _persistSecurityInfo = DEF_PERSISTSECURITYINFO; + base.Remove (mappedKey); + } else if (DbConnectionStringBuilderHelper.ConvertToBoolean (value)) throw new NotImplementedException ("Persisting security info" + " is not yet implemented"); break; case "POOLING" : - this.Pooling = DbConnectionStringBuilderHelper.ConvertToBoolean (value); + if (value == null) { + _pooling = DEF_POOLING; + base.Remove (mappedKey); + } else + this.Pooling = DbConnectionStringBuilderHelper.ConvertToBoolean (value); break; - case "UID" : - case "USER" : case "USER ID" : - this.UserID = value.ToString (); + if (value == null) { + _userID = DEF_USERID; + base.Remove (mappedKey); + } else + this.UserID = value.ToString (); break; - case "WSID" : case "WORKSTATION ID" : - this.WorkstationID = value.ToString (); + if (value == null) { + _workstationID = DEF_WORKSTATIONID; + base.Remove (mappedKey); + } else + this.WorkstationID = value.ToString (); break; default : throw new ArgumentException("Keyword not supported :" + key); Modified: trunk/mcs/class/System.Data/Test/System.Data.SqlClient/ChangeLog =================================================================== --- trunk/mcs/class/System.Data/Test/System.Data.SqlClient/ChangeLog 2005-06-23 13:05:46 UTC (rev 46421) +++ trunk/mcs/class/System.Data/Test/System.Data.SqlClient/ChangeLog 2005-06-23 13:13:04 UTC (rev 46422) @@ -1,3 +1,7 @@ +2005-06-23 Sureshkumar T <[EMAIL PROTECTED]> + + * SqlConnectionStringBuilderTest.cs: Added few more tests. + 2005-06-21 Sureshkumar T <[EMAIL PROTECTED]> * SqlConnectionStringBuilderTest.cs: Added some preliminary tests. Modified: trunk/mcs/class/System.Data/Test/System.Data.SqlClient/SqlConnectionStringBuilderTest.cs =================================================================== --- trunk/mcs/class/System.Data/Test/System.Data.SqlClient/SqlConnectionStringBuilderTest.cs 2005-06-23 13:05:46 UTC (rev 46421) +++ trunk/mcs/class/System.Data/Test/System.Data.SqlClient/SqlConnectionStringBuilderTest.cs 2005-06-23 13:13:04 UTC (rev 46422) @@ -84,6 +84,45 @@ builder.ConnectionString.Contains ("Network Library=dbmssocn"), "#PT1 network library should exist"); } + + public void NullTest () + { + builder = new SqlConnectionStringBuilder ("SERVER=localhost;Network=DBMSSOCN"); + builder ["Network Library"] = null; + Assert.AreEqual ("Data Source=localhost", builder.ConnectionString, + "#NT1 should remove the key if set with null"); + } + + public void ContainsKeyTest () + { + builder = new SqlConnectionStringBuilder ("SERVER=localhost;Network=DBMSSOCN"); + Assert.AreEqual (true, builder.ContainsKey ("NETWORK"), + "#CKT1 should say true"); + Assert.AreEqual (false, builder.ContainsKey ("ABCD"), + "#CKT2 should say false"); + } + + [Test, ExpectedException (typeof (ArgumentException))] + public void InvalidKeyTest () + { + builder = new SqlConnectionStringBuilder ("SERVER=localhost;Network=DBMSSOCN"); + int value = (int) builder ["ABCD"]; + value++; // to avoid warning + } + + [Test] + public void RemoveTest () + { + builder = new SqlConnectionStringBuilder ("SERVER = localhost ;Network=DBMSSOCN"); + // non existing key + Assert.AreEqual (false, builder.Remove ("ABCD"), + "#RT1 cannot remove non existant key"); + Assert.AreEqual (true, builder.Remove ("NETWORK library"), + "#RT2 should remove the key"); + Assert.AreEqual ("Data Source=localhost", builder.ConnectionString, + "#RT3 should have removed the key"); + } + } } _______________________________________________ Mono-patches maillist - Mono-patches@lists.ximian.com http://lists.ximian.com/mailman/listinfo/mono-patches