2007-07-22 Nagappan A <anagappan@novell.com>
[mono.git] / mcs / class / System.Data / System.Data.Common / DataTableMappingCollection.cs
index 675580968e91bd30d0151be38989efac448aad6c..6b80997fe14d061f825ccfec987e8d706f89c83e 100644 (file)
@@ -9,6 +9,29 @@
 // Copyright (C) Tim Coleman, 2002-2003
 //
 
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
 using System;
 using System.Collections;
 using System.ComponentModel;
@@ -40,14 +63,18 @@ namespace System.Data.Common {
                #region Properties
 
                [Browsable (false)]
+#if !NET_2_0
                [DataSysDescription ("The number of items in the collection")]
+#endif
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public int Count {
                        get { return mappings.Count; }
                }
 
                [Browsable (false)]
+#if !NET_2_0
                [DataSysDescription ("The specified DataTableMapping object")]
+#endif
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public DataTableMapping this [int index] {
                        get { return (DataTableMapping)(mappings[index]); }
@@ -60,7 +87,9 @@ namespace System.Data.Common {
                }
 
                [Browsable (false)]
+#if !NET_2_0
                [DataSysDescription ("The specified DataTableMapping object")]
+#endif
                [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
                public DataTableMapping this [string sourceTable] {
                        get { return (DataTableMapping) sourceTables[sourceTable]; }
@@ -108,7 +137,7 @@ namespace System.Data.Common {
                public int Add (object value) 
                {
                        if (!(value is System.Data.Common.DataTableMapping))
-                               throw new SystemException ("The object passed in was not a DataTableMapping object.");
+                               throw new InvalidCastException ("The object passed in was not a DataTableMapping object.");
 
                        sourceTables[((DataTableMapping)value).SourceTable] = value;    
                        dataSetTables[((DataTableMapping)value).DataSetTable] = value;  
@@ -122,11 +151,11 @@ namespace System.Data.Common {
                        return mapping;
                }
 
-#if NET_1_2
-               [MonoTODO]
+#if NET_2_0
                public void AddRange (Array values)
                {
-                       throw new NotImplementedException ();
+                       for (int i = 0; i < values.Length; ++i)
+                               Add (values.GetValue (i));
                }
 #endif
 
@@ -158,9 +187,31 @@ namespace System.Data.Common {
                        mappings.CopyTo (array, index);
                }
 
+#if NET_2_0
+               public void CopyTo (DataTableMapping[] array, int index) 
+               {
+                       mappings.CopyTo (array, index);
+               }
+#endif
+
                public DataTableMapping GetByDataSetTable (string dataSetTable) 
                {
-                       return (DataTableMapping)(dataSetTables[dataSetTable]);
+                       
+                       // this should work case-insenstive.
+                        if (!(dataSetTables[dataSetTable] == null)) 
+                                return (DataTableMapping)(dataSetTables[dataSetTable]);
+                        else {
+                                string lowcasevalue = dataSetTable.ToLower();
+                                object [] keyarray = new object[dataSetTables.Count];
+                                dataSetTables.Keys.CopyTo(keyarray,0);
+                                for (int i=0; i<keyarray.Length; i++) {
+                                        string temp = (string) keyarray[i];
+                                        if (lowcasevalue.Equals(temp.ToLower()))                                                               return (DataTableMapping)(dataSetTables[keyarray[i]]);
+                                }
+                                return null;
+                                                                                
+                        }
+
                }
 
                [EditorBrowsable (EditorBrowsableState.Advanced)]
@@ -169,7 +220,8 @@ namespace System.Data.Common {
                        if (tableMappings.Contains (sourceTable))
                                return tableMappings[sourceTable];
                        if (mappingAction == MissingMappingAction.Error)
-                               throw new InvalidOperationException ();
+                               throw new InvalidOperationException (String.Format ("Missing source table mapping: '{0}'",
+                                                                                   sourceTable));
                        if (mappingAction == MissingMappingAction.Ignore)
                                return null;
                        return new DataTableMapping (sourceTable, dataSetTable);
@@ -192,14 +244,42 @@ namespace System.Data.Common {
 
                public int IndexOfDataSetTable (string dataSetTable) 
                {
-                       return IndexOf ((DataTableMapping)(dataSetTables[dataSetTable]));
+                         // this should work case-insensitive
+                                                                                            
+                         if (!(dataSetTables[dataSetTable] == null)) 
+                               return IndexOf ((DataTableMapping)(dataSetTables[dataSetTable]));
+                         else {
+                                string lowcasevalue = dataSetTable.ToLower();
+                               object [] keyarray = new object[dataSetTables.Count];
+                                dataSetTables.Keys.CopyTo(keyarray,0);
+                                for (int i=0; i<keyarray.Length; i++) {
+                                        string temp = (string) keyarray[i];
+                                        if (lowcasevalue.Equals(temp.ToLower()))
+                                               return IndexOf ((DataTableMapping)(dataSetTables[keyarray[i]]));
+                                          
+                                }
+                               return -1;
+                                                                                                    
+                        }
+
                }
 
                public void Insert (int index, object value) 
                {
                        mappings.Insert (index, value);
+                       sourceTables[((DataTableMapping)value).SourceTable] = value;
+                        dataSetTables[((DataTableMapping)value).DataSetTable] = value;
                }
 
+#if NET_2_0
+               public void Insert (int index, DataTableMapping value) 
+               {
+                       mappings.Insert (index, value);
+                       sourceTables[value.SourceTable] = value;
+                        dataSetTables[value.DataSetTable] = value;
+               }
+#endif
+
                ITableMapping ITableMappingCollection.Add (string sourceTableName, string dataSetTableName)
                {
                        ITableMapping tableMapping = new DataTableMapping (sourceTableName, dataSetTableName);
@@ -214,11 +294,29 @@ namespace System.Data.Common {
 
                public void Remove (object value) 
                {
+                       if (!(value is DataTableMapping))
+                                 throw new InvalidCastException ();
+                       int index = mappings.IndexOf (value);
+                       if (( index < 0 ) || (index >=mappings.Count))
+                                    throw new ArgumentException("There is no such element in collection.");
                        mappings.Remove ((DataTableMapping) value);
                }
 
+#if NET_2_0
+               public void Remove (DataTableMapping value) 
+               {
+                       int index = mappings.IndexOf (value);
+                       if (( index < 0 ) || (index >=mappings.Count))
+                                    throw new ArgumentException("There is no such element in collection."); 
+                       mappings.Remove ((DataTableMapping) value);
+               }
+#endif
+
                public void RemoveAt (int index) 
                {
+                        if (( index < 0 ) || (index >=mappings.Count))
+                                    throw new IndexOutOfRangeException("There is no element in collection.");
+
                        mappings.RemoveAt (index);
                }