System.Data.DataSet.ReadXmlDiffgram C# (CSharp) Method

ReadXmlDiffgram() private method

private ReadXmlDiffgram ( XmlReader reader ) : void
reader XmlReader
return void
        private void ReadXmlDiffgram(XmlReader reader)
        {
            long logScopeId = DataCommonEventSource.Log.EnterScope("<ds.DataSet.ReadXmlDiffgram|INFO> {0}", ObjectID);
            try
            {
                int d = reader.Depth;
                bool fEnforce = EnforceConstraints;
                EnforceConstraints = false;
                DataSet newDs;
                bool isEmpty = IsEmpty();

                if (isEmpty)
                {
                    newDs = this;
                }
                else
                {
                    newDs = Clone();
                    newDs.EnforceConstraints = false;
                }

                foreach (DataTable t in newDs.Tables)
                {
                    t.Rows._nullInList = 0;
                }
                reader.MoveToContent();
                if ((reader.LocalName != Keywords.DIFFGRAM) && (reader.NamespaceURI != Keywords.DFFNS))
                {
                    return;
                }

                reader.Read();
                if (reader.NodeType == XmlNodeType.Whitespace)
                {
                    MoveToElement(reader, reader.Depth - 1 /*iCurrentDepth*/); // skip over whitespaces.
                }

                newDs._fInLoadDiffgram = true;

                if (reader.Depth > d)
                {
                    if ((reader.NamespaceURI != Keywords.DFFNS) && (reader.NamespaceURI != Keywords.MSDNS))
                    {
                        //we should be inside the dataset part
                        XmlDocument xdoc = new XmlDocument();
                        XmlElement node = xdoc.CreateElement(reader.Prefix, reader.LocalName, reader.NamespaceURI);
                        reader.Read();
                        if (reader.NodeType == XmlNodeType.Whitespace)
                        {
                            MoveToElement(reader, reader.Depth - 1 /*iCurrentDepth*/); // skip over whitespaces.
                        }
                        if (reader.Depth - 1 > d)
                        {
                            XmlDataLoader xmlload = new XmlDataLoader(newDs, false, node, false);
                            xmlload._isDiffgram = true; // turn on the special processing
                            xmlload.LoadData(reader);
                        }
                        ReadEndElement(reader);
                        if (reader.NodeType == XmlNodeType.Whitespace)
                        {
                            MoveToElement(reader, reader.Depth - 1 /*iCurrentDepth*/); // skip over whitespaces.
                        }
                    }
                    Debug.Assert(reader.NodeType != XmlNodeType.Whitespace, "Should not be on Whitespace node");

                    if (((reader.LocalName == Keywords.SQL_BEFORE) && (reader.NamespaceURI == Keywords.DFFNS)) ||
                        ((reader.LocalName == Keywords.MSD_ERRORS) && (reader.NamespaceURI == Keywords.DFFNS)))
                    {
                        //this will consume the changes and the errors part
                        XMLDiffLoader diffLoader = new XMLDiffLoader();
                        diffLoader.LoadDiffGram(newDs, reader);
                    }

                    // get to the closing diff tag
                    while (reader.Depth > d)
                    {
                        reader.Read();
                    }
                    // read the closing tag
                    ReadEndElement(reader);
                }

                foreach (DataTable t in newDs.Tables)
                {
                    if (t.Rows._nullInList > 0)
                    {
                        throw ExceptionBuilder.RowInsertMissing(t.TableName);
                    }
                }

                newDs._fInLoadDiffgram = false;

                //terrible performance!
                foreach (DataTable t in newDs.Tables)
                {
                    DataRelation[] nestedParentRelations = t.NestedParentRelations;
                    foreach (DataRelation rel in nestedParentRelations)
                    {
                        if (rel.ParentTable == t)
                        {
                            foreach (DataRow r in t.Rows)
                            {
                                foreach (DataRelation rel2 in nestedParentRelations)
                                {
                                    r.CheckForLoops(rel2);
                                }
                            }
                        }
                    }
                }

                if (!isEmpty)
                {
                    Merge(newDs);
                    if (_dataSetName == "NewDataSet")
                    {
                        _dataSetName = newDs._dataSetName;
                    }
                    newDs.EnforceConstraints = fEnforce;
                }
                EnforceConstraints = fEnforce;
            }
            finally
            {
                DataCommonEventSource.Log.ExitScope(logScopeId);
            }
        }