|
From: <fab...@us...> - 2010-09-19 20:17:18
|
Revision: 5192
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5192&view=rev
Author: fabiomaulo
Date: 2010-09-19 20:17:12 +0000 (Sun, 19 Sep 2010)
Log Message:
-----------
Fix NH-626 and NH-866 (support for XmlDoc type)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate/NHibernateUtil.cs
trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/SqlTypes/XmlSqlType.cs
trunk/nhibernate/src/NHibernate/Type/XmlDocType.cs
trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.cs
trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.hbm.xml
trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2010-09-19 12:31:31 UTC (rev 5191)
+++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2010-09-19 20:17:12 UTC (rev 5192)
@@ -2,7 +2,6 @@
using System.Collections;
using System.Collections.Generic;
using System.Data;
-using System.Text;
using NHibernate.Mapping;
using NHibernate.SqlCommand;
using NHibernate.Util;
@@ -16,6 +15,7 @@
RegisterColumnType(DbType.String, 1073741823, "NVARCHAR(MAX)");
RegisterColumnType(DbType.AnsiString, 2147483647, "VARCHAR(MAX)");
RegisterColumnType(DbType.Binary, 2147483647, "VARBINARY(MAX)");
+ RegisterColumnType(DbType.Xml, "XML");
}
/// <summary>
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-09-19 12:31:31 UTC (rev 5191)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2010-09-19 20:17:12 UTC (rev 5192)
@@ -847,6 +847,7 @@
<Compile Include="Param\VersionTypeSeedParameterSpecification.cs" />
<Compile Include="Proxy\AbstractProxyFactory.cs" />
<Compile Include="SqlCommand\InsertSelect.cs" />
+ <Compile Include="SqlTypes\XmlSqlType.cs" />
<Compile Include="Tool\hbm2ddl\SchemaMetadataUpdater.cs" />
<Compile Include="Tool\hbm2ddl\ScriptSplitter.cs" />
<Compile Include="Transaction\AdoNetWithDistrubtedTransactionFactory.cs" />
@@ -857,6 +858,7 @@
<Compile Include="Bytecode\ICollectionTypeFactory.cs" />
<Compile Include="Type\LocalDateTimeType.cs" />
<Compile Include="Type\UtcDateTimeType.cs" />
+ <Compile Include="Type\XmlDocType.cs" />
<Compile Include="Util\ExpressionsHelper.cs" />
<Compile Include="Util\NullableDictionary.cs" />
<Compile Include="Hql\Ast\ANTLR\Util\PathHelper.cs" />
Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-09-19 12:31:31 UTC (rev 5191)
+++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2010-09-19 20:17:12 UTC (rev 5192)
@@ -281,6 +281,8 @@
public static readonly NullableType AnsiChar = new AnsiCharType();
+ public static readonly NullableType XmlDoc = new XmlDocType();
+
/// <summary>
/// A NHibernate persistent enum type
/// </summary>
Added: trunk/nhibernate/src/NHibernate/SqlTypes/XmlSqlType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/SqlTypes/XmlSqlType.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/SqlTypes/XmlSqlType.cs 2010-09-19 20:17:12 UTC (rev 5192)
@@ -0,0 +1,18 @@
+using System;
+using System.Data;
+
+namespace NHibernate.SqlTypes
+{
+ [Serializable]
+ public class XmlSqlType : SqlType
+ {
+ public XmlSqlType()
+ : base(DbType.Xml)
+ {
+ }
+
+ public XmlSqlType(int length) : base(DbType.Xml, length)
+ {
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-09-19 12:31:31 UTC (rev 5191)
+++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2010-09-19 20:17:12 UTC (rev 5192)
@@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
+using System.Xml;
using NHibernate.Bytecode;
using NHibernate.Classic;
using NHibernate.Engine;
@@ -205,6 +206,9 @@
RegisterType(typeof (UInt16), NHibernateUtil.UInt16, new[] {"ushort"});
RegisterType(typeof (UInt32), NHibernateUtil.UInt32, new[] {"uint"});
RegisterType(typeof (UInt64), NHibernateUtil.UInt64, new[] {"ulong"});
+
+ RegisterType(typeof (XmlDocument), NHibernateUtil.XmlDoc, new[] {"xmldoc", "xmldocument", "xml"});
+
// object needs to have both class and serializable setup before it can
// be created.
RegisterType(typeof (Object), NHibernateUtil.Object, new[] {"object"});
Added: trunk/nhibernate/src/NHibernate/Type/XmlDocType.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Type/XmlDocType.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Type/XmlDocType.cs 2010-09-19 20:17:12 UTC (rev 5192)
@@ -0,0 +1,86 @@
+using System;
+using System.Data;
+using System.Xml;
+using NHibernate.SqlTypes;
+
+namespace NHibernate.Type
+{
+ [Serializable]
+ public 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(IDbCommand cmd, object value, int index)
+ {
+ ((IDataParameter) cmd.Parameters[index]).Value = ((XmlDocument) value).OuterXml;
+ }
+
+ public override object Get(IDataReader rs, int index)
+ {
+ // according to documentation, GetValue should return a string, at list for MsSQL
+ // hopefully all DataProvider has the same behaviour
+ string xmlString = Convert.ToString(rs.GetValue(index));
+ return FromStringValue(xmlString);
+ }
+
+ public override object Get(IDataReader rs, string name)
+ {
+ return Get(rs, rs.GetOrdinal(name));
+ }
+
+ public override string ToString(object val)
+ {
+ return val == null ? null : ((XmlDocument) val).OuterXml;
+ }
+
+ public override object FromStringValue(string xml)
+ {
+ if (xml != null)
+ {
+ var xmlDocument = new XmlDocument();
+ xmlDocument.LoadXml(xml);
+ return xmlDocument;
+ }
+ return null;
+ }
+
+ 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;
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-19 12:31:31 UTC (rev 5191)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-19 20:17:12 UTC (rev 5192)
@@ -491,6 +491,8 @@
<Compile Include="TypesTest\DateTimeClass.cs" />
<Compile Include="TypesTest\LocalDateTimeTypeFixture.cs" />
<Compile Include="TypesTest\UtcDateTimeTypeFixture.cs" />
+ <Compile Include="TypesTest\XmlDocClass.cs" />
+ <Compile Include="TypesTest\XmlDocTypeFixture.cs" />
<Compile Include="UtilityTest\ReflectionHelperIsMethodOfTests.cs" />
<Compile Include="UtilityTest\ReflectionHelperTest.cs" />
<Compile Include="Linq\RegresstionTests.cs" />
@@ -2277,6 +2279,7 @@
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
<EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="TypesTest\XmlDocClass.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2302\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2303\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2287\Mappings.hbm.xml" />
@@ -2610,10 +2613,6 @@
<EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" />
</ItemGroup>
<ItemGroup>
- <Folder Include="NHSpecificTest\NH2111" />
- <Folder Include="NHSpecificTest\NH2278" />
- <Folder Include="NHSpecificTest\NH2279" />
- <Folder Include="NHSpecificTest\NH2322" />
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.cs 2010-09-19 20:17:12 UTC (rev 5192)
@@ -0,0 +1,11 @@
+using System.Xml;
+
+namespace NHibernate.Test.TypesTest
+{
+ public class XmlDocClass
+ {
+ public int Id { get; set; }
+ public XmlDocument Document { get; set; }
+ public XmlDocument AutoDocument { get; set; }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocClass.hbm.xml 2010-09-19 20:17:12 UTC (rev 5192)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
+ <class name="NHibernate.Test.TypesTest.XmlDocClass, NHibernate.Test" table="nh_xmldoc">
+ <id name="Id" column="id">
+ <generator class="assigned" />
+ </id>
+
+ <property name="Document" type="XmlDoc" />
+ <property name="AutoDocument" />
+ </class>
+</hibernate-mapping>
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/TypesTest/XmlDocTypeFixture.cs 2010-09-19 20:17:12 UTC (rev 5192)
@@ -0,0 +1,76 @@
+using System.Xml;
+using NHibernate.Type;
+using NUnit.Framework;
+using SharpTestsEx;
+
+namespace NHibernate.Test.TypesTest
+{
+ public class XmlDocTypeFixture : TypeFixtureBase
+ {
+ protected override string TypeName
+ {
+ get { return "XmlDoc"; }
+ }
+
+ [Test]
+ public void ReadWrite()
+ {
+ using (var s = OpenSession())
+ {
+ var docEntity = new XmlDocClass {Id = 1 };
+ docEntity.Document = new XmlDocument();
+ docEntity.Document.LoadXml("<MyNode>my Text</MyNode>");
+ s.Save(docEntity);
+ s.Flush();
+ }
+
+ using (var s = OpenSession())
+ {
+ var docEntity = s.Get<XmlDocClass>(1);
+ var document = docEntity.Document;
+ document.Should().Not.Be.Null();
+ document.OuterXml.Should().Contain("<MyNode>my Text</MyNode>");
+ var xmlElement = document.CreateElement("Pizza");
+ xmlElement.SetAttribute("temp", "calda");
+ document.FirstChild.AppendChild(xmlElement);
+ s.Save(docEntity);
+ s.Flush();
+ }
+ using (var s = OpenSession())
+ {
+ var docEntity = s.Get<XmlDocClass>(1);
+ docEntity.Document.OuterXml.Should().Contain("Pizza temp=\"calda\"");
+ s.Delete(docEntity);
+ s.Flush();
+ }
+ }
+
+ [Test]
+ public void InsertNullValue()
+ {
+ using (ISession s = OpenSession())
+ {
+ var docEntity = new XmlDocClass { Id = 1 };
+ docEntity.Document = null;
+ s.Save(docEntity);
+ s.Flush();
+ }
+
+ using (ISession s = OpenSession())
+ {
+ var docEntity = s.Get<XmlDocClass>(1);
+ docEntity.Document.Should().Be.Null();
+ s.Delete(docEntity);
+ s.Flush();
+ }
+ }
+
+ [Test]
+ public void AutoDiscoverFromNetType()
+ {
+ // integration test to be 100% sure
+ var propertyType = sessions.GetEntityPersister(typeof (XmlDocClass).FullName).GetPropertyType("AutoDocument");
+ propertyType.Should().Be.InstanceOf<XmlDocType>();
+ }
+ }
+}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|