[Task] Add an extra check in Task.WaitAny to make sure the index returned is valid
[mono.git] / mcs / class / System.Data / System.Data.Common / Key.cs
index 989e86316788303abecd4ff3ed727454341df033..a41dd799741e35b8c344c84f608763c067e36a8b 100644 (file)
@@ -69,13 +69,11 @@ namespace System.Data.Common
                                }\r
                        }\r
 \r
-                       if (rowState != DataViewRowState.None) {\r
+                       if (rowState != DataViewRowState.None)\r
                                _rowStateFilter = rowState;\r
-                       }\r
-                       else {\r
+                       else\r
                                // FIXME : what is the correct value ?\r
                                _rowStateFilter = DataViewRowState.CurrentRows;\r
-                       }\r
                }\r
 \r
                #endregion // Constructors\r
@@ -163,32 +161,59 @@ namespace System.Data.Common
                        return _filter.EvalBoolean(_tmpRow);\r
                }\r
 \r
-               internal static int GetRecord(DataRow row, DataViewRowState rowStateFilter)\r
+               internal bool ContainsVersion (DataRowState state, DataRowVersion version)\r
                {\r
-\r
-                       if (row.Original == row.Current) {\r
-                                if ((rowStateFilter & DataViewRowState.Unchanged) != DataViewRowState.None) {\r
-                                        return row.Current;\r
-                                }\r
+                       switch (state) {\r
+                               case DataRowState.Unchanged:\r
+                                       if ((_rowStateFilter & DataViewRowState.Unchanged) != DataViewRowState.None)\r
+                                               return ((version & DataRowVersion.Default) != 0);\r
+                                       break;\r
+                               case DataRowState.Added:\r
+                                       if ((_rowStateFilter & DataViewRowState.Added) != DataViewRowState.None)\r
+                                               return ((version & DataRowVersion.Default) != 0);\r
+                                       break;\r
+                               case DataRowState.Deleted:\r
+                                       if ((_rowStateFilter & DataViewRowState.Deleted) != DataViewRowState.None)\r
+                                               return (version == DataRowVersion.Original);\r
+                                       break;\r
+                               default:\r
+                                       if ((_rowStateFilter & DataViewRowState.ModifiedCurrent) != DataViewRowState.None)\r
+                                               return ((version & DataRowVersion.Default) != 0);\r
+                                       if ((_rowStateFilter & DataViewRowState.ModifiedOriginal) != DataViewRowState.None)\r
+                                               return (version == DataRowVersion.Original);\r
+                                       break;\r
                        }\r
-                       else if (row.Original == -1) {\r
-                                 if ((rowStateFilter & DataViewRowState.Added) != DataViewRowState.None) {\r
-                                       return row.Current;\r
-                                 }\r
-                       }\r
-                       else if (row.Current == -1) {\r
-                                    if ((rowStateFilter & DataViewRowState.Deleted) != DataViewRowState.None) {\r
+\r
+                       return false;\r
+               }\r
+\r
+               internal static int GetRecord(DataRow row, DataViewRowState rowStateFilter)\r
+               {\r
+                       switch (row.RowState) {\r
+                               case DataRowState.Unchanged: {\r
+                                       if ((rowStateFilter & DataViewRowState.Unchanged) != DataViewRowState.None)\r
+                                               return row.Proposed >= 0 ? row.Proposed : row.Current;\r
+                                       break;\r
+                               }\r
+                               case DataRowState.Added: {\r
+                                       if ((rowStateFilter & DataViewRowState.Added) != DataViewRowState.None)\r
+                                               return row.Proposed >= 0 ? row.Proposed : row.Current;\r
+                                       break;\r
+                               }\r
+                               case DataRowState.Deleted: {\r
+                                       if ((rowStateFilter & DataViewRowState.Deleted) != DataViewRowState.None)\r
                                                return row.Original;\r
-                                        }\r
-                       }\r
-                       else if ((rowStateFilter & DataViewRowState.ModifiedCurrent) != DataViewRowState.None) {\r
-                               return row.Current;\r
-                       }\r
-                       else if ((rowStateFilter & DataViewRowState.ModifiedOriginal) != DataViewRowState.None) {\r
-                               return row.Original;\r
+                                       break;\r
+                               }\r
+                               default:\r
+                                       if ((rowStateFilter & DataViewRowState.ModifiedCurrent) != DataViewRowState.None)\r
+                                               return row.Proposed >= 0 ? row.Proposed : row.Current;\r
+                                       if ((rowStateFilter & DataViewRowState.ModifiedOriginal) != DataViewRowState.None)\r
+                                               return row.Original;\r
+                                       break;\r
                        }\r
 \r
-            return -1;\r
+                       return -1;\r
                }\r
 \r
                /// <summary>\r
@@ -230,7 +255,7 @@ namespace System.Data.Common
                        }\r
                        else {\r
                                for(int i=0; i < columns.Length; i++) {\r
-                                       if (Columns[i] != columns[i]) {\r
+                                       if (Sort [i] != ListSortDirection.Ascending || Columns[i] != columns[i]) {\r
                                                return false;\r
                                        }\r
                                }\r