An alternative to UBB.threads
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
FLocal/Patcher/Data/XMLParser.cs

115 lines
3.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Patcher.DB;
namespace Patcher.Data
{
static class XMLParser
{
private static ForeignKeyConstraint.ReferentialAction ParseReferentialAction(XElement element)
{
if(element == null) {
return ForeignKeyConstraint.ReferentialAction.NoAction;
}
switch(element.Value)
{
case "noAction":
return ForeignKeyConstraint.ReferentialAction.NoAction;
case "cascade":
return ForeignKeyConstraint.ReferentialAction.Cascade;
case "setNull":
return ForeignKeyConstraint.ReferentialAction.SetNull;
case "setDefault":
return ForeignKeyConstraint.ReferentialAction.SetDefault;
case "restrict":
return ForeignKeyConstraint.ReferentialAction.Restrict;
default:
throw new FormattableException("Unknown referential action {0}", element.Value);
}
}
public static AbstractConstraint ParseConstraint(XElement element)
{
XElement[] children = element.Elements().ToArray();
if(children.Length != 3)
{
throw new FormattableException("Wrong children count");
}
if(children[0].Name != "table")
{
throw new FormattableException("Expected element name {0}, got {1}", "table", children[0].Name);
}
string table = children[0].Value;
if(children[1].Name != "constraintName")
{
throw new FormattableException("Expected element name {0}, got {1}", "constraintName", children[1].Name);
}
string constraintName = children[1].Value;
XElement specific = children[2];
switch(specific.Name.ToString())
{
case "foreignKey":
return new ForeignKeyConstraint(
table,
constraintName,
specific.Element("column").Value,
specific.Element("referencedTable").Value,
ParseReferentialAction(specific.Element("onUpdate")),
ParseReferentialAction(specific.Element("onDelete"))
);
case "unique":
return new UniqueConstraint(table, constraintName, new HashSet<string>(from elem in specific.Elements("column") select elem.Value));
case "check":
return new CheckConstraint(table, constraintName, specific.Element("condition").Value);
default:
throw new FormattableException("Unknown constraint type {0}", children[2].Name);
}
}
public static ColumnOptions ParseColumnOptions(XElement element)
{
return new ColumnOptions(
element.Element("type").Value,
element.Element("defaultValue") != null ? element.Element("defaultValue").Value : null,
element.Element("isNotNull") != null
);
}
public static ColumnReference ParseColumnReference(XElement element) {
return new ColumnReference(
element.Element("table").Value,
element.Element("column").Value
);
}
private static ColumnDescription ParseColumnDescription(XElement element, string table)
{
return new ColumnDescription(
new ColumnReference(
table,
element.Element("column").Value
),
ParseColumnOptions(element)
);
}
public static TableDescription ParseTableDescription(XElement element) {
string table = element.Element("table").Value;
return new TableDescription(
table,
ParseColumnDescription(element.Element("primaryKey"), table),
from elem in element.Elements("column") select ParseColumnDescription(elem, table)
);
}
}
}