* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Data / System.Data.OleDb.jvm / OleDbConnection.cs
index 8548a4cc16a983f6d02f09cb9aa7bbb5150ea9ac..9c5685dc61ae7b13f5c64015004087f7d4edfb17 100644 (file)
@@ -1,32 +1,32 @@
 //\r
 // System.Data.OleDb.OleDbConnection\r
-//
-// Authors:
-//     Konstantin Triger <kostat@mainsoft.com>
-//     Boris Kirzner <borisk@mainsoft.com>
-//     
-// (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
-//
-
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-// 
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//\r
+// Authors:\r
+//     Konstantin Triger <kostat@mainsoft.com>\r
+//     Boris Kirzner <borisk@mainsoft.com>\r
+//     \r
+// (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)\r
+//\r
+\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+// \r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+// \r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
 //\r
 \r
 \r
@@ -35,27 +35,17 @@ using System.Data;
 using System.Data.Common;\r
 using System.Collections;\r
 using System.Data.ProviderBase;\r
+using System.Globalization;\r
 \r
 using java.sql;\r
 \r
+using System.Configuration;\r
+using Mainsoft.Data.Configuration;\r
+using Mainsoft.Data.Jdbc.Providers;\r
+\r
 namespace System.Data.OleDb\r
 {\r
-       public sealed class OleDbConnection : AbstractDBConnection, System.ICloneable\r
-       {\r
-               #region Fields \r
-\r
-               protected static Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());\r
-\r
-               private static readonly object _lockObjectStringManager = new object();\r
-               //private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OleDbStrings");\r
-\r
-               private static readonly string[] _resourceIgnoredKeys = new string[] {"CON_PROVIDER","CON_DATA_SOURCE","CON_DATABASE",\r
-                                                                                                                                                         "CON_PASSWORD","CON_USER_ID","CON_TIMEOUT",\r
-                                                                                                                                                         "CON_SERVER_NAME","CON_PORT","CON_SERVICE_NAME",\r
-                                                                                                                                                         "CON_JNDI_NAME","CON_JNDI_PROVIDER","CON_JNDI_FACTORY",\r
-                                                                                                                                                         "JDBC_DRIVER","JDBC_URL","DB2_CON_LOCATION" };\r
-\r
-               #endregion //Fields\r
+       public sealed class OleDbConnection : AbstractDBConnection {\r
 \r
                #region Events\r
 \r
@@ -66,141 +56,37 @@ namespace System.Data.OleDb
                \r
                #region Constructors\r
 \r
-               public OleDbConnection() : this(null)\r
-               {\r
+               public OleDbConnection() : this(null) {\r
                }\r
 \r
-               public OleDbConnection(String connectionString) : base(connectionString)\r
-               {                       \r
+               public OleDbConnection(String connectionString) : base(connectionString) {                      \r
                }\r
 \r
                #endregion // Constructors\r
 \r
                #region Properties\r
 \r
-               protected override string[] ResourceIgnoredKeys\r
-               {\r
-                       get { return _resourceIgnoredKeys; }\r
-               }\r
-\r
-               public String Provider\r
-               {\r
-                       get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }\r
-               }\r
-\r
-               protected override Hashtable SkippedUserParameters\r
-               {\r
-                       get { return _skippedUserParameters; }\r
-               }\r
-\r
-               protected override string ServerName\r
-               {\r
-                       get { \r
-                               if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {\r
-                                       string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));\r
-\r
-                                       if (!String.Empty.Equals(host)) {\r
-                                               return host;\r
-                                       }\r
-\r
-                                       if (ProviderType == PROVIDER_TYPE.IBMDADB2) {\r
-                                               string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));\r
-\r
-                                               if (!String.Empty.Equals(location)) {\r
-                                                       int semicolumnIndex = location.IndexOf(':');\r
-                                                       if (semicolumnIndex != -1) {\r
-                                                               return location.Substring(0,semicolumnIndex);\r
-                                                       }\r
-                                                       else {\r
-                                                               return location;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-\r
-                               }\r
-                               return base.ServerName; \r
-                       }\r
-               }\r
-\r
-               protected override string CatalogName\r
-               {\r
-                       get { \r
-                               switch (ProviderType) {\r
-                                       case PROVIDER_TYPE.IBMDADB2:\r
-                                       case PROVIDER_TYPE.MSDAORA:\r
-                                               return DataSource;\r
-                               }\r
-                               return base.CatalogName;\r
-                       }\r
-               }\r
-\r
-               protected override string Port\r
-               {\r
+               public String Provider {\r
                        get {\r
-                               string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));\r
-                               switch (ProviderType) {\r
-                                       case PROVIDER_TYPE.MSDAORA :\r
-                                               if (String.Empty.Equals(port)) {\r
-                                                       return StringManager.GetString("ORA_CON_PORT");\r
-                                               }\r
-                                               return port;\r
-                                       case PROVIDER_TYPE.IBMDADB2 :\r
-                                               if (String.Empty.Equals(port)) {\r
-                                                       string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));\r
-\r
-                                                       if (!String.Empty.Equals(location)) {\r
-                                                               int semicolumnIndex = location.IndexOf(':');\r
-                                                               if (semicolumnIndex != -1) {\r
-                                                                       return location.Substring(semicolumnIndex + 1);\r
-                                                               }\r
-                                                       }\r
-                                                       return StringManager.GetString("DB2_CON_PORT");\r
-                                               }\r
-                                               return port;\r
-                               }\r
-                               return base.Port;\r
-                       }\r
-               }\r
+                               IDictionary conDict = ConnectionStringBuilder;\r
+                               string provider = (string)conDict["Provider"];\r
+                               if (provider == null || provider.Length == 0)\r
+                                       throw ExceptionHelper.OleDbNoProviderSpecified();\r
 \r
