* support-test-*.cs: Rename from test-*-p2.cs.
[mono.git] / mcs / class / System.Data.OracleClient / System.Data.OracleClient.jvm / OracleConnection.cs
1 //\r
2 // System.Data.OracleClient.OracleConnection\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.Data.ProviderBase;\r
37 using System.Collections;\r
38 \r
39 using java.sql;\r
40 \r
41 namespace System.Data.OracleClient {\r
42         public sealed class OracleConnection : AbstractDBConnection, System.ICloneable {\r
43                 #region Fields \r
44 \r
45                 static readonly Hashtable _skippedUserParameters = new Hashtable(new CaseInsensitiveHashCodeProvider(),new CaseInsensitiveComparer());\r
46 \r
47                 private static readonly object _lockObjectStringManager = new object();\r
48                 //private static DbStringManager _stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OracleStrings");\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 OracleInfoMessageEventHandler InfoMessage;\r
61                 public event StateChangeEventHandler StateChange;\r
62 \r
63                 #endregion // Events\r
64                 \r
65                 #region Constructors\r
66 \r
67                 public OracleConnection() : this(null) {\r
68                 }\r
69 \r
70                 public OracleConnection(String connectionString) : base(connectionString) {                     \r
71                 }\r
72 \r
73                 #endregion // Constructors\r
74 \r
75                 #region Properties\r
76 \r
77                 protected override string[] ResourceIgnoredKeys {\r
78                         get { return _resourceIgnoredKeys; }\r
79                 }\r
80 \r
81                 public String Provider {\r
82                         get { return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_PROVIDER")); }\r
83                 }\r
84 \r
85                 protected override Hashtable SkippedUserParameters {\r
86                         get { return _skippedUserParameters; }\r
87                 }\r
88 \r
89                 protected override string ServerName {\r
90                         get { \r
91                                 if (ProviderType == PROVIDER_TYPE.IBMDADB2 || ProviderType == PROVIDER_TYPE.MSDAORA) {\r
92                                         string host = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("CON_SERVER_NAME"));\r
93 \r
94                                         if (!String.Empty.Equals(host)) {\r
95                                                 return host;\r
96                                         }\r
97 \r
98                                         if (ProviderType == PROVIDER_TYPE.IBMDADB2) {\r
99                                                 string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));\r
100 \r
101                                                 if (!String.Empty.Equals(location)) {\r
102                                                         int semicolumnIndex = location.IndexOf(':');\r
103                                                         if (semicolumnIndex != -1) {\r
104                                                                 return location.Substring(0,semicolumnIndex);\r
105                                                         }\r
106                                                         else {\r
107                                                                 return location;\r
108                                                         }\r
109                                                 }\r
110                                         }\r
111 \r
112                                 }\r
113                                 return base.ServerName; \r
114                         }\r
115                 }\r
116 \r
117                 protected override string CatalogName {\r
118                         get { \r
119                                 switch (ProviderType) {\r
120                                         case PROVIDER_TYPE.IBMDADB2:\r
121                                         case PROVIDER_TYPE.MSDAORA:\r
122                                                 return DataSource;\r
123                                 }\r
124                                 return base.CatalogName;\r
125                         }\r
126                 }\r
127 \r
128                 protected override string Port {\r
129                         get {\r
130                                 string port = ConnectionStringHelper.FindValue(UserParameters, StringManager.GetStringArray("CON_PORT"));\r
131                                 switch (ProviderType) {\r
132                                         case PROVIDER_TYPE.MSDAORA :\r
133                                                 if (String.Empty.Equals(port)) {\r
134                                                         return StringManager.GetString("ORA_CON_PORT");\r
135                                                 }\r
136                                                 return port;\r
137                                         case PROVIDER_TYPE.IBMDADB2 :\r
138                                                 if (String.Empty.Equals(port)) {\r
139                                                         string location = ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("DB2_CON_LOCATION"));\r
140 \r
141                                                         if (!String.Empty.Equals(location)) {\r
142                                                                 int semicolumnIndex = location.IndexOf(':');\r
143                                                                 if (semicolumnIndex != -1) {\r
144                                                                         return location.Substring(semicolumnIndex + 1);\r
145                                                                 }\r
146                                                         }\r
147                                                         return StringManager.GetString("DB2_CON_PORT");\r
148                                                 }\r
149                                                 return port;\r
150                                 }\r
151                                 return base.Port;\r
152                         }\r
153                 }\r
154 \r
155                 protected override string JdbcDriverName {\r
156                         get {\r
157                                 JDBC_MODE jdbcMode = JdbcMode;\r
158                                 switch (jdbcMode) {\r
159                                         case JDBC_MODE.DATA_SOURCE_MODE :\r
160                                                 return base.JdbcDriverName;\r
161                                         case JDBC_MODE.JDBC_DRIVER_MODE :\r
162                                                 return ConnectionStringHelper.FindValue(UserParameters,StringManager.GetStringArray("JDBC_DRIVER"));\r
163                                         case JDBC_MODE.PROVIDER_MODE:\r
164                                         switch (ProviderType) {\r
165                                                 case PROVIDER_TYPE.SQLOLEDB :\r
166                                                         return StringManager.GetString("SQL_JDBC_DRIVER");\r
167                                                 case PROVIDER_TYPE.MSDAORA :\r
168                                                         return StringManager.GetString("ORA_JDBC_DRIVER");\r
169                                                 case PROVIDER_TYPE.IBMDADB2 :\r
170                                                         return StringManager.GetString("DB2_JDBC_DRIVER");\r
171                                         }\r
172                                                 break;\r
173                                 };\r
174                                 return base.JdbcDriverName;\r
175                         }\r
176                 }\r
177 \r
178                 protected override DbStringManager StringManager {\r
179                         get {\r
180                                 object stringManager = AppDomain.CurrentDomain.GetData("System.Data.OracleConnection.stringManager");\r
181                                 if (stringManager == null) {\r
182                                         lock(_lockObjectStringManager) {\r
183                                                 stringManager = AppDomain.CurrentDomain.GetData("System.Data.OracleConnection.stringManager");\r
184                                                 if (stringManager != null)\r
185                                                         return (DbStringManager)stringManager;\r
186                                                 stringManager = new DbStringManager("System.Data.System.Data.ProviderBase.jvm.OracleStrings");\r
187                                                 AppDomain.CurrentDomain.SetData("System.Data.OracleConnection.stringManager", stringManager);\r
188                                         }\r
189                                 }\r
190                                 return (DbStringManager)stringManager;\r
191                         }\r
192                 }\r
193 \r
194                 #endregion // Properties\r
195 \r
196                 #region Methods\r
197 \r
198                 public new OracleTransaction BeginTransaction(IsolationLevel level) {\r
199                         return new OracleTransaction(level, this);\r
200                 }\r
201 \r
202                 public new OracleTransaction BeginTransaction() {\r
203                         return BeginTransaction(IsolationLevel.ReadCommitted);\r
204                 }\r
205 \r
206                 public new OracleCommand CreateCommand() {\r
207                         return new OracleCommand(this);\r
208                 }\r
209 \r
210                 protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) {\r
211                         return BeginTransaction();\r
212                 }\r
213 \r
214                 protected override DbCommand CreateDbCommand() {\r
215                         return CreateCommand();\r
216                 }\r
217 \r
218 \r
219                 protected override void CopyTo(AbstractDBConnection target) {\r
220                         base.CopyTo(target);\r
221                 }\r
222 \r
223                 public object Clone() {\r
224                         OracleConnection clone = new OracleConnection();\r
225                         CopyTo(clone);\r
226                         return clone;\r
227                 }\r
228 \r
229                 protected sealed override SystemException CreateException(SQLException e) {\r
230                         return new OracleException(e,this);             \r
231                 }\r
232 \r
233                 protected sealed override SystemException CreateException(string message) {\r
234                         return new OracleException(message, null, this);        \r
235                 }\r
236 \r
237                 public DataTable GetOracleSchemaTable (Guid schema, object[] restrictions) {\r
238                         DataTable schemaTable = new DataTable("Tables");\r
239                         schemaTable.Columns.Add("TABLE_CATALOG");\r
240                         schemaTable.Columns.Add("TABLE_SCHEMA");\r
241                         schemaTable.Columns.Add("TABLE_NAME");\r
242                         schemaTable.Columns.Add("TABLE_TYPE");\r
243                         schemaTable.Columns.Add("TABLE_GUID");\r
244                         schemaTable.Columns.Add("DESCRIPTION");\r
245                         schemaTable.Columns.Add("TABLE_PROPID");\r
246                         schemaTable.Columns.Add("DATE_CREATED");\r
247                         schemaTable.Columns.Add("DATE_MODIFIED");\r
248             \r
249             \r
250                         Connection con = JdbcConnection;\r
251                         String catalog = con.getCatalog();\r
252             \r
253                         DatabaseMetaData meta = con.getMetaData();\r
254                         ResultSet schemaRes = meta.getSchemas();\r
255                         System.Collections.ArrayList schemas = new System.Collections.ArrayList();\r
256                         while(schemaRes.next()) {\r
257                                 schemas.Add(schemaRes.getString(1));\r
258                         }\r
259                         schemaRes.close();\r
260 \r
261                         for(int i = 0; i < schemas.Count; i++) {\r
262                                 ResultSet tableRes = meta.getTables(catalog, schemas[i].ToString(), null, null);\r
263                                 while(tableRes.next()) {\r
264                                         DataRow row = schemaTable.NewRow();\r
265                                         row["TABLE_CATALOG"] = catalog;\r
266                                         row["TABLE_SCHEMA"] = schemas[i];\r
267                                         row["TABLE_NAME"] = tableRes.getString("TABLE_NAME");\r
268                                         row["TABLE_TYPE"] = tableRes.getString("TABLE_TYPE");\r
269                                         row["DESCRIPTION"] = tableRes.getString("REMARKS");\r
270                     \r
271                                         schemaTable.Rows.Add(row);\r
272                                 }\r
273                                 tableRes.close();\r
274                         }\r
275                         return schemaTable;\r
276                 }\r
277 \r
278                 protected override void ValidateConnectionString(string connectionString) {\r
279                         base.ValidateConnectionString(connectionString);\r
280                 }\r
281 \r
282                 protected override string BuildJdbcUrl() {\r
283                         return base.BuildJdbcUrl();\r
284                 }\r
285 \r
286                 public static void ReleaseObjectPool() {\r
287                         // since we're using connection pool from app servet, this is by design\r
288                         //throw new NotImplementedException();\r
289                 }\r
290 \r
291                 protected sealed override void OnSqlWarning(SQLWarning warning) {\r
292                         OracleErrorCollection col = new OracleErrorCollection(warning, this);\r
293                         OnOracleInfoMessage(new OracleInfoMessageEventArgs(col));\r
294                 }\r
295 \r
296 //              protected sealed override Connection GetConnectionFromProvider() {\r
297 //                      if ((ProviderType == PROVIDER_TYPE.MSDAORA) && \r
298 //                              ("true").Equals(StringManager.GetString("ORA_CONNECTION_POOLING_ENABLED","false"))) {\r
299 //                              ActivateJdbcDriver(JdbcDriverName);\r
300 //                              return OracleConnectionFactory.GetConnection(ProviderType,JdbcUrl,User,Password,ConnectionTimeout);\r
301 //                      }\r
302 //                      else {\r
303 //                              return base.GetConnectionFromProvider();\r
304 //                      }\r
305                         //TBD\r
306 //              }\r
307 \r
308                 private String BuildDb2Url() {\r
309                         return StringManager.GetString("DB2_JDBC_URL") //jdbc:db2://\r
310                                 + ServerName + ":" + Port + "/" + CatalogName;\r
311                 }\r
312 \r
313                 private String BuildOracleUrl() {\r
314                         return StringManager.GetString("ORA_JDBC_URL") //"jdbc:oracle:thin:@"\r
315                                 + ServerName + ":" + Port + ":" + CatalogName;\r
316                 }\r
317         \r
318                 protected sealed override void OnStateChanged(ConnectionState orig, ConnectionState current) {\r
319                         if(StateChange != null) {\r
320                                 StateChange(this, new StateChangeEventArgs(orig, current));\r
321                         }\r
322                 }\r
323 \r
324                 public override void Close() {\r
325                         ConnectionState orig = State;\r
326                         base.Close();\r
327                         ConnectionState current = State;\r
328                         if(current != orig) {\r
329                                 OnStateChanged(orig, current);\r
330                         }\r
331                 }\r
332 \r
333                 private void OnOracleInfoMessage (OracleInfoMessageEventArgs value) {
334                         if (InfoMessage != null) {
335                                 InfoMessage (this, value);
336                         }
337                 }\r
338 \r
339                 #endregion // Methods\r
340 \r
341         }\r
342 }