a1b53a4dc4d9fd1373b1dd66335f55454e3b3241
[mono.git] / mcs / class / System.Data / System.Data.OleDb.jvm / OleDbConnection.cs
1 //\r
2 // System.Data.OleDb.OleDbConnection\r
3 //
4 // Authors:
5 //      Konstantin Triger <kostat@mainsoft.com>
6 //      Boris Kirzner <borisk@mainsoft.com>
7 //      
8 // (C) 2005 Mainsoft Corporation (http://www.mainsoft.com)
9 //
10
11 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 // 
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 // 
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 //\r
31 \r
32 \r
33 \r
34 using System.Data;\r
35 using System.Data.Common;\r
36 using System.Collections;\r
37 \r
38 using java.sql;\r
39 \r
40 namespace System.Data.OleDb\r
41 {\r
42         public sealed class OleDbConnection : AbstractDBConnection, System.ICloneable\r
43         {\r
44                 #region Fields \r
45 \r
46                 protected static Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());\r
47 \r
48                 private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OleDbStrings");\r
49 \r
50                 private static readonly string[] _resourceIgnoredKeys = new string[] {"CON_PROVIDER","CON_DATA_SOURCE","CON_DATABASE",\r
51                                                                                                                                                           "CON_PASSWORD","CON_USER_ID","CON_TIMEOUT",\r
52                                                                                                                                                           "CON_SERVER_NAME","CON_PORT","CON_SERVICE_NAME",\r
53                                                                                                                                                           "CON_JNDI_NAME","CON_JNDI_PROVIDER","CON_JNDI_FACTORY",\r
54                                                                                                                                                           "JDBC_DRIVER","JDBC_URL","DB2_CON_LOCATION" };\r
55 \r
56                 #endregion //Fields\r
57 \r
58                 #region Events\r
59 \r
60                 public event OleDbInfoMessageEventHandler InfoMessage;\r
61                 public event StateChangeEventHandler StateChange;\r
62 \r
63                 #endregion // Events\r
64                 \r
65                 #region Constructors\r
66 \r
67                 public OleDbConnection() : this(null)\r
68                 {\r
69                 }\r
70 \r
71                 public OleDbConnection(String connectionString) : base(connectionString)\r
72                 {                       \r
73                 }\r
74 \r
75                 #endregion // Constructors\r
76 \r
77                 #region Properties\r
78 \r
79                 protected override string[] ResourceIgnoredKeys\r
80                 {\r
81                         get { return _resourceIgnoredKeys; }\r
82                 }\r
83 \r
84                 public String Provider\r
85                 {\r
86                         get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }\r
87                 }\r
88 \r
89                 protected override Hashtable SkippedUserParameters\r
90                 {\r
91                         get { return _skippedUserParameters; }\r
92                 }\r
93 \r
94                 protected override string ServerName\r
95                 {\r
96                         get { \r
97                                 if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {\r
98                                         string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));\r
99 \r
100                                         if (!String.Empty.Equals(host)) {\r
101                                                 return host;\r
102                                         }\r
103 \r
104                                         if (ProviderType == PROVIDER_TYPE.IBMDADB2) {\r
105                                                 string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));\r
106 \r
107                                                 if (!String.Empty.Equals(location)) {\r
108                                                         int semicolumnIndex = location.IndexOf(':');\r
109                                                         if (semicolumnIndex != -1) {\r
110                                                                 return location.Substring(0,semicolumnIndex);\r
111                                                         }\r
112                                                         else {\r
113                                                                 return location;\r
114                                                         }\r
115                                                 }\r
116                                         }\r
117 \r
118                                 }\r
119                                 return base.ServerName; \r
120                         }\r
121                 }\r
122 \r
123                 protected override string CatalogName\r
124                 {\r
125                         get { \r
126                                 switch (ProviderType) {\r
127                                         case PROVIDER_TYPE.IBMDADB2:\r
128                                         case PROVIDER_TYPE.MSDAORA:\r
129                                                 return DataSource;\r
130                                 }\r
131                                 return base.CatalogName;\r
132                         }\r
133                 }\r
134 \r
135                 protected override string Port\r
136                 {\r
137                         get {\r
138                                 string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));\r
139                                 switch (ProviderType) {\r
140                                         case PROVIDER_TYPE.MSDAORA :\r
141                                                 if (String.Empty.Equals(port)) {\r
142                                                         return StringManager.GetString("ORA_CON_PORT");\r
143                                                 }\r
144                                                 return port;\r
145                                         case PROVIDER_TYPE.IBMDADB2 :\r
146                                                 if (String.Empty.Equals(port)) {\r
147                                                         string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));\r
148 \r
149                                                         if (!String.Empty.Equals(location)) {\r
150                                                                 int semicolumnIndex = location.IndexOf(':');\r
151                                                                 if (semicolumnIndex != -1) {\r
152                                                                         return location.Substring(semicolumnIndex + 1);\r
153                                                                 }\r
154                                                         }\r
155                                                         return StringManager.GetString("DB2_CON_PORT");\r
156                                                 }\r
157                                                 return port;\r
158                                 }\r
159                                 return base.Port;\r
160                         }\r
161                 }\r
162 \r
163                 protected override string JdbcDriverName\r
164                 {\r
165                         get {\r
166                                 JDBC_MODE jdbcMode = JdbcMode;\r
167                                 switch (jdbcMode) {\r
168                                         case JDBC_MODE.DATA_SOURCE_MODE :\r
169                                                 return base.JdbcDriverName;\r
170                                         case JDBC_MODE.JDBC_DRIVER_MODE :\r
171                                                 return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));\r
172                                         case JDBC_MODE.PROVIDER_MODE:\r
173                                                 switch (ProviderType) {\r
174                                                         case PROVIDER_TYPE.SQLOLEDB :\r
175                                                                 return StringManager.GetString("SQL_JDBC_DRIVER");\r
176                                                         case PROVIDER_TYPE.MSDAORA :\r
177                                                                 return StringManager.GetString("ORA_JDBC_DRIVER");\r
178                                                         case PROVIDER_TYPE.IBMDADB2 :\r
179                                                                 return StringManager.GetString("DB2_JDBC_DRIVER");\r
180                                                 }\r
181                                                 break;\r
182                                 };\r
183                                 return base.JdbcDriverName;\r
184                         }\r
185                 }\r
186 \r
187                 protected override DbStringManager StringManager\r
188                 {\r
189                         get { return _stringManager; }\r
190                 }\r
191 \r
192                 #endregion // Properties\r
193 \r
194                 #region Methods\r
195 \r
196                 public new OleDbTransaction BeginTransaction(IsolationLevel level)\r
197                 {\r
198                         return new OleDbTransaction(level, this);\r
199                 }\r
200 \r
201                 public new OleDbTransaction BeginTransaction()\r
202                 {\r
203                         return BeginTransaction(IsolationLevel.ReadCommitted);\r
204                 }\r
205 \r
206                 public new OleDbCommand CreateCommand()\r
207                 {\r
208                         return new OleDbCommand(this);\r
209                 }\r
210 \r
211                 protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) {\r
212                         return BeginTransaction();\r
213                 }\r
214 \r
215                 protected override DbCommand CreateDbCommand() {\r
216                         return CreateCommand();\r
217                 }\r
218 \r
219 \r
220                 protected internal override void CopyTo(AbstractDBConnection target)\r
221                 {\r
222                         base.CopyTo(target);\r
223                 }\r
224 \r
225                 public object Clone()\r
226                 {\r
227                         OleDbConnection clone = new OleDbConnection();\r
228                         CopyTo(clone);\r
229                         return clone;\r
230                 }\r
231 \r
232                 protected override SystemException CreateException(SQLException e)\r
233                 {\r
234                         return new OleDbException(e,this);              \r
235                 }\r
236 \r
237                 public DataTable GetOleDbSchemaTable (Guid schema, object[] restrictions)\r
238                 {\r
239                         DataTable schemaTable = new DataTable("Tables");\r
240                         schemaTable.Columns.Add("TABLE_CATALOG");\r
241                         schemaTable.Columns.Add("TABLE_SCHEMA");\r
242                         schemaTable.Columns.Add("TABLE_NAME");\r
243                         schemaTable.Columns.Add("TABLE_TYPE");\r
244                         schemaTable.Columns.Add("TABLE_GUID");\r
245                         schemaTable.Columns.Add("DESCRIPTION");\r
246                         schemaTable.Columns.Add("TABLE_PROPID");\r
247                         schemaTable.Columns.Add("DATE_CREATED");\r
248                         schemaTable.Columns.Add("DATE_MODIFIED");\r
249             \r
250             \r
251                         Connection con = JdbcConnection;\r
252                         String catalog = con.getCatalog();\r
253             \r
254                         DatabaseMetaData meta = con.getMetaData();\r
255                         ResultSet schemaRes = meta.getSchemas();\r
256                         System.Collections.ArrayList schemas = new System.Collections.ArrayList();\r
257                         while(schemaRes.next()) {\r
258                                 schemas.Add(schemaRes.getString(1));\r
259                         }\r
260                         schemaRes.close();\r
261 \r
262                         for(int i = 0; i < schemas.Count; i++) {\r
263                                 ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);\r
264                                 while(tableRes.next()) {\r
265                                         DataRow row = schemaTable.NewRow();\r
266                                         row["TABLE_CATALOG"] = catalog;\r
267                                         row["TABLE_SCHEMA"] = schemas[i];\r
268                                         row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");\r
269                                         row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");\r
270                                         row["DESCRIPTION"] = tableRes.getString("REMARKS");\r
271                     \r
272                                         schemaTable.Rows.Add(row);\r
273                                 }\r
274                                 tableRes.close();\r
275                         }\r
276                         return schemaTable;\r
277                 }\r
278 \r
279                 protected internal override void ValidateConnectionString(string connectionString)\r
280                 {\r
281                         base.ValidateConnectionString(connectionString);\r
282 \r
283                         JDBC_MODE currentJdbcMode = JdbcMode;\r
284                         \r
285                         if (currentJdbcMode == JDBC_MODE.NONE) {\r
286                                 string provider = StringManager.GetString("CON_PROVIDER");\r
287 \r
288                                 if (String.Empty.Equals(provider)) {\r
289                                         throw ExceptionHelper.OleDbNoProviderSpecified();\r
290                                 }\r
291                         }\r
292                 }\r
293 \r
294                 protected override string BuildJdbcUrl()\r
295                 {\r
296                         switch (JdbcMode) {\r
297                                 case JDBC_MODE.PROVIDER_MODE :\r
298                                 switch (ProviderType) {\r
299                                         case PROVIDER_TYPE.IBMDADB2:\r
300                                                 return BuildDb2Url();\r
301                                         case PROVIDER_TYPE.MSDAORA:\r
302                                                 return BuildOracleUrl();\r
303                                         case PROVIDER_TYPE.SQLOLEDB:\r
304                                                 return BuildMsSqlUrl();\r
305                                 }\r
306                                 break;\r
307                         }\r
308                         return base.BuildJdbcUrl();\r
309                 }\r
310 \r
311                 public static void ReleaseObjectPool()\r
312                 {\r
313                         // since we're using connection pool from app servet, this is by design\r
314                         //throw new NotImplementedException();\r
315                 }\r
316 \r
317                 internal override void OnSqlWarning(SQLWarning warning)\r
318                 {\r
319                         OleDbErrorCollection col = new OleDbErrorCollection(warning, this);\r
320                         OnOleDbInfoMessage(new OleDbInfoMessageEventArgs(col));\r
321                 }\r
322 \r
323                 internal override Connection GetConnectionFromProvider()\r
324                 {\r
325                         if ((ProviderType == PROVIDER_TYPE.MSDAORA) && \r
326                                 ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {\r
327                                 ActivateJdbcDriver(JdbcDriverName);\r
328                                 return OleDbConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);\r
329                         }\r
330                         else {\r
331                                 return base.GetConnectionFromProvider();\r
332                         }\r
333                 }\r
334 \r
335                 private String BuildDb2Url()\r
336                 {\r
337                         return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://\r
338                                 + ServerName + ":" + Port + "/" + CatalogName;\r
339                 }\r
340 \r
341                 private String BuildOracleUrl()\r
342                 {\r
343                         return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"\r
344                                 + ServerName + ":" + Port + ":" + CatalogName;\r
345                 }\r
346         \r
347                 internal override void OnStateChanged(ConnectionState orig, ConnectionState current)\r
348                 {\r
349                         if(StateChange != null) {\r
350                                 StateChange(this, new StateChangeEventArgs(orig, current));\r
351                         }\r
352                 }\r
353 \r
354                 public override void Close()\r
355                 {\r
356                         ConnectionState orig = State;\r
357                         base.Close();\r
358                         ConnectionState current = State;\r
359                         if(current != orig) {\r
360                                 OnStateChanged(orig, current);\r
361                         }\r
362                 }\r
363 \r
364                 private void OnOleDbInfoMessage (OleDbInfoMessageEventArgs value)
365                 {
366                         if (InfoMessage != null) {
367                                 InfoMessage (this, value);
368                         }
369                 }\r
370 \r
371                 #endregion // Methods\r
372 \r
373         }\r
374 }