2004-03-10 Umadevi S (sumadevi@novell.com)
[mono.git] / mcs / class / System.Data / System.Data.OleDb / OleDbConnection.cs
index 77ca8c77f950adc3c441ca36cc9f59a3d373e2d9..a079c6f9b959a600c4b535d202bed3bf4da4e704 100644 (file)
 //
 // System.Data.OleDb.OleDbConnection
 //
-// Author:
+// Authors:
 //   Rodrigo Moya (rodrigo@ximian.com)
+//   Tim Coleman (tim@timcoleman.com)
 //
 // Copyright (C) Rodrigo Moya, 2002
+// Copyright (C) Tim Coleman, 2002
 //
 
 using System.ComponentModel;
 using System.Data;
 using System.Data.Common;
-using System.Exception;
 
 namespace System.Data.OleDb
 {
        public sealed class OleDbConnection : Component, ICloneable, IDbConnection
        {
-               private IntPtr m_gdaConnection = IntPtr.Zero;
-               private string m_string = "";
-               private int m_timeout = 15; // default is 15 seconds
+               #region Fields
 
-               /*
-                * Constructors
-                */
+               string connectionString;
+               int connectionTimeout;
+               IntPtr gdaConnection;
+
+               #endregion
+
+               #region Constructors
                
                public OleDbConnection ()
                {
+                       libgda.gda_init ("System.Data.OleDb", "1.0", 0, new string [0]);
+                       gdaConnection = IntPtr.Zero;
+                       connectionTimeout = 15;
+                       connectionString = null;
                }
 
-               /*
-                * Properties
-                */
-               
-               public OleDbConnection (string cnc_string) : this ()
+               public OleDbConnection (string connectionString) : this ()
                {
-                       m_string = cnc_string;
+                       this.connectionString = connectionString;
                }
 
-               string IDbConnection.ConnectionString
-               {
+               #endregion // Constructors
+
+               #region Properties
+
+               public string ConnectionString {
                        get {
-                               return m_string;
+                               return connectionString;
                        }
                        set {
-                               m_string = value;
+                               connectionString = value;
                        }
                }
 
-               int IDbConnection.ConnectionTimeout
-               {
+               public int ConnectionTimeout {
                        get {
-                               return m_timeout;
+                               return connectionTimeout;
                        }
                }
 
-               string IDbConnection.Database
-               {
+               public string Database { 
                        get {
-                               if (m_gdaConnection != IntPtr.Zero
-                                   && libgda.gda_connection_is_open (m_gdaConnection)) {
-                                       return libgda.gda_connection_get_database (m_gdaConnection);
+                               if (gdaConnection != IntPtr.Zero
+                                   && libgda.gda_connection_is_open (gdaConnection)) {
+                                       return libgda.gda_connection_get_database (gdaConnection);
                                }
 
                                return null;
                        }
                }
 
-               public string DataSource
-               {
-                       [MonoTODO]
+               public string DataSource {
                        get {
-                               throw new NotImplementedException ();
+                               if (gdaConnection != IntPtr.Zero
+                                   && libgda.gda_connection_is_open (gdaConnection)) {
+                                       return libgda.gda_connection_get_dsn (gdaConnection);
+                               }
+
+                               return null;
                        }
                }
 
-               public string Provider
-               {
+               public string Provider {
                        get {
-                               if (m_gdaConnection != IntPtr.Zero
-                                   && libgda.gda_connection_is_open (m_gdaConnection)) {
-                                       return libgda.gda_connection_get_provider (m_gdaConnection);
+                               if (gdaConnection != IntPtr.Zero
+                                   && libgda.gda_connection_is_open (gdaConnection)) {
+                                       return libgda.gda_connection_get_provider (gdaConnection);
                                }
 
                                return null;
                        }
                }
 
-               public string ServerVersion
-               {
-                       [MonoTODO]
+               public string ServerVersion {
                        get {
-                               throw new NotImplementedException ();
+                               if (gdaConnection != IntPtr.Zero
+                                   && libgda.gda_connection_is_open (gdaConnection)) {
+                                       return libgda.gda_connection_get_server_version (gdaConnection);
+                               }
+
+                               return null;
                        }
                }
 
-               ConnectionState IDbConnection.State
+               public ConnectionState State
                {
                        get {
-                               if (m_gdaConnection != IntPtr.Zero) {
-                                       if (libgda.gda_connection_is_open (m_gdaConnection))
+                               if (gdaConnection != IntPtr.Zero) {
+                                       if (libgda.gda_connection_is_open (gdaConnection))
                                                return ConnectionState.Open;
                                }
 
@@ -109,83 +118,155 @@ namespace System.Data.OleDb
                internal IntPtr GdaConnection
                {
                        get {
-                               return m_gdaConnection;
+                               return gdaConnection;
                        }
                }
                
-               /*
-                * Methods
-                */
-               
-               IDbTransaction IDbConnection.BeginTransaction ()
+               #endregion // Properties
+       
+               #region Methods
+       
+               public OleDbTransaction BeginTransaction ()
                {
-                       if (m_gdaConnection != IntPtr.Zero)
+                       if (gdaConnection != IntPtr.Zero)
                                return new OleDbTransaction (this);
 
                        return null;
                }
 
-               IDbTransaction IDbConnection.BeginTransaction (IsolationLevel level)
+               IDbTransaction IDbConnection.BeginTransaction ()
                {
-                       if (m_gdaConnection != IntPtr.Zero)
+                       return BeginTransaction ();
+               }
+               
+               public OleDbTransaction BeginTransaction (IsolationLevel level)
+               {
+                       if (gdaConnection != IntPtr.Zero)
                                return new OleDbTransaction (this, level);
 
                        return null;
                }
 
-               void IDbConnection.ChangeDatabase (string name)
+               IDbTransaction IDbConnection.BeginTransaction (IsolationLevel level)
                {
-                       // FIXME: see http://bugzilla.gnome.org/show_bug.cgi?id=83315
+                       return BeginTransaction (level);
                }
 
-               [MonoTODO]
-               object ICloneable.Clone ()
+               public void ChangeDatabase (string name)
                {
-                       throw new NotImplementedException();
+                       if (gdaConnection == IntPtr.Zero)
+                               throw new ArgumentException ();
+                       if (State != ConnectionState.Open)
+                               throw new InvalidOperationException ();
+
+                       if (!libgda.gda_connection_change_database (gdaConnection, name))
+                               throw new OleDbException (this);
                }
-               
-               void IDbConnection.Close ()
+
+               public void Close ()
                {
-                       if (m_gdaConnection != IntPtr.Zero) {
-                               libgda.gda_connection_close (m_gdaConnection);
-                               m_gdaConnection = IntPtr.Zero;
+                       if (State == ConnectionState.Open) {
+                               libgda.gda_connection_close (gdaConnection);
+                               gdaConnection = IntPtr.Zero;
                        }
                }
 
-               IDbCommand IDbConnection.CreateCommand ()
+               public OleDbCommand CreateCommand ()
                {
-                       if (m_gdaConnection != IntPtr.Zero
-                           && libgda.gda_connection_is_open (m_gdaConnection)) {
-                               return new OleDbCommand ();
-                       }
+                       if (State == ConnectionState.Open)
+                               return new OleDbCommand (null, this);
 
                        return null;
                }
 
                [MonoTODO]
-               public DataTable GetOleDbSchemaTable (Guid schema,
-                                                     object[] restrictions)
+               protected override void Dispose (bool disposing)
                {
                        throw new NotImplementedException ();
                }
 
-               void IDbConnection.Open ()
+               [MonoTODO]
+               public DataTable GetOleDbSchemaTable (Guid schema, object[] restrictions)
                {
-                       if (m_gdaConnection != IntPtr.Zero ||
-                           libgda.gda_connection_is_open (m_gdaConnection))
+                       throw new NotImplementedException ();
+               }
+
+               [MonoTODO]
+               object ICloneable.Clone ()
+               {
+                       throw new NotImplementedException();
+               }
+
+               IDbCommand IDbConnection.CreateCommand ()
+               {
+                       return CreateCommand ();
+               }
+
+               public void Open ()
+               {
+                       string provider = "Default";
+                       string gdaCncStr = "";
+                       string[] args;
+                       int len;
+                       char [] separator = { ';' };
+                       
+                       if (State == ConnectionState.Open)
                                throw new InvalidOperationException ();
 
-                       m_gdaConnection = libgda.gda_client_open_connection (
-                               libgda.GdaClient,
-                               m_string,
-                               "", "");
+                       gdaConnection = libgda.gda_client_open_connection (libgda.GdaClient,
+                                                                          connectionString,
+                                                                          "", "", 0);
+                       
+                       /* convert the connection string to its GDA equivalent */
+                       //args = connectionString.Split (';');
+                       //len = args.Length;
+                       //for (int i = 0; i < len; i++) {
+                       //      string[] values = args[i].Split (separator, 2);
+                       //      if (values[0] == "Provider") {
+                       //              if (values[1] == "SQLOLEDB")
+                       //                      provider = "FreeTDS";
+                       //              else if (values[1] == "MSDAORA")
+                       //                      provider = "Oracle";
+                       //              else if (values[2] == "Microsoft.Jet.OLEDB.4.0")
+                       //                      provider = "MS Access";
+                       //              else
+                       //                      provider = values[2];
+                       //      }
+                       //      else if (values[0] == "Addr" || values[0] == "Address")
+                       //              gdaCncStr = String.Concat (gdaCncStr, "HOST=", values[1], ";");
+                       //      else if (values[0] == "Database")
+                       //              gdaCncStr = String.Concat (gdaCncStr, "DATABASE=", values[1], ";");
+                       //      else if (values[0] == "Connection Lifetime")
+                       //              connectionTimeout = System.Convert.ToInt32 (values[1]);
+                       //      else if (values[0] == "File Name")
+                       //              gdaCncStr = String.Concat (gdaCncStr, "FILENAME=", values[1], ";");
+                       //      else if (values[0] == "Password" || values[0] == "Pwd")
+                       //              gdaCncStr = String.Concat (gdaCncStr, "PASSWORD=", values[1], ";");
+                       //      else if (values[0] == "User ID")
+                       //              gdaCncStr = String.Concat (gdaCncStr, "USERNAME=", values[1], ";");
+                       //}
+
+                       /* open the connection */
+                       //System.Console.WriteLine ("Opening connection for provider " +
+                       //                provider + " with " + gdaCncStr);
+                       //gdaConnection = libgda.gda_client_open_connection_from_string (libgda.GdaClient,
+                       //                                                             provider,
+                       //                                                             gdaCncStr);
                }
 
-               /*
-                * Events
-                */
-               
+               [MonoTODO]
+               public static void ReleaseObjectPool ()
+               {
+                       throw new NotImplementedException ();
+               }
+
+               #endregion
+
+               #region Events and Delegates
+
                public event OleDbInfoMessageEventHandler InfoMessage;
                public event StateChangeEventHandler StateChange;
+
+               #endregion
        }
 }