internal void HandleColumn(XmlElement node, DataTable table)
{
DataColumn column;
Type type;
string str3;
string str4;
int minOccurs = 0;
int maxOccurs = 1;
node.GetAttribute("use");
if (node.Attributes.Count > 0)
{
string str7 = node.GetAttribute("ref");
if ((str7 != null) && (str7.Length > 0))
{
return;
}
str3 = str4 = this.GetInstanceName(node);
column = table.Columns[str4, this._schemaUri];
if (column != null)
{
if (column.ColumnMapping == MappingType.Attribute)
{
if (XMLSchema.FEqualIdentity(node, "attribute", "urn:schemas-microsoft-com:xml-data"))
{
throw ExceptionBuilder.DuplicateDeclaration(str3);
}
}
else if (XMLSchema.FEqualIdentity(node, "element", "urn:schemas-microsoft-com:xml-data"))
{
throw ExceptionBuilder.DuplicateDeclaration(str3);
}
str4 = XMLSchema.GenUniqueColumnName(str3, table);
}
}
else
{
str3 = str4 = "";
}
XmlElement element = this.FindTypeNode(node);
SimpleType type2 = null;
if (element == null)
{
throw ExceptionBuilder.UndefinedDatatype(node.GetAttribute("type"));
}
string attribute = element.GetAttribute("type", "urn:schemas-microsoft-com:datatypes");
string dtValues = element.GetAttribute("values", "urn:schemas-microsoft-com:datatypes");
if ((attribute == null) || (attribute.Length == 0))
{
attribute = "";
type = typeof(string);
}
else
{
type = this.ParseDataType(attribute, dtValues);
if (attribute == "float")
{
attribute = "";
}
if (attribute == "char")
{
attribute = "";
type2 = SimpleType.CreateSimpleType(type);
}
if (attribute == "enumeration")
{
attribute = "";
type2 = SimpleType.CreateEnumeratedType(dtValues);
}
if (attribute == "bin.base64")
{
attribute = "";
type2 = SimpleType.CreateByteArrayType("base64");
}
if (attribute == "bin.hex")
{
attribute = "";
type2 = SimpleType.CreateByteArrayType("hex");
}
}
bool isAttribute = XMLSchema.FEqualIdentity(node, "attribute", "urn:schemas-microsoft-com:xml-data");
this.GetMinMax(node, isAttribute, ref minOccurs, ref maxOccurs);
string str2 = null;
str2 = node.GetAttribute("default");
bool flag2 = false;
column = new DataColumn(XmlConvert.DecodeName(str4), type, null, isAttribute ? MappingType.Attribute : MappingType.Element);
XMLSchema.SetProperties(column, node.Attributes);
column.XmlDataType = attribute;
column.SimpleType = type2;
column.AllowDBNull = (minOccurs == 0) || flag2;
column.Namespace = isAttribute ? string.Empty : this._schemaUri;
if (node.Attributes != null)
{
for (int i = 0; i < node.Attributes.Count; i++)
{
if ((node.Attributes[i].NamespaceURI == "urn:schemas-microsoft-com:xml-msdata") && (node.Attributes[i].LocalName == "Expression"))
{
column.Expression = node.Attributes[i].Value;
break;
}
}
}
string str5 = node.GetAttribute("targetNamespace");
if ((str5 != null) && (str5.Length > 0))
{
column.Namespace = str5;
}
table.Columns.Add(column);
if ((str2 != null) && (str2.Length != 0))
{
try
{
column.DefaultValue = SqlConvert.ChangeTypeForXML(str2, type);
}
catch (FormatException)
{
throw ExceptionBuilder.CannotConvert(str2, type.FullName);
}
}
for (XmlNode node2 = node.FirstChild; node2 != null; node2 = node2.NextSibling)
{
if (XMLSchema.FEqualIdentity(node2, "description", "urn:schemas-microsoft-com:xml-data"))
{
column.Description(((XmlElement)node2).InnerText);
}
}
}