* DataColumn.cs (Expression) : Validate the expression.
authorEran Domb <eran@mono-cvs.ximian.com>
Mon, 8 Dec 2003 13:27:43 +0000 (13:27 -0000)
committerEran Domb <eran@mono-cvs.ximian.com>
Mon, 8 Dec 2003 13:27:43 +0000 (13:27 -0000)
* DataRelationCollection.cs (IndexOf) : Added new method sensetive to case differences in relation name.

(Contains, IndexOf, this[], Add) : Call new IndexOf when needed.

* DataRow.cs (this[]) : Fix the condition for throwing RowNotInTableException.

(RejectChanges) : Detach row when state was Added.

(CollectionChanged) : Fix a bug.

* ExpressionElement (ValidateExpression) : Fix a bug.

* ForeignKeyConstraint.cs (AssertConstraint) : Added implementation. Check all rows from child table have
a parent row in the parent table.

(_validateColumns) : Fix bugs.

* MergeManager.cs (AdjustSchema) : Fix a bug.

* XmlDataLoader.cs (ReadModeInferSchema) : Change implementation. Now we can read nested xml, and we generate the relations
between the tables.

svn path=/trunk/mcs/; revision=20866

mcs/class/System.Data/System.Data/DataColumn.cs
mcs/class/System.Data/System.Data/DataRelationCollection.cs
mcs/class/System.Data/System.Data/DataRow.cs
mcs/class/System.Data/System.Data/ExpressionElement.cs
mcs/class/System.Data/System.Data/ForeignKeyConstraint.cs
mcs/class/System.Data/System.Data/MergeManager.cs
mcs/class/System.Data/System.Data/XmlDataLoader.cs

index b9c7982fb04e0b499500391d503163ee0d9caa6b..792f972140b297d3671cab3b9c9fe06701a219ea 100644 (file)
@@ -373,6 +373,9 @@ namespace System.Data {
                        set {
                                //TODO: validation of the expression
                                expression = value;  //Check?
+
+                               //Check the validate expression of ExpressionElement with string
+                               expression = System.Data.ExpressionElement.ValidateExpression(expression);
                                
                                if (expression != string.Empty)
                                        ReadOnly = true;
index 63d1dfaad4f2e0e77227ecdb4c2ff1dbb81c7630..e064e04b6073ecaa3beba4295e531d4588b29750 100644 (file)
@@ -46,9 +46,8 @@ namespace System.Data {
                        public override DataRelation this [string name]
                        {
                                get {
-                                       foreach (DataRelation dataRelation in List)
-                                               if (dataRelation.RelationName == name) return dataRelation;
-                                       return null;
+                                       int index = IndexOf (name, true);
+                                       return index < 0 ? null : (DataRelation) list[index];
                                }
                        }
 
@@ -398,15 +397,21 @@ namespace System.Data {
                                //TODO: Issue a good exception message.
                                throw new ArgumentNullException();
                        }
-                       else if(List.IndexOf(relation) != -1)
+                       if(List.IndexOf(relation) != -1)
                        {
                                //TODO: Issue a good exception message.
                                throw new ArgumentException();
                        }
-                       else if(List.Contains(relation.RelationName))
+
+                       // check if the collection has a relation with the same name.
+                       int tmp = IndexOf(relation.RelationName);
+                       // if we found a relation with same name we have to check
+                       // that it is the same case.
+                       // indexof can return a table with different case letters.
+                       if (tmp != -1)
                        {
-                               //TODO: Issue a good exception message.
-                               throw new DuplicateNameException("A Relation named " + relation.RelationName + " already belongs to this DataSet.");
+                               if(relation.RelationName == this[tmp].RelationName)
+                                       throw new DuplicateNameException("A DataRelation named '" + relation.RelationName + "' already belongs to this DataSet.");
                        }
                        List.Add(relation);
                }
@@ -434,7 +439,7 @@ namespace System.Data {
 
                public virtual bool Contains(string name)
                {
-                       return IndexOf(name) != -1;
+                       return (-1 != IndexOf (name, false));
                }
 
                private CollectionChangeEventArgs CreateCollectionChangeEvent (CollectionChangeAction action)
@@ -451,7 +456,28 @@ namespace System.Data {
 
                public virtual int IndexOf(string relationName)
                {
-                       return List.IndexOf(this[relationName]);
+                       return IndexOf(relationName, false);
+               }
+
+               private int IndexOf (string name, bool error)
+               {
+                       int count = 0, match = -1;
+                       for (int i = 0; i < list.Count; i++)
+                       {
+                               String name2 = ((DataRelation) list[i]).RelationName;
+                               if (String.Compare (name, name2, true) == 0)
+                               {
+                                       if (String.Compare (name, name2, false) == 0)
+                                               return i;
+                                       match = i;
+                                       count++;
+                               }
+                       }
+                       if (count == 1)
+                               return match;
+                       if (count > 1 && error)
+                               throw new ArgumentException ("There is no match for the name in the same case and there are multiple matches in different case.");
+                       return -1;
                }
 
                protected virtual void OnCollectionChanged (CollectionChangeEventArgs ccevent)
index d1dc0c76797f62e06dae63f117d7e310a6f2758b..9f60c265f8613dcd067f40e339d00a56112c8bb6 100644 (file)
@@ -210,7 +210,7 @@ namespace System.Data {
                                                        throw new ArgumentException ();
                                        }
                                }
-                               if (rowState == DataRowState.Detached && proposed == null)
+                               if (rowState == DataRowState.Detached && version == DataRowVersion.Default && proposed == null)
                                        throw new RowNotInTableException("This row has been removed from a table and does not have any data.  BeginEdit() will allow creation of new data in this row.");
                                
                                throw new VersionNotFoundException (Locale.GetText ("There is no " + version.ToString () + " data to access."));
@@ -1025,7 +1025,11 @@ namespace System.Data {
                                // if so: FIXME ;)
                                
                                if ((rowState & DataRowState.Added) > 0)
+                               {
                                        _table.Rows.RemoveInternal (this);
+                                       // if row was in Added state we move it to Detached.
+                                       DetachRow();
+                               }
                        }
                }
 
@@ -1180,21 +1184,21 @@ namespace System.Data {
                                {
                                        tmp = new object[current.Length + 1];
                                        Array.Copy (current, tmp, current.Length);
-                                       tmp[tmp.Length - 1] = DBNull.Value;
+                                       tmp[tmp.Length - 1] = SetColumnValue(null, tmp.Length - 1);
                                        current = tmp;
                                }
                                if (proposed != null)
                                {
                                        tmp = new object[proposed.Length + 1];
                                        Array.Copy (proposed, tmp, proposed.Length);
-                                       tmp[tmp.Length - 1] = DBNull.Value;
+                                       tmp[tmp.Length - 1] = SetColumnValue(null, tmp.Length - 1);
                                        proposed = tmp;
                                }
                                if(original != null)
                                {
                                        tmp = new object[original.Length + 1];
                                        Array.Copy (original, tmp, original.Length);
-                                       tmp[tmp.Length - 1] = DBNull.Value;
+                                       tmp[tmp.Length - 1] = SetColumnValue(null, tmp.Length - 1);
                                        original = tmp;
                                }
 
index 482b0ad12f19aafa1582fe879d5f0d2b00d76d15..c775a2eb21daf6b5d0d2c103719584b8c09b2ab8 100644 (file)
@@ -17,17 +17,17 @@ using System.Reflection;
 \r
 using System.Collections;\r
 \r
-namespace System.Data \r
+namespace System.Data\r
 {\r
        /// <summary>\r
        /// The main element which includes whole expression\r
        /// </summary>\r
-       internal class ExpressionMainElement : ExpressionElement \r
+       internal class ExpressionMainElement : ExpressionElement\r
        {\r
                \r
                \r
 \r
-               public ExpressionMainElement (string s) \r
+               public ExpressionMainElement (string s)\r
                {\r
                        s = ExpressionElement.ValidateExpression (s);\r
                        ParseExpression (s);\r
@@ -55,7 +55,7 @@ namespace System.Data
        /// <summary>\r
        ///  Class for =\r
        /// </summary>\r
-       internal class ExpressionEquals : ExpressionElement \r
+       internal class ExpressionEquals : ExpressionElement\r
        {       \r
 \r
                public ExpressionEquals (string exp1, string exp2) \r
@@ -79,7 +79,7 @@ namespace System.Data
        /// <summary>\r
        ///  Class for <\r
        /// </summary>\r
-       internal class ExpressionLessThan : ExpressionElement \r
+       internal class ExpressionLessThan : ExpressionElement\r
        {       \r
 \r
                public ExpressionLessThan (string exp1, string exp2) \r
@@ -103,7 +103,7 @@ namespace System.Data
        /// <summary>\r
        ///  Class for <=\r
        /// </summary>\r
-       internal class ExpressionLessThanOrEqual : ExpressionElement \r
+       internal class ExpressionLessThanOrEqual : ExpressionElement\r
        {       \r
 \r
                public ExpressionLessThanOrEqual (string exp1, string exp2) \r
@@ -127,7 +127,7 @@ namespace System.Data
        /// <summary>\r
        ///  Class for >\r
        /// </summary>\r
-       internal class ExpressionGreaterThan : ExpressionElement \r
+       internal class ExpressionGreaterThan : ExpressionElement\r
        {       \r
 \r
                public ExpressionGreaterThan (string exp1, string exp2) \r
@@ -151,7 +151,7 @@ namespace System.Data
        /// <summary>\r
        ///  Class for >=\r
        /// </summary>\r
-       internal class ExpressionGreaterThanOrEqual : ExpressionElement \r
+       internal class ExpressionGreaterThanOrEqual : ExpressionElement\r
        {       \r
 \r
                public ExpressionGreaterThanOrEqual (string exp1, string exp2) \r
@@ -175,7 +175,7 @@ namespace System.Data
        /// <summary>\r
        ///  Class for <>\r
        /// </summary>\r
-       internal class ExpressionUnequals : ExpressionElement \r
+       internal class ExpressionUnequals : ExpressionElement\r
        {       \r
 \r
                public ExpressionUnequals (string exp1, string exp2) \r
@@ -200,7 +200,7 @@ namespace System.Data
        /// <summary>\r
        ///  Class for LIKE-operator\r
        /// </summary>\r
-       internal class ExpressionLike : ExpressionElement \r
+       internal class ExpressionLike : ExpressionElement\r
        {       \r
 \r
                public ExpressionLike (string exp1, string exp2) \r
@@ -285,9 +285,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for OR\r
        /// </summary>\r
-       internal class ExpressionOr : ExpressionElement \r
+       internal class ExpressionOr : ExpressionElement\r
        {                               \r
-               public ExpressionOr (string exp1, string exp2) \r
+               public ExpressionOr (string exp1, string exp2)\r
                {\r
                        ParseExpression (exp1);\r
                        ParseExpression (exp2);\r
@@ -308,9 +308,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for AND\r
        /// </summary>\r
-       internal class ExpressionAnd : ExpressionElement \r
+       internal class ExpressionAnd : ExpressionElement\r
        {                               \r
-               public ExpressionAnd (string exp1, string exp2) \r
+               public ExpressionAnd (string exp1, string exp2)\r
                {\r
                        ParseExpression (exp1);\r
                        ParseExpression (exp2);\r
@@ -342,9 +342,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for +\r
        /// </summary>\r
-       internal class ExpressionAddition : ExpressionElement \r
+       internal class ExpressionAddition : ExpressionElement\r
        {\r
-               public ExpressionAddition (string exp1, string exp2) \r
+               public ExpressionAddition (string exp1, string exp2)\r
                {                       \r
                        this.exp1 = exp1;\r
                        this.exp2 = exp2;\r
@@ -352,7 +352,7 @@ namespace System.Data
                        ParseExpression (exp2);\r
                }\r
                \r
-               public override Type ResultType (DataRow Row) \r
+               public override Type ResultType (DataRow Row)\r
                {\r
                        Type ResultType = typeof (string);\r
                        ExpressionElement exp1Temp = ((ExpressionElement)Elements [0]);\r
@@ -415,7 +415,7 @@ namespace System.Data
 \r
 \r
                // This method is shouldnt never invoked\r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
@@ -424,9 +424,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for -\r
        /// </summary>\r
-       internal class ExpressionSubtraction : ExpressionElement \r
+       internal class ExpressionSubtraction : ExpressionElement\r
        {\r
-               public ExpressionSubtraction (string exp1, string exp2) \r
+               public ExpressionSubtraction (string exp1, string exp2)\r
                {                       \r
                        this.exp1 = exp1;\r
                        this.exp2 = exp2;\r
@@ -440,7 +440,7 @@ namespace System.Data
                }\r
                \r
                // This method is shouldnt never invoked\r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
@@ -488,9 +488,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for *\r
        /// </summary>\r
-       internal class ExpressionMultiply : ExpressionElement \r
+       internal class ExpressionMultiply : ExpressionElement\r
        {\r
-               public ExpressionMultiply (string exp1, string exp2) \r
+               public ExpressionMultiply (string exp1, string exp2)\r
                {                       \r
                        this.exp1 = exp1;\r
                        this.exp2 = exp2;\r
@@ -498,7 +498,7 @@ namespace System.Data
                        ParseExpression (exp2);\r
                }\r
                \r
-               public override Type ResultType (DataRow Row) \r
+               public override Type ResultType (DataRow Row)\r
                {\r
                        Type ResultType = null;\r
                        ExpressionElement E1 = ((ExpressionElement)Elements [0]);\r
@@ -524,7 +524,7 @@ namespace System.Data
                        return CalculateResult (Row);\r
                }\r
                \r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
@@ -570,9 +570,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for *\r
        /// </summary>\r
-       internal class ExpressionDivide : ExpressionElement \r
+       internal class ExpressionDivide : ExpressionElement\r
        {\r
-               public ExpressionDivide (string exp1, string exp2) \r
+               public ExpressionDivide (string exp1, string exp2)\r
                {                       \r
                        this.exp1 = exp1;\r
                        this.exp2 = exp2;\r
@@ -586,7 +586,7 @@ namespace System.Data
                }\r
                \r
                // This method is shouldnt never invoked\r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
@@ -634,9 +634,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for *\r
        /// </summary>\r
-       internal class ExpressionModulus : ExpressionElement \r
+       internal class ExpressionModulus : ExpressionElement\r
        {\r
-               public ExpressionModulus (string exp1, string exp2) \r
+               public ExpressionModulus (string exp1, string exp2)\r
                {                       \r
                        this.exp1 = exp1;\r
                        this.exp2 = exp2;\r
@@ -650,7 +650,7 @@ namespace System.Data
                }\r
                \r
                // This method is shouldnt never invoked\r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
@@ -699,39 +699,39 @@ namespace System.Data
        // _____A_G_G_R_E_G_A_T_E_S_____\r
        //\r
 \r
-       internal class ExpressionAggregate : ExpressionElement \r
+       internal class ExpressionAggregate : ExpressionElement\r
        {\r
                \r
-               public ExpressionAggregate() \r
+               public ExpressionAggregate()\r
                {\r
                }\r
 \r
-               public ExpressionAggregate(string s) \r
+               public ExpressionAggregate(string s)\r
                {\r
                        s = ExpressionElement.ValidateExpression (s);\r
                        ParseExpression (s);\r
                }\r
 \r
                \r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
 \r
-               public override object Result(DataRow Row) \r
+               public override object Result(DataRow Row)\r
                {\r
                        DataRow[] rows = new DataRow[Row.Table.Rows.Count];\r
                        Row.Table.Rows.CopyTo(rows, 0);\r
                        return ((ExpressionAggregate)Elements[0]).Result(rows);\r
                }\r
 \r
-               public virtual object Result(DataRow[] rows) \r
+               public virtual object Result(DataRow[] rows)\r
                {\r
                        return ((ExpressionAggregate)Elements[0]).Result(rows);\r
                }\r
 \r
 \r
-               protected virtual void ParseParameters (string s) \r
+               protected virtual void ParseParameters (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        bool inString = false;\r
@@ -756,8 +756,7 @@ namespace System.Data
                                        parentheses--;\r
 \r
                                if ((s [i] == ',' ||  s [i] == ')') && !inString && parentheses == -1) \r
-                               { \r
-                                       // Parameter changed\r
+                               { // Parameter changed\r
 \r
                                        if (p1 == null) \r
                                        {\r
@@ -778,14 +777,14 @@ namespace System.Data
        /// <summary>\r
        ///  Class for Sum (column_Name)\r
        /// </summary\r
-       internal class ExpressionSum : ExpressionAggregate \r
+       internal class ExpressionSum : ExpressionAggregate\r
        {\r
-               public ExpressionSum (string exp1) \r
+               public ExpressionSum (string exp1)\r
                {\r
                        ParseParameters (exp1);\r
                }\r
 \r
-               public override object Result(DataRow[] rows) \r
+               public override object Result(DataRow[] rows)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        object value1 = E1.Result (rows[0]);\r
@@ -846,14 +845,14 @@ namespace System.Data
        /// <summary>\r
        ///  Class for Avg (column_Name)\r
        /// </summary\r
-       internal class ExpressionAvg : ExpressionAggregate \r
+       internal class ExpressionAvg : ExpressionAggregate\r
        {\r
-               public ExpressionAvg (string exp1) \r
+               public ExpressionAvg (string exp1)\r
                {\r
                        ParseParameters (exp1);\r
                }\r
 \r
-               public override object Result(DataRow[] rows) \r
+               public override object Result(DataRow[] rows)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        object value1 = E1.Result (rows[0]);\r
@@ -921,7 +920,7 @@ namespace System.Data
                /// <summary>\r
                ///  This is used from ExpressionStdDev for evaluating avg.\r
                /// </summary>\r
-               public ExpressionAvg (ExpressionElement E) \r
+               public ExpressionAvg (ExpressionElement E)\r
                {\r
                        Elements.Add (E);\r
                }\r
@@ -931,14 +930,14 @@ namespace System.Data
        /// <summary>\r
        ///  Class for Min (column_Name)\r
        /// </summary\r
-       internal class ExpressionMin : ExpressionAggregate \r
+       internal class ExpressionMin : ExpressionAggregate\r
        {\r
-               public ExpressionMin (string exp1) \r
+               public ExpressionMin (string exp1)\r
                {\r
                        ParseParameters (exp1);\r
                }\r
 \r
-               public override object Result(DataRow[] rows) \r
+               public override object Result(DataRow[] rows)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        object value1 = E1.Result (rows[0]);\r
@@ -950,7 +949,7 @@ namespace System.Data
                                \r
                                Type t1 = null;\r
                                // This should be optimized somehow\r
-                               for (int i = 0; i < rows.Length; i++) \r
+                               for (int i = 0; i < rows.Length; i++)\r
                                {\r
                                       \r
                                        // TODO: other types and exceptions\r
@@ -984,14 +983,14 @@ namespace System.Data
        /// <summary>\r
        ///  Class for Max (column_Name)\r
        /// </summary\r
-       internal class ExpressionMax : ExpressionAggregate \r
+       internal class ExpressionMax : ExpressionAggregate\r
        {\r
-               public ExpressionMax (string exp1) \r
+               public ExpressionMax (string exp1)\r
                {\r
                        ParseParameters (exp1);\r
                }\r
 \r
-               public override object Result(DataRow[] rows) \r
+               public override object Result(DataRow[] rows)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        object value1 = E1.Result (rows[0]);\r
@@ -1038,14 +1037,14 @@ namespace System.Data
        /// <summary>\r
        ///  Class for count (column)\r
        /// </summary>\r
-       internal class ExpressionCount : ExpressionAggregate \r
+       internal class ExpressionCount : ExpressionAggregate\r
        {\r
-               public ExpressionCount (string exp1) \r
+               public ExpressionCount (string exp1)\r
                {\r
                        ParseParameters (exp1);\r
                }\r
                \r
-               public override object Result(DataRow[] rows) \r
+               public override object Result(DataRow[] rows)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        int count = 0;\r
@@ -1075,14 +1074,14 @@ namespace System.Data
        /// <summary>\r
        ///  Class for StdDev (column)\r
        /// </summary>\r
-       internal class ExpressionStdev : ExpressionAggregate \r
+       internal class ExpressionStdev : ExpressionAggregate\r
        {\r
-               public ExpressionStdev (string exp1) \r
+               public ExpressionStdev (string exp1)\r
                {               \r
                        ParseParameters (exp1);\r
                }\r
 \r
-               public override object Result(DataRow[] rows) \r
+               public override object Result(DataRow[] rows)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        ExpressionAvg Avg = new ExpressionAvg (E1);\r
@@ -1098,7 +1097,7 @@ namespace System.Data
                        if (E1 is ExpressionSingleElement) \r
                        {\r
 \r
-                               for (int i = 0; i <rows.Length; i++) \r
+                               for (int i = 0; i <rows.Length; i++)\r
                                {\r
                                        // (value - avg)²\r
                                        object v = E1.Result (rows[i]);\r
@@ -1131,14 +1130,14 @@ namespace System.Data
        /// <summary>\r
        ///  Class for Var (column)\r
        /// </summary>\r
-       internal class ExpressionVar : ExpressionAggregate \r
+       internal class ExpressionVar : ExpressionAggregate\r
        {\r
-               public ExpressionVar (string exp1) \r
+               public ExpressionVar (string exp1)\r
                {\r
                        ParseParameters (exp1);\r
                }\r
 \r
-               public override object Result(DataRow[] rows) \r
+               public override object Result(DataRow[] rows)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        ExpressionAvg Avg = new ExpressionAvg (E1);\r
@@ -1154,7 +1153,7 @@ namespace System.Data
                        if (E1 is ExpressionSingleElement) \r
                        {\r
 \r
-                               for (int i = 0; i < rows.Length; i++) \r
+                               for (int i = 0; i < rows.Length; i++)\r
                                {\r
 \r
                                       \r
@@ -1192,9 +1191,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for len (string) function\r
        /// </summary>\r
-       internal class ExpressionLen : ExpressionElement \r
+       internal class ExpressionLen : ExpressionElement\r
        {\r
-               public ExpressionLen (string exp1) \r
+               public ExpressionLen (string exp1)\r
                {                       \r
                        _ResultType = typeof (int);\r
                        ParseParameters (exp1);\r
@@ -1208,12 +1207,12 @@ namespace System.Data
                        return value1.ToString ().Length;\r
                }\r
                \r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
 \r
-               public void ParseParameters (string s) \r
+               public void ParseParameters (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        bool inString = false;\r
@@ -1237,8 +1236,7 @@ namespace System.Data
                                        parentheses--;\r
 \r
                                if ((s [i] == ',' ||  s [i] == ')') && !inString && parentheses == -1) \r
-                               { \r
-                                       // Parameter changed\r
+                               { // Parameter changed\r
 \r
                                        if (p1 == null) \r
                                        {\r
@@ -1258,9 +1256,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for iif (exp1, truepart, falsepart) function\r
        /// </summary>\r
-       internal class ExpressionIif : ExpressionElement \r
+       internal class ExpressionIif : ExpressionElement\r
        {\r
-               public ExpressionIif (string exp) \r
+               public ExpressionIif (string exp)\r
                {       \r
                        ParseParameters (exp);\r
                }\r
@@ -1278,12 +1276,12 @@ namespace System.Data
                }\r
                \r
                // This method is shouldnt never invoked\r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
 \r
-               public override Type ResultType (DataRow Row) \r
+               public override Type ResultType (DataRow Row)\r
                {                                               \r
                        ExpressionElement E1 = ((ExpressionElement)Elements [0]);\r
                        ExpressionElement E2 = ((ExpressionElement)Elements [1]);\r
@@ -1298,7 +1296,7 @@ namespace System.Data
                /// <summary>\r
                ///  Parses expressions in parameters (exp, truepart, falsepart)\r
                /// </summary>\r
-               private void ParseParameters (string s) \r
+               private void ParseParameters (string s)\r
                {\r
                        bool inString = false;\r
                        string stemp = s.ToLower ();\r
@@ -1326,8 +1324,7 @@ namespace System.Data
 \r
                                if ((s [i] == ',' && !inString && parentheses == 0) || \r
                                        (s [i] == ')' && i == (s.Length -1))) \r
-                               { \r
-                                       // Parameter changed\r
+                               { // Parameter changed\r
 \r
                                        if (p1 == null) \r
                                        {\r
@@ -1367,9 +1364,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for isnull (expression, returnvalue) function\r
        /// </summary>\r
-       internal class ExpressionIsNull : ExpressionElement \r
+       internal class ExpressionIsNull : ExpressionElement\r
        {\r
-               public ExpressionIsNull (string exp) \r
+               public ExpressionIsNull (string exp)\r
                {                       \r
                        ParseParameters (exp);\r
                }\r
@@ -1387,7 +1384,7 @@ namespace System.Data
                                return R1;\r
                }\r
 \r
-               public override Type ResultType (DataRow Row) \r
+               public override Type ResultType (DataRow Row)\r
                {\r
                        ExpressionElement E1 = (ExpressionElement)Elements [0];\r
                        ExpressionElement E2 = (ExpressionElement)Elements [1];\r
@@ -1403,7 +1400,7 @@ namespace System.Data
                /// <summary>\r
                ///  IsNull function does not return boolean value, so throw exception\r
                /// </summary>\r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
@@ -1411,7 +1408,7 @@ namespace System.Data
                /// <summary>\r
                ///  Parses parameters of function and invoke ParseExpression methods\r
                /// </summary>\r
-               private void ParseParameters (string s) \r
+               private void ParseParameters (string s)\r
                {\r
                        bool inString = false;\r
                        string stemp = s.ToLower ();\r
@@ -1439,8 +1436,7 @@ namespace System.Data
 \r
                                if ((s [i] == ',' && !inString && parentheses == 0) || \r
                                        (s [i] == ')' && i == (s.Length -1))) \r
-                               { \r
-                                       // Parameter changed\r
+                               { // Parameter changed\r
 \r
                                        if (p1 == null) \r
                                        {\r
@@ -1472,9 +1468,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for Substring (expression, start, length) function\r
        /// </summary>\r
-       internal class ExpressionSubstring : ExpressionElement \r
+       internal class ExpressionSubstring : ExpressionElement\r
        {\r
-               public ExpressionSubstring (string exp) \r
+               public ExpressionSubstring (string exp)\r
                {                       \r
                        ParseParameters (exp);\r
                        _ResultType = typeof (string);\r
@@ -1524,7 +1520,7 @@ namespace System.Data
                /// <summary>\r
                ///  IsNull function does not return boolean value, so throw exception\r
                /// </summary>\r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }\r
@@ -1532,7 +1528,7 @@ namespace System.Data
                /// <summary>\r
                ///  Parses parameters of function and invoke ParseExpression methods\r
                /// </summary>\r
-               private void ParseParameters (string s) \r
+               private void ParseParameters (string s)\r
                {\r
                        bool inString = false;\r
                        string stemp = s.ToLower ();\r
@@ -1562,8 +1558,7 @@ namespace System.Data
 \r
                                if ((s [i] == ',' && !inString && parentheses == 0) || \r
                                        (s [i] == ')' && i == (s.Length -1))) \r
-                               { \r
-                                       // Parameter changed\r
+                               { // Parameter changed\r
 \r
                                        if (p1 == null) \r
                                        {\r
@@ -1603,9 +1598,9 @@ namespace System.Data
        /// <summary>\r
        ///  Class for In (exp, exp, exp, ...) function\r
        /// </summary>\r
-       internal class ExpressionIn : ExpressionElement \r
+       internal class ExpressionIn : ExpressionElement\r
        {\r
-               public ExpressionIn (string exp1, string exp2) \r
+               public ExpressionIn (string exp1, string exp2)\r
                {       \r
                        ParseExpression(exp1);\r
                        ParseParameters (exp2);\r
@@ -1619,7 +1614,7 @@ namespace System.Data
                        ExpressionElement E;\r
                        ExpressionElement columnElement = (ExpressionElement)Elements [0];\r
 \r
-                       for (int i = 1; i < Elements.Count; i++) \r
+                       for (int i = 1; i < Elements.Count; i++)\r
                        {\r
                                E = (ExpressionElement)Elements [i];\r
                                if(ExpressionElement.Compare (columnElement, E, Row) == 0)\r
@@ -1631,7 +1626,7 @@ namespace System.Data
                /// <summary>\r
                ///  Parses parameters of function and invoke ParseExpression methods\r
                /// </summary>\r
-               private void ParseParameters (string s) \r
+               private void ParseParameters (string s)\r
                {\r
                        bool inString = false;\r
                        ArrayList parameters = new ArrayList();\r
@@ -1671,11 +1666,11 @@ namespace System.Data
        /// <summary>\r
        ///  Class for just one element for example string, int, ...\r
        /// </summary>\r
-       internal class ExpressionSingleElement : ExpressionElement \r
+       internal class ExpressionSingleElement : ExpressionElement\r
        {               \r
                private object Element = null;\r
                \r
-               public ExpressionSingleElement (string s) \r
+               public ExpressionSingleElement (string s)\r
                {\r
                        // TODO: Every type should be checked\r
                        if (s.StartsWith ("'") && s.EndsWith ("'")) \r
@@ -1708,7 +1703,7 @@ namespace System.Data
                        }                               \r
                }\r
 \r
-               public override object Result (DataRow Row) \r
+               public override object Result (DataRow Row)\r
                {\r
                        object Result = null;\r
                        if (ResultType (Row) == typeof (DataColumn)) \r
@@ -1716,7 +1711,7 @@ namespace System.Data
                                \r
                                if (!Row.Table.Columns.Contains (Element.ToString ()))\r
                                        throw new EvaluateException ("Column name '" + Element.ToString () + "' not found.");\r
-                               else \r
+                               else\r
                                {\r
                                        DataRowVersion rowVersion = DataRowVersion.Default;\r
                                        // if this row is deleted we get the original version, or else we get an exception.\r
@@ -1731,7 +1726,7 @@ namespace System.Data
                        return Result;\r
                }\r
                \r
-               public override bool Test (DataRow Row) \r
+               public override bool Test (DataRow Row)\r
                {\r
                        throw new EvaluateException ();\r
                }               \r
@@ -1740,7 +1735,7 @@ namespace System.Data
        /// <summary>\r
        ///  Parent class of all the elements of expression\r
        /// </summary>\r
-       internal abstract class ExpressionElement \r
+       internal abstract class ExpressionElement\r
        {        \r
                enum OP {OPERATOR, OPERAND};\r
                enum OPERATOR_TYPE {SYMBOLIC, LITERAL, UNDEFINED};\r
@@ -1766,12 +1761,12 @@ namespace System.Data
 \r
                public virtual object Result (DataRow Row) {return null;}\r
                 \r
-               public virtual Type ResultType (DataRow Row) \r
+               public virtual Type ResultType (DataRow Row)\r
                {\r
                        return _ResultType;\r
                }\r
 \r
-               protected object CalculateResult (DataRow Row) \r
+               protected object CalculateResult (DataRow Row)\r
                {\r
                        ExpressionElement E1 = ((ExpressionElement)Elements [0]);\r
                        ExpressionElement E2 = ((ExpressionElement)Elements [1]);\r
@@ -1803,7 +1798,7 @@ namespace System.Data
                        \r
                        return Result; \r
                }\r
-               protected virtual object Calculate (object value1, object value2, Type TempType) \r
+               protected virtual object Calculate (object value1, object value2, Type TempType)\r
                {\r
                        return null;\r
                }\r
@@ -1812,7 +1807,7 @@ namespace System.Data
                ///  static method for comparing two ExpressionElement. This is used in =, <, >, <>, <=, >= elements.\r
                ///  If elements are equal returns 0, if E1 is less that E2, return -1 else if E1 is greater 1 \r
                /// </summary>\r
-               protected static int Compare (ExpressionElement E1, ExpressionElement E2, DataRow Row) \r
+               protected static int Compare (ExpressionElement E1, ExpressionElement E2, DataRow Row)\r
                { \r
                        int ReturnValue = 0;\r
 \r
@@ -1867,7 +1862,7 @@ namespace System.Data
                ///  Checks syntax of expression and throws exception if needed.\r
                ///  Also removes whitespaces between operator elements for example: age < = 64 --> age <= 64\r
                /// </summary>\r
-               internal static string ValidateExpression (string s) \r
+               internal static string ValidateExpression (string s)\r
                {                       \r
                        //\r
                        // TODO: find out nice way to do this. This is NOT nice way :-P\r
@@ -1941,25 +1936,28 @@ namespace System.Data
                                        }\r
                                        else if (operatorType == OPERATOR_TYPE.SYMBOLIC) \r
                                        {\r
+                                               \r
+                                               //Checking for operators following one another\r
+                                               if ((strOperator == " +" || strOperator == " -" || strOperator == " %" || strOperator ==" *") &&\r
+                                                       (c == '=' || c== '<' || c== '>'))\r
+                                                               throw new SyntaxErrorException (\r
+                                                                       "The operator " + strOperator + c + " is not valid");\r
 \r
-                                               if (c != '<' && c != '=' && c != '>' && c != ' ') \r
-                                               {\r
-                                                       \r
-                                                       // this is COPY-PASTE\r
-                                                       op = OP.OPERAND;\r
-                                                       if (!newExp.EndsWith (" ") && !strOperator.StartsWith (" ")) \r
-                                                               strOperator = " " + strOperator;\r
+                                               // this is COPY-PASTE\r
+                                               op = OP.OPERAND;\r
+                                               if (!newExp.EndsWith (" ") && !strOperator.StartsWith (" ")) \r
+                                                       strOperator = " " + strOperator;\r
 \r
-                                                       newExp += strOperator;\r
+                                               newExp += strOperator;\r
 \r
-                                                       if (Char.IsDigit (c))\r
-                                                               isDigit = true;\r
-                                                               \r
-                                                       strOperand = c.ToString ();\r
+                                               if (Char.IsDigit (c))\r
+                                                       isDigit = true;\r
                                                        \r
-                                                       strOperator = "";\r
-                                                       continue;\r
-                                               }\r
+                                               strOperand = c.ToString ();\r
+                                               \r
+                                               strOperator = "";\r
+                                               continue;\r
+\r
                                        }\r
 \r
                                        if (operatorType == OPERATOR_TYPE.LITERAL && c == ' ') \r
@@ -2002,7 +2000,7 @@ namespace System.Data
                ///  Finds and creates Expression elements.\r
                ///  This presumes that expression is valid.\r
                /// </summary>\r
-               protected void ParseExpression (string s) \r
+               protected void ParseExpression (string s)\r
                {       \r
                        //\r
                        // TODO/FIXME: IMHO, this should be done with different kind of parsing:\r
@@ -2191,7 +2189,7 @@ namespace System.Data
                // These methods are temporary for now\r
                //\r
 \r
-               private bool FindOrElement (string s, ref string s1, ref string s2) \r
+               private bool FindOrElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf("or");\r
@@ -2237,7 +2235,7 @@ namespace System.Data
                        return false;\r
                }\r
                \r
-               private bool FindAndElement (string s, ref string s1, ref string s2) \r
+               private bool FindAndElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf("and");\r
@@ -2284,7 +2282,7 @@ namespace System.Data
                        return false;\r
                }\r
 \r
-               private bool FindLikeElement (string s, ref string s1, ref string s2) \r
+               private bool FindLikeElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf("like");\r
@@ -2331,7 +2329,7 @@ namespace System.Data
                        return false;\r
                }\r
 \r
-               private bool FindEqualElement (string s, ref string s1, ref string s2) \r
+               private bool FindEqualElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("=");\r
@@ -2370,7 +2368,7 @@ namespace System.Data
                        return false;\r
                }\r
 \r
-               private bool FindUnequalElement (string s, ref string s1, ref string s2) \r
+               private bool FindUnequalElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("<>");\r
@@ -2409,7 +2407,7 @@ namespace System.Data
                }\r
 \r
 \r
-               private bool FindLessThanElement (string s, ref string s1, ref string s2) \r
+               private bool FindLessThanElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("<");\r
@@ -2447,7 +2445,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindLessThanOrEqualElement (string s, ref string s1, ref string s2) \r
+               private bool FindLessThanOrEqualElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("<=");\r
@@ -2480,7 +2478,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindGreaterThanElement (string s, ref string s1, ref string s2) \r
+               private bool FindGreaterThanElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf (">");\r
@@ -2517,7 +2515,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindGreaterThanOrEqualElement (string s, ref string s1, ref string s2) \r
+               private bool FindGreaterThanOrEqualElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf (">=");\r
@@ -2553,7 +2551,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindAdditionElement (string s, ref string s1, ref string s2) \r
+               private bool FindAdditionElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("+");\r
@@ -2590,7 +2588,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindSubtractElement (string s, ref string s1, ref string s2) \r
+               private bool FindSubtractElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("-");\r
@@ -2639,7 +2637,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindMultiplyElement (string s, ref string s1, ref string s2) \r
+               private bool FindMultiplyElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("*");\r
@@ -2677,7 +2675,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindDivideElement (string s, ref string s1, ref string s2) \r
+               private bool FindDivideElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("/");\r
@@ -2715,7 +2713,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindModulusElement (string s, ref string s1, ref string s2) \r
+               private bool FindModulusElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("%");\r
@@ -2750,7 +2748,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindAggregateElement (string s, AGGREGATE aggregate) \r
+               private bool FindAggregateElement (string s, AGGREGATE aggregate)\r
                {\r
                        string agg = null;\r
 \r
@@ -2812,7 +2810,7 @@ namespace System.Data
 \r
                }\r
                \r
-               private bool FindSumElement (string s) \r
+               private bool FindSumElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("sum");\r
@@ -2842,7 +2840,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindAvgElement (string s) \r
+               private bool FindAvgElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("avg");\r
@@ -2871,7 +2869,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindMinElement (string s) \r
+               private bool FindMinElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("min");\r
@@ -2900,7 +2898,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindMaxElement (string s) \r
+               private bool FindMaxElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("max");\r
@@ -2929,7 +2927,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindCountElement (string s) \r
+               private bool FindCountElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("count");\r
@@ -2958,7 +2956,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindStdevElement (string s) \r
+               private bool FindStdevElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("stdev");\r
@@ -2987,7 +2985,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindVarElement (string s) \r
+               private bool FindVarElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("var");\r
@@ -3016,7 +3014,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindLenElement (string s) \r
+               private bool FindLenElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("len");\r
@@ -3046,7 +3044,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindIifElement (string s) \r
+               private bool FindIifElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("iif");\r
@@ -3075,7 +3073,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindIsNullElement (string s) \r
+               private bool FindIsNullElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("isnull");\r
@@ -3104,7 +3102,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindSubstringElement (string s) \r
+               private bool FindSubstringElement (string s)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("substring");\r
@@ -3133,7 +3131,7 @@ namespace System.Data
                        return false;                   \r
                }\r
 \r
-               private bool FindInElement (string s, ref string s1, ref string s2) \r
+               private bool FindInElement (string s, ref string s1, ref string s2)\r
                {\r
                        string stemp = s.ToLower ();\r
                        int indexOf = stemp.IndexOf ("in");\r
@@ -3190,56 +3188,56 @@ namespace System.Data
                        Elements.Add (new ExpressionOr (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateAndElement (string s1, string s2, string inside) \r
+               private void CreateAndElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionAnd (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateLikeElement (string s1, string s2, string inside) \r
+               private void CreateLikeElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionLike (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateInElement (string s1, string s2, string inside) \r
+               private void CreateInElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionIn (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateEqualsElement (string s1, string s2, string inside) \r
+               private void CreateEqualsElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionEquals (s1.Trim (), s2.Trim ()));                   \r
                }\r
 \r
-               private void CreateUnequalsElement (string s1, string s2, string inside) \r
+               private void CreateUnequalsElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionUnequals (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateLessThanElement (string s1, string s2, string inside) \r
+               private void CreateLessThanElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionLessThan (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateLessThanOrEqualElement (string s1, string s2, string inside) \r
+               private void CreateLessThanOrEqualElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionLessThanOrEqual (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateGreaterThanElement (string s1, string s2, string inside) \r
+               private void CreateGreaterThanElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionGreaterThan (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
 \r
-               private void CreateGreaterThanOrEqualElement (string s1, string s2, string inside) \r
+               private void CreateGreaterThanOrEqualElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionGreaterThanOrEqual (s1.Trim (), s2.Trim ()));\r
@@ -3251,25 +3249,25 @@ namespace System.Data
                        Elements.Add (new ExpressionAddition (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateSubtractionElement (string s1, string s2,  string inside) \r
+               private void CreateSubtractionElement (string s1, string s2,  string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);                      \r
                        Elements.Add (new ExpressionSubtraction (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateMultiplyElement (string s1, string s2, string inside) \r
+               private void CreateMultiplyElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionMultiply (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateDivideElement (string s1, string s2, string inside) \r
+               private void CreateDivideElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionDivide (s1.Trim (), s2.Trim ()));\r
                }\r
 \r
-               private void CreateModulusElement (string s1, string s2, string inside) \r
+               private void CreateModulusElement (string s1, string s2, string inside)\r
                {\r
                        CheckParenthesis (inside, ref s1, ref s2);\r
                        Elements.Add (new ExpressionModulus (s1.Trim (), s2.Trim ()));\r
@@ -3279,7 +3277,7 @@ namespace System.Data
 \r
                #region Little helppers\r
 \r
-               private void CheckParenthesis (string inside, ref string s1, ref string s2) \r
+               private void CheckParenthesis (string inside, ref string s1, ref string s2)\r
                {\r
                        if (s1 == string.Empty && inside != string.Empty)\r
                                s1 = inside;\r
@@ -3310,7 +3308,7 @@ namespace System.Data
                /// <summary>\r
                ///  Checks is the element part of column table\r
                /// </summary>\r
-               private bool IsPartOfColumnName (string s, int indexOf) \r
+               private bool IsPartOfColumnName (string s, int indexOf)\r
                {\r
                        for (int i = indexOf; i >= 0; i--) \r
                        {\r
@@ -3333,7 +3331,7 @@ namespace System.Data
                /// <summary>\r
                ///  Checks are element part of function\r
                /// </summary>\r
-               private bool IsPartOfFunction (string s, int indexOf) \r
+               private bool IsPartOfFunction (string s, int indexOf)\r
                {\r
 \r
                        // \r
index 21d9b8cf9a5cfc0823576e14a50b4bc98c2acc9b..09459d4450fc473622c3bdc44ab47189f96f1726 100644 (file)
@@ -114,55 +114,42 @@ namespace System.Data {
                        DataTable ptable = parentColumns[0].Table;
                        DataTable ctable = childColumns[0].Table;
        
-                       
-                       foreach (DataColumn pc in parentColumns)
+                       for (int i = 0; i < parentColumns.Length; i++)
                        {
+                               DataColumn pc = parentColumns[i];
+                               DataColumn cc = childColumns[i];
                                //not null check
                                if (null == pc.Table) 
-                               {
                                        throw new ArgumentException("All columns must belong to a table." + 
-                                                       " ColumnName: " + pc.ColumnName + " does not belong to a table.");
-                               }
+                                               " ColumnName: " + pc.ColumnName + " does not belong to a table.");
                                
                                //All columns must belong to the same table
                                if (ptable != pc.Table)
                                        throw new InvalidConstraintException("Parent columns must all belong to the same table.");
                                
-                               foreach (DataColumn cc in childColumns)
-                               {
-                                       //not null
-                                       if (null == pc.Table) 
-                                       {
-                                               throw new ArgumentException("All columns must belong to a table." + 
-                                                       " ColumnName: " + pc.ColumnName + " does not belong to a table.");
-                                       }
-                       
-                                       //All columns must belong to the same table.
-                                       if (ctable != cc.Table)
-                                               throw new InvalidConstraintException("Child columns must all belong to the same table.");
-                                               
-                                               
-                                       //Can't be the same column
-                                       if (pc == cc)
-                                               throw new InvalidOperationException("Parent and child columns can't be the same column.");
+                               //not null check
+                               if (null == cc.Table) 
+                                       throw new ArgumentException("All columns must belong to a table." + 
+                                               " ColumnName: " + pc.ColumnName + " does not belong to a table.");
 
-                                       foreach (DataColumn c2 in childColumns) {
-                                               if (!Object.ReferenceEquals (c2.Table, cc.Table))
-                                                               throw new ArgumentException ("Cannot create a Key from Columns thath belong to different tables.");
-                                               
-                                       }
-
-                                       if (! pc.DataType.Equals(cc.DataType))
-                                       {
-                                               //LAMESPEC: spec says throw InvalidConstraintException
-                                               //              implementation throws InvalidOperationException
-                                               throw new ArgumentException("Parent column is not type compatible with it's child"
-                                                               + " column.");
-                                       }
-                               }       
+                               //All columns must belong to the same table.
+                               if (ctable != cc.Table)
+                                       throw new InvalidConstraintException("Child columns must all belong to the same table.");
+                               
+                               //Can't be the same column
+                               if (pc == cc)
+                                       throw new InvalidOperationException("Parent and child columns can't be the same column.");
+
+                               if (! pc.DataType.Equals(cc.DataType))
+                               {
+                                       //LAMESPEC: spec says throw InvalidConstraintException
+                                       //              implementation throws InvalidOperationException
+                                       throw new ArgumentException("Parent column is not type compatible with it's child"
+                                               + " column.");
+                               }
+                                       
                        }
                        
-                       
                        //Same dataset.  If both are null it's ok
                        if (ptable.DataSet != ctable.DataSet)
                        {
@@ -171,9 +158,7 @@ namespace System.Data {
                                throw new InvalidOperationException("Parent column and child column must belong to" + 
                                                " tables that belong to the same DataSet.");
                                                
-                       }
-
-                       
+                       }       
                }
                
 
@@ -383,10 +368,15 @@ namespace System.Data {
 
                        if (Table.DataSet == null || RelatedTable.DataSet == null) return; //   
                                
-                       //TODO:
-                       //check for orphaned children
-                       //check for...
-                       
+                       try
+                       {
+                               foreach (DataRow row in Table.Rows)
+                                       AssertConstraint(row);
+                       }
+                       catch (InvalidConstraintException)
+                       {
+                               throw new ArgumentException("This constraint cannot be enabled as not all values have corresponding parent values.");
+                       }
                }
                
                [MonoTODO]
index b0932aa146175512f52d855a5032e185b0a17453..32621cd904f2358fcd3c8c2655e45488a93abc35 100644 (file)
@@ -112,7 +112,7 @@ namespace System.Data
                        // we act according to the missingschemaaction param.\r
                        int tmp = targetSet.Tables.IndexOf(tableName);\r
                        // we need to check if it is equals names\r
-                       if (tmp != -1 && !targetSet.Tables[tmp].Equals(tableName))\r
+                       if (tmp != -1 && !targetSet.Tables[tmp].TableName.Equals(tableName))\r
                                tmp = -1;\r
                        if (tmp == -1)\r
                        {\r
index 0c7a7de36d8805e5c0553b6176039a77651565df..8bbd4b478e091518fa3fe992bb95ec1e22fa32fa 100644 (file)
@@ -22,15 +22,16 @@ using System.Xml.XPath;
 using System.Collections;
 using System.Globalization;
 
-namespace System.Data {
+namespace System.Data \r
+{
 
-        internal class XmlDataLoader
+       internal class XmlDataLoader
        {
        
-               private DataSet DSet;
+               private DataSet DSet;
                Hashtable DiffGrRows = new Hashtable ();
 
-               public XmlDataLoader (DataSet set) 
+               public XmlDataLoader (DataSet set) 
                {
                        DSet = set;
                }
@@ -39,7 +40,8 @@ namespace System.Data {
                {
                        XmlReadMode Result = XmlReadMode.Auto;
 
-                       switch (mode) {
+                       switch (mode) \r
+                       {
 
                                case XmlReadMode.Fragment:
                                        break;
@@ -68,65 +70,33 @@ namespace System.Data {
                [MonoTODO]
                private void ReadModeInferSchema (XmlReader reader)
                {
-                       // root element is DataSets name
-                       reader.MoveToContent ();
-
-                       DSet.DataSetName = reader.LocalName;
-
-                       // And now comes tables
-                       while (reader.Read ()) {
-
-                               // skip possible inline-schema
-                               if (String.Compare (reader.LocalName, "schema", true) == 0 && reader.NodeType == XmlNodeType.Element) {
-                                       while (reader.Read () && (reader.NodeType != XmlNodeType.EndElement 
-                                                                 || String.Compare (reader.LocalName, "schema", true) != 0));
-                               }
-
-
-                               if (reader.NodeType == XmlNodeType.Element) {
-                                       
-                                       string datatablename = reader.LocalName;
-                                       DataTable table;
-                                       bool NewTable = false;
-
-                                       if (!DSet.Tables.Contains (datatablename)) {
-                                               table = new DataTable (reader.LocalName);
-                                               DSet.Tables.Add (table);
-                                               NewTable = true;
-                                       }
-                                       else {
-                                               table = DSet.Tables [datatablename];
-                                       }
-
-                                       Hashtable rowValue = new Hashtable ();
-
-                                       while (reader.Read () && (reader.NodeType != XmlNodeType.EndElement 
-                                                                 || reader.LocalName != datatablename))
-                                       {
-                                               if (reader.NodeType == XmlNodeType.Element) {
-
-                                                       string dataColumnName = reader.LocalName;
-                                                       if (NewTable)
-                                                               table.Columns.Add (dataColumnName);
-
-                                                       // FIXME: exception?
-                                                       if (!reader.Read ())
-                                                               return;
-
-                                                       rowValue.Add (dataColumnName, reader.Value);
-                                               }
-                                       }
-                                       
-                                       DataRow row = table.NewRow ();
-                                       
-                                       IDictionaryEnumerator enumerator = rowValue.GetEnumerator ();
-                                       while (enumerator.MoveNext ()) {
-                                               row [enumerator.Key.ToString ()] = enumerator.Value.ToString ();
-                                       }
-
-                                       table.Rows.Add (row);
-                               }
-                       }                       
+                       // first load an XmlDocument from the reader.
+                       XmlDocument doc = new XmlDocument();
+                       doc.Load(reader);
+
+                       // set EnforceConstraint to false - we do not want any validation during 
+                       // load time.
+                       bool origEnforceConstraint = DSet.EnforceConstraints;
+                       DSet.EnforceConstraints = false;
+                       
+                       // first element is the DataSet.
+                       XmlElement elem = doc.DocumentElement;
+                       DSet.DataSetName = elem.LocalName;
+
+                       // get the Namespace of the DataSet.
+                       if (elem.HasAttribute("xmlns"))
+                               DSet.Namespace = elem.Attributes["xmlns"].Value;
+
+                       // The childs are tables.
+                       XmlNodeList nList = elem.ChildNodes;
+
+                       for (int i = 0; i < nList.Count; i++)
+                       {
+                               XmlNode node = nList[i];
+                               AddRowToTable(node, null);
+                       }
+                       // set the EnforceConstraints to original value;
+                       DSet.EnforceConstraints = origEnforceConstraint;
                }
 
                // Read Xmldocument. XmlReadMode.ReadSchema and XmlReadMode.IgnoreSchema
@@ -142,9 +112,9 @@ namespace System.Data {
                        reader.ReadStartElement ();
                        reader.MoveToContent ();
 
-                       while (reader.NodeType != XmlNodeType.EndElement) 
+                       while (reader.NodeType != XmlNodeType.EndElement) \r
                        {
-                               if (reader.NodeType == XmlNodeType.Element)
+                               if (reader.NodeType == XmlNodeType.Element)\r
                                {
                                        // FIXME: possible inline-schema should be readed here
                                        if (String.Compare (reader.LocalName, "schema", true) == 0) \r
@@ -176,27 +146,31 @@ namespace System.Data {
                
                private void ReadColumns (XmlReader reader, DataRow row, DataTable table, string TableName)
                {
-                       do {
-                               if (reader.NodeType == XmlNodeType.Element) {
+                       do \r
+                       {
+                               if (reader.NodeType == XmlNodeType.Element) \r
+                               {
                                        DataColumn col = table.Columns [reader.LocalName];
-                                       if (col != null) {
+                                       if (col != null) \r
+                                       {
                                                reader.Read ();
                                                row [col] = StringToObject (col.DataType, reader.Value);
                                        }
                                }
-                               else {
+                               else \r
+                               {
                                        reader.Read ();
                                }
                                
                        } while (table.TableName != reader.LocalName 
-                                || reader.NodeType != XmlNodeType.EndElement);
+                               || reader.NodeType != XmlNodeType.EndElement);
                }
 
                internal static object StringToObject (Type type, string value)
                {
                        if (type == null) return value;
 
-                       switch (Type.GetTypeCode (type))
+                       switch (Type.GetTypeCode (type))\r
                        {
                                case TypeCode.Boolean: return XmlConvert.ToBoolean (value);
                                case TypeCode.Byte: return XmlConvert.ToByte (value);
@@ -220,6 +194,103 @@ namespace System.Data {
                        return Convert.ChangeType (value, type);
                }
 
+               private void AddRowToTable(XmlNode tableNode, DataColumn relationColumn)
+               {
+                       Hashtable rowValue = new Hashtable();
+                       DataTable table;
+                       
+                       // Check if the table exists in the DataSet. If not create one.
+                       if (DSet.Tables.Contains(tableNode.LocalName))
+                               table = DSet.Tables[tableNode.LocalName];
+                       else
+                       {
+                               table = new DataTable(tableNode.LocalName);
+                               DSet.Tables.Add(table);
+                       }
+                       
+                       // Get the child nodes of the table. Any child can be one of the following tow:
+                       // 1. DataTable - if there was a relation with another table..
+                       // 2. DataColumn - column of the current table.
+                       XmlNodeList childList = tableNode.ChildNodes;
+                       for (int i = 0; i < childList.Count; i++)
+                       {
+                               XmlNode childNode = childList[i];
+                               
+                               // The child node is a table if:
+                               // 1. He has attributes it means that it is a table OR
+                               // 2. He has more then one child nodes. Columns has only one child node
+                               // which is a Text node type that has the column value.
+                               if (childNode.ChildNodes.Count > 1 || childNode.Attributes.Count > 0)
+                               {
+                                       // We need to create new column for the relation between the current
+                                       // table and the new table we found (the child table).
+                                       string newRelationColumnName = table.TableName + "_Id";
+                                       if (!table.Columns.Contains(newRelationColumnName))
+                                       {
+                                               DataColumn newRelationColumn = new DataColumn(newRelationColumnName, typeof(int));
+                                               newRelationColumn.AutoIncrement = true;
+                                               table.Columns.Add(newRelationColumn);
+                                       }
+                                       // Add a row to the new table we found.
+                                       AddRowToTable(childNode, table.Columns[newRelationColumnName]);
+                               }
+                               else //Child node is a column.
+                               {
+                                       if (!table.Columns.Contains(childNode.LocalName))
+                                               table.Columns.Add(childNode.LocalName);
+                                       
+                                       rowValue.Add(childNode.LocalName, childNode.FirstChild.Value);
+                               }
+                       }
+
+                       // Column can be attribute of the table element.
+                       XmlAttributeCollection aCollection = tableNode.Attributes;
+                       for (int i = 0; i < aCollection.Count; i++)
+                       {
+                               XmlAttribute attr = aCollection[i];
+                               //the atrribute can be the namespace.
+                               if (attr.Prefix.Equals("xmlns"))
+                                       table.Namespace = attr.Value;
+                               else // the attribute is a column.
+                               {
+                                       if (!table.Columns.Contains(attr.LocalName))
+                                               table.Columns.Add(attr.LocalName);
+                                       table.Columns[attr.LocalName].Namespace = table.Namespace;
+
+                                       rowValue.Add(attr.LocalName, attr.Value);
+                               }
+                       }
+
+                       // If the current table is a child table we need to add a new column for the relation
+                       // and add a new relation to the DataSet.
+                       if (relationColumn != null)
+                       {
+                               if (!table.Columns.Contains(relationColumn.ColumnName))
+                               {
+                                       DataColumn dc = new DataColumn(relationColumn.ColumnName, typeof(int));
+                                       dc.AutoIncrement = true;
+                                       table.Columns.Add(dc);
+                                       DSet.Relations.Add(relationColumn, dc);
+                               }
+                       }
+
+                       // Create new row and add all values to the row.
+                       // then add it to the table.
+                       DataRow row = table.NewRow ();
+                                       
+                       IDictionaryEnumerator enumerator = rowValue.GetEnumerator ();
+                       while (enumerator.MoveNext ()) \r
+                       {
+                               row [enumerator.Key.ToString ()] = enumerator.Value.ToString ();
+                       }
+
+                       table.Rows.Add (row);
+                       
+               }
+
                #endregion // Private helper methods
+
+               
        }
+
 }