-               protected override string JdbcDriverName\r
-               {\r
-                       get {\r
-                               JDBC_MODE jdbcMode = JdbcMode;\r
-                               switch (jdbcMode) {\r
-                                       case JDBC_MODE.DATA_SOURCE_MODE :\r
-                                               return base.JdbcDriverName;\r
-                                       case JDBC_MODE.JDBC_DRIVER_MODE :\r
-                                               return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));\r
-                                       case JDBC_MODE.PROVIDER_MODE:\r
-                                               switch (ProviderType) {\r
-                                                       case PROVIDER_TYPE.SQLOLEDB :\r
-                                                               return StringManager.GetString("SQL_JDBC_DRIVER");\r
-                                                       case PROVIDER_TYPE.MSDAORA :\r
-                                                               return StringManager.GetString("ORA_JDBC_DRIVER");\r
-                                                       case PROVIDER_TYPE.IBMDADB2 :\r
-                                                               return StringManager.GetString("DB2_JDBC_DRIVER");\r
-                                               }\r
-                                               break;\r
-                               };\r
-                               return base.JdbcDriverName;\r
+                               return provider;\r
                        }\r
                }\r
 \r
-               protected override DbStringManager StringManager\r
-               {\r
-                       get {\r
-                               object stringManager = AppDomain.CurrentDomain.GetData("System.Data.OleDbConnection.stringManager");\r
-                               if (stringManager == null) {\r
-                                       lock(_lockObjectStringManager) {\r
-                                               stringManager = AppDomain.CurrentDomain.GetData("System.Data.OleDbConnection.stringManager");\r
-                                               if (stringManager != null)\r
-                                                       return (DbStringManager)stringManager;\r
-                                               stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OleDbStrings");\r
-                                               AppDomain.CurrentDomain.SetData("System.Data.OleDbConnection.stringManager", stringManager);\r
-                                       }\r
-                               }\r
-                               return (DbStringManager)stringManager;\r
+               protected override IConnectionProvider GetConnectionProvider() {\r
+                       IDictionary conProviderDict = ConnectionStringDictionary.Parse(ConnectionString);\r
+                       string jdbcUrl = (string)conProviderDict["JdbcUrl"];\r
+                       if (jdbcUrl == null) {\r
+                               string provider = (string)conProviderDict["Provider"];\r
+                               if (provider != null)\r
+                                       return GetConnectionProvider("Mainsoft.Data.Configuration/OleDbProviders", provider);\r
                        }\r
+\r
+                       return new GenericProvider (conProviderDict);\r
                }\r
 \r
                #endregion // Properties\r
@@ -230,19 +116,6 @@ namespace System.Data.OleDb
                        return CreateCommand();\r
                }\r
 \r
-\r
-               protected internal override void CopyTo(AbstractDBConnection target)\r
-               {\r
-                       base.CopyTo(target);\r
-               }\r
-\r
-               public object Clone()\r
-               {\r
-                       OleDbConnection clone = new OleDbConnection();\r
-                       CopyTo(clone);\r
-                       return clone;\r
-               }\r
-\r
                protected sealed override SystemException CreateException(SQLException e)\r
                {\r
                        return new OleDbException(e,this);              \r
@@ -253,78 +126,67 @@ namespace System.Data.OleDb
                        return new OleDbException(message, null, this); \r
                }\r
 \r
+               [MonoTODO]\r
                public DataTable GetOleDbSchemaTable (Guid schema, object[] restrictions)\r
                {\r
-                       DataTable schemaTable = new DataTable("Tables");\r
-                       schemaTable.Columns.Add("TABLE_CATALOG");\r
-                       schemaTable.Columns.Add("TABLE_SCHEMA");\r
-                       schemaTable.Columns.Add("TABLE_NAME");\r
-                       schemaTable.Columns.Add("TABLE_TYPE");\r
-                       schemaTable.Columns.Add("TABLE_GUID");\r
-                       schemaTable.Columns.Add("DESCRIPTION");\r
-                       schemaTable.Columns.Add("TABLE_PROPID");\r
-                       schemaTable.Columns.Add("DATE_CREATED");\r
-                       schemaTable.Columns.Add("DATE_MODIFIED");\r
-            \r
-            \r
-                       Connection con = JdbcConnection;\r
-                       String catalog = con.getCatalog();\r
-            \r
-                       DatabaseMetaData meta = con.getMetaData();\r
-                       ResultSet schemaRes = meta.getSchemas();\r
-                       System.Collections.ArrayList schemas = new System.Collections.ArrayList();\r
-                       while(schemaRes.next()) {\r
-                               schemas.Add(schemaRes.getString(1));\r
-                       }\r
-                       schemaRes.close();\r
-\r
-                       for(int i = 0; i < schemas.Count; i++) {\r
-                               ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);\r
-                               while(tableRes.next()) {\r
-                                       DataRow row = schemaTable.NewRow();\r
-                                       row["TABLE_CATALOG"] = catalog;\r
-                                       row["TABLE_SCHEMA"] = schemas[i];\r
-                                       row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");\r
-                                       row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");\r
-                                       row["DESCRIPTION"] = tableRes.getString("REMARKS");\r
-                    \r
-                                       schemaTable.Rows.Add(row);\r
-                               }\r
-                               tableRes.close();\r
-                       }\r
-                       return schemaTable;\r
-               }\r
+                       if (State != ConnectionState.Open)\r
+                               throw ExceptionHelper.ConnectionNotOpened("GetOleDbSchemaTable", State.ToString());\r
 \r
-               protected internal sealed override void ValidateConnectionString(string connectionString)\r
-               {\r
-                       base.ValidateConnectionString(connectionString);\r
+                       try {\r
 \r
-                       JDBC_MODE currentJdbcMode = JdbcMode;\r
-                       \r
-                       if (currentJdbcMode == JDBC_MODE.NONE) {\r
-                               string provider = StringManager.GetString("CON_PROVIDER");\r
+                               string[] fixedRestrictions = new string[4];\r
+                               if (restrictions != null) {\r
+                                       if (restrictions.Length > 4)\r
+                                               throw new OleDbException("The parameter is incorrect", null, this);\r
 \r
-                               if (String.Empty.Equals(provider)) {\r
-                                       throw ExceptionHelper.OleDbNoProviderSpecified();\r
+                                       for (int i = 0, count = restrictions.Length; i < count; i ++) {\r
+                                               if (restrictions[i] != null) {\r
+                                                       if (!(restrictions[i] is string))\r
+                                                               throw new OleDbException("The parameter is incorrect", null, this);\r
+\r
+                                                       fixedRestrictions[i] = (string)restrictions[i];\r
+                                               }\r
+                                       }\r
                                }\r
-                       }\r
-               }\r
 \r
-               protected override string BuildJdbcUrl()\r
-               {\r
-                       switch (JdbcMode) {\r
-                               case JDBC_MODE.PROVIDER_MODE :\r
-                               switch (ProviderType) {\r
-                                       case PROVIDER_TYPE.IBMDADB2:\r
-                                               return BuildDb2Url();\r
-                                       case PROVIDER_TYPE.MSDAORA:\r
-                                               return BuildOracleUrl();\r
-                                       case PROVIDER_TYPE.SQLOLEDB:\r
-                                               return BuildMsSqlUrl();\r
+                               DataTable schemaTable = new DataTable("Tables");\r
+                               schemaTable.Columns.Add("TABLE_CATALOG");\r
+                               schemaTable.Columns.Add("TABLE_SCHEMA");\r
+                               schemaTable.Columns.Add("TABLE_NAME");\r
+                               schemaTable.Columns.Add("TABLE_TYPE");\r
+                               schemaTable.Columns.Add("TABLE_GUID");\r
+                               schemaTable.Columns.Add("DESCRIPTION");\r
+                               schemaTable.Columns.Add("TABLE_PROPID");\r
+                               schemaTable.Columns.Add("DATE_CREATED");\r
+                               schemaTable.Columns.Add("DATE_MODIFIED");\r
+\r
+                               java.sql.ResultSet tableRes = JdbcConnection.getMetaData().getTables(\r
+                                       fixedRestrictions[0],\r
+                                       fixedRestrictions[1],\r
+                                       fixedRestrictions[2],\r
+                                       new string[]{fixedRestrictions[3]});\r
+\r
+                               try {\r
+                                       while(tableRes.next()) {\r
+                                               DataRow row = schemaTable.NewRow();\r
+                                               row["TABLE_CATALOG"] = tableRes.getString("TABLE_CAT");\r
+                                               row["TABLE_SCHEMA"] = tableRes.getString("TABLE_SCHEM");\r
+                                               row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");\r
+                                               row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");\r
+                                               row["DESCRIPTION"] = tableRes.getString("REMARKS");\r
+                \r
+                                               schemaTable.Rows.Add(row);\r
+                                       }\r
                                }\r
-                               break;\r
+                               finally {\r
+                                       tableRes.close();\r
+                               }\r
+\r
+                               return schemaTable;\r
+                       }\r
+                       catch (SQLException e) {\r
+                               throw CreateException(e);\r
                        }\r
-                       return base.BuildJdbcUrl();\r
                }\r
 \r
                public static void ReleaseObjectPool()\r
@@ -339,30 +201,6 @@ namespace System.Data.OleDb
                        OnOleDbInfoMessage(new OleDbInfoMessageEventArgs(col));\r
                }\r
 \r
-               protected internal sealed override Connection GetConnectionFromProvider()\r
-               {\r
-                       if ((ProviderType == PROVIDER_TYPE.MSDAORA) && \r
-                               ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {\r
-                               ActivateJdbcDriver(JdbcDriverName);\r
-                               return OleDbConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);\r
-                       }\r
-                       else {\r
-                               return base.GetConnectionFromProvider();\r
-                       }\r
-               }\r
-\r
-               private String BuildDb2Url()\r
-               {\r
-                       return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://\r
-                               + ServerName + ":" + Port + "/" + CatalogName;\r
-               }\r
-\r
-               private String BuildOracleUrl()\r
-               {\r
-                       return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"\r
-                               + ServerName + ":" + Port + ":" + CatalogName;\r
-               }\r
-        \r
                protected internal sealed override void OnStateChanged(ConnectionState orig, ConnectionState current)\r
                {\r
                        if(StateChange != null) {\r
@@ -380,14 +218,14 @@ namespace System.Data.OleDb
                        }\r
                }\r
 \r
-               private void OnOleDbInfoMessage (OleDbInfoMessageEventArgs value)
-               {
-                       if (InfoMessage != null) {
-                               InfoMessage (this, value);
-                       }
+               private void OnOleDbInfoMessage (OleDbInfoMessageEventArgs value)\r
+               {\r
+                       if (InfoMessage != null) {\r
+                               InfoMessage (this, value);\r
+                       }\r
                }\r
 \r
                #endregion // Methods\r
 \r
        }\r
-}
\ No newline at end of file
+}\r