2004-03-12 Andreas Nahr <ClassDevelopment@A-SoftTech.com>
[mono.git] / mcs / class / System.Data / System.Data.OleDb / OleDbCommand.cs
index 644fb54ac61013ecd6c2797b39590533b0145ee6..8de3e49794cb44f52eef899a778651a9023631c5 100644 (file)
@@ -13,6 +13,7 @@ using System.ComponentModel;
 using System.Data;
 using System.Data.Common;
 using System.Collections;
+using System.Runtime.InteropServices;
 
 namespace System.Data.OleDb
 {
@@ -32,8 +33,7 @@ namespace System.Data.OleDb
                bool designTimeVisible;
                OleDbDataReader dataReader;
                CommandBehavior behavior;
-               ArrayList gdaCommands;
-               ArrayList gdaResults;
+               IntPtr gdaCommand;
 
                #endregion // Fields
 
@@ -50,12 +50,10 @@ namespace System.Data.OleDb
                        designTimeVisible = false;
                        dataReader = null;
                        behavior = CommandBehavior.Default;
-                       gdaCommands = new ArrayList ();
-                       gdaResults = new ArrayList ();
+                       gdaCommand = IntPtr.Zero;
                }
 
-               public OleDbCommand (string cmdText)
-                       : this ()
+               public OleDbCommand (string cmdText) : this ()
                {
                        CommandText = cmdText;
                }
@@ -66,8 +64,9 @@ namespace System.Data.OleDb
                        Connection = connection;
                }
 
-               public OleDbCommand (string cmdText, OleDbConnection connection, OleDbTransaction transaction)
-                       : this (cmdText, connection)
+               public OleDbCommand (string cmdText,
+                                    OleDbConnection connection,
+                                    OleDbTransaction transaction) : this (cmdText, connection)
                {
                        this.transaction = transaction;
                }
@@ -78,71 +77,101 @@ namespace System.Data.OleDb
        
                public string CommandText 
                {
-                       get { return commandText; }
+                       get {
+                               return commandText;
+                       }
                        set { 
-                               string[] queries = value.Split (new Char[] {';'});
-                               gdaCommands.Clear ();
-
-                               foreach (string query in queries) 
-                                       gdaCommands.Add (libgda.gda_command_new (query, 0, 0));
-
-                               commandText = value; 
+                               commandText = value;
                        }
                }
 
                public int CommandTimeout {
-                       get { return timeout; }
-                       set { timeout = value; }
+                       get {
+                               return timeout;
+                       }
+                       set {
+                               timeout = value;
+                       }
                }
 
                public CommandType CommandType { 
-                       get { return commandType; }
-                       set { commandType = value; }
+                       get {
+                               return commandType;
+                       }
+                       set {
+                               commandType = value;
+                       }
                }
 
                public OleDbConnection Connection { 
-                       get { return connection; }
-                       set { connection = value; }
+                       get {
+                               return connection;
+                       }
+                       set {
+                               connection = value;
+                       }
                }
 
                public bool DesignTimeVisible { 
-                       get { return designTimeVisible; }
-                       set { designTimeVisible = value; }
+                       get {
+                               return designTimeVisible;
+                       }
+                       set {
+                               designTimeVisible = value;
+                       }
                }
 
                public OleDbParameterCollection Parameters {
-                       get { return parameters; }
-                       set { parameters = value; }
+                       get {
+                               return parameters;
+                       }
+                       set {
+                               parameters = value;
+                       }
                }
 
                public OleDbTransaction Transaction {
-                       get { return transaction; }
-                       set { transaction = value; }
+                       get {
+                               return transaction;
+                       }
+                       set {
+                               transaction = value;
+                       }
                }
 
                public UpdateRowSource UpdatedRowSource { 
                        [MonoTODO]
-                       get { throw new NotImplementedException (); }
+                       get {
+                               throw new NotImplementedException ();
+                       }
                        [MonoTODO]
-                       set { throw new NotImplementedException (); }
+                       set {
+                               throw new NotImplementedException ();
+                       }
                }
 
                IDbConnection IDbCommand.Connection {
-                       get { return Connection; }
-                       set { Connection = (OleDbConnection) value; }
+                       get {
+                               return Connection;
+                       }
+                       set {
+                               Connection = (OleDbConnection) value;
+                       }
                }
 
                IDataParameterCollection IDbCommand.Parameters  {
-                       get { return Parameters; }
+                       get {
+                               return Parameters;
+                       }
                }
 
                IDbTransaction IDbCommand.Transaction  {
-                       get { return Transaction; }
-                       set { Transaction = (OleDbTransaction) value; }
-               }
-
-               internal ArrayList GdaResults {
-                       get { return gdaResults; }
+                       get {
+                               return Transaction;
+                       }
+                       set {
+                               Transaction = (OleDbTransaction) value;
+                       }
                }
 
                #endregion // Properties
@@ -160,24 +189,59 @@ namespace System.Data.OleDb
                        return new OleDbParameter ();
                }
 
+               IDbDataParameter IDbCommand.CreateParameter ()
+               {
+                       return CreateParameter ();
+               }
+               
                [MonoTODO]
                protected override void Dispose (bool disposing)
                {
                        throw new NotImplementedException ();
                }
 
+               private void SetupGdaCommand ()
+               {
+                       GdaCommandType type;
+                       
+                       switch (commandType) {
+                       case CommandType.TableDirect :
+                               type = GdaCommandType.Table;
+                               break;
+                       case CommandType.StoredProcedure :
+                               type = GdaCommandType.Procedure;
+                               break;
+                       case CommandType.Text :
+                       default :
+                               type = GdaCommandType.Sql;
+                               break;
+                       }
+                       
+                       if (gdaCommand != IntPtr.Zero) {
+                               libgda.gda_command_set_text (gdaCommand, commandText);
+                               libgda.gda_command_set_command_type (gdaCommand, type);
+                       } else {
+                               gdaCommand = libgda.gda_command_new (commandText, type, 0);
+                       }
+
+                       //libgda.gda_command_set_transaction 
+               }
+               
                public int ExecuteNonQuery ()
                {
                        if (connection == null)
-                               throw new InvalidOperationException ();
+                               throw new InvalidOperationException ("connection == null");
                        if (connection.State == ConnectionState.Closed)
-                               throw new InvalidOperationException ();
+                               throw new InvalidOperationException ("State == Closed");
                        // FIXME: a third check is mentioned in .NET docs
 
                        IntPtr gdaConnection = connection.GdaConnection;
                        IntPtr gdaParameterList = parameters.GdaParameterList;
 
-                       return libgda.gda_connection_execute_non_query (gdaConnection, (IntPtr) gdaCommands[0], gdaParameterList);
+                       SetupGdaCommand ();
+                       return libgda.gda_connection_execute_non_query (gdaConnection,
+                                                                       (IntPtr) gdaCommand,
+                                                                       gdaParameterList);
                }
 
                public OleDbDataReader ExecuteReader ()
@@ -185,52 +249,72 @@ namespace System.Data.OleDb
                        return ExecuteReader (CommandBehavior.Default);
                }
 
+               IDataReader IDbCommand.ExecuteReader ()
+               {
+                       return ExecuteReader ();
+               }
+
                public OleDbDataReader ExecuteReader (CommandBehavior behavior)
                {
+                       ArrayList results = new ArrayList ();
+                       IntPtr rs_list;
+                       GdaList glist_node;
+
                        if (connection.State != ConnectionState.Open)
-                               throw new InvalidOperationException ();
+                               throw new InvalidOperationException ("State != Open");
 
                        this.behavior = behavior;
 
                        IntPtr gdaConnection = connection.GdaConnection;
                        IntPtr gdaParameterList = parameters.GdaParameterList;
 
-                       foreach (IntPtr gdaCommand in gdaCommands) 
-                               GdaResults.Add (libgda.gda_connection_execute_single_command (gdaConnection, gdaCommand, gdaParameterList));
-
-                       dataReader = new OleDbDataReader (this);
-
-                       dataReader.NextResult ();
+                       /* execute the command */
+                       SetupGdaCommand ();
+                       rs_list = libgda.gda_connection_execute_command (
+                               gdaConnection,
+                               gdaCommand,
+                               gdaParameterList);
+                       if (rs_list != IntPtr.Zero) {
+                               glist_node = (GdaList) Marshal.PtrToStructure (rs_list, typeof (GdaList));
+
+                               while (glist_node != null) {
+                                       results.Add (glist_node.data);
+                                       if (glist_node.next == IntPtr.Zero)
+                                               break;
+
+                                       glist_node = (GdaList) Marshal.PtrToStructure (glist_node.next,
+                                                                                      typeof (GdaList));
+                               }
+                               dataReader = new OleDbDataReader (this, results);
+                               dataReader.NextResult ();
+                       }
 
                        return dataReader;
                }
 
-               [MonoTODO]
-               public object ExecuteScalar ()
-               {
-                       throw new NotImplementedException ();   
-               }
-
-               [MonoTODO]
-               object ICloneable.Clone ()
-               {
-                       throw new NotImplementedException ();   
-               }
-
-               [MonoTODO]
-               IDbDataParameter IDbCommand.CreateParameter ()
+               IDataReader IDbCommand.ExecuteReader (CommandBehavior behavior)
                {
-                       throw new NotImplementedException ();   
+                       return ExecuteReader (behavior);
                }
-
-               [MonoTODO]
-               IDataReader IDbCommand.ExecuteReader ()
+               
+               public object ExecuteScalar ()
                {
-                       throw new NotImplementedException ();   
+                       SetupGdaCommand ();
+                       OleDbDataReader reader = ExecuteReader ();
+                       if (reader == null) {
+                               return null;
+                       }
+                       if (!reader.Read ()) {
+                               reader.Close ();
+                               return null;
+                       }
+                       object o = reader.GetValue (0);
+                       reader.Close ();
+                       return o;
                }
 
                [MonoTODO]
-               IDataReader IDbCommand.ExecuteReader (CommandBehavior behavior)
+               object ICloneable.Clone ()
                {
                        throw new NotImplementedException ();   
                }
@@ -247,17 +331,5 @@ namespace System.Data.OleDb
                }
 
                #endregion
-
-               #region Internal Methods
-
-               // only meant to be used between OleDbConnectioin,
-               // OleDbCommand, and OleDbDataReader
-               internal void OpenReader (OleDbDataReader reader) 
-               {
-                       connection.OpenReader (reader);
-               }
-
-               #endregion
-
        }
 }