using System;
using System.Data.Common;
using System.Xml;
using NHibernate.Engine;
using NHibernate.SqlTypes;
namespace NHibernate.Type
{
[Serializable]
public partial class XmlDocType : MutableType
{
public XmlDocType()
: base(new XmlSqlType())
{
}
public XmlDocType(SqlType sqlType) : base(sqlType)
{
}
public override string Name
{
get { return "XmlDoc"; }
}
public override System.Type ReturnedClass
{
get { return typeof (XmlDocument); }
}
///
public override void Set(DbCommand cmd, object value, int index, ISessionImplementor session)
{
cmd.Parameters[index].Value = GetStringRepresentation(value);
}
///
public override object Get(DbDataReader rs, int index, ISessionImplementor session)
{
// according to documentation, GetValue should return a string, at least for MsSQL
// hopefully all DataProvider has the same behaviour
string xmlString = Convert.ToString(rs.GetValue(index));
// 6.0 TODO: inline the call.
#pragma warning disable 618
return FromStringValue(xmlString);
#pragma warning restore 618
}
public override object Get(DbDataReader rs, string name, ISessionImplementor session)
{
return Get(rs, rs.GetOrdinal(name), session);
}
///
public override string ToLoggableString(object value, ISessionFactoryImplementor factory)
{
return (value == null) ? null :
// 6.0 TODO: inline this call.
#pragma warning disable 618
ToString(value);
#pragma warning restore 618
}
// Since 5.2
[Obsolete("This method has no more usages and will be removed in a future version. Override ToLoggableString instead.")]
public override string ToString(object val)
{
return GetStringRepresentation(val);
}
// Since 5.2
[Obsolete("This method has no more usages and will be removed in a future version.")]
public override object FromStringValue(string xml)
{
return ParseStringRepresentation(xml);
}
public override object DeepCopyNotNull(object value)
{
var original = (XmlDocument) value;
var copy = new XmlDocument();
copy.LoadXml(original.OuterXml);
return copy;
}
public override bool IsEqual(object x, object y)
{
if (x == null && y == null)
{
return true;
}
if (x == null || y == null)
{
return false;
}
return ((XmlDocument) x).OuterXml == ((XmlDocument) y).OuterXml;
}
///
public override object Assemble(object cached, ISessionImplementor session, object owner)
{
return ParseStringRepresentation(cached as string);
}
///
public override object Disassemble(object value, ISessionImplementor session, object owner)
{
return GetStringRepresentation(value);
}
private static string GetStringRepresentation(object value)
{
return ((XmlDocument) value)?.OuterXml;
}
private static object ParseStringRepresentation(string value)
{
if (value == null)
return null;
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(value);
return xmlDocument;
}
}
}