**** Merged from MCS ****
[mono-project.git] / mcs / class / System.Data.OracleClient / System.Data.OracleClient / OracleConnection.cs
blob06eb0872e6e1eef88a4e91191f33ba721f7c52b4
1 //
2 // OracleConnection.cs
3 //
4 // Part of the Mono class libraries at
5 // mcs/class/System.Data.OracleClient/System.Data.OracleClient
6 //
7 // Assembly: System.Data.OracleClient.dll
8 // Namespace: System.Data.OracleClient
9 //
10 // Authors:
11 // Daniel Morgan <danmorg@sc.rr.com>
12 // Tim Coleman <tim@timcoleman.com>
14 // Copyright (C) Daniel Morgan, 2002
15 // Copyright (C) Tim Coleman, 2003
17 // Original source code for setting ConnectionString
18 // by Tim Coleman <tim@timcoleman.com>
20 // Copyright (C) Tim Coleman, 2002
22 // Licensed under the MIT/X11 License.
25 using System;
26 using System.Collections;
27 using System.Collections.Specialized;
28 using System.ComponentModel;
29 using System.Data;
30 using System.Data.OracleClient.Oci;
31 using System.Drawing.Design;
32 using System.EnterpriseServices;
33 using System.Text;
35 namespace System.Data.OracleClient
37 internal struct OracleConnectionInfo
39 public string Username;
40 public string Password;
41 public string Database;
44 [DefaultEvent ("InfoMessage")]
45 public sealed class OracleConnection : Component, ICloneable, IDbConnection
47 #region Fields
49 OciGlue oci;
50 ConnectionState state;
51 OracleConnectionInfo conInfo;
52 OracleTransaction transaction = null;
53 string connectionString = "";
54 OracleDataReader dataReader = null;
56 #endregion // Fields
58 #region Constructors
60 public OracleConnection ()
62 state = ConnectionState.Closed;
63 oci = new OciGlue ();
66 public OracleConnection (string connectionString)
67 : this()
69 SetConnectionString (connectionString);
72 #endregion // Constructors
74 #region Properties
76 int IDbConnection.ConnectionTimeout {
77 [MonoTODO]
78 get { return -1; }
81 string IDbConnection.Database {
82 [MonoTODO]
83 get { return String.Empty; }
86 internal OracleDataReader DataReader {
87 get { return dataReader; }
88 set { dataReader = value; }
91 internal OciEnvironmentHandle Environment {
92 get { return oci.Environment; }
95 internal OciErrorHandle ErrorHandle {
96 get { return oci.ErrorHandle; }
99 internal OciServiceHandle ServiceContext {
100 get { return oci.ServiceContext; }
103 [MonoTODO]
104 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
105 public string DataSource {
106 get {
107 throw new NotImplementedException ();
111 [Browsable (false)]
112 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
113 public ConnectionState State {
114 get { return state; }
117 [DefaultValue ("")]
118 [RecommendedAsConfigurable (true)]
119 [RefreshProperties (RefreshProperties.All)]
120 [Editor ("Microsoft.VSDesigner.Data.Oracle.Design.OracleConnectionStringEditor, " + Consts.AssemblyMicrosoft_VSDesigner, typeof(UITypeEditor))]
121 public string ConnectionString {
122 get { return connectionString; }
123 set { SetConnectionString (value); }
126 [MonoTODO]
127 [Browsable (false)]
128 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
129 public string ServerVersion {
130 get {
131 throw new NotImplementedException ();
135 internal OciGlue Oci {
136 get { return oci; }
139 internal OracleTransaction Transaction {
140 get { return transaction; }
141 set { transaction = value; }
144 #endregion // Properties
146 #region Methods
148 public OracleTransaction BeginTransaction ()
150 return BeginTransaction (IsolationLevel.ReadCommitted);
153 public OracleTransaction BeginTransaction (IsolationLevel il)
155 if (state == ConnectionState.Closed)
156 throw new InvalidOperationException ("The connection is not open.");
157 if (transaction != null)
158 throw new InvalidOperationException ("OracleConnection does not support parallel transactions.");
160 OciTransactionHandle transactionHandle = oci.CreateTransaction ();
161 if (transactionHandle == null)
162 throw new Exception("Error: Unable to start transaction");
163 else {
164 transactionHandle.Begin ();
165 transaction = new OracleTransaction (this, il, transactionHandle);
168 return transaction;
171 [MonoTODO]
172 void IDbConnection.ChangeDatabase (string databaseName)
174 throw new NotImplementedException ();
177 public OracleCommand CreateCommand ()
179 OracleCommand command = new OracleCommand ();
180 command.Connection = this;
181 return command;
184 [MonoTODO]
185 object ICloneable.Clone ()
187 throw new NotImplementedException ();
190 IDbTransaction IDbConnection.BeginTransaction ()
192 return BeginTransaction ();
195 IDbTransaction IDbConnection.BeginTransaction (IsolationLevel iso)
197 return BeginTransaction (iso);
200 IDbCommand IDbConnection.CreateCommand ()
202 return CreateCommand ();
205 void IDisposable.Dispose ()
207 Dispose (true);
208 GC.SuppressFinalize (this);
211 [MonoTODO]
212 protected override void Dispose (bool disposing)
214 base.Dispose (disposing);
217 [MonoTODO]
218 public void EnlistDistributedTransaction (ITransaction distributedTransaction)
220 throw new NotImplementedException ();
223 public void Open ()
225 oci.CreateConnection (conInfo);
226 state = ConnectionState.Open;
229 public void Close ()
231 if (transaction != null)
232 transaction.Rollback ();
234 oci.Disconnect ();
235 state = ConnectionState.Closed;
239 void SetConnectionString (string connectionString)
241 this.connectionString = connectionString;
242 conInfo.Username = "";
243 conInfo.Database = "";
244 conInfo.Password = "";
246 if (connectionString == String.Empty)
247 return;
249 connectionString += ";";
250 NameValueCollection parameters = new NameValueCollection ();
252 bool inQuote = false;
253 bool inDQuote = false;
255 string name = String.Empty;
256 string value = String.Empty;
257 StringBuilder sb = new StringBuilder ();
259 foreach (char c in connectionString) {
260 switch (c) {
261 case '\'':
262 inQuote = !inQuote;
263 break;
264 case '"' :
265 inDQuote = !inDQuote;
266 break;
267 case ';' :
268 if (!inDQuote && !inQuote) {
269 if (name != String.Empty && name != null) {
270 value = sb.ToString ();
271 parameters [name.ToUpper ().Trim ()] = value.Trim ();
273 name = String.Empty;
274 value = String.Empty;
275 sb = new StringBuilder ();
277 else
278 sb.Append (c);
279 break;
280 case '=' :
281 if (!inDQuote && !inQuote) {
282 name = sb.ToString ();
283 sb = new StringBuilder ();
285 else
286 sb.Append (c);
287 break;
288 default:
289 sb.Append (c);
290 break;
294 SetProperties (parameters);
297 private void SetProperties (NameValueCollection parameters)
299 string value;
300 foreach (string name in parameters) {
301 value = parameters[name];
303 switch (name) {
304 case "DATA SOURCE" :
305 case "DATABASE" :
306 // set Database property
307 conInfo.Database = value;
308 break;
309 case "PASSWORD" :
310 case "PWD" :
311 conInfo.Password = value;
312 break;
313 case "UID" :
314 case "USER ID" :
315 conInfo.Username = value;
316 break;
317 default:
318 throw new Exception("Connection parameter not supported." + name);
323 #endregion // Methods
325 public event OracleInfoMessageEventHandler InfoMessage;
326 public event StateChangeEventHandler StateChange;