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 - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches