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);
}
}