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. |