TDS 8 changes
[mono.git] / mcs / class / System.Data / Mainsoft.Data.Jdbc.Providers.jvm / OleDbOracleProvider.cs
1 //
2 // Mainsoft.Data.Jdbc.Providers.OleDbOracleProvider
3 //
4 // Authors:
5 //      Konstantin Triger <kostat@mainsoft.com>
6 //      Boris Kirzner <borisk@mainsoft.com>
7 //      
8 // (C) 2006 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 //
31
32 using System;
33 using System.Collections;
34 using Mainsoft.Data.Configuration;
35 using System.Reflection;
36
37 namespace Mainsoft.Data.Jdbc.Providers
38 {
39         public class OleDbOracleProvider : GenericProvider
40         {
41                 #region Consts
42
43                 private const string Port = "Port";
44                 private const string ROWID = "ROWID";
45                 private const string DBTYPE_CHAR = "DBTYPE_CHAR";
46
47                 #endregion //Consts
48
49                 #region oracle.sql.Types constants
50
51                 private enum JavaSqlTypes {
52                         ARRAY = 2003 ,
53                         BIGINT = -5, 
54                         BINARY = -2 ,
55                         BIT = -7 ,
56                         BLOB = 2004, 
57                         BOOLEAN = 16, 
58                         CHAR = 1, 
59                         CLOB = 2005, 
60                         DATALINK = 70, 
61                         DATE = 91, 
62                         DECIMAL = 3, 
63                         DISTINCT = 2001, 
64                         DOUBLE = 8, 
65                         FLOAT = 6, 
66                         INTEGER = 4, 
67                         JAVA_OBJECT = 2000, 
68                         LONGVARBINARY = -4,
69                         LONGVARCHAR = -1, 
70                         NULL = 0, 
71                         NUMERIC = 2 ,
72                         OTHER = 1111 ,
73                         REAL = 7 ,
74                         REF = 2006 ,
75                         SMALLINT = 5,
76                         STRUCT = 2002, 
77                         TIME = 92, 
78                         TIMESTAMP = 93, 
79                         TINYINT = -6, 
80                         VARBINARY = -3, 
81                         VARCHAR = 12,
82
83                         //ORACLE types, see oracle.jdbc.OracleTypes
84                         BINARY_FLOAT  = 100,
85                         BINARY_DOUBLE = 101,
86                         ROWID = -8,
87                         CURSOR = -10,
88                         TIMESTAMPNS = -100,
89                         TIMESTAMPTZ = -101,
90                         TIMESTAMPLTZ = -102,
91                         INTERVALYM      = -103,
92                         INTERVALDS      = -104,
93                 }
94
95                 #endregion
96
97                 #region Fields
98
99                 #endregion // Fields
100
101                 #region Constructors
102
103                 public OleDbOracleProvider (IDictionary providerInfo) : base (providerInfo)
104                 {
105                 }
106
107                 #endregion // Constructors
108
109                 #region Properties
110
111                 #endregion // Properties
112
113                 #region Methods
114
115                 public override IConnectionStringDictionary GetConnectionStringBuilder (string connectionString)
116                 {
117                         IConnectionStringDictionary conectionStringBuilder = base.GetConnectionStringBuilder (connectionString);
118
119                         string port = (string) conectionStringBuilder [Port];
120                         if (port == null || port.Length == 0) {
121                                 port = (string) ProviderInfo [Port];
122                                 conectionStringBuilder.Add (Port, port);
123                         }
124                         
125                         return conectionStringBuilder;
126                 }
127
128                 public override java.sql.Connection GetConnection(IConnectionStringDictionary conectionStringBuilder) {
129                         return new OracleConnection(base.GetConnection (conectionStringBuilder));
130                 }
131
132
133                 #endregion //Methods
134
135                 #region OracleConnection
136
137                 sealed class OracleConnection : Connection {
138
139                         public OracleConnection(java.sql.Connection connection)
140                                 : base(connection) {}
141
142                         public override java.sql.Statement createStatement() {
143                                 return new OracleStatement (base.createStatement());
144                         }
145
146                         public override java.sql.Statement createStatement(int arg_0, int arg_1) {
147                                 return new OracleStatement (base.createStatement(arg_0, arg_1));
148                         }
149
150                         public override java.sql.Statement createStatement(int arg_0, int arg_1, int arg_2) {
151                                 return new OracleStatement (base.createStatement(arg_0, arg_1, arg_2));
152                         }
153
154                         public override java.sql.CallableStatement prepareCall(string arg_0) {
155                                 return new OracleCallableStatement(base.prepareCall (arg_0));
156                         }
157
158                         public override java.sql.CallableStatement prepareCall(string arg_0, int arg_1, int arg_2) {
159                                 return new OracleCallableStatement(base.prepareCall (arg_0, arg_1, arg_2));
160                         }
161
162                         public override java.sql.CallableStatement prepareCall(string arg_0, int arg_1, int arg_2, int arg_3) {
163                                 return new OracleCallableStatement(base.prepareCall (arg_0, arg_1, arg_2, arg_3));
164                         }
165
166                         public override java.sql.PreparedStatement prepareStatement(string arg_0) {
167                                 return new OraclePreparedStatement(base.prepareStatement (arg_0));
168                         }
169
170                         public override java.sql.PreparedStatement prepareStatement(string arg_0, int arg_1) {
171                                 return new OraclePreparedStatement(base.prepareStatement (arg_0, arg_1));
172                         }
173
174                         public override java.sql.PreparedStatement prepareStatement(string arg_0, int arg_1, int arg_2) {
175                                 return new OraclePreparedStatement(base.prepareStatement (arg_0, arg_1, arg_2));
176                         }
177
178                         public override java.sql.PreparedStatement prepareStatement(string arg_0, int arg_1, int arg_2, int arg_3) {
179                                 return new OraclePreparedStatement(base.prepareStatement (arg_0, arg_1, arg_2, arg_3));
180                         }
181
182                         public override java.sql.PreparedStatement prepareStatement(string arg_0, int[] arg_1) {
183                                 return new OraclePreparedStatement(base.prepareStatement (arg_0, arg_1));
184                         }
185
186                         public override java.sql.PreparedStatement prepareStatement(string arg_0, string[] arg_1) {
187                                 return new OraclePreparedStatement(base.prepareStatement (arg_0, arg_1));
188                         }
189                 }
190
191                 #endregion
192
193                 sealed class OracleStatement : Statement {
194
195                         public OracleStatement (java.sql.Statement statement) 
196                                 : base (statement) {
197                         }
198
199                         public override java.sql.ResultSet executeQuery(string arg_0) {
200                                 return new OracleResultSet (base.executeQuery(arg_0));
201                         }
202
203                         public override java.sql.ResultSet getResultSet() {
204                                 return new OracleResultSet (base.getResultSet());
205                         }
206                 }
207
208                 sealed class OraclePreparedStatement : PreparedStatement, IPreparedStatement {
209                         readonly MethodInfo _info;
210
211                         public OraclePreparedStatement(java.sql.PreparedStatement statement)
212                                 : base(statement) {
213                                 _info = Wrapped.GetType().GetMethod("setFixedCHAR");
214                         }
215
216                         public override java.sql.ResultSet executeQuery(string arg_0) {
217                                 return new OracleResultSet (base.executeQuery(arg_0));
218                         }
219
220                         #region IPreparedStatement Members
221
222                         public void setBit(int parameterIndex, int value) {
223                                 base.setInt(parameterIndex, value);
224                         }
225
226                         public void setChar(int parameterIndex, string value) {
227                                 if (_info == null) {
228                                         base.setString(parameterIndex, value);
229                                         return;
230                                 }
231
232                                 _info.Invoke(Wrapped, new object[] {
233                                                         new java.lang.Integer(parameterIndex),
234                                                         value});
235                         }
236
237                         public void setNumeric(int parameterIndex, java.math.BigDecimal value) {
238                                 base.setBigDecimal(parameterIndex, value);
239                         }
240
241                         public void setReal(int parameterIndex, double value) {
242                                 base.setDouble(parameterIndex, value);
243                         }
244
245                         #endregion
246                 }
247
248                 sealed class OracleCallableStatement : CallableStatement, IPreparedStatement {
249                         readonly MethodInfo _info;
250
251                         public OracleCallableStatement(java.sql.CallableStatement statement)
252                                 : base(statement) {
253                                 _info = Wrapped.GetType().GetMethod("setFixedCHAR");
254                         }
255
256                         public override java.sql.ResultSet executeQuery(string arg_0) {
257                                 return new OracleResultSet (base.executeQuery(arg_0));
258                         }
259
260                         #region IPreparedStatement Members
261
262                         public void setBit(int parameterIndex, int value) {
263                                 base.setInt(parameterIndex, value);
264                         }
265
266                         public void setChar(int parameterIndex, string value) {
267                                 if (_info == null) {
268                                         base.setString(parameterIndex, value);
269                                         return;
270                                 }
271
272                                 _info.Invoke(Wrapped, new object[] {
273                                                                 new java.lang.Integer(parameterIndex),
274                                                                 value});
275                         }
276
277                         public void setNumeric(int parameterIndex, java.math.BigDecimal value) {
278                                 base.setBigDecimal(parameterIndex, value);
279                         }
280
281                         public void setReal(int parameterIndex, double value) {
282                                 base.setDouble(parameterIndex, value);
283                         }
284
285                         #endregion
286
287                 }
288
289                 sealed class OracleResultSet : ResultSet {
290                         public OracleResultSet (java.sql.ResultSet resultSet) : base (resultSet) {
291                         }
292
293                         public override java.sql.ResultSetMetaData getMetaData() {
294                                 return new OracleResultSetMetaData (base.getMetaData ());
295                         }
296                 }
297
298                 sealed class OracleResultSetMetaData: ResultSetMetaData {
299                         public OracleResultSetMetaData (java.sql.ResultSetMetaData resultSetMetaData)
300                                 : base (resultSetMetaData) {
301                         }
302
303                         public override int getColumnType(int arg_0) {
304                                 int jdbcType = base.getColumnType (arg_0);
305                                 if ((JavaSqlTypes)jdbcType == JavaSqlTypes.ROWID)
306                                         return (int)JavaSqlTypes.VARCHAR;
307
308                                 return jdbcType;
309                         }
310
311                         public override string getColumnTypeName(int arg_0) {
312                                 string columnTypeName = base.getColumnTypeName (arg_0);
313                                 if (ROWID == columnTypeName)
314                                         return DBTYPE_CHAR;
315
316                                 return columnTypeName;
317                         }
318                 }
319
320         }
321 }