You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
(248) |
May
(82) |
Jun
(90) |
Jul
(177) |
Aug
(253) |
Sep
(157) |
Oct
(151) |
Nov
(143) |
Dec
(278) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(152) |
Feb
(107) |
Mar
(177) |
Apr
(133) |
May
(259) |
Jun
(81) |
Jul
(119) |
Aug
(306) |
Sep
(416) |
Oct
(240) |
Nov
(329) |
Dec
(206) |
2006 |
Jan
(466) |
Feb
(382) |
Mar
(153) |
Apr
(162) |
May
(133) |
Jun
(21) |
Jul
(18) |
Aug
(37) |
Sep
(97) |
Oct
(114) |
Nov
(110) |
Dec
(28) |
2007 |
Jan
(74) |
Feb
(65) |
Mar
(49) |
Apr
(76) |
May
(43) |
Jun
(15) |
Jul
(68) |
Aug
(55) |
Sep
(63) |
Oct
(59) |
Nov
(70) |
Dec
(66) |
2008 |
Jan
(71) |
Feb
(60) |
Mar
(120) |
Apr
(31) |
May
(48) |
Jun
(81) |
Jul
(107) |
Aug
(51) |
Sep
(80) |
Oct
(83) |
Nov
(83) |
Dec
(79) |
2009 |
Jan
(83) |
Feb
(110) |
Mar
(97) |
Apr
(91) |
May
(291) |
Jun
(250) |
Jul
(197) |
Aug
(58) |
Sep
(54) |
Oct
(122) |
Nov
(68) |
Dec
(34) |
2010 |
Jan
(50) |
Feb
(17) |
Mar
(63) |
Apr
(61) |
May
(84) |
Jun
(81) |
Jul
(138) |
Aug
(144) |
Sep
(78) |
Oct
(26) |
Nov
(30) |
Dec
(61) |
2011 |
Jan
(33) |
Feb
(35) |
Mar
(166) |
Apr
(221) |
May
(109) |
Jun
(76) |
Jul
(27) |
Aug
(37) |
Sep
(1) |
Oct
(4) |
Nov
(2) |
Dec
(1) |
2012 |
Jan
|
Feb
|
Mar
(2) |
Apr
(2) |
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
(1) |
Oct
|
Nov
(1) |
Dec
|
2013 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
(1) |
Sep
(3) |
Oct
(2) |
Nov
|
Dec
(1) |
2014 |
Jan
(1) |
Feb
(1) |
Mar
(3) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <fab...@us...> - 2008-11-17 21:38:37
|
Revision: 3916 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3916&view=rev Author: fabiomaulo Date: 2008-11-17 21:34:20 +0000 (Mon, 17 Nov 2008) Log Message: ----------- fix NH-1570 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-11-17 20:42:16 UTC (rev 3915) +++ trunk/nhibernate/src/NHibernate/Dialect/MsSql2005Dialect.cs 2008-11-17 21:34:20 UTC (rev 3916) @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Data; using System.Text; -using System.Text.RegularExpressions; using NHibernate.Mapping; using NHibernate.SqlCommand; using NHibernate.Util; @@ -44,24 +43,24 @@ /// </remarks> public override SqlString GetLimitString(SqlString querySqlString, int offset, int last) { - // we have to do this in order to support parameters in order clause, the foramt - // that sql 2005 uses for paging means that we move the parameters around, which means, - // that positions are lost, so we record them before making any changes. - // NH-1528 - int parameterPositon = 0; - foreach (var part in querySqlString.Parts) - { - Parameter param = part as Parameter; - if (param == null) - continue; - param.OriginalPositionInQuery = parameterPositon; - parameterPositon += 1; - } + // we have to do this in order to support parameters in order clause, the foramt + // that sql 2005 uses for paging means that we move the parameters around, which means, + // that positions are lost, so we record them before making any changes. + // NH-1528 + int parameterPositon = 0; + foreach (var part in querySqlString.Parts) + { + Parameter param = part as Parameter; + if (param == null) + continue; + param.OriginalPositionInQuery = parameterPositon; + parameterPositon += 1; + } int fromIndex = GetFromIndex(querySqlString); SqlString select = querySqlString.Substring(0, fromIndex); - List<SqlString> columnsOrAliases; - Dictionary<SqlString, SqlString> aliasToColumn; + List<SqlString> columnsOrAliases; + Dictionary<SqlString, SqlString> aliasToColumn; ExtractColumnOrAliasNames(select, out columnsOrAliases, out aliasToColumn); int orderIndex = querySqlString.LastIndexOfCaseInsensitive(" order by "); @@ -71,13 +70,13 @@ { from = querySqlString.Substring(fromIndex, orderIndex - fromIndex).Trim(); SqlString orderBy = querySqlString.Substring(orderIndex).Trim(); - sortExpressions = orderBy.Substring(9).Split(","); + sortExpressions = orderBy.Substring(9).Split(","); } else { from = querySqlString.Substring(fromIndex).Trim(); // Use dummy sort to avoid errors - sortExpressions = new SqlString[] { new SqlString("CURRENT_TIMESTAMP"), }; + sortExpressions = new[] { new SqlString("CURRENT_TIMESTAMP"), }; } SqlStringBuilder result = @@ -99,7 +98,7 @@ } for (int i = 0; i < sortExpressions.Length; i++) { - SqlString sortExpression = RemoveSortOrderDirection(sortExpressions[i]); + SqlString sortExpression = RemoveSortOrderDirection(sortExpressions[i]); if (!columnsOrAliases.Contains(sortExpression)) { result.Add(", query.__hibernate_sort_expr_").Add(i.ToString()).Add("__"); @@ -132,13 +131,14 @@ return result.ToSqlString(); } - private static SqlString RemoveSortOrderDirection(SqlString sortExpression) + private static SqlString RemoveSortOrderDirection(SqlString sortExpression) { - if (sortExpression.EndsWithCaseInsensitive("asc")) - return sortExpression.Substring(0, sortExpression.Length - 3).Trim(); - if (sortExpression.EndsWithCaseInsensitive("desc")) - return sortExpression.Substring(0, sortExpression.Length - 4).Trim(); - return sortExpression.Trim(); + SqlString trimmedExpression = sortExpression.Trim(); + if (trimmedExpression.EndsWithCaseInsensitive("asc")) + return trimmedExpression.Substring(0, trimmedExpression.Length - 3).Trim(); + if (trimmedExpression.EndsWithCaseInsensitive("desc")) + return trimmedExpression.Substring(0, trimmedExpression.Length - 4).Trim(); + return trimmedExpression.Trim(); } private static void AppendSortExpressions(ICollection<SqlString> columnsOrAliases, SqlString[] sortExpressions, @@ -167,7 +167,7 @@ } } - private int GetFromIndex(SqlString querySqlString) + private static int GetFromIndex(SqlString querySqlString) { string subselect = querySqlString.GetSubselectString().ToString(); int fromIndex = querySqlString.IndexOfCaseInsensitive(subselect); @@ -178,11 +178,11 @@ return fromIndex; } - private static void ExtractColumnOrAliasNames(SqlString select, out List<SqlString> columnsOrAliases, - out Dictionary<SqlString, SqlString> aliasToColumn) + private static void ExtractColumnOrAliasNames(SqlString select, out List<SqlString> columnsOrAliases, + out Dictionary<SqlString, SqlString> aliasToColumn) { - columnsOrAliases = new List<SqlString>(); - aliasToColumn = new Dictionary<SqlString, SqlString>(); + columnsOrAliases = new List<SqlString>(); + aliasToColumn = new Dictionary<SqlString, SqlString>(); IList<string> tokens = new QuotedAndParenthesisStringTokenizer(select.ToString()).GetTokens(); int index = 0; @@ -240,7 +240,7 @@ } columnsOrAliases.Add(new SqlString(alias)); - aliasToColumn[new SqlString(alias)] = new SqlString(token); + aliasToColumn[new SqlString(alias)] = new SqlString(token); } } @@ -442,4 +442,4 @@ } } } -} \ No newline at end of file +} Modified: trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2008-11-17 20:42:16 UTC (rev 3915) +++ trunk/nhibernate/src/NHibernate.Test/DialectTest/MsSql2005DialectFixture.cs 2008-11-17 21:34:20 UTC (rev 3916) @@ -15,8 +15,13 @@ { MsSql2005Dialect d = new MsSql2005Dialect(); - SqlString str = d.GetLimitString(new SqlString("SELECT fish.id FROM fish"), 0, 10); + SqlString str = d.GetLimitString(new SqlString("select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_ from dbo.Contact c where COALESCE(c.Rating, 0) > 0 order by c.Rating desc , c.Last_Name , c.First_Name"), 0, 10); Assert.AreEqual( + "SELECT TOP 10 Contact1_19_0_, Rating2_19_0_ FROM (SELECT ROW_NUMBER() OVER(ORDER BY __hibernate_sort_expr_0__ DESC, __hibernate_sort_expr_1__, __hibernate_sort_expr_2__) as row, query.Contact1_19_0_, query.Rating2_19_0_, query.__hibernate_sort_expr_0__, query.__hibernate_sort_expr_1__, query.__hibernate_sort_expr_2__ FROM (select distinct c.Contact_Id as Contact1_19_0_, c._Rating as Rating2_19_0_, c.Rating as __hibernate_sort_expr_0__, c.Last_Name as __hibernate_sort_expr_1__, c.First_Name as __hibernate_sort_expr_2__ from dbo.Contact c where COALESCE(c.Rating, 0) > 0) query ) page WHERE page.row > 0 ORDER BY __hibernate_sort_expr_0__ DESC, __hibernate_sort_expr_1__, __hibernate_sort_expr_2__", + str.ToString()); + + str = d.GetLimitString(new SqlString("SELECT fish.id FROM fish"), 0, 10); + Assert.AreEqual( "SELECT TOP 10 id FROM (SELECT ROW_NUMBER() OVER(ORDER BY __hibernate_sort_expr_0__) as row, query.id, query.__hibernate_sort_expr_0__ FROM (SELECT fish.id, CURRENT_TIMESTAMP as __hibernate_sort_expr_0__ FROM fish) query ) page WHERE page.row > 0 ORDER BY __hibernate_sort_expr_0__", str.ToString()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-17 20:42:18
|
Revision: 3915 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3915&view=rev Author: fabiomaulo Date: 2008-11-17 20:42:16 +0000 (Mon, 17 Nov 2008) Log Message: ----------- fix NH-1573 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd Modified: trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs 2008-11-17 13:59:23 UTC (rev 3914) +++ trunk/nhibernate/src/NHibernate/Cfg/MappingSchema/Hbm.generated.cs 2008-11-17 20:42:16 UTC (rev 3915) @@ -1353,11 +1353,11 @@ /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute()] - public bool collable; + public bool callable; /// <remarks/> [System.Xml.Serialization.XmlIgnoreAttribute()] - public bool collableSpecified; + public bool callableSpecified; /// <remarks/> [System.Xml.Serialization.XmlAttributeAttribute()] Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-11-17 13:59:23 UTC (rev 3914) +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-11-17 20:42:16 UTC (rev 3915) @@ -1111,7 +1111,7 @@ sqlString = PreprocessSQL(sqlString, queryParameters, dialect); - // TODO NH: Collable for SP -> PrepareCallableQueryCommand + // TODO NH: Callable for SP -> PrepareCallableQueryCommand IDbCommand command = session.Batcher.PrepareQueryCommand(CommandType.Text, sqlString, GetParameterTypes(queryParameters, useLimit, useOffset)); @@ -1347,7 +1347,7 @@ try { log.Info(st.CommandText); - // TODO NH: Collable + // TODO NH: Callable rs = session.Batcher.ExecuteReader(st); rs = WrapResultSetIfEnabled(rs, session); Modified: trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2008-11-17 13:59:23 UTC (rev 3914) +++ trunk/nhibernate/src/NHibernate/Persister/Collection/AbstractCollectionPersister.cs 2008-11-17 20:42:16 UTC (rev 3915) @@ -1866,7 +1866,7 @@ public abstract bool IsOneToMany { get; } protected object PerformInsert(object ownerId, IPersistentCollection collection, IExpectation expectation, - object entry, int index, bool useBatch, bool collable, ISessionImplementor session) + object entry, int index, bool useBatch, bool callable, ISessionImplementor session) { object entryId = null; int offset = 0; Modified: trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd =================================================================== --- trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd 2008-11-17 13:59:23 UTC (rev 3914) +++ trunk/nhibernate/src/NHibernate/nhibernate-mapping.xsd 2008-11-17 20:42:16 UTC (rev 3915) @@ -1669,7 +1669,7 @@ </xs:restriction> </xs:simpleType> <xs:complexType name="customSQL" mixed="true"> - <xs:attribute name="collable" type="xs:boolean" /> + <xs:attribute name="callable" type="xs:boolean" /> <xs:attribute name="check" type="customSQLCheck" use="optional" /> </xs:complexType> <xs:simpleType name="versionGeneration"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-17 13:59:27
|
Revision: 3914 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3914&view=rev Author: tehlike Date: 2008-11-17 13:59:23 +0000 (Mon, 17 Nov 2008) Log Message: ----------- Relocating tests for SchemaUpdate. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/1_Version.hbm.xml trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/2_Version.hbm.xml trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/Version.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/ Removed Paths: ------------- trunk/nhibernate/src/NHibernate.Test/SchemaUpdate/ Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-16 22:37:57 UTC (rev 3913) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-17 13:59:23 UTC (rev 3914) @@ -818,8 +818,8 @@ <Compile Include="QueryTest\PositionalParametersFixture.cs" /> <Compile Include="QueryTest\QueryParametersFixture.cs" /> <Compile Include="ReflectionOptimizerTest\LcgFixture.cs" /> - <Compile Include="SchemaUpdate\MigrationFixture.cs" /> - <Compile Include="SchemaUpdate\Version.cs" /> + <Compile Include="Tools\hbm2ddl\SchemaUpdate\MigrationFixture.cs" /> + <Compile Include="Tools\hbm2ddl\SchemaUpdate\Version.cs" /> <Compile Include="SecondLevelCacheTest\AnotherItem.cs" /> <Compile Include="SecondLevelCacheTest\Item.cs" /> <Compile Include="SecondLevelCacheTest\SecondLevelCacheTest.cs" /> @@ -1396,8 +1396,8 @@ <EmbeddedResource Include="NHSpecificTest\NH995\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> - <EmbeddedResource Include="SchemaUpdate\1_Version.hbm.xml" /> - <EmbeddedResource Include="SchemaUpdate\2_Version.hbm.xml" /> + <EmbeddedResource Include="Tools\hbm2ddl\SchemaUpdate\1_Version.hbm.xml" /> + <EmbeddedResource Include="Tools\hbm2ddl\SchemaUpdate\2_Version.hbm.xml" /> </ItemGroup> <ItemGroup> <EmbeddedResource Include="BulkManipulation\Vehicle.hbm.xml" /> Property changes on: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/1_Version.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SchemaUpdate/1_Version.hbm.xml 2008-11-14 15:53:37 UTC (rev 3910) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/1_Version.hbm.xml 2008-11-17 13:59:23 UTC (rev 3914) @@ -1,6 +1,6 @@ <?xml version="1.0"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" - namespace="NHibernate.Test.SchemaUpdate" + namespace="NHibernate.Test.Tools.hbm2ddl.SchemaUpdate" assembly="NHibernate.Test"> <class name="Version"> Modified: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/2_Version.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SchemaUpdate/2_Version.hbm.xml 2008-11-14 15:53:37 UTC (rev 3910) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/2_Version.hbm.xml 2008-11-17 13:59:23 UTC (rev 3914) @@ -1,6 +1,6 @@ <?xml version="1.0"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" - namespace="NHibernate.Test.SchemaUpdate" + namespace="NHibernate.Test.Tools.hbm2ddl.SchemaUpdate" assembly="NHibernate.Test"> <class name="Version"> Modified: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SchemaUpdate/MigrationFixture.cs 2008-11-14 15:53:37 UTC (rev 3910) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs 2008-11-17 13:59:23 UTC (rev 3914) @@ -5,7 +5,7 @@ using NHibernate.Tool.hbm2ddl; using NUnit.Framework; -namespace NHibernate.Test.SchemaUpdate +namespace NHibernate.Test.Tools.hbm2ddl.SchemaUpdate { [TestFixture] public class MigrationFixture @@ -13,8 +13,8 @@ [Test] public void SimpleColumnAddition() { - String resource2 = "NHibernate.Test.SchemaUpdate.2_Version.hbm.xml"; - String resource1 = "NHibernate.Test.SchemaUpdate.1_Version.hbm.xml"; + String resource2 = "NHibernate.Test.Tools.hbm2ddl.SchemaUpdate.2_Version.hbm.xml"; + String resource1 = "NHibernate.Test.Tools.hbm2ddl.SchemaUpdate.1_Version.hbm.xml"; Configuration v1cfg = TestConfigurationHelper.GetDefaultConfiguration(); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1)) Modified: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/Version.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SchemaUpdate/Version.cs 2008-11-14 15:53:37 UTC (rev 3910) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/Version.cs 2008-11-17 13:59:23 UTC (rev 3914) @@ -1,4 +1,4 @@ -namespace NHibernate.Test.SchemaUpdate +namespace NHibernate.Test.Tools.hbm2ddl.SchemaUpdate { public class Version { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-16 22:38:04
|
Revision: 3913 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3913&view=rev Author: tehlike Date: 2008-11-16 22:37:57 +0000 (Sun, 16 Nov 2008) Log Message: ----------- Typo correction (NH-1572) by Gennadii Donchyts Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/AbstractType.cs Modified: trunk/nhibernate/src/NHibernate/Type/AbstractType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/AbstractType.cs 2008-11-16 22:22:59 UTC (rev 3912) +++ trunk/nhibernate/src/NHibernate/Type/AbstractType.cs 2008-11-16 22:37:57 UTC (rev 3913) @@ -241,7 +241,7 @@ public virtual int Compare(object x, object y, EntityMode? entityMode) { IComparable xComp = x as IComparable; - IComparable yComp = x as IComparable; + IComparable yComp = y as IComparable; if (xComp != null) return xComp.CompareTo(y); if (yComp != null) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-16 22:23:03
|
Revision: 3912 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3912&view=rev Author: tehlike Date: 2008-11-16 22:22:59 +0000 (Sun, 16 Nov 2008) Log Message: ----------- Implementation for SchemaValidator with its test (which means partial implementation of hbm2ddl.verify) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Mapping/Table.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs trunk/nhibernate/src/NHibernate.Test/Tools/ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -1981,6 +1981,47 @@ return script.ToArray(); } + public void ValidateSchema(Dialect.Dialect dialect, DatabaseMetadata databaseMetadata) + { + SecondPassCompile(); + + string defaultCatalog = PropertiesHelper.GetString(Environment.DefaultCatalog, properties, null); + string defaultSchema = PropertiesHelper.GetString(Environment.DefaultSchema, properties, null); + + var iter = this.TableMappings; + foreach (var table in iter) + { + if (table.IsPhysicalTable) + { + /*NH Different Implementation : + TableMetadata tableInfo = databaseMetadata.getTableMetadata( + table.getName(), + ( table.getSchema() == null ) ? defaultSchema : table.getSchema(), + ( table.getCatalog() == null ) ? defaultCatalog : table.getCatalog(), + table.isQuoted());*/ + ITableMetadata tableInfo = databaseMetadata.GetTableMetadata( + table.Name, + table.Schema??defaultSchema, + table.Catalog,//??defaultCatalog, + table.IsQuoted); + if (tableInfo == null) + throw new HibernateException("Missing table: " + table.Name); + else + table.ValidateColumns(dialect, mapping, tableInfo); + } + } + + var persistenceIdentifierGenerators = IterateGenerators(dialect); + foreach (var generator in persistenceIdentifierGenerators) + { + string key = generator.GeneratorKey(); + if (!databaseMetadata.IsSequence(key) && !databaseMetadata.IsTable(key)) + { + throw new HibernateException(string.Format("Missing sequence or table: ", key)); + } + } + } + private IEnumerable<IPersistentIdentifierGenerator> IterateGenerators(Dialect.Dialect dialect) { var generators = new Dictionary<string, IPersistentIdentifierGenerator>(); Modified: trunk/nhibernate/src/NHibernate/Mapping/Table.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Mapping/Table.cs 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate/Mapping/Table.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -1018,9 +1018,34 @@ return buf.ToString(); } - public void ValidateColumns(Dialect.Dialect dialect, IMapping mapping, DataTable tableInfo) + public void ValidateColumns(Dialect.Dialect dialect, IMapping mapping, ITableMetadata tableInfo) { - throw new NotSupportedException(); + var iter = this.ColumnIterator; + foreach (var column in iter) + { + + var columnInfo = tableInfo.GetColumnMetadata(column.Name); + + if (columnInfo == null) + throw new HibernateException(string.Format("Missing column: {0} in {1}", column.Name, + Table.Qualify(tableInfo.Catalog, tableInfo.Schema, tableInfo.Name))); + + else + { + //TODO: Add new method to ColumnMetadata :getTypeCode + bool typesMatch = column.GetSqlType(dialect, mapping).ToLower() + .StartsWith(columnInfo.TypeName.ToLower()) + ; //|| columnInfo.get() == column.GetSqlTypeCode(mapping); + if (!typesMatch) + { + throw new HibernateException( + string.Format("Wrong column type in {0} for column {1}. Found: {2}, Expected {3}", + Table.Qualify(tableInfo.Catalog, tableInfo.Schema, tableInfo.Name), + column.Name, columnInfo.TypeName.ToLower(), column.GetSqlType(dialect, mapping))); + } + } + } + } public static string Qualify(string catalog, string schema, string table) Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-16 22:22:59 UTC (rev 3912) @@ -1020,6 +1020,7 @@ <Compile Include="Tool\hbm2ddl\ManagedProviderConnectionHelper.cs" /> <Compile Include="Dialect\Schema\AbstractDataBaseSchema.cs" /> <Compile Include="Tool\hbm2ddl\SchemaUpdate.cs" /> + <Compile Include="Tool\hbm2ddl\SchemaValidator.cs" /> <Compile Include="Tool\hbm2ddl\SuppliedConnectionHelper.cs" /> <Compile Include="Tool\hbm2ddl\SuppliedConnectionProviderConnectionHelper.cs" /> <Compile Include="Transaction\AdoNetTransactionFactory.cs" /> Added: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Data.SqlClient; +using System.Text; +using log4net; +using log4net.Repository.Hierarchy; +using NHibernate.Cfg; +using NHibernate.Util; + +namespace NHibernate.Tool.hbm2ddl +{ + public class SchemaValidator + { + + private static readonly ILog log = LogManager.GetLogger(typeof(SchemaValidator)); + private readonly IConnectionHelper connectionHelper; + private readonly Configuration configuration; + private Dialect.Dialect dialect; + + public SchemaValidator(Configuration cfg) : + this(cfg, cfg.Properties) + { + } + + public SchemaValidator(Configuration cfg, IDictionary<string, string> connectionProperties) + { + this.configuration = cfg; + dialect = Dialect.Dialect.GetDialect(connectionProperties); + IDictionary<string, string> props = new Dictionary<string, string>(dialect.DefaultProperties); + foreach (var prop in connectionProperties) + props[prop.Key] = prop.Value; + connectionHelper = new ManagedProviderConnectionHelper(props); + } + + public SchemaValidator(Configuration cfg, Settings settings) + { + this.configuration = cfg; + dialect = settings.Dialect; + connectionHelper = new SuppliedConnectionProviderConnectionHelper(settings.ConnectionProvider); + } + + public static void Main(string[] args) + { + try + { + Configuration cfg = new Configuration(); + + String propFile = null; + + for (int i = 0; i < args.Length; i++) + { + if (args[i].StartsWith("--")) + { + if (args[i].StartsWith("--properties=")) + { + propFile = args[i].Substring(13); + } + else if (args[i].StartsWith("--config=")) + { + cfg.Configure(args[i].Substring(9)); + } + else if (args[i].StartsWith("--naming=")) + { + cfg.SetNamingStrategy( + (INamingStrategy)Activator.CreateInstance(ReflectHelper.ClassForName(args[i].Substring(9)))); + } + } + else + { + cfg.AddFile(args[i]); + } + + } + /* NH: No props file for .NET + if ( propFile != null ) { + Properties props = new Properties(); + props.putAll( cfg.getProperties() ); + props.load( new FileInputStream( propFile ) ); + cfg.setProperties( props ); + } + */ + new SchemaValidator(cfg).Validate(); + } + catch (Exception e) + { + log.Error("Error running schema update", e); + Console.WriteLine(e); + } + } + + /** + * Perform the validations. + */ + public void Validate() + { + log.Info("Running schema validator"); + DbConnection connection = null; + try + { + + DatabaseMetadata meta; + try + { + log.Info("fetching database metadata"); + connectionHelper.Prepare(); + connection = connectionHelper.Connection; + meta = new DatabaseMetadata(connection, dialect, false); + } + catch (Exception sqle) + { + log.Error("could not get database metadata", sqle); + throw sqle; + } + configuration.ValidateSchema(dialect, meta); + } + catch (Exception e) + { + log.Error("could not complete schema validation", e); + throw e; + } + finally + { + try + { + connectionHelper.Release(); + } + catch (Exception e) + { + log.Error("Error closing connection", e); + } + + } + } + } +} Property changes on: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaValidator.cs ___________________________________________________________________ Added: svn:mergeinfo + Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-15 19:44:59 UTC (rev 3911) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-16 22:22:59 UTC (rev 3912) @@ -887,6 +887,8 @@ <Compile Include="TestCase.cs" /> <Compile Include="TestConfigurationHelper.cs" /> <Compile Include="TestTestCase.cs" /> + <Compile Include="Tools\hbm2ddl\SchemaValidator\SchemaValidateFixture.cs" /> + <Compile Include="Tools\hbm2ddl\SchemaValidator\Version.cs" /> <Compile Include="TransactionTest\TransactionFixture.cs" /> <Compile Include="TransactionTest\TransactionNotificationFixture.cs" /> <Compile Include="TypeParameters\DefaultValueIntegerType.cs" /> @@ -1535,6 +1537,8 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="Tools\hbm2ddl\SchemaValidator\2_Version.hbm.xml" /> + <EmbeddedResource Include="Tools\hbm2ddl\SchemaValidator\1_Version.hbm.xml" /> <EmbeddedResource Include="TypesTest\GenericEnumStringClass.hbm.xml" /> <EmbeddedResource Include="Operations\Competition.hbm.xml" /> <EmbeddedResource Include="Operations\Employer.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/1_Version.hbm.xml 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.Tools.hbm2ddl.SchemaValidator" + assembly="NHibernate.Test"> + + <class name="Version"> + <id name="Id"> + <generator class="NHibernate.Id.TableHiLoGenerator"> + <param name="table">uid_table</param> + <param name="column">next_hi_value_column</param> + </generator> + </id> + <property name="Description"/> + <many-to-one name="Previous"/> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/2_Version.hbm.xml 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.Tools.hbm2ddl.SchemaValidator" + assembly="NHibernate.Test"> + + <class name="Version"> + <id name="Id"> + <generator class="NHibernate.Id.TableHiLoGenerator"> + <param name="table">uid_table</param> + <param name="column">next_hi_value_column</param> + </generator> + </id> + <property name="Description"/> + <property name="Name"/> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using NHibernate.Cfg; +using NHibernate.Tool.hbm2ddl; +using NUnit.Framework; + +namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator +{ + [TestFixture] + public class SchemaValidateFixture + { + [Test] + public void ShouldVerifySameTable() + { + string resource1 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml"; + Configuration v1cfg = TestConfigurationHelper.GetDefaultConfiguration(); + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1)) + new NHibernate.Tool.hbm2ddl.SchemaExport(v1cfg).Execute(true,true,false,true); + + var v1schemaValidator = new NHibernate.Tool.hbm2ddl.SchemaValidator((v1cfg)); + v1schemaValidator.Validate(); + + } + + [Test] + [ExpectedException(typeof(HibernateException), ExpectedMessage = "Missing column: Name in nhibernate.dbo.Version")] + public void ShouldNotVerifyModifiedTable() + { + string resource1 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.1_Version.hbm.xml"; + string resource2 = "NHibernate.Test.Tools.hbm2ddl.SchemaValidator.2_Version.hbm.xml"; + Configuration v1cfg = TestConfigurationHelper.GetDefaultConfiguration(); + Configuration v2cfg = TestConfigurationHelper.GetDefaultConfiguration(); + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1)) + v1cfg.AddInputStream(stream); + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource2)) + v2cfg.AddInputStream(stream); + new NHibernate.Tool.hbm2ddl.SchemaExport(v1cfg).Execute(true, true, false, true); + var v2schemaValidator = new NHibernate.Tool.hbm2ddl.SchemaValidator((v2cfg)); + v2schemaValidator.Validate(); + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/Version.cs 2008-11-16 22:22:59 UTC (rev 3912) @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.Tools.hbm2ddl.SchemaValidator +{ + public class Version + { + private int id; + private string name; + private string description; + private Version previous; + + public virtual int Id + { + get { return id; } + set { id = value; } + } + + public virtual string Name + { + get { return name; } + set { name = value; } + } + + public virtual string Description + { + get { return description; } + set { description = value; } + } + + + public virtual Version Previous + { + get { return previous; } + set { previous = value; } + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-15 19:45:04
|
Revision: 3911 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3911&view=rev Author: tehlike Date: 2008-11-15 19:44:59 +0000 (Sat, 15 Nov 2008) Log Message: ----------- Test added to illustrate the use of EnumStringType<T> class (NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs) Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-14 15:53:37 UTC (rev 3910) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-15 19:44:59 UTC (rev 3911) @@ -911,6 +911,8 @@ <Compile Include="TypesTest\EnumCharTypeFixture.cs" /> <Compile Include="TypesTest\EnumStringClass.cs" /> <Compile Include="TypesTest\EnumStringTypeFixture.cs" /> + <Compile Include="TypesTest\GenericEnumStringClass.cs" /> + <Compile Include="TypesTest\GenericEnumStringTypeFixture.cs" /> <Compile Include="TypesTest\GuidClass.cs" /> <Compile Include="TypesTest\GuidTypeFixture.cs" /> <Compile Include="TypesTest\Int16TypeFixture.cs" /> @@ -1533,6 +1535,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="TypesTest\GenericEnumStringClass.hbm.xml" /> <EmbeddedResource Include="Operations\Competition.hbm.xml" /> <EmbeddedResource Include="Operations\Employer.hbm.xml" /> <EmbeddedResource Include="Operations\Node.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.cs 2008-11-15 19:44:59 UTC (rev 3911) @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace NHibernate.Test.TypesTest +{ + public class GenericEnumStringClass + { + public virtual int Id + { + get; + set; + } + + public virtual SampleEnum EnumValue + { + get; + set; + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.hbm.xml 2008-11-15 19:44:59 UTC (rev 3911) @@ -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.GenericEnumStringClass, NHibernate.Test" table="bc_estr"> + <id name="Id" column="id"> + <generator class="assigned" /> + </id> + + <property name="EnumValue" type="NHibernate.Type.EnumStringType`1[[NHibernate.Test.TypesTest.SampleEnum, NHibernate.Test]], NHibernate" column="enumc"/> + </class> +</hibernate-mapping> Property changes on: trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringClass.hbm.xml ___________________________________________________________________ Added: svn:mergeinfo + Added: trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/GenericEnumStringTypeFixture.cs 2008-11-15 19:44:59 UTC (rev 3911) @@ -0,0 +1,93 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + [TestFixture] + public class GenericEnumStringTypeFixture : TypeFixtureBase + { + protected override string TypeName + { + get { return "GenericEnumString"; } + } + + protected override void OnSetUp() + { + GenericEnumStringClass basic = new GenericEnumStringClass(); + basic.Id = 1; + basic.EnumValue = SampleEnum.Dimmed; + + GenericEnumStringClass basic2 = new GenericEnumStringClass(); + basic2.Id = 2; + basic2.EnumValue = SampleEnum.On; + + ISession s = OpenSession(); + s.Save(basic); + s.Save(basic2); + s.Flush(); + s.Close(); + } + + protected override void OnTearDown() + { + ISession s = OpenSession(); + s.Delete("from GenericEnumStringClass"); + s.Flush(); + s.Close(); + } + + + [Test] + public void ReadFromLoad() + { + ISession s = OpenSession(); + + GenericEnumStringClass basic = (GenericEnumStringClass)s.Load(typeof(GenericEnumStringClass), 1); + Assert.AreEqual(SampleEnum.Dimmed, basic.EnumValue); + + GenericEnumStringClass basic2 = (GenericEnumStringClass)s.Load(typeof(GenericEnumStringClass), 2); + Assert.AreEqual(SampleEnum.On, basic2.EnumValue); + + s.Close(); + } + + [Test] + public void ReadFromQuery() + { + ISession s = OpenSession(); + + IQuery q = s.CreateQuery("from GenericEnumStringClass as esc where esc.EnumValue=:enumValue"); + q.SetParameter("enumValue", SampleEnum.On, new SampleEnumType()); + IList results = q.List(); + + Assert.AreEqual(1, results.Count, "only 1 was 'On'"); + + q.SetParameter("enumValue", SampleEnum.Off, new SampleEnumType()); + results = q.List(); + + Assert.AreEqual(0, results.Count, "should not be any in the 'Off' status"); + + s.Close(); + + // it will also be possible to query based on a string value + // since that is what is in the db + s = OpenSession(); + + q = s.CreateQuery("from GenericEnumStringClass as esc where esc.EnumValue=:stringValue"); + q.SetString("stringValue", "On"); + results = q.List(); + + Assert.AreEqual(1, results.Count, "only 1 was 'On' string"); + + q.SetString("stringValue", "Off"); + results = q.List(); + + Assert.AreEqual(0, results.Count, "should not be any in the 'Off' string"); + + s.Close(); + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-14 15:53:42
|
Revision: 3910 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3910&view=rev Author: fabiomaulo Date: 2008-11-14 15:53:37 +0000 (Fri, 14 Nov 2008) Log Message: ----------- Actualized LinFu.DynamicProxy.dll with the last released version for 2.0 and 3.5 Modified Paths: -------------- trunk/nhibernate/lib/net/2.0/LinFu.DynamicProxy.dll trunk/nhibernate/lib/net/3.5/LinFu.DynamicProxy.dll Modified: trunk/nhibernate/lib/net/2.0/LinFu.DynamicProxy.dll =================================================================== (Binary files differ) Modified: trunk/nhibernate/lib/net/3.5/LinFu.DynamicProxy.dll =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-13 18:37:24
|
Revision: 3909 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3909&view=rev Author: tehlike Date: 2008-11-13 18:37:19 +0000 (Thu, 13 Nov 2008) Log Message: ----------- Minor. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs Modified: trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs 2008-11-13 18:08:08 UTC (rev 3908) +++ trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs 2008-11-13 18:37:19 UTC (rev 3909) @@ -83,20 +83,7 @@ { int length = (int)rs.GetBytes(index, 0, null, 0, 0); byte[] buffer = new byte[length]; - - int offset = 0; - - while (length - offset > 0) - { - int countRead = (int)rs.GetBytes(index, offset, buffer, offset, length - offset); - offset += countRead; - - if (countRead == 0) - { - // Should never happen - throw new AssertionFailure("Error in BinaryType.Get, IDataRecord.GetBytes read zero bytes"); - } - } + rs.GetBytes(index, 0, buffer, 0, length); return ToExternalFormat(buffer); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-13 18:08:12
|
Revision: 3908 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3908&view=rev Author: tehlike Date: 2008-11-13 18:08:08 +0000 (Thu, 13 Nov 2008) Log Message: ----------- Minor. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Type/BinaryType.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Type/AbstractBynaryType.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-12 02:40:14 UTC (rev 3907) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-13 18:08:08 UTC (rev 3908) @@ -1052,7 +1052,7 @@ <Compile Include="Tuple\StandardProperty.cs" /> <Compile Include="Tuple\VersionProperty.cs" /> <Compile Include="TypeMismatchException.cs" /> - <Compile Include="Type\AbstractBynaryType.cs" /> + <Compile Include="Type\AbstractBinaryType.cs" /> <Compile Include="Type\AbstractEnumType.cs" /> <Compile Include="Type\AbstractStringType.cs" /> <Compile Include="Type\AnsiCharType.cs" /> Copied: trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs (from rev 3907, trunk/nhibernate/src/NHibernate/Type/AbstractBynaryType.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs 2008-11-13 18:08:08 UTC (rev 3908) @@ -0,0 +1,179 @@ +using System; +using System.Collections; +using System.Data; +using System.Text; +using NHibernate.Engine; +using NHibernate.SqlTypes; +using NHibernate.Util; + +namespace NHibernate.Type +{ + /// <summary> Logic to bind stream of byte into a VARBINARY </summary> + [Serializable] + public abstract class AbstractBinaryType : MutableType, IVersionType, IComparer + { + internal AbstractBinaryType() : this(new BinarySqlType()) + { + } + + internal AbstractBinaryType(BinarySqlType sqlType) + : base(sqlType) + { + } + + + #region IVersionType Members + // Note : simply returns null for seed() and next() as the only known + // application of binary types for versioning is for use with the + // TIMESTAMP datatype supported by Sybase and SQL Server, which + // are completely db-generated values... + + public object Next(object current, ISessionImplementor session) + { + return current; + } + + public object Seed(ISessionImplementor session) + { + return null; + } + + public override bool IsEqual(object x, object y) + { + if (x == y) + return true; + + if (x == null || y == null) + return false; + + return CollectionHelper.CollectionEquals<byte>(ToInternalFormat(x), ToInternalFormat(y)); + } + + public IComparer Comparator + { + get { return this; } + } + + #endregion + + #region IComparer Members + + public virtual int Compare(object x, object y) + { + return Compare(x, y, null); + } + + #endregion + + public abstract override string Name { get;} + + /// <summary> Convert the byte[] into the expected object type</summary> + protected internal abstract object ToExternalFormat(byte[] bytes); + + /// <summary> Convert the object into the internal byte[] representation</summary> + protected internal abstract byte[] ToInternalFormat(object bytes); + + public override void Set(IDbCommand cmd, object value, int index) + { + byte[] internalValue = ToInternalFormat(value); + ((IDataParameter)cmd.Parameters[index]).Value = internalValue; + } + + public override object Get(IDataReader rs, int index) + { + int length = (int)rs.GetBytes(index, 0, null, 0, 0); + byte[] buffer = new byte[length]; + + int offset = 0; + + while (length - offset > 0) + { + int countRead = (int)rs.GetBytes(index, offset, buffer, offset, length - offset); + offset += countRead; + + if (countRead == 0) + { + // Should never happen + throw new AssertionFailure("Error in BinaryType.Get, IDataRecord.GetBytes read zero bytes"); + } + } + return ToExternalFormat(buffer); + } + + public override object Get(IDataReader rs, string name) + { + return Get(rs, rs.GetOrdinal(name)); + } + + public override int GetHashCode(object x, EntityMode entityMode) + { + byte[] bytes = ToInternalFormat(x); + int hashCode = 1; + unchecked + { + for (int j = 0; j < bytes.Length; j++) + { + hashCode = 31 * hashCode + bytes[j]; + } + } + return hashCode; + } + + public override int Compare(object x, object y, EntityMode? entityMode) + { + byte[] xbytes = ToInternalFormat(x); + byte[] ybytes = ToInternalFormat(y); + if (xbytes.Length < ybytes.Length) + return -1; + if (xbytes.Length > ybytes.Length) + return 1; + for (int i = 0; i < xbytes.Length; i++) + { + if (xbytes[i] < ybytes[i]) + return -1; + if (xbytes[i] > ybytes[i]) + return 1; + } + return 0; + } + + public override string ToString(object val) + { + // convert to HEX string + byte[] bytes = ToInternalFormat(val); + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < bytes.Length; i++) + { + String hexStr = Convert.ToString(bytes[i] - Byte.MinValue, 16); + if (hexStr.Length == 1) + buf.Append('0'); + buf.Append(hexStr); + } + return buf.ToString(); + } + + public override object DeepCopyNotNull(object value) + { + byte[] bytes = ToInternalFormat(value); + byte[] result = new byte[bytes.Length]; + Array.Copy(bytes, 0, result, 0, bytes.Length); + return ToExternalFormat(result); + } + + public override object FromStringValue(string xml) + { + if (xml == null) + return null; + if (xml.Length % 2 != 0) + throw new ArgumentException("The string is not a valid xml representation of a binary content."); + + byte[] bytes = new byte[xml.Length / 2]; + for (int i = 0; i < bytes.Length; i++) + { + string hexStr = xml.Substring(i * 2, ((i + 1) * 2) - (i * 2)); + bytes[i] = (byte)(Convert.ToInt32(hexStr, 16) + Byte.MinValue); + } + return ToExternalFormat(bytes); + } + } +} Property changes on: trunk/nhibernate/src/NHibernate/Type/AbstractBinaryType.cs ___________________________________________________________________ Added: svn:mergeinfo + Deleted: trunk/nhibernate/src/NHibernate/Type/AbstractBynaryType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/AbstractBynaryType.cs 2008-11-12 02:40:14 UTC (rev 3907) +++ trunk/nhibernate/src/NHibernate/Type/AbstractBynaryType.cs 2008-11-13 18:08:08 UTC (rev 3908) @@ -1,179 +0,0 @@ -using System; -using System.Collections; -using System.Data; -using System.Text; -using NHibernate.Engine; -using NHibernate.SqlTypes; -using NHibernate.Util; - -namespace NHibernate.Type -{ - /// <summary> Logic to bind stream of byte into a VARBINARY </summary> - [Serializable] - public abstract class AbstractBynaryType : MutableType, IVersionType, IComparer - { - internal AbstractBynaryType() : this(new BinarySqlType()) - { - } - - internal AbstractBynaryType(BinarySqlType sqlType) - : base(sqlType) - { - } - - - #region IVersionType Members - // Note : simply returns null for seed() and next() as the only known - // application of binary types for versioning is for use with the - // TIMESTAMP datatype supported by Sybase and SQL Server, which - // are completely db-generated values... - - public object Next(object current, ISessionImplementor session) - { - return current; - } - - public object Seed(ISessionImplementor session) - { - return null; - } - - public override bool IsEqual(object x, object y) - { - if (x == y) - return true; - - if (x == null || y == null) - return false; - - return CollectionHelper.CollectionEquals<byte>(ToInternalFormat(x), ToInternalFormat(y)); - } - - public IComparer Comparator - { - get { return this; } - } - - #endregion - - #region IComparer Members - - public virtual int Compare(object x, object y) - { - return Compare(x, y, null); - } - - #endregion - - public abstract override string Name { get;} - - /// <summary> Convert the byte[] into the expected object type</summary> - protected internal abstract object ToExternalFormat(byte[] bytes); - - /// <summary> Convert the object into the internal byte[] representation</summary> - protected internal abstract byte[] ToInternalFormat(object bytes); - - public override void Set(IDbCommand cmd, object value, int index) - { - byte[] internalValue = ToInternalFormat(value); - ((IDataParameter)cmd.Parameters[index]).Value = internalValue; - } - - public override object Get(IDataReader rs, int index) - { - int length = (int)rs.GetBytes(index, 0, null, 0, 0); - byte[] buffer = new byte[length]; - - int offset = 0; - - while (length - offset > 0) - { - int countRead = (int)rs.GetBytes(index, offset, buffer, offset, length - offset); - offset += countRead; - - if (countRead == 0) - { - // Should never happen - throw new AssertionFailure("Error in BinaryType.Get, IDataRecord.GetBytes read zero bytes"); - } - } - return ToExternalFormat(buffer); - } - - public override object Get(IDataReader rs, string name) - { - return Get(rs, rs.GetOrdinal(name)); - } - - public override int GetHashCode(object x, EntityMode entityMode) - { - byte[] bytes = ToInternalFormat(x); - int hashCode = 1; - unchecked - { - for (int j = 0; j < bytes.Length; j++) - { - hashCode = 31 * hashCode + bytes[j]; - } - } - return hashCode; - } - - public override int Compare(object x, object y, EntityMode? entityMode) - { - byte[] xbytes = ToInternalFormat(x); - byte[] ybytes = ToInternalFormat(y); - if (xbytes.Length < ybytes.Length) - return -1; - if (xbytes.Length > ybytes.Length) - return 1; - for (int i = 0; i < xbytes.Length; i++) - { - if (xbytes[i] < ybytes[i]) - return -1; - if (xbytes[i] > ybytes[i]) - return 1; - } - return 0; - } - - public override string ToString(object val) - { - // convert to HEX string - byte[] bytes = ToInternalFormat(val); - StringBuilder buf = new StringBuilder(); - for (int i = 0; i < bytes.Length; i++) - { - String hexStr = Convert.ToString(bytes[i] - Byte.MinValue, 16); - if (hexStr.Length == 1) - buf.Append('0'); - buf.Append(hexStr); - } - return buf.ToString(); - } - - public override object DeepCopyNotNull(object value) - { - byte[] bytes = ToInternalFormat(value); - byte[] result = new byte[bytes.Length]; - Array.Copy(bytes, 0, result, 0, bytes.Length); - return ToExternalFormat(result); - } - - public override object FromStringValue(string xml) - { - if (xml == null) - return null; - if (xml.Length % 2 != 0) - throw new ArgumentException("The string is not a valid xml representation of a binary content."); - - byte[] bytes = new byte[xml.Length / 2]; - for (int i = 0; i < bytes.Length; i++) - { - string hexStr = xml.Substring(i * 2, ((i + 1) * 2) - (i * 2)); - bytes[i] = (byte)(Convert.ToInt32(hexStr, 16) + Byte.MinValue); - } - return ToExternalFormat(bytes); - } - } -} Modified: trunk/nhibernate/src/NHibernate/Type/BinaryType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/BinaryType.cs 2008-11-12 02:40:14 UTC (rev 3907) +++ trunk/nhibernate/src/NHibernate/Type/BinaryType.cs 2008-11-13 18:08:08 UTC (rev 3908) @@ -7,7 +7,7 @@ /// BinaryType. /// </summary> [Serializable] - public class BinaryType : AbstractBynaryType + public class BinaryType : AbstractBinaryType { internal BinaryType() : this(new BinarySqlType()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-12 02:40:25
|
Revision: 3907 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3907&view=rev Author: fabiomaulo Date: 2008-11-12 02:40:14 +0000 (Wed, 12 Nov 2008) Log Message: ----------- Tests for session.Merge Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/Operations/ trunk/nhibernate/src/NHibernate.Test/Operations/AbstractOperationTestCase.cs trunk/nhibernate/src/NHibernate.Test/Operations/Address.cs trunk/nhibernate/src/NHibernate.Test/Operations/Competition.cs trunk/nhibernate/src/NHibernate.Test/Operations/Competition.hbm.xml trunk/nhibernate/src/NHibernate.Test/Operations/Competitor.cs trunk/nhibernate/src/NHibernate.Test/Operations/Employee.cs trunk/nhibernate/src/NHibernate.Test/Operations/Employer.cs trunk/nhibernate/src/NHibernate.Test/Operations/Employer.hbm.xml trunk/nhibernate/src/NHibernate.Test/Operations/MergeFixture.cs trunk/nhibernate/src/NHibernate.Test/Operations/Node.cs trunk/nhibernate/src/NHibernate.Test/Operations/Node.hbm.xml trunk/nhibernate/src/NHibernate.Test/Operations/NumberedNode.cs trunk/nhibernate/src/NHibernate.Test/Operations/OneToOne.hbm.xml trunk/nhibernate/src/NHibernate.Test/Operations/OptLockEntity.hbm.xml trunk/nhibernate/src/NHibernate.Test/Operations/Person.cs trunk/nhibernate/src/NHibernate.Test/Operations/PersonalDetails.cs trunk/nhibernate/src/NHibernate.Test/Operations/TimestampedEntity.cs trunk/nhibernate/src/NHibernate.Test/Operations/VersionedEntity.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-10 17:47:28 UTC (rev 3906) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-12 02:40:14 UTC (rev 3907) @@ -767,6 +767,19 @@ <Compile Include="Ondelete\ParentChildFixture.cs" /> <Compile Include="Ondelete\Person.cs" /> <Compile Include="Ondelete\Salesperson.cs" /> + <Compile Include="Operations\AbstractOperationTestCase.cs" /> + <Compile Include="Operations\Address.cs" /> + <Compile Include="Operations\Competition.cs" /> + <Compile Include="Operations\Competitor.cs" /> + <Compile Include="Operations\Employee.cs" /> + <Compile Include="Operations\Employer.cs" /> + <Compile Include="Operations\MergeFixture.cs" /> + <Compile Include="Operations\Node.cs" /> + <Compile Include="Operations\NumberedNode.cs" /> + <Compile Include="Operations\Person.cs" /> + <Compile Include="Operations\PersonalDetails.cs" /> + <Compile Include="Operations\TimestampedEntity.cs" /> + <Compile Include="Operations\VersionedEntity.cs" /> <Compile Include="ProjectionFixtures\Key.cs" /> <Compile Include="ProjectionFixtures\Fixture.cs" /> <Compile Include="ProjectionFixtures\NodeType.cs" /> @@ -1520,6 +1533,11 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="Operations\Competition.hbm.xml" /> + <EmbeddedResource Include="Operations\Employer.hbm.xml" /> + <EmbeddedResource Include="Operations\Node.hbm.xml" /> + <EmbeddedResource Include="Operations\OneToOne.hbm.xml" /> + <EmbeddedResource Include="Operations\OptLockEntity.hbm.xml" /> <EmbeddedResource Include="Subclass\EnumDiscriminator\EnumDiscriminator.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\Select\MyEntity.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1478\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/Operations/AbstractOperationTestCase.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/AbstractOperationTestCase.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/AbstractOperationTestCase.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,58 @@ +using System.Collections; +using NHibernate.Cfg; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.Operations +{ + public abstract class AbstractOperationTestCase : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get + { + return new[] + { + "Operations.Node.hbm.xml", "Operations.Employer.hbm.xml", "Operations.OptLockEntity.hbm.xml", + "Operations.OneToOne.hbm.xml", "Operations.Competition.hbm.xml" + }; + } + } + + protected override string CacheConcurrencyStrategy + { + get { return null; } + } + + protected override void Configure(Configuration configuration) + { + configuration.SetProperty(Environment.GenerateStatistics, "true"); + configuration.SetProperty(Environment.BatchSize, "0"); + } + + protected void ClearCounts() + { + sessions.Statistics.Clear(); + } + + protected void AssertInsertCount(long expected) + { + Assert.That(sessions.Statistics.EntityInsertCount, Is.EqualTo(expected), "unexpected insert count"); + } + + protected void AssertUpdateCount(int expected) + { + Assert.That(sessions.Statistics.EntityUpdateCount, Is.EqualTo(expected), "unexpected update count"); + } + + protected void AssertDeleteCount(int expected) + { + Assert.That(sessions.Statistics.EntityDeleteCount, Is.EqualTo(expected), "unexpected delete count"); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Address.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Address.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Address.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,21 @@ +namespace NHibernate.Test.Operations +{ + public class Address + { + private Person resident; + public virtual long Id { get; set; } + public virtual string StreetAddress { get; set; } + public virtual string City { get; set; } + public virtual string Country { get; set; } + + public virtual Person Resident + { + get { return resident; } + set + { + resident = value; + resident.Address = this; + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Competition.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Competition.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Competition.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.Operations +{ + public class Competition + { + public Competition() + { + Competitors = new List<Competitor>(); + } + public virtual int Id { get; set; } + public virtual IList<Competitor> Competitors { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Competition.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Competition.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Competition.hbm.xml 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Operations"> + + <class name="Competition"> + <id name="Id"> + <generator class="native"/> + </id> + <list name="Competitors" table="COMPET_ION_OR" cascade="persist,merge,delete"> + <key column="TION_ID"/> + <list-index column="INDEX_COL"/> + <many-to-many class="Competitor" column="TOR_ID" /> + </list> + </class> + + <class name="Competitor"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Name"/> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Operations/Competitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Competitor.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Competitor.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,8 @@ +namespace NHibernate.Test.Operations +{ + public class Competitor + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Employee.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Employee.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Employee.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.Operations +{ + public class Employee + { + public virtual int Id { get; set; } + public virtual ICollection<Employer> Employers { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Employer.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Employer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Employer.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.Operations +{ + public class Employer + { + public virtual int Id { get; set; } + public virtual ICollection<Employee> Employees { get; set; } + public virtual int Vers { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Employer.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Employer.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Employer.hbm.xml 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Operations"> + + <class name="Employer" polymorphism="explicit"> + <id name="Id"> + <generator class="native"/> + </id> + <version column="vers" name="Vers"/> + <bag name="Employees" cascade="persist,merge" table="EMPLOYER_EMPLOYEE"> + <key column="EMPER_ID"/> + <many-to-many class="Employee" column="EMPEE_ID" /> + </bag> + </class> + + <class name="Employee" polymorphism="explicit"> + <id name="Id"> + <generator class="native"/> + </id> + <bag name="Employers" inverse="true" cascade="persist,merge,save-update" table="EMPLOYER_EMPLOYEE"> + <key column="EMPEE_ID"/> + <many-to-many class="Employer" column="EMPER_ID" /> + </bag> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Operations/MergeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/MergeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/MergeFixture.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,705 @@ +using System.Collections.Generic; +using NHibernate.Criterion; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.Operations +{ + [TestFixture] + public class MergeFixture : AbstractOperationTestCase + { + protected override void OnTearDown() + { + Cleanup(); + } + + private void Cleanup() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from NumberedNode where parent is not null"); + s.Delete("from NumberedNode"); + + s.Delete("from Node where parent is not null"); + s.Delete("from Node"); + + s.Delete("from VersionedEntity where parent is not null"); + s.Delete("from VersionedEntity"); + s.Delete("from TimestampedEntity"); + + s.Delete("from Competitor"); + s.Delete("from Competition"); + + s.Delete("from Employer"); + + tx.Commit(); + } + } + } + + [Test] + public void DeleteAndMerge() + { + using (ISession s = OpenSession()) + { + s.BeginTransaction(); + var jboss = new Employer(); + s.Persist(jboss); + s.Transaction.Commit(); + s.Clear(); + + s.BeginTransaction(); + var otherJboss = s.Get<Employer>(jboss.Id); + s.Delete(otherJboss); + s.Transaction.Commit(); + s.Clear(); + jboss.Vers = 1; + s.BeginTransaction(); + s.Merge(jboss); + s.Transaction.Commit(); + } + } + + [Test] + public void MergeBidiForeignKeyOneToOne() + { + Person p; + Address a; + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + p = new Person {Name = "steve"}; + a = new Address {StreetAddress = "123 Main", City = "Austin", Country = "US", Resident = p}; + s.Persist(a); + s.Persist(p); + tx.Commit(); + } + } + + ClearCounts(); + + p.Address.StreetAddress = "321 Main"; + + using (ISession s = OpenSession()) + { + using (s.BeginTransaction()) + { + p = (Person) s.Merge(p); + s.Transaction.Commit(); + } + } + + AssertInsertCount(0); + AssertUpdateCount(0); // no cascade + AssertDeleteCount(0); + + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete(a); + s.Delete(p); + tx.Commit(); + } + } + } + + [Test, Ignore("Need some more investigation about id sync.")] + public void MergeBidiPrimayKeyOneToOne() + { + Person p; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + p = new Person {Name = "steve"}; + new PersonalDetails {SomePersonalDetail = "I have big feet", Person = p}; + s.Persist(p); + tx.Commit(); + } + + ClearCounts(); + + p.Details.SomePersonalDetail = p.Details.SomePersonalDetail + " and big hands too"; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + p = (Person) s.Merge(p); + tx.Commit(); + } + + AssertInsertCount(0); + AssertUpdateCount(1); + AssertDeleteCount(0); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete(p); + tx.Commit(); + } + } + + [Test] + public void MergeDeepTree() + { + ClearCounts(); + + ISession s = OpenSession(); + ITransaction tx = s.BeginTransaction(); + var root = new Node {Name = "root"}; + var child = new Node {Name = "child"}; + var grandchild = new Node {Name = "grandchild"}; + root.AddChild(child); + child.AddChild(grandchild); + s.Merge(root); + tx.Commit(); + s.Close(); + + AssertInsertCount(3); + AssertUpdateCount(0); + ClearCounts(); + + grandchild.Description = "the grand child"; + var grandchild2 = new Node {Name = "grandchild2"}; + child.AddChild(grandchild2); + + s = OpenSession(); + tx = s.BeginTransaction(); + s.Merge(root); + tx.Commit(); + s.Close(); + + AssertInsertCount(1); + AssertUpdateCount(1); + ClearCounts(); + + var child2 = new Node {Name = "child2"}; + var grandchild3 = new Node {Name = "grandchild3"}; + child2.AddChild(grandchild3); + root.AddChild(child2); + + s = OpenSession(); + tx = s.BeginTransaction(); + s.Merge(root); + tx.Commit(); + s.Close(); + + AssertInsertCount(2); + AssertUpdateCount(0); + ClearCounts(); + + s = OpenSession(); + tx = s.BeginTransaction(); + s.Delete(grandchild); + s.Delete(grandchild2); + s.Delete(grandchild3); + s.Delete(child); + s.Delete(child2); + s.Delete(root); + tx.Commit(); + s.Close(); + } + + [Test] + public void MergeDeepTreeWithGeneratedId() + { + ClearCounts(); + + NumberedNode root; + NumberedNode child; + NumberedNode grandchild; + using (ISession s = OpenSession()) + { + ITransaction tx = s.BeginTransaction(); + root = new NumberedNode("root"); + child = new NumberedNode("child"); + grandchild = new NumberedNode("grandchild"); + root.AddChild(child); + child.AddChild(grandchild); + root = (NumberedNode) s.Merge(root); + tx.Commit(); + } + + AssertInsertCount(3); + AssertUpdateCount(0); + ClearCounts(); + + IEnumerator<NumberedNode> rit = root.Children.GetEnumerator(); + rit.MoveNext(); + child = rit.Current; + IEnumerator<NumberedNode> cit = child.Children.GetEnumerator(); + cit.MoveNext(); + grandchild = cit.Current; + grandchild.Description = "the grand child"; + var grandchild2 = new NumberedNode("grandchild2"); + child.AddChild(grandchild2); + + using (ISession s = OpenSession()) + { + ITransaction tx = s.BeginTransaction(); + root = (NumberedNode) s.Merge(root); + tx.Commit(); + } + + AssertInsertCount(1); + AssertUpdateCount(1); + ClearCounts(); + + sessions.Evict(typeof (NumberedNode)); + + var child2 = new NumberedNode("child2"); + var grandchild3 = new NumberedNode("grandchild3"); + child2.AddChild(grandchild3); + root.AddChild(child2); + + using (ISession s = OpenSession()) + { + ITransaction tx = s.BeginTransaction(); + root = (NumberedNode) s.Merge(root); + tx.Commit(); + } + + AssertInsertCount(2); + AssertUpdateCount(0); + ClearCounts(); + + using (ISession s = OpenSession()) + { + ITransaction tx = s.BeginTransaction(); + s.Delete("from NumberedNode where name like 'grand%'"); + s.Delete("from NumberedNode where name like 'child%'"); + s.Delete("from NumberedNode"); + tx.Commit(); + } + } + + [Test] + public void MergeManaged() + { + ISession s = OpenSession(); + ITransaction tx = s.BeginTransaction(); + var root = new NumberedNode("root"); + s.Persist(root); + tx.Commit(); + + ClearCounts(); + + tx = s.BeginTransaction(); + var child = new NumberedNode("child"); + root.AddChild(child); + Assert.That(s.Merge(root), Is.SameAs(root)); + IEnumerator<NumberedNode> rit = root.Children.GetEnumerator(); + rit.MoveNext(); + NumberedNode mergedChild = rit.Current; + Assert.That(mergedChild, Is.Not.SameAs(child)); + Assert.That(s.Contains(mergedChild)); + Assert.That(! s.Contains(child)); + Assert.That(root.Children.Count, Is.EqualTo(1)); + Assert.That(root.Children.Contains(mergedChild)); + //assertNotSame( mergedChild, s.Merge(child) ); //yucky :( + tx.Commit(); + + AssertInsertCount(1); + AssertUpdateCount(0); + + Assert.That(root.Children.Count, Is.EqualTo(1)); + Assert.That(root.Children.Contains(mergedChild)); + + tx = s.BeginTransaction(); + Assert.That(s.CreateCriteria(typeof (NumberedNode)).SetProjection(Projections.RowCount()).UniqueResult(), + Is.EqualTo(2)); + tx.Rollback(); + s.Close(); + } + + [Test] + public void MergeManyToManyWithCollectionDeference() + { + // setup base data... + ISession s = OpenSession(); + ITransaction tx = s.BeginTransaction(); + var competition = new Competition(); + competition.Competitors.Add(new Competitor {Name = "Name"}); + competition.Competitors.Add(new Competitor()); + competition.Competitors.Add(new Competitor()); + s.Persist(competition); + tx.Commit(); + s.Close(); + + // the competition graph is now detached: + // 1) create a new List reference to represent the competitors + s = OpenSession(); + tx = s.BeginTransaction(); + var newComp = new List<Competitor>(); + Competitor originalCompetitor = competition.Competitors[0]; + originalCompetitor.Name = "Name2"; + newComp.Add(originalCompetitor); + newComp.Add(new Competitor()); + // 2) set that new List reference unto the Competition reference + competition.Competitors = newComp; + // 3) attempt the merge + var competition2 = (Competition) s.Merge(competition); + tx.Commit(); + s.Close(); + + Assert.That(!(competition == competition2)); + Assert.That(!(competition.Competitors == competition2.Competitors)); + Assert.That(competition2.Competitors.Count, Is.EqualTo(2)); + + s = OpenSession(); + tx = s.BeginTransaction(); + competition = s.Get<Competition>(competition.Id); + Assert.That(competition.Competitors.Count, Is.EqualTo(2)); + s.Delete(competition); + tx.Commit(); + s.Close(); + } + + [Test] + public void MergeStaleVersionFails() + { + ISession s = OpenSession(); + s.BeginTransaction(); + var entity = new VersionedEntity {Id = "entity", Name = "entity"}; + s.Persist(entity); + s.Transaction.Commit(); + s.Close(); + + // make the detached 'entity' reference stale... + s = OpenSession(); + s.BeginTransaction(); + var entity2 = s.Get<VersionedEntity>(entity.Id); + entity2.Name = "entity-name"; + s.Transaction.Commit(); + s.Close(); + + // now try to reattch it + s = OpenSession(); + s.BeginTransaction(); + try + { + s.Merge(entity); + s.Transaction.Commit(); + Assert.Fail("was expecting staleness error"); + } + catch (StaleObjectStateException) + { + // expected outcome... + } + finally + { + s.Transaction.Rollback(); + s.Close(); + Cleanup(); + } + } + + [Test] + public void MergeTree() + { + ClearCounts(); + + ISession s = OpenSession(); + ITransaction tx = s.BeginTransaction(); + var root = new Node {Name = "root"}; + var child = new Node {Name = "child"}; + root.AddChild(child); + s.Persist(root); + tx.Commit(); + s.Close(); + + AssertInsertCount(2); + ClearCounts(); + + root.Description = "The root node"; + child.Description = "The child node"; + + var secondChild = new Node {Name = "second child"}; + + root.AddChild(secondChild); + + s = OpenSession(); + tx = s.BeginTransaction(); + s.Merge(root); + tx.Commit(); + s.Close(); + + AssertInsertCount(1); + AssertUpdateCount(2); + } + + [Test] + public void MergeTreeWithGeneratedId() + { + ClearCounts(); + + ISession s = OpenSession(); + ITransaction tx = s.BeginTransaction(); + var root = new NumberedNode("root"); + var child = new NumberedNode("child"); + root.AddChild(child); + s.Persist(root); + tx.Commit(); + s.Close(); + + AssertInsertCount(2); + ClearCounts(); + + root.Description = "The root node"; + child.Description = "The child node"; + + var secondChild = new NumberedNode("second child"); + + root.AddChild(secondChild); + + s = OpenSession(); + tx = s.BeginTransaction(); + s.Merge(root); + tx.Commit(); + s.Close(); + + AssertInsertCount(1); + AssertUpdateCount(2); + } + + [Test] + public void NoExtraUpdatesOnMerge() + { + ISession s = OpenSession(); + s.BeginTransaction(); + var node = new Node {Name = "test"}; + s.Persist(node); + s.Transaction.Commit(); + s.Close(); + + ClearCounts(); + + // node is now detached, but we have made no changes. so attempt to merge it + // into this new session; this should cause no updates... + s = OpenSession(); + s.BeginTransaction(); + node = (Node) s.Merge(node); + s.Transaction.Commit(); + s.Close(); + + AssertUpdateCount(0); + AssertInsertCount(0); + + /////////////////////////////////////////////////////////////////////// + // as a control measure, now update the node while it is detached and + // make sure we get an update as a result... + node.Description = "new description"; + s = OpenSession(); + s.BeginTransaction(); + node = (Node) s.Merge(node); + s.Transaction.Commit(); + s.Close(); + AssertUpdateCount(1); + AssertInsertCount(0); + /////////////////////////////////////////////////////////////////////// + } + + [Test] + public void NoExtraUpdatesOnMergeVersioned() + { + ISession s = OpenSession(); + s.BeginTransaction(); + var entity = new VersionedEntity {Id = "entity", Name = "entity"}; + s.Persist(entity); + s.Transaction.Commit(); + s.Close(); + + ClearCounts(); + + // entity is now detached, but we have made no changes. so attempt to merge it + // into this new session; this should cause no updates... + s = OpenSession(); + s.BeginTransaction(); + var mergedEntity = (VersionedEntity) s.Merge(entity); + s.Transaction.Commit(); + s.Close(); + + AssertUpdateCount(0); + AssertInsertCount(0); + Assert.That(entity.Version, Is.EqualTo(mergedEntity.Version), "unexpected version increment"); + + /////////////////////////////////////////////////////////////////////// + // as a control measure, now update the node while it is detached and + // make sure we get an update as a result... + entity.Name = "new name"; + s = OpenSession(); + s.BeginTransaction(); + entity = (VersionedEntity) s.Merge(entity); + s.Transaction.Commit(); + s.Close(); + AssertUpdateCount(1); + AssertInsertCount(0); + /////////////////////////////////////////////////////////////////////// + } + + [Test] + public void NoExtraUpdatesOnMergeVersionedWithCollection() + { + ISession s = OpenSession(); + s.BeginTransaction(); + var parent = new VersionedEntity {Id = "parent", Name = "parent"}; + var child = new VersionedEntity {Id = "child", Name = "child"}; + parent.Children.Add(child); + child.Parent = parent; + s.Persist(parent); + s.Transaction.Commit(); + s.Close(); + + ClearCounts(); + + // parent is now detached, but we have made no changes. so attempt to merge it + // into this new session; this should cause no updates... + s = OpenSession(); + s.BeginTransaction(); + var mergedParent = (VersionedEntity) s.Merge(parent); + s.Transaction.Commit(); + s.Close(); + + AssertUpdateCount(0); + AssertInsertCount(0); + Assert.That(parent.Version, Is.EqualTo(mergedParent.Version), "unexpected parent version increment"); + IEnumerator<VersionedEntity> it = mergedParent.Children.GetEnumerator(); + it.MoveNext(); + VersionedEntity mergedChild = it.Current; + Assert.That(child.Version, Is.EqualTo(mergedChild.Version), "unexpected child version increment"); + + /////////////////////////////////////////////////////////////////////// + // as a control measure, now update the node while it is detached and + // make sure we get an update as a result... + mergedParent.Name = "new name"; + mergedParent.Children.Add(new VersionedEntity {Id = "child2", Name = "new child"}); + s = OpenSession(); + s.BeginTransaction(); + parent = (VersionedEntity) s.Merge(mergedParent); + s.Transaction.Commit(); + s.Close(); + AssertUpdateCount(1); + AssertInsertCount(1); + /////////////////////////////////////////////////////////////////////// + } + + [Test] + public void NoExtraUpdatesOnMergeWithCollection() + { + ISession s = OpenSession(); + s.BeginTransaction(); + var parent = new Node {Name = "parent"}; + var child = new Node {Name = "child"}; + parent.Children.Add(child); + child.Parent = parent; + s.Persist(parent); + s.Transaction.Commit(); + s.Close(); + + ClearCounts(); + + // parent is now detached, but we have made no changes. so attempt to merge it + // into this new session; this should cause no updates... + s = OpenSession(); + s.BeginTransaction(); + parent = (Node) s.Merge(parent); + s.Transaction.Commit(); + s.Close(); + + AssertUpdateCount(0); + AssertInsertCount(0); + + /////////////////////////////////////////////////////////////////////// + // as a control measure, now update the node while it is detached and + // make sure we get an update as a result... + IEnumerator<Node> it = parent.Children.GetEnumerator(); + it.MoveNext(); + it.Current.Description = "child's new description"; + parent.Children.Add(new Node {Name = "second child"}); + s = OpenSession(); + s.BeginTransaction(); + parent = (Node) s.Merge(parent); + s.Transaction.Commit(); + s.Close(); + AssertUpdateCount(1); + AssertInsertCount(1); + /////////////////////////////////////////////////////////////////////// + } + + [Test] + public void PersistThenMergeInSameTxnWithTimestamp() + { + ISession s = OpenSession(); + ITransaction tx = s.BeginTransaction(); + var entity = new TimestampedEntity {Id = "test", Name = "test"}; + s.Persist(entity); + s.Merge(new TimestampedEntity {Id = "test", Name = "test-2"}); + + try + { + // control operation... + s.SaveOrUpdate(new TimestampedEntity {Id = "test", Name = "test-3"}); + Assert.Fail("saveOrUpdate() should fail here"); + } + catch (NonUniqueObjectException) + { + // expected behavior + } + + tx.Commit(); + s.Close(); + } + + [Test] + public void PersistThenMergeInSameTxnWithVersion() + { + ISession s = OpenSession(); + ITransaction tx = s.BeginTransaction(); + var entity = new VersionedEntity {Id = "test", Name = "test"}; + s.Persist(entity); + s.Merge(new VersionedEntity {Id = "test", Name = "test-2"}); + + try + { + // control operation... + s.SaveOrUpdate(new VersionedEntity {Id = "test", Name = "test-3"}); + Assert.Fail("saveOrUpdate() should fail here"); + } + catch (NonUniqueObjectException) + { + // expected behavior + } + + tx.Commit(); + s.Close(); + } + + [Test] + public void RecursiveMergeTransient() + { + using (ISession s = OpenSession()) + { + using (ITransaction tx = s.BeginTransaction()) + { + var jboss = new Employer(); + var gavin = new Employee(); + jboss.Employees = new List<Employee> {gavin}; + s.Merge(jboss); + s.Flush(); + jboss = s.CreateQuery("from Employer e join fetch e.Employees").UniqueResult<Employer>(); + Assert.That(NHibernateUtil.IsInitialized(jboss.Employees)); + Assert.That(jboss.Employees.Count, Is.EqualTo(1)); + s.Clear(); + IEnumerator<Employee> it = jboss.Employees.GetEnumerator(); + it.MoveNext(); + + s.Merge(it.Current); + tx.Commit(); + } + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Node.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Node.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Node.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,43 @@ +using System; +using Iesi.Collections.Generic; + +namespace NHibernate.Test.Operations +{ + public class Node + { + private ISet<Node> cascadingChildren = new HashedSet<Node>(); + private ISet<Node> children = new HashedSet<Node>(); + private DateTime created = DateTime.Now; + + public virtual string Name { get; set; } + + public virtual string Description { get; set; } + + public virtual DateTime Created + { + get { return created; } + set { created = value; } + } + + public virtual Node Parent { get; set; } + + public virtual ISet<Node> Children + { + get { return children; } + set { children = value; } + } + + public virtual ISet<Node> CascadingChildren + { + get { return cascadingChildren; } + set { cascadingChildren = value; } + } + + public virtual Node AddChild(Node child) + { + children.Add(child); + child.Parent = this; + return this; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/Node.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Node.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Node.hbm.xml 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Operations"> + + <class name="Node" polymorphism="explicit"> + <id name="Name"> + <generator class="assigned"/> + </id> + <property name="Description"/> + <many-to-one name="Parent"/> + <property name="Created" not-null="true"/> + <set name="Children" inverse="true" cascade="persist,merge,save-update,evict"> + <key column="parent"/> + <one-to-many class="Node"/> + </set> + <set name="CascadingChildren" inverse="false" cascade="persist,merge,save-update,evict,delete"> + <key column="CASC_PARENT"/> + <one-to-many class="Node"/> + </set> + </class> + + <class name="NumberedNode" polymorphism="explicit"> + <id name="Id" unsaved-value="0"> + <generator class="native"/> + </id> + <property name="Name"> + <column name="name" index="iname" not-null="true"/> + </property> + <property name="Description"/> + <property name="Created" not-null="true"/> + <many-to-one name="Parent" class="NumberedNode"/> + <set name="Children" inverse="true" cascade="persist,merge,save-update" access="field.camelcase"> + <key column="parent"/> + <one-to-many class="NumberedNode"/> + </set> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Operations/NumberedNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/NumberedNode.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/NumberedNode.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using Iesi.Collections.Generic; + +namespace NHibernate.Test.Operations +{ + public class NumberedNode + { + private readonly ISet<NumberedNode> children = new HashedSet<NumberedNode>(); + + protected NumberedNode() {} + + public NumberedNode(string name) + { + Name = name; + Created = DateTime.Now; + } + + public virtual long Id { get; set; } + public virtual string Name { get; set; } + public virtual NumberedNode Parent { get; set; } + + public virtual ICollection<NumberedNode> Children + { + get { return children; } + } + + public virtual string Description { get; set; } + public virtual DateTime Created { get; set; } + + public virtual NumberedNode AddChild(NumberedNode child) + { + children.Add(child); + child.Parent = this; + return this; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/OneToOne.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/OneToOne.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/OneToOne.hbm.xml 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!-- + Mappings demonstrating bidirectional one-to-one mappings for testing + with various operations. + + Person -> Address is modeled as a bidirectional one to one based on FK. + Person -> Details is modeled as a bidirectional one to one based on PK. +--> + +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Operations"> + + <class name="Person" table="OPS_PERSON"> + <id name="Id" column="ID" type="long"> + <generator class="increment"/> + </id> + <property name="Name" column="NAME" type="string"/> + <one-to-one name="Address" class="Address" property-ref="Resident" /> + <one-to-one name="Details" class="PersonalDetails" cascade="all" /> + </class> + + <class name="Address" table="OPS_ADDRESS"> + <id name="Id" column="ID" type="long"> + <generator class="increment"/> + </id> + <property name="StreetAddress" column="STREET" type="string" /> + <property name="City" column="CITY" type="string" /> + <property name="Country" column="CTRY" type="string" /> + <many-to-one name="Resident" column="RESIDENT" class="Person" /> + </class> + + <class name="PersonalDetails" table="OPS_PERS_DETAIL"> + <id name="Id" column="ID" type="long"> + <generator class="increment"/> + </id> + <property name="SomePersonalDetail" column="SOME_DETAIL" type="string"/> + <one-to-one name="Person" class="Person" constrained="true" /> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/OptLockEntity.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/OptLockEntity.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/OptLockEntity.hbm.xml 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.Operations"> + + <class name="VersionedEntity" table="V_ENTITY"> + <id name="Id" column="ID" type="string"> + <generator class="assigned"/> + </id> + <version name="Version" column="VERS" type="long" /> + <property name="Name" column="NAME" type="string" /> + <many-to-one name="Parent" class="VersionedEntity"/> + <set name="Children" inverse="true" cascade="persist,merge,save-update,evict,delete"> + <key column="parent"/> + <one-to-many class="VersionedEntity"/> + </set> + </class> + + <class name="TimestampedEntity" table="T_ENTITY"> + <id name="Id" column="ID" type="string"> + <generator class="assigned"/> + </id> + <timestamp name="Timestamp" column="TS" /> + <property name="Name" column="NAME" type="string" /> + </class> + +</hibernate-mapping> + Added: trunk/nhibernate/src/NHibernate.Test/Operations/Person.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/Person.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/Person.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,10 @@ +namespace NHibernate.Test.Operations +{ + public class Person + { + public virtual long Id { get; set; } + public virtual string Name { get; set; } + public virtual Address Address { get; set; } + public virtual PersonalDetails Details { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/PersonalDetails.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/PersonalDetails.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/PersonalDetails.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,19 @@ +namespace NHibernate.Test.Operations +{ + public class PersonalDetails + { + private Person person; + public virtual long Id { get; set; } + public virtual string SomePersonalDetail { get; set; } + + public virtual Person Person + { + get { return person; } + set + { + person = value; + person.Details = this; + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/TimestampedEntity.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/TimestampedEntity.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/TimestampedEntity.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,11 @@ +using System; + +namespace NHibernate.Test.Operations +{ + public class TimestampedEntity + { + public virtual string Id { get; set; } + public virtual string Name { get; set; } + public virtual DateTime Timestamp { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Operations/VersionedEntity.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Operations/VersionedEntity.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Operations/VersionedEntity.cs 2008-11-12 02:40:14 UTC (rev 3907) @@ -0,0 +1,18 @@ +using Iesi.Collections.Generic; + +namespace NHibernate.Test.Operations +{ + public class VersionedEntity + { + public VersionedEntity() + { + Children = new HashedSet<VersionedEntity>(); + } + + public virtual string Id { get; set; } + public virtual string Name { get; set; } + public virtual long Version { get; set; } + public virtual VersionedEntity Parent { get; set; } + public virtual ISet<VersionedEntity> Children { get; set; } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-10 17:47:32
|
Revision: 3906 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3906&view=rev Author: fabiomaulo Date: 2008-11-10 17:47:28 +0000 (Mon, 10 Nov 2008) Log Message: ----------- Bug fix in error message Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs Modified: trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2008-11-10 17:29:13 UTC (rev 3905) +++ trunk/nhibernate/src/NHibernate/Exceptions/ADOExceptionHelper.cs 2008-11-10 17:47:28 UTC (rev 3906) @@ -12,7 +12,7 @@ { public const string SQLNotAvailable = "SQL not available"; - /// <summary> + /// <summary> /// Converts the given SQLException into NHibernate's ADOException hierarchy, as well as performing /// appropriate logging. /// </summary> @@ -21,9 +21,10 @@ /// <param name="message">An optional error message.</param> /// <param name="sql">The SQL executed.</param> /// <returns> The converted <see cref="ADOException"/>.</returns> - public static ADOException Convert(ISQLExceptionConverter converter, Exception sqlException, string message, SqlString sql) + public static ADOException Convert(ISQLExceptionConverter converter, Exception sqlException, string message, + SqlString sql) { - sql = TryGetActualSqlQuery(sqlException, sql); + sql = TryGetActualSqlQuery(sqlException, sql); ADOExceptionReporter.LogExceptions(sqlException, ExtendMessage(message, sql, null, null)); return converter.Convert(sqlException, message, sql); } @@ -38,16 +39,16 @@ /// <returns> The converted <see cref="ADOException"/>.</returns> public static ADOException Convert(ISQLExceptionConverter converter, Exception sqlException, string message) { - SqlString sql = new SqlString(SQLNotAvailable); - sql = TryGetActualSqlQuery(sqlException, sql); - return Convert(converter, sqlException, message, sql); + var sql = new SqlString(SQLNotAvailable); + sql = TryGetActualSqlQuery(sqlException, sql); + return Convert(converter, sqlException, message, sql); } public static ADOException Convert(ISQLExceptionConverter converter, Exception sqle, string message, SqlString sql, - object[] parameterValues, IDictionary<string, TypedValue> namedParameters) + object[] parameterValues, IDictionary<string, TypedValue> namedParameters) { - sql = TryGetActualSqlQuery(sqle, sql); - string extendMessage = ExtendMessage(message, sql, parameterValues, namedParameters); + sql = TryGetActualSqlQuery(sqle, sql); + string extendMessage = ExtendMessage(message, sql, parameterValues, namedParameters); ADOExceptionReporter.LogExceptions(sqle, extendMessage); return new ADOException(extendMessage, sqle, sql); } @@ -58,7 +59,7 @@ public static DbException ExtractDbException(Exception sqlException) { Exception baseException = sqlException; - DbException result = sqlException as DbException; + var result = sqlException as DbException; while (result == null && baseException != null) { baseException = baseException.InnerException; @@ -67,46 +68,41 @@ return result; } - public static string ExtendMessage(string message, SqlString sql, object[] parameterValues, IDictionary<string, TypedValue> namedParameters) + public static string ExtendMessage(string message, SqlString sql, object[] parameterValues, + IDictionary<string, TypedValue> namedParameters) { - StringBuilder sb = new StringBuilder(); - sb.Append(message).Append(Environment.NewLine). - Append("[ ").Append(sql).Append(" ]"); + var sb = new StringBuilder(); + sb.Append(message).Append(Environment.NewLine).Append("[ ").Append(sql).Append(" ]"); if (parameterValues != null && parameterValues.Length > 0) { sb.Append(Environment.NewLine).Append("Positional parameters: "); - int index = 0; - foreach (object parameterValue in parameterValues) + for (int index = 0; index < parameterValues.Length; index++) { - object value = parameterValue; - if (value == null) - value = "null"; + object value = parameterValues[index] ?? "null"; sb.Append(" #").Append(index).Append(">").Append(value); } } if (namedParameters != null && namedParameters.Count > 0) { sb.Append(Environment.NewLine); - foreach (KeyValuePair<string, TypedValue> namedParameter in namedParameters) + foreach (var namedParameter in namedParameters) { - object value = namedParameter.Value.Value; - if (value == null) - value = "null"; - sb.Append(" ").Append("Name:").Append(namedParameter.Key) - .Append(" - Value:").Append(value); - + object value = namedParameter.Value.Value ?? "null"; + sb.Append(" ").Append("Name:").Append(namedParameter.Key).Append(" - Value:").Append(value); } } sb.Append(Environment.NewLine); return sb.ToString(); } - public static SqlString TryGetActualSqlQuery(Exception sqle, SqlString sql) - { - string query = (string)sqle.Data["actual-sql-query"]; - if(query!=null) - sql = new SqlString(query); - return sql; - } + public static SqlString TryGetActualSqlQuery(Exception sqle, SqlString sql) + { + var query = (string) sqle.Data["actual-sql-query"]; + if (query != null) + { + sql = new SqlString(query); + } + return sql; + } } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-10 17:29:16
|
Revision: 3905 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3905&view=rev Author: fabiomaulo Date: 2008-11-10 17:29:13 +0000 (Mon, 10 Nov 2008) Log Message: ----------- Test available only where the drive support multi-queries Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1508/Fixture.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1508/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1508/Fixture.cs 2008-11-10 13:31:01 UTC (rev 3904) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1508/Fixture.cs 2008-11-10 17:29:13 UTC (rev 3905) @@ -1,9 +1,5 @@ using System; -using System.Collections; -using System.Collections.Generic; - -using NHibernate.Criterion; - +using NHibernate.Driver; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1508 @@ -11,6 +7,17 @@ [TestFixture] public class Fixture : BugTestCase { + [TestFixtureSetUp] + public void CheckMultiQuerySupport() + { + TestFixtureSetUp(); + IDriver driver = sessions.ConnectionProvider.Driver; + if (!driver.SupportsMultipleQueries) + { + Assert.Ignore("Driver {0} does not support multi-queries", driver.GetType().FullName); + } + } + protected override void OnSetUp() { Person john = new Person(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-10 13:31:03
|
Revision: 3904 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3904&view=rev Author: fabiomaulo Date: 2008-11-10 13:31:01 +0000 (Mon, 10 Nov 2008) Log Message: ----------- Revert patch NH-1155 because are breaking all dialect with SupportsVariableLimit=true. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/SubselectFetch.cs trunk/nhibernate/src/NHibernate/Loader/Loader.cs trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs trunk/nhibernate/src/NHibernate.Test/SubselectFetchTest/SubselectFetchFixture.cs Modified: trunk/nhibernate/src/NHibernate/Engine/SubselectFetch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/SubselectFetch.cs 2008-11-08 21:31:30 UTC (rev 3903) +++ trunk/nhibernate/src/NHibernate/Engine/SubselectFetch.cs 2008-11-10 13:31:01 UTC (rev 3904) @@ -8,23 +8,21 @@ { public class SubselectFetch { - private readonly ISet<EntityKey> resultingEntityKeys; - private readonly SqlString queryString; private readonly string alias; - private readonly Dialect.Dialect dialect; private readonly ILoadable loadable; - private readonly QueryParameters queryParameters; private readonly IDictionary<string, int[]> namedParameterLocMap; + private readonly QueryParameters queryParameters; + private readonly SqlString queryString; + private readonly ISet<EntityKey> resultingEntityKeys; - public SubselectFetch(string alias, Dialect.Dialect dialect, ILoadable loadable, QueryParameters queryParameters, - ISet<EntityKey> resultingEntityKeys, IDictionary<string, int[]> namedParameterLocMap) + public SubselectFetch(string alias, ILoadable loadable, QueryParameters queryParameters, + ISet<EntityKey> resultingEntityKeys, IDictionary<string, int[]> namedParameterLocMap) { this.resultingEntityKeys = resultingEntityKeys; this.queryParameters = queryParameters; this.namedParameterLocMap = namedParameterLocMap; this.loadable = loadable; this.alias = alias; - this.dialect = dialect; queryString = queryParameters.FilteredSQL.GetSubselectString(); } @@ -39,6 +37,11 @@ get { return resultingEntityKeys; } } + public IDictionary<string, int[]> NamedParameterLocMap + { + get { return namedParameterLocMap; } + } + public SqlString ToSubselectString(string ukname) { string[] joinColumns = ukname == null @@ -47,39 +50,12 @@ SqlString sqlString = new SqlStringBuilder().Add("select ").Add(StringHelper.Join(", ", joinColumns)).Add(queryString).ToSqlString(); - - RowSelection selection = queryParameters.RowSelection; - - bool useLimit = Loader.Loader.UseLimit(selection, dialect); - bool hasFirstRow = Loader.Loader.GetFirstRow(selection) > 0; - bool useOffset = hasFirstRow && useLimit && dialect.SupportsLimitOffset; - - if ((useLimit || hasFirstRow) == false) - { - return sqlString; - } - - sqlString = AppendOrderByIfNeeded(sqlString); - - return - dialect.GetLimitString(sqlString.Trim(), useOffset ? Loader.Loader.GetFirstRow(selection) : 0, - Loader.Loader.GetMaxOrLimit(dialect, selection)); + return sqlString; } - private SqlString AppendOrderByIfNeeded(SqlString sqlString) - { - SqlString orderByOrEmpty = queryParameters.FilteredSQL.SubstringStartingWithLast("order by"); - return sqlString.Append(orderByOrEmpty); - } - public override string ToString() { return "SubselectFetch(" + queryString + ')'; } - - public IDictionary<string, int[]> NamedParameterLocMap - { - get { return namedParameterLocMap; } - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Loader/Loader.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-11-08 21:31:30 UTC (rev 3903) +++ trunk/nhibernate/src/NHibernate/Loader/Loader.cs 2008-11-10 13:31:01 UTC (rev 3904) @@ -516,7 +516,7 @@ if (rowKeys[i] != null && loadables[i].HasSubselectLoadableCollections) { SubselectFetch subselectFetch = - new SubselectFetch(aliases[i], factory.Dialect, loadables[i], queryParameters, keySets[i], namedParameterLocMap); + new SubselectFetch(aliases[i], loadables[i], queryParameters, keySets[i], namedParameterLocMap); session.PersistenceContext.BatchFetchQueue.AddSubselect(rowKeys[i], subselectFetch); } Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2008-11-08 21:31:30 UTC (rev 3903) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/CriteriaQueryTest.cs 2008-11-10 13:31:01 UTC (rev 3904) @@ -431,7 +431,7 @@ s.Close(); } - [Test] + [Test, Ignore("Not supported.")] public void NH_1155_ShouldNotLoadAllChildrenInPagedSubSelect() { if (this.Dialect.GetType().Equals((typeof(MsSql2000Dialect)))) Modified: trunk/nhibernate/src/NHibernate.Test/SubselectFetchTest/SubselectFetchFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SubselectFetchTest/SubselectFetchFixture.cs 2008-11-08 21:31:30 UTC (rev 3903) +++ trunk/nhibernate/src/NHibernate.Test/SubselectFetchTest/SubselectFetchFixture.cs 2008-11-10 13:31:01 UTC (rev 3904) @@ -248,7 +248,7 @@ Assert.AreEqual(3, sessions.Statistics.PrepareStatementCount); r = (Parent) s.Get(typeof(Parent), r.Name); - Assert.IsFalse(NHibernateUtil.IsInitialized(r.Children)); + Assert.IsTrue(NHibernateUtil.IsInitialized(r.Children)); // The test for True is the test of H3.2 Assert.IsFalse(NHibernateUtil.IsInitialized(r.MoreChildren)); Assert.AreEqual(r.Children.Count, 1); Assert.AreEqual(r.MoreChildren.Count, 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 21:55:40
|
Revision: 3903 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3903&view=rev Author: fabiomaulo Date: 2008-11-08 21:31:30 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Little refactoring Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 21:20:57 UTC (rev 3902) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 21:31:30 UTC (rev 3903) @@ -1063,7 +1063,6 @@ <Compile Include="Type\CustomCollectionType.cs" /> <Compile Include="Type\EmbeddedComponentType.cs" /> <Compile Include="Type\EnumCharType.cs" /> - <Compile Include="Type\EnumStringType`1.cs" /> <Compile Include="Type\GenericOrderedSetType.cs" /> <Compile Include="Type\ICacheAssembler.cs" /> <Compile Include="Type\OrderedSetType.cs" /> Modified: trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs 2008-11-08 21:20:57 UTC (rev 3902) +++ trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs 2008-11-08 21:31:30 UTC (rev 3903) @@ -2,7 +2,6 @@ using System.Data; using NHibernate.Engine; using NHibernate.SqlTypes; -using NHibernate.Util; namespace NHibernate.Type { @@ -64,7 +63,6 @@ [Serializable] public abstract class EnumStringType : AbstractEnumType { - /// <summary> /// Hardcoding of <c>255</c> for the maximum length /// of the Enum name that will be saved to the db. @@ -79,20 +77,27 @@ /// Initializes a new instance of <see cref="EnumStringType"/>. /// </summary> /// <param name="enumClass">The <see cref="System.Type"/> of the Enum.</param> - protected EnumStringType(System.Type enumClass) - : this(enumClass, MaxLengthForEnumString) - { - } + protected EnumStringType(System.Type enumClass) : this(enumClass, MaxLengthForEnumString) {} /// <summary> /// Initializes a new instance of <see cref="EnumStringType"/>. /// </summary> /// <param name="enumClass">The <see cref="System.Type"/> of the Enum.</param> /// <param name="length">The length of the string that can be written to the column.</param> - protected EnumStringType(System.Type enumClass, int length) - :base(SqlTypeFactory.GetString(length),enumClass) - { + protected EnumStringType(System.Type enumClass, int length) : base(SqlTypeFactory.GetString(length), enumClass) {} + /// <summary> + /// + /// </summary> + /// <remarks> + /// This appends <c>enumstring - </c> to the beginning of the underlying + /// enums name so that <see cref="System.Enum"/> could still be stored + /// using the underlying value through the <see cref="PersistentEnumType"/> + /// also. + /// </remarks> + public override string Name + { + get { return "enumstring - " + ReturnedClass.Name; } } /// <summary> @@ -109,7 +114,7 @@ } catch (ArgumentException ae) { - throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, this.ReturnedClass.Name), ae); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, ReturnedClass.Name), ae); } } @@ -132,14 +137,14 @@ /// <param name="index"></param> public override void Set(IDbCommand cmd, object value, int index) { - IDataParameter par = (IDataParameter) cmd.Parameters[index]; + var par = (IDataParameter) cmd.Parameters[index]; if (value == null) { par.Value = DBNull.Value; } else { - par.Value = Enum.Format(this.ReturnedClass, value, "G"); + par.Value = Enum.Format(ReturnedClass, value, "G"); } } @@ -176,20 +181,6 @@ /// <summary> /// /// </summary> - /// <remarks> - /// This appends <c>enumstring - </c> to the beginning of the underlying - /// enums name so that <see cref="System.Enum"/> could still be stored - /// using the underlying value through the <see cref="PersistentEnumType"/> - /// also. - /// </remarks> - public override string Name - { - get { return "enumstring - " + this.ReturnedClass.Name; } - } - - /// <summary> - /// - /// </summary> /// <param name="value"></param> /// <returns></returns> public override string ToString(object value) @@ -221,10 +212,15 @@ return (value == null) ? null : GetValue(value); } - public override string ObjectToSQLString(object value, Dialect.Dialect dialect) { return GetValue(value).ToString(); } } + + [Serializable] + public class EnumStringType<T> : EnumStringType + { + public EnumStringType() : base(typeof (T)) {} + } } \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs 2008-11-08 21:20:57 UTC (rev 3902) +++ trunk/nhibernate/src/NHibernate/Type/EnumStringType`1.cs 2008-11-08 21:31:30 UTC (rev 3903) @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace NHibernate.Type -{ - [Serializable] - public class EnumStringType<T> : EnumStringType - { - public EnumStringType():base(typeof(T)) - { - - } - } -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 21:21:02
|
Revision: 3902 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3902&view=rev Author: fabiomaulo Date: 2008-11-08 21:20:57 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Improv: ignore transient entities when on session.Refresh Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs 2008-11-08 17:07:55 UTC (rev 3901) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs 2008-11-08 21:20:57 UTC (rev 3902) @@ -97,8 +97,10 @@ source.FetchProfile = "refresh"; object result = persister.Load(id, obj, @event.LockMode, source); source.FetchProfile = previousFetchProfile; - - UnresolvableObjectException.ThrowIfNull(result, id, persister.EntityName); + // NH Different behavior : we are ignoring transient entities without throw any kind of exception + // because a transient entity is "self refreshed" + if (!ForeignKeys.IsTransient(persister.EntityName, obj, result == null, @event.Session)) + UnresolvableObjectException.ThrowIfNull(result, id, persister.EntityName); } // Evict collections from the factory-level cache Modified: trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs 2008-11-08 17:07:55 UTC (rev 3901) +++ trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs 2008-11-08 21:20:57 UTC (rev 3902) @@ -16,7 +16,7 @@ protected override IList Mappings { - get { return new string[] { "Cascade.Job.hbm.xml", "Cascade.JobBatch.hbm.xml" }; } + get { return new[] { "Cascade.Job.hbm.xml", "Cascade.JobBatch.hbm.xml" }; } } [Test] @@ -57,5 +57,58 @@ session.Transaction.Enlist(cmd); cmd.ExecuteNonQuery(); } + + [Test] + public void RefreshIgnoringTransient() + { + // No exception expected + ISession session = OpenSession(); + ITransaction txn = session.BeginTransaction(); + + var batch = new JobBatch(DateTime.Now); + session.Refresh(batch); + + txn.Rollback(); + session.Close(); + } + + [Test] + public void RefreshIgnoringTransientInCollection() + { + ISession session = OpenSession(); + ITransaction txn = session.BeginTransaction(); + + var batch = new JobBatch(DateTime.Now); + batch.CreateJob().ProcessingInstructions = "Just do it!"; + session.Persist(batch); + session.Flush(); + + batch.CreateJob().ProcessingInstructions = "I know you can do it!"; + session.Refresh(batch); + Assert.That(batch.Jobs.Count == 1); + + txn.Rollback(); + session.Close(); + } + + [Test] + public void RefreshNotIgnoringTransientByUnsavedValue() + { + ISession session = OpenSession(); + ITransaction txn = session.BeginTransaction(); + + var batch = new JobBatch { BatchDate = DateTime.Now, Id = 1 }; + try + { + session.Refresh(batch); + } + catch (UnresolvableObjectException) + { + // as expected + txn.Rollback(); + session.Close(); + } + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 17:07:58
|
Revision: 3901 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3901&view=rev Author: fabiomaulo Date: 2008-11-08 17:07:55 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Fix NH-1561 by Mark Junker (with modifications) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs 2008-11-08 16:15:12 UTC (rev 3900) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -20,6 +20,11 @@ this.connection = connection; } + protected DbConnection Connection + { + get { return connection; } + } + #region IDataBaseSchema Members public virtual bool StoresMixedCaseQuotedIdentifiers Added: trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/SybaseAnywhereMetaData.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -0,0 +1,139 @@ +using System; +using System.Data; +using System.Data.Common; + +namespace NHibernate.Dialect.Schema +{ + // Metadata for connections using the iAnywhere.Data.SQLAnywhere ADO.NET provider + public class SybaseAnywhereDataBaseMetaData : AbstractDataBaseSchema + { + public SybaseAnywhereDataBaseMetaData(DbConnection pObjConnection) : base(pObjConnection) {} + + public override ITableMetadata GetTableMetadata(DataRow rs, bool extras) + { + return new SybaseAnywhereTableMetaData(rs, this, extras); + } + + public override DataTable GetTables(string catalog, string schemaPattern, string tableNamePattern, string[] types) + { + var restrictions = new[] {schemaPattern, tableNamePattern, null}; + DataTable objTbl = Connection.GetSchema("Tables", restrictions); + return objTbl; + } + + public override DataTable GetIndexInfo(string catalog, string schemaPattern, string tableName) + { + var restrictions = new[] {schemaPattern, tableName, null}; + DataTable objTbl = Connection.GetSchema("Indexes", restrictions); + return objTbl; + } + + public override DataTable GetIndexColumns(string catalog, string schemaPattern, string tableName, string indexName) + { + var restrictions = new[] {schemaPattern, tableName, indexName, null}; + DataTable objTbl = Connection.GetSchema("IndexColumns", restrictions); + return objTbl; + } + + public override DataTable GetColumns(string catalog, string schemaPattern, string tableNamePattern, + string columnNamePattern) + { + var restrictions = new[] {schemaPattern, tableNamePattern, null}; + DataTable objTbl = Connection.GetSchema("Columns", restrictions); + return objTbl; + } + + public override DataTable GetForeignKeys(string catalog, string schema, string table) + { + var restrictions = new[] {schema, table, null}; + DataTable objTbl = Connection.GetSchema("ForeignKeys", restrictions); + return objTbl; + } + } + + public class SybaseAnywhereTableMetaData : AbstractTableMetadata + { + public SybaseAnywhereTableMetaData(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) {} + + protected override IColumnMetadata GetColumnMetadata(DataRow rs) + { + return new SybaseAnywhereColumnMetaData(rs); + } + + protected override string GetColumnName(DataRow rs) + { + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override string GetConstraintName(DataRow rs) + { + // There is no thing like a constraint name for ASA9 - so + // we just use the column name here ... + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs) + { + return new SybaseAnywhereForeignKeyMetaData(rs); + } + + protected override IIndexMetadata GetIndexMetadata(DataRow rs) + { + return new SybaseAnywhereIndexMetaData(rs); + } + + protected override string GetIndexName(DataRow rs) + { + return (string) rs["INDEX_NAME"]; + } + + protected override void ParseTableInfo(DataRow rs) + { + Catalog = null; + Schema = Convert.ToString(rs["TABLE_SCHEMA"]); + if (string.IsNullOrEmpty(Schema)) + { + Schema = null; + } + Name = Convert.ToString(rs["TABLE_NAME"]); + } + } + + public class SybaseAnywhereColumnMetaData : AbstractColumnMetaData + { + public SybaseAnywhereColumnMetaData(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["COLUMN_NAME"]); + object objValue = rs["COLUMN_SIZE"]; + if (objValue != DBNull.Value) + { + ColumnSize = Convert.ToInt32(objValue); + } + objValue = rs["PRECISION"]; + if (objValue != DBNull.Value) + { + NumericalPrecision = Convert.ToInt32(objValue); + } + Nullable = Convert.ToString(rs["IS_NULLABLE"]); + TypeName = Convert.ToString(rs["DATA_TYPE"]); + } + } + + public class SybaseAnywhereIndexMetaData : AbstractIndexMetadata + { + public SybaseAnywhereIndexMetaData(DataRow rs) : base(rs) + { + Name = (string) rs["INDEX_NAME"]; + } + } + + public class SybaseAnywhereForeignKeyMetaData : AbstractForeignKeyMetadata + { + public SybaseAnywhereForeignKeyMetaData(DataRow rs) : base(rs) + { + // There is no thing like a constraint name for ASA9 - so + // we just use the column name here ... + Name = (string) rs["COLUMN_NAME"]; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/SybaseASA10Dialect.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -0,0 +1,15 @@ +using System.Data; + +namespace NHibernate.Dialect +{ + public class SybaseASA10Dialect : SybaseASA9Dialect + { + public SybaseASA10Dialect() + { + RegisterColumnType(DbType.StringFixedLength, 255, "NCHAR($l)"); + RegisterColumnType(DbType.String, 1073741823, "LONG NVARCHAR"); + RegisterColumnType(DbType.String, 255, "NVARCHAR($l)"); + RegisterColumnType(DbType.String, "LONG NVARCHAR"); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/SybaseASA9Dialect.cs 2008-11-08 17:07:55 UTC (rev 3901) @@ -0,0 +1,91 @@ +using System.Data; +using System.Data.Common; +using NHibernate.Dialect.Function; +using NHibernate.Dialect.Schema; +using NHibernate.SqlCommand; + +namespace NHibernate.Dialect +{ + public class SybaseASA9Dialect : SybaseAnywhereDialect + { + public SybaseASA9Dialect() + { + RegisterColumnType(DbType.AnsiStringFixedLength, 255, "CHAR($l)"); + RegisterColumnType(DbType.AnsiString, "VARCHAR(255)"); + RegisterColumnType(DbType.AnsiString, 255, "VARCHAR($l)"); + RegisterColumnType(DbType.AnsiString, 2147483647, "LONG VARCHAR"); // should use the IType.ClobType + RegisterColumnType(DbType.Binary, "BINARY(255)"); + RegisterColumnType(DbType.Binary, 2147483647, "LONG BINARY"); // should use the IType.BlobType + RegisterColumnType(DbType.Boolean, "BIT"); + RegisterColumnType(DbType.Byte, "SMALLINT"); + RegisterColumnType(DbType.Currency, "DECIMAL(18,4)"); + RegisterColumnType(DbType.Date, "DATE"); + RegisterColumnType(DbType.DateTime, "TIMESTAMP"); + RegisterColumnType(DbType.Decimal, "DECIMAL(18,5)"); // NUMERIC(18,5) is equivalent to DECIMAL(18,5) + RegisterColumnType(DbType.Decimal, 18, "DECIMAL(18,$l)"); + RegisterColumnType(DbType.Double, "DOUBLE"); + RegisterColumnType(DbType.Guid, "CHAR(16)"); + RegisterColumnType(DbType.Int16, "SMALLINT"); + RegisterColumnType(DbType.Int32, "INTEGER"); + RegisterColumnType(DbType.Int64, "BIGINT"); + RegisterColumnType(DbType.Single, "FLOAT"); + RegisterColumnType(DbType.StringFixedLength, 255, "CHAR($l)"); + RegisterColumnType(DbType.String, 1073741823, "LONG VARCHAR"); + RegisterColumnType(DbType.String, 255, "VARCHAR($l)"); + RegisterColumnType(DbType.String, "LONG VARCHAR"); + RegisterColumnType(DbType.Time, "TIME"); + RegisterColumnType(DbType.SByte, "SMALLINT"); + RegisterColumnType(DbType.UInt16, "UNSIGNED SMALLINT"); + RegisterColumnType(DbType.UInt32, "UNSIGNED INT"); + RegisterColumnType(DbType.UInt64, "UNSIGNED BIGINT"); + RegisterColumnType(DbType.VarNumeric, "NUMERIC($l)"); + //RegisterColumnType(DbType.Xml, "TEXT"); + + // Override standard HQL function + RegisterFunction("current_timestamp", new StandardSQLFunction("current_timestamp")); + RegisterFunction("length", new StandardSafeSQLFunction("length", NHibernateUtil.String, 1)); + RegisterFunction("substring", new AnsiSubstringFunction()); + RegisterFunction("nullif", new StandardSafeSQLFunction("nullif", 2)); + RegisterFunction("lower", new StandardSafeSQLFunction("lower", NHibernateUtil.String, 1)); + RegisterFunction("upper", new StandardSafeSQLFunction("upper", NHibernateUtil.String, 1)); + ; + RegisterFunction("now", new StandardSQLFunction("now")); + } + + public override bool SupportsLimit + { + get { return true; } + } + + public override bool SupportsVariableLimit + { + get { return false; } + } + + public override SqlString GetLimitString(SqlString querySqlString, int offset, int limit) + { + int intSelectInsertPoint = GetAfterSelectInsertPoint(querySqlString); + string strLimit = string.Format(" TOP {0} START AT {1}", limit, offset + 1); + return querySqlString.Insert(intSelectInsertPoint, strLimit); + } + + public override IDataBaseSchema GetDataBaseSchema(DbConnection connection) + { + return new SybaseAnywhereDataBaseMetaData(connection); + } + + private static int GetAfterSelectInsertPoint(SqlString sql) + { + string[] arrSelectStrings = {"select distinct", "select all", "select"}; + for (int i = 0; i != arrSelectStrings.Length; ++i) + { + string strSelect = arrSelectStrings[i]; + if (sql.StartsWithCaseInsensitive(strSelect)) + { + return strSelect.Length; + } + } + return 0; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 16:15:12 UTC (rev 3900) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 17:07:55 UTC (rev 3901) @@ -444,6 +444,9 @@ <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> <Compile Include="Dialect\Schema\SQLiteMetaData.cs" /> + <Compile Include="Dialect\Schema\SybaseAnywhereMetaData.cs" /> + <Compile Include="Dialect\SybaseASA10Dialect.cs" /> + <Compile Include="Dialect\SybaseASA9Dialect.cs" /> <Compile Include="Id\SelectGenerator.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 16:15:14
|
Revision: 3900 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3900&view=rev Author: fabiomaulo Date: 2008-11-08 16:15:12 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Fix NH-1560 with a little refactoring Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs 2008-11-08 16:09:54 UTC (rev 3899) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/AbstractDataBaseSchema.cs 2008-11-08 16:15:12 UTC (rev 3900) @@ -1,6 +1,5 @@ using System.Data; using System.Data.Common; -using NHibernate.Dialect.Schema; namespace NHibernate.Dialect.Schema { @@ -16,11 +15,13 @@ { private readonly DbConnection connection; - public AbstractDataBaseSchema(DbConnection connection) + protected AbstractDataBaseSchema(DbConnection connection) { this.connection = connection; } + #region IDataBaseSchema Members + public virtual bool StoresMixedCaseQuotedIdentifiers { get { return true; } @@ -48,7 +49,7 @@ public virtual DataTable GetTables(string catalog, string schemaPattern, string tableNamePattern, string[] types) { - string[] restrictions = new string[4] { catalog, schemaPattern, tableNamePattern, null }; + var restrictions = new[] {catalog, schemaPattern, tableNamePattern, null}; return connection.GetSchema("Tables", restrictions); } @@ -59,28 +60,31 @@ public abstract ITableMetadata GetTableMetadata(DataRow rs, bool extras); - public virtual DataTable GetColumns(string catalog, string schemaPattern, string tableNamePattern, string columnNamePattern) + public virtual DataTable GetColumns(string catalog, string schemaPattern, string tableNamePattern, + string columnNamePattern) { - string[] restrictions = new string[4] { catalog, schemaPattern, tableNamePattern, columnNamePattern }; + var restrictions = new[] {catalog, schemaPattern, tableNamePattern, columnNamePattern}; return connection.GetSchema("Columns", restrictions); } - public DataTable GetIndexInfo(string catalog, string schemaPattern, string tableName) + public virtual DataTable GetIndexInfo(string catalog, string schemaPattern, string tableName) { - string[] restrictions = new string[4] { catalog, schemaPattern, tableName, null }; + var restrictions = new[] {catalog, schemaPattern, tableName, null}; return connection.GetSchema("Indexes", restrictions); } - public DataTable GetIndexColumns(string catalog, string schemaPattern, string tableName, string indexName) + public virtual DataTable GetIndexColumns(string catalog, string schemaPattern, string tableName, string indexName) { - string[] restrictions = new string[5] { catalog, schemaPattern, tableName, indexName, null }; + var restrictions = new[] {catalog, schemaPattern, tableName, indexName, null}; return connection.GetSchema("IndexColumns", restrictions); } public virtual DataTable GetForeignKeys(string catalog, string schema, string table) { - string[] restrictions = new string[4] { catalog, schema, table, null }; + var restrictions = new[] {catalog, schema, table, null}; return connection.GetSchema("ForeignKeys", restrictions); } + + #endregion } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 16:09:57
|
Revision: 3899 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3899&view=rev Author: fabiomaulo Date: 2008-11-08 16:09:54 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Fix NH-1562 (schema update for SQLite by Mark Junker) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Dialect/Schema/SQLiteMetaData.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-11-08 15:58:07 UTC (rev 3898) +++ trunk/nhibernate/src/NHibernate/Dialect/SQLiteDialect.cs 2008-11-08 16:09:54 UTC (rev 3899) @@ -2,6 +2,7 @@ using System.Text; using NHibernate.SqlCommand; using NHibernate.Util; +using System.Data.Common; namespace NHibernate.Dialect { @@ -34,6 +35,7 @@ RegisterColumnType(DbType.Double, "NUMERIC"); RegisterColumnType(DbType.Single, "NUMERIC"); RegisterColumnType(DbType.VarNumeric, "NUMERIC"); + RegisterColumnType(DbType.AnsiString, "TEXT"); RegisterColumnType(DbType.String, "TEXT"); RegisterColumnType(DbType.AnsiStringFixedLength, "TEXT"); RegisterColumnType(DbType.StringFixedLength, "TEXT"); @@ -44,6 +46,19 @@ RegisterColumnType(DbType.Guid, "UNIQUEIDENTIFIER"); } + public override Schema.IDataBaseSchema GetDataBaseSchema(DbConnection connection) + { + return new Schema.SQLiteDataBaseMetaData(connection); + } + + public override string AddColumnString + { + get + { + return "add column"; + } + } + public override string IdentitySelectString { get { return "select last_insert_rowid()"; } Added: trunk/nhibernate/src/NHibernate/Dialect/Schema/SQLiteMetaData.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Schema/SQLiteMetaData.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Dialect/Schema/SQLiteMetaData.cs 2008-11-08 16:09:54 UTC (rev 3899) @@ -0,0 +1,102 @@ +using System; +using System.Data; +using System.Data.Common; + +namespace NHibernate.Dialect.Schema +{ + public class SQLiteDataBaseMetaData : AbstractDataBaseSchema + { + public SQLiteDataBaseMetaData(DbConnection connection) : base(connection) {} + + public override ITableMetadata GetTableMetadata(DataRow rs, bool extras) + { + return new SQLiteTableMetaData(rs, this, extras); + } + } + + public class SQLiteTableMetaData : AbstractTableMetadata + { + public SQLiteTableMetaData(DataRow rs, IDataBaseSchema meta, bool extras) : base(rs, meta, extras) {} + + protected override IColumnMetadata GetColumnMetadata(DataRow rs) + { + return new SQLiteColumnMetaData(rs); + } + + protected override string GetColumnName(DataRow rs) + { + return Convert.ToString(rs["COLUMN_NAME"]); + } + + protected override string GetConstraintName(DataRow rs) + { + throw new NotImplementedException(); + } + + protected override IForeignKeyMetadata GetForeignKeyMetadata(DataRow rs) + { + return new SQLiteForeignKeyMetaData(rs); + } + + protected override IIndexMetadata GetIndexMetadata(DataRow rs) + { + return new SQLiteIndexMetaData(rs); + } + + protected override string GetIndexName(DataRow rs) + { + return Convert.ToString(rs["INDEX_NAME"]); + } + + protected override void ParseTableInfo(DataRow rs) + { + Catalog = Convert.ToString(rs["TABLE_CATALOG"]); + Schema = Convert.ToString(rs["TABLE_SCHEMA"]); + if (string.IsNullOrEmpty(Catalog)) + { + Catalog = null; + } + if (string.IsNullOrEmpty(Schema)) + { + Schema = null; + } + Name = Convert.ToString(rs["TABLE_NAME"]); + } + } + + public class SQLiteColumnMetaData : AbstractColumnMetaData + { + public SQLiteColumnMetaData(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["COLUMN_NAME"]); + object objValue = rs["CHARACTER_MAXIMUM_LENGTH"]; + if (objValue != DBNull.Value) + { + ColumnSize = Convert.ToInt32(objValue); + } + objValue = rs["NUMERIC_PRECISION"]; + if (objValue != DBNull.Value) + { + NumericalPrecision = Convert.ToInt32(objValue); + } + Nullable = Convert.ToString(rs["IS_NULLABLE"]); + TypeName = Convert.ToString(rs["DATA_TYPE"]); + } + } + + public class SQLiteIndexMetaData : AbstractIndexMetadata + { + public SQLiteIndexMetaData(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["INDEX_NAME"]); + } + } + + public class SQLiteForeignKeyMetaData : AbstractForeignKeyMetadata + { + public SQLiteForeignKeyMetaData(DataRow rs) : base(rs) + { + Name = Convert.ToString(rs["CONSTRAINT_NAME"]); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 15:58:07 UTC (rev 3898) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 16:09:54 UTC (rev 3899) @@ -443,6 +443,7 @@ <Compile Include="Bytecode\HibernateByteCodeException.cs" /> <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> + <Compile Include="Dialect\Schema\SQLiteMetaData.cs" /> <Compile Include="Id\SelectGenerator.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 15:58:16
|
Revision: 3898 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3898&view=rev Author: fabiomaulo Date: 2008-11-08 15:58:07 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Fix NH-1551 (better coverage for Oracle; by Jaroslav Mart?\195?\161sek) Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/GeneratedTest/PartiallyGeneratedComponentTest.cs trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithCachingTest.cs trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithoutCachingTest.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1039/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1408/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH364/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH940/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypeParameters/TypeParameterTest.cs Modified: trunk/nhibernate/src/NHibernate.Test/GeneratedTest/PartiallyGeneratedComponentTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/GeneratedTest/PartiallyGeneratedComponentTest.cs 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/GeneratedTest/PartiallyGeneratedComponentTest.cs 2008-11-08 15:58:07 UTC (rev 3898) @@ -21,7 +21,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect is MsSql2000Dialect || dialect is FirebirdDialect; + return dialect is MsSql2000Dialect || dialect is FirebirdDialect || dialect is Oracle9Dialect; } [Test] Modified: trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithCachingTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithCachingTest.cs 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithCachingTest.cs 2008-11-08 15:58:07 UTC (rev 3898) @@ -17,7 +17,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect is MsSql2000Dialect; + return dialect is MsSql2000Dialect || dialect is Oracle9Dialect; } } } Modified: trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithoutCachingTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithoutCachingTest.cs 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/GeneratedTest/TriggerGeneratedValuesWithoutCachingTest.cs 2008-11-08 15:58:07 UTC (rev 3898) @@ -17,7 +17,7 @@ protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect is MsSql2000Dialect; + return dialect is MsSql2000Dialect || dialect is Oracle9Dialect; } protected override string CacheConcurrencyStrategy Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1039/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1039/Mappings.hbm.xml 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1039/Mappings.hbm.xml 2008-11-08 15:58:07 UTC (rev 3898) @@ -13,7 +13,7 @@ <dynamic-component name="Properties"> <set name="Phones" table="NH1039_Phone"> <key column="PersonId"/> - <element column="Number" type="string"/> + <element column="`Number`" type="string"/> </set> </dynamic-component> </class> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1408/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1408/Mappings.hbm.xml 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1408/Mappings.hbm.xml 2008-11-08 15:58:07 UTC (rev 3898) @@ -6,7 +6,7 @@ <class name="DbResource" table="Resources"> <cache usage="nonstrict-read-write" /> <id name="Oid" column="ID"> - <generator class="identity"/> + <generator class="native"/> </id> <discriminator column="Type" type="String(25)" not-null="true" /> <version name="Version" column="Version" /> @@ -27,7 +27,7 @@ <class name="DbResourceKey" table="ResourceKeys"> <cache usage="nonstrict-read-write" /> <id name="Oid" column="ID"> - <generator class="identity"/> + <generator class="native"/> </id> <version name="Version" column="Version" /> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1413/Mappings.hbm.xml 2008-11-08 15:58:07 UTC (rev 3898) @@ -5,7 +5,7 @@ <class name="Foo" table="XFoos"> <id name="Oid" column="ID"> - <generator class="identity"/> + <generator class="native"/> </id> <version name="Version" column="Version" /> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH364/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH364/Mappings.hbm.xml 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH364/Mappings.hbm.xml 2008-11-08 15:58:07 UTC (rev 3898) @@ -37,7 +37,7 @@ <id name="Id"> <generator class="native"/> </id> - <property name="Number"/> + <property name="Number" column="`Number`"/> <idbag name="Items" table="InvoiceItem364" lazy="true" access="field.pascalcase-underscore"> <collection-id column="Id" type="Int32"> <generator class="native"/> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Fixture.cs 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Fixture.cs 2008-11-08 15:58:07 UTC (rev 3898) @@ -2,6 +2,7 @@ using System.Data; using Iesi.Collections.Generic; using NHibernate; +using NHibernate.Dialect; using NHibernate.SqlTypes; using NHibernate.UserTypes; using NUnit.Framework; @@ -11,6 +12,12 @@ [TestFixture] public class Fixture : BugTestCase { + + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + [Test] public void CaseInsensitiveId() { Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Mappings.hbm.xml 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH732/Mappings.hbm.xml 2008-11-08 15:58:07 UTC (rev 3898) @@ -15,7 +15,7 @@ </class> <class name="UserToRole"> <id name="Id"> - <generator class="identity"/> + <generator class="native"/> </id> <many-to-one class="User" column="UserName" name="User"/> Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH940/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH940/Mappings.hbm.xml 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH940/Mappings.hbm.xml 2008-11-08 15:58:07 UTC (rev 3898) @@ -2,7 +2,7 @@ <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="NHibernate.Test.NHSpecificTest.NH940" assembly="NHibernate.Test"> <class name="A"> - <id name="Id" column="uid" type="Int64"> + <id name="Id" column="`uid`" type="Int64"> <generator class="increment"/> </id> @@ -10,7 +10,7 @@ </class> <class name="B"> - <id name="Id" column="uid" type="Int64"> + <id name="Id" column="`uid`" type="Int64"> <generator class="increment"/> </id> </class> Modified: trunk/nhibernate/src/NHibernate.Test/TypeParameters/TypeParameterTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypeParameters/TypeParameterTest.cs 2008-11-08 15:24:29 UTC (rev 3897) +++ trunk/nhibernate/src/NHibernate.Test/TypeParameters/TypeParameterTest.cs 2008-11-08 15:58:07 UTC (rev 3898) @@ -70,7 +70,7 @@ "Default value should have been mapped to null"); Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_TWO")) == DBNull.Value, "Default value should have been mapped to null"); - Assert.AreEqual(reader.GetInt32(reader.GetOrdinal("VALUE_THREE")), 5, + Assert.AreEqual(Convert.ToInt32(reader.GetValue(reader.GetOrdinal("VALUE_THREE"))), 5, "Non-Default value should not be changed"); Assert.IsTrue(reader.GetValue(reader.GetOrdinal("VALUE_FOUR")) == DBNull.Value, "Default value should have been mapped to null"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 15:24:34
|
Revision: 3897 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3897&view=rev Author: fabiomaulo Date: 2008-11-08 15:24:29 +0000 (Sat, 08 Nov 2008) Log Message: ----------- Fix NH-1550 (by Jaroslav Mart?\195?\161sek) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs Modified: trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs 2008-11-08 15:14:52 UTC (rev 3896) +++ trunk/nhibernate/src/NHibernate/Dialect/Oracle9Dialect.cs 2008-11-08 15:24:29 UTC (rev 3897) @@ -103,6 +103,8 @@ RegisterFunction("upper", new StandardSQLFunction("upper")); RegisterFunction("ascii", new StandardSQLFunction("ascii", NHibernateUtil.Int32)); RegisterFunction("length", new StandardSQLFunction("length", NHibernateUtil.Int64)); + RegisterFunction("left", new SQLFunctionTemplate(NHibernateUtil.String, "substr(?1, 1, ?2)")); + RegisterFunction("right", new SQLFunctionTemplate(NHibernateUtil.String, "substr(?1, -?2)")); RegisterFunction("to_char", new StandardSQLFunction("to_char", NHibernateUtil.String)); RegisterFunction("to_date", new StandardSQLFunction("to_date", NHibernateUtil.Timestamp)); @@ -189,32 +191,30 @@ get { return true; } } + public override bool SupportsVariableLimit + { + get { return false; } + } + public override SqlString GetLimitString(SqlString querySqlString, int offset, int limit) { SqlStringBuilder pagingBuilder = new SqlStringBuilder(); var hasOffset = offset > 0; - if (hasOffset) - { - pagingBuilder.Add("select * from ( select row_.*, rownum rownum_ from ( "); - } - else - { - pagingBuilder.Add("select * from ( "); - } + pagingBuilder.Add("SELECT * FROM ("); pagingBuilder.Add(querySqlString); if (hasOffset) { - pagingBuilder.Add(" ) row_ where rownum <= "); + pagingBuilder.Add(") WHERE rownum BETWEEN "); pagingBuilder.Add(offset.ToString()); - pagingBuilder.Add(" ) where rownum_ > "); + pagingBuilder.Add(" AND "); pagingBuilder.Add((limit + offset).ToString()); } else { - pagingBuilder.Add(" ) where rownum <= "); - pagingBuilder.Add(offset.ToString()); + pagingBuilder.Add(") WHERE rownum <= "); + pagingBuilder.Add(limit.ToString()); } return pagingBuilder.ToSqlString(); Modified: trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs 2008-11-08 15:14:52 UTC (rev 3896) +++ trunk/nhibernate/src/NHibernate.Test/Legacy/SQLFunctionsTest.cs 2008-11-08 15:24:29 UTC (rev 3897) @@ -76,9 +76,17 @@ rset = s.CreateQuery("select abs(round(s.Pay)) from s in class Simple").List(); Assert.AreEqual(46f, rset[0], "abs(round(-45.8)) result was incorrect"); + rset = s.CreateQuery("select left('abc', 2), right('abc', 2) from s in class Simple").List(); + row = (object[]) rset[0]; + Assert.AreEqual("ab", row[0], "Left function is broken."); + Assert.AreEqual("bc", row[1], "Right function is broken."); + // Test a larger depth 3 function example - Not a useful combo other than for testing Assert.AreEqual(1, - s.CreateQuery("select trunc(round(sysdate)) from s in class Simple").List().Count); + s.CreateQuery("select trunc(round(length('A'))) from s in class Simple").List().Count); + // NOTE: In Oracle this will fail as the translator will expect two columns in return + //Assert.AreEqual(1, + // s.CreateQuery("select trunc(round(sysdate)) from s in class Simple").List().Count); // Test the oracle standard NVL funtion as a test of multi-param functions... // NOTE: commented out for NH, since Pay is a value type and will never be null @@ -577,4 +585,4 @@ } } } -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-08 15:15:00
|
Revision: 3896 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3896&view=rev Author: fabiomaulo Date: 2008-11-08 15:14:52 +0000 (Sat, 08 Nov 2008) Log Message: ----------- - Removed default ProxyFactoryFactory. - Improv Exceptions related with ProxyFactoryFactory Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs trunk/nhibernate/src/NHibernate/Cfg/Environment.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Bytecode/HibernateByteCodeException.cs trunk/nhibernate/src/NHibernate/Bytecode/ProxyFactoryFactoryNotConfiguredException.cs trunk/nhibernate/src/NHibernate/Bytecode/UnableToLoadProxyFactoryFactoryException.cs trunk/nhibernate/src/NHibernate.Test/Bytecode/ trunk/nhibernate/src/NHibernate.Test/Bytecode/Lightweight/ trunk/nhibernate/src/NHibernate.Test/Bytecode/Lightweight/BytecodeProviderFixture.cs trunk/nhibernate/src/NHibernate.Test/Bytecode/WrongProxyFactoryFactory.cs Modified: trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2008-11-07 22:40:43 UTC (rev 3895) +++ trunk/nhibernate/src/NHibernate/Bytecode/CodeDom/BytecodeProviderImpl.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -31,11 +31,11 @@ } catch (Exception e) { - throw new HibernateException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); + throw new HibernateByteCodeException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); } } - throw new HibernateException("The ProxyFactoryFactory was not configured. Initialize the 'proxyfactory.factory_class' property of the session-factory section."); + throw new ProxyFactoryFactoryNotConfiguredException(); } } @@ -61,15 +61,14 @@ { pffc = ReflectHelper.ClassForName(typeName); } - catch (HibernateException he) + catch (Exception he) { - throw new HibernateException("Unable to load type '" + typeName + "' during configuration of proxy factory class.", - he); + throw new UnableToLoadProxyFactoryFactoryException(typeName, he); } if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) { - var he = new HibernateException(pffc.FullName + " does not implement " + typeof (IProxyFactoryFactory).FullName); + var he = new HibernateByteCodeException(pffc.FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName); throw he; } proxyFactoryFactory = pffc; Added: trunk/nhibernate/src/NHibernate/Bytecode/HibernateByteCodeException.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/HibernateByteCodeException.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Bytecode/HibernateByteCodeException.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -0,0 +1,15 @@ +using System; +using System.Runtime.Serialization; + +namespace NHibernate.Bytecode +{ + [Serializable] + public class HibernateByteCodeException : HibernateException + { + public HibernateByteCodeException() {} + public HibernateByteCodeException(string message) : base(message) {} + public HibernateByteCodeException(string message, Exception inner) : base(message, inner) {} + + protected HibernateByteCodeException(SerializationInfo info, StreamingContext context) : base(info, context) {} + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs 2008-11-07 22:40:43 UTC (rev 3895) +++ trunk/nhibernate/src/NHibernate/Bytecode/Lightweight/BytecodeProviderImpl.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -30,10 +30,10 @@ } catch (Exception e) { - throw new HibernateException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); + throw new HibernateByteCodeException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); } } - throw new HibernateException("The ProxyFactoryFactory was not configured. Initialize the 'proxyfactory.factory_class' property of the session-factory section."); + throw new ProxyFactoryFactoryNotConfiguredException(); } } @@ -60,15 +60,14 @@ { pffc = ReflectHelper.ClassForName(typeName); } - catch (HibernateException he) + catch (Exception he) { - throw new HibernateException("Unable to load type '" + typeName + "' during configuration of proxy factory class.", - he); + throw new UnableToLoadProxyFactoryFactoryException(typeName, he); } if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) { - var he = new HibernateException(pffc.FullName + " does not implement " + typeof (IProxyFactoryFactory).FullName); + var he = new HibernateByteCodeException(pffc.FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName); throw he; } proxyFactoryFactory = pffc; Modified: trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs 2008-11-07 22:40:43 UTC (rev 3895) +++ trunk/nhibernate/src/NHibernate/Bytecode/NullBytecodeProvider.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -26,10 +26,10 @@ } catch (Exception e) { - throw new HibernateException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); + throw new HibernateByteCodeException("Failed to create an instance of '" + proxyFactoryFactory.FullName + "'!", e); } } - throw new HibernateException("The ProxyFactoryFactory was not configured. Initialize the 'proxyfactory.factory_class' property of the session-factory section."); + throw new ProxyFactoryFactoryNotConfiguredException(); } } @@ -49,15 +49,14 @@ { pffc = ReflectHelper.ClassForName(typeName); } - catch (HibernateException he) + catch (Exception he) { - throw new HibernateException("Unable to load type '" + typeName + "' during configuration of proxy factory class.", - he); + throw new UnableToLoadProxyFactoryFactoryException(typeName, he); } if (typeof (IProxyFactoryFactory).IsAssignableFrom(pffc) == false) { - var he = new HibernateException(pffc.FullName + " does not implement " + typeof (IProxyFactoryFactory).FullName); + var he = new HibernateByteCodeException(pffc.FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName); throw he; } proxyFactoryFactory = pffc; Added: trunk/nhibernate/src/NHibernate/Bytecode/ProxyFactoryFactoryNotConfiguredException.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/ProxyFactoryFactoryNotConfiguredException.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Bytecode/ProxyFactoryFactoryNotConfiguredException.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -0,0 +1,29 @@ +using System; +using System.Runtime.Serialization; + +namespace NHibernate.Bytecode +{ + + [Serializable] + public class ProxyFactoryFactoryNotConfiguredException : HibernateByteCodeException + { + public ProxyFactoryFactoryNotConfiguredException() {} + + protected ProxyFactoryFactoryNotConfiguredException(SerializationInfo info, + StreamingContext context) : base(info, context) {} + + public override string Message + { + get + { + const string msg = @"The ProxyFactoryFactory was not configured. +Initialize 'proxyfactory.factory_class' property of the session-factory configuration section with one of the available NHibernate.ByteCode providers. +Example: +<property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> +Example: +<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>"; + return msg; + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Bytecode/UnableToLoadProxyFactoryFactoryException.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Bytecode/UnableToLoadProxyFactoryFactoryException.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Bytecode/UnableToLoadProxyFactoryFactoryException.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -0,0 +1,37 @@ +using System; +using System.Runtime.Serialization; + +namespace NHibernate.Bytecode +{ + [Serializable] + public class UnableToLoadProxyFactoryFactoryException : HibernateByteCodeException + { + private readonly string typeName; + public UnableToLoadProxyFactoryFactoryException(string typeName, Exception inner) + : base("", inner) + { + this.typeName = typeName; + } + + protected UnableToLoadProxyFactoryFactoryException(SerializationInfo info, + StreamingContext context) : base(info, context) {} + public override string Message + { + get + { + const string causes = @" +Possible causes are: +- The NHibernate.Bytecode provider assembly was not deployed. +- The typeName used to initialize the 'proxyfactory.factory_class' property of the session-factory section is not well formed. + +Solution: +Confirm that your deployment folder contains one of the following assemblies: +NHibernate.ByteCode.LinFu.dll +NHibernate.ByteCode.Castle.dll"; + string msg = "Unable to load type '" + typeName + "' during configuration of proxy factory class." + causes; + + return msg; + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-11-07 22:40:43 UTC (rev 3895) +++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -178,7 +178,6 @@ GlobalProperties = new Dictionary<string, string>(); GlobalProperties[PropertyUseReflectionOptimizer] = bool.TrueString; - SetDefaultProxyFactoryFactory(); LoadGlobalPropertiesFromAppConfig(); VerifyProperties(GlobalProperties); @@ -191,12 +190,6 @@ } } - private static void SetDefaultProxyFactoryFactory() - { - // maitaining the optionality of set the proxyfactory.factory_class property - GlobalProperties[ProxyFactoryFactoryClass] = "NHibernate.ProxyGenerators.CastleDynamicProxy.ProxyFactoryFactory, NHibernate.ProxyGenerators.CastleDynamicProxy"; - } - private static void LoadGlobalPropertiesFromAppConfig() { object config = ConfigurationManager.GetSection(CfgXmlHelper.CfgSectionName); @@ -252,8 +245,6 @@ { GlobalProperties[PropertyUseReflectionOptimizer] = savedUseReflectionOptimizer; } - - SetDefaultProxyFactoryFactory(); } /// <summary> Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-07 22:40:43 UTC (rev 3895) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-08 15:14:52 UTC (rev 3896) @@ -440,6 +440,9 @@ <Compile Include="AdoNet\ResultSetWrapper.cs" /> <Compile Include="AdoNet\SqlClientBatchingBatcherFactory.cs" /> <Compile Include="AdoNet\TooManyRowsAffectedException.cs" /> + <Compile Include="Bytecode\HibernateByteCodeException.cs" /> + <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> + <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> <Compile Include="Id\SelectGenerator.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/Bytecode/Lightweight/BytecodeProviderFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Bytecode/Lightweight/BytecodeProviderFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Bytecode/Lightweight/BytecodeProviderFixture.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -0,0 +1,76 @@ +using NHibernate.Bytecode; +using NHibernate.Bytecode.Lightweight; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.Bytecode.Lightweight +{ + [TestFixture] + public class BytecodeProviderFixture + { + [Test] + public void NotConfiguredProxyFactoryFactory() + { + try + { + var bcp = new BytecodeProviderImpl(); + IProxyFactoryFactory p = bcp.ProxyFactoryFactory; + Assert.Fail(); + } + catch (HibernateByteCodeException e) + { + Assert.That(e.Message, Text.StartsWith("The ProxyFactoryFactory was not configured")); + Assert.That(e.Message, Text.Contains("Example")); + } + } + + [Test] + public void UnableToLoadProxyFactoryFactory() + { + try + { + var bcp = new BytecodeProviderImpl(); + bcp.SetProxyFactoryFactory("whatever"); + Assert.Fail(); + } + catch (HibernateByteCodeException e) + { + Assert.That(e.Message, Text.StartsWith("Unable to load type")); + Assert.That(e.Message, Text.Contains("Possible causes")); + Assert.That(e.Message, Text.Contains("Confirm that your deployment folder contains")); + } + } + + [Test] + public void DoesNotImplementProxyFactoryFactory() + { + try + { + var bcp = new BytecodeProviderImpl(); + bcp.SetProxyFactoryFactory(GetType().AssemblyQualifiedName); + Assert.Fail(); + } + catch (HibernateByteCodeException e) + { + Assert.That(e.Message, + Is.EqualTo(GetType().FullName + " does not implement " + typeof(IProxyFactoryFactory).FullName)); + } + } + + [Test] + public void CantCreateProxyFactoryFactory() + { + try + { + var bcp = new BytecodeProviderImpl(); + bcp.SetProxyFactoryFactory(typeof(WrongProxyFactoryFactory).AssemblyQualifiedName); + IProxyFactoryFactory p = bcp.ProxyFactoryFactory; + Assert.Fail(); + } + catch (HibernateByteCodeException e) + { + Assert.That(e.Message,Text.StartsWith("Failed to create an instance of")); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Bytecode/WrongProxyFactoryFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Bytecode/WrongProxyFactoryFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Bytecode/WrongProxyFactoryFactory.cs 2008-11-08 15:14:52 UTC (rev 3896) @@ -0,0 +1,27 @@ +using NHibernate.Bytecode; +using NHibernate.Proxy; + +namespace NHibernate.Test.Bytecode +{ + public class WrongProxyFactoryFactory : IProxyFactoryFactory + { + public WrongProxyFactoryFactory() + { + throw new System.Exception(); + } + + #region Implementation of IProxyFactoryFactory + + public IProxyFactory BuildProxyFactory() + { + throw new System.NotImplementedException(); + } + + public IProxyValidator ProxyValidator + { + get { throw new System.NotImplementedException(); } + } + + #endregion + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-07 22:40:43 UTC (rev 3895) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-08 15:14:52 UTC (rev 3896) @@ -77,6 +77,8 @@ <Compile Include="AssemblyInfo.cs" /> <Compile Include="Assertions\InheritedAreMarkedSerializable.cs" /> <Compile Include="Assertions\IsSerializable.cs" /> + <Compile Include="Bytecode\Lightweight\BytecodeProviderFixture.cs" /> + <Compile Include="Bytecode\WrongProxyFactoryFactory.cs" /> <Compile Include="CacheTest\CacheFixture.cs" /> <Compile Include="CacheTest\QueryCacheFixture.cs" /> <Compile Include="CacheTest\TimestamperFixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-07 22:40:48
|
Revision: 3895 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3895&view=rev Author: fabiomaulo Date: 2008-11-07 22:40:43 +0000 (Fri, 07 Nov 2008) Log Message: ----------- Continue the FIX of SVN problem Modified Paths: -------------- trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ByteCode.build trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ByteCode.Test.build Modified: trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build 2008-11-07 22:32:55 UTC (rev 3894) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build 2008-11-07 22:40:43 UTC (rev 3895) @@ -1,7 +1,7 @@ <?xml version="1.0" ?> <project - name="NHibernate.ProxyGenerators.CastleDynamicProxy" + name="NHibernate.ByteCode.Castle" default="build" xmlns="http://nant.sf.net/release/0.85-rc3/nant.xsd" > @@ -32,6 +32,6 @@ </target> <target name="generate-assemblyinfo" depends="init common.generate-assemblyinfo" /> - <target name="build" depends="init generate-assemblyinfo common.compile-dll" description="Build Castle ProxyGenerators" /> + <target name="build" depends="init generate-assemblyinfo common.compile-dll" description="Build Castle ByteCode" /> </project> Modified: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build 2008-11-07 22:32:55 UTC (rev 3894) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build 2008-11-07 22:40:43 UTC (rev 3895) @@ -1,7 +1,7 @@ <?xml version="1.0" ?> <project - name="NHibernate.ProxyGenerators.CastleDynamicProxy.Tests" + name="NHibernate.ByteCode.Castle.Tests" default="build" xmlns="http://nant.sf.net/release/0.85-rc3/nant.xsd" > @@ -13,7 +13,7 @@ <target name="init" depends="common.init"> <property name="assembly.is-cls-compliant" value="false" /> - <property name="assembly.description" value="The Unit Tests for Castle ProxyGenerators." /> + <property name="assembly.description" value="The Unit Tests for Castle ByteCode." /> <property name="assembly.version" value="1.0.0.1" /> <property name="assembly.version.informational" value="1.0" /> Modified: trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ByteCode.build =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ByteCode.build 2008-11-07 22:32:55 UTC (rev 3894) +++ trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ByteCode.build 2008-11-07 22:40:43 UTC (rev 3895) @@ -1,7 +1,7 @@ <?xml version="1.0" ?> <project - name="NHibernate.ProxyGenerators.LinFuDynamicProxy" + name="NHibernate.ByteCode.LinFu" default="build" xmlns="http://nant.sf.net/release/0.85-rc3/nant.xsd" > @@ -31,6 +31,6 @@ </target> <target name="generate-assemblyinfo" depends="init common.generate-assemblyinfo" /> - <target name="build" depends="init generate-assemblyinfo common.compile-dll" description="Build LinFu ProxyGenerators" /> + <target name="build" depends="init generate-assemblyinfo common.compile-dll" description="Build LinFu ByteCode" /> </project> Modified: trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ByteCode.Test.build =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ByteCode.Test.build 2008-11-07 22:32:55 UTC (rev 3894) +++ trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ByteCode.Test.build 2008-11-07 22:40:43 UTC (rev 3895) @@ -1,7 +1,7 @@ <?xml version="1.0" ?> <project - name="NHibernate.ProxyGenerators.LinFuDynamicProxy.Tests" + name="NHibernate.ByteCode.LinFu.Tests" default="build" xmlns="http://nant.sf.net/release/0.85-rc3/nant.xsd" > @@ -13,7 +13,7 @@ <target name="init" depends="common.init"> <property name="assembly.is-cls-compliant" value="false" /> - <property name="assembly.description" value="The Unit Tests for LinFu ProxyGenerators." /> + <property name="assembly.description" value="The Unit Tests for LinFu ByteCode." /> <property name="assembly.version" value="1.0.0.1" /> <property name="assembly.version.informational" value="1.0" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2008-11-07 22:33:00
|
Revision: 3894 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3894&view=rev Author: fabiomaulo Date: 2008-11-07 22:32:55 +0000 (Fri, 07 Nov 2008) Log Message: ----------- - Fix some SVN problems of previous commit - Changed names of ProxyGenerators to ByteCode - Using LinFu for NH-Tests Added Paths: ----------- trunk/nhibernate/src/NHibernate.ByteCode.Castle/ trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build trunk/nhibernate/src/NHibernate.ByteCode.Castle/LazyInitializer.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle/NHibernate.ByteCode.Castle.csproj trunk/nhibernate/src/NHibernate.ByteCode.Castle/Properties/ trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactoryFactory.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/App.config trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/DebugConnectionProvider.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/NHibernate.ByteCode.Castle.Tests.csproj trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/Properties/ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxy.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyFixture.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.hbm.xml trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Classes.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CustomProxyFixture.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestCase.cs trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestConfigurationHelper.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ByteCode.build trunk/nhibernate/src/NHibernate.ByteCode.LinFu/LazyInitializer.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu/NHibernate.ByteCode.LinFu.csproj trunk/nhibernate/src/NHibernate.ByteCode.LinFu/Properties/ trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ProxyFactory.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu/ProxyFactoryFactory.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/App.config trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ByteCode.Test.build trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/DebugConnectionProvider.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/NHibernate.ByteCode.LinFu.Tests.csproj trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/Properties/ trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ProxyInterface/ trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ProxyInterface/IMyProxy.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ProxyInterface/MyProxyImpl.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ProxyInterface/ProxyFixture.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/ProxyInterface/ProxyImpl.hbm.xml trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/TestCase.cs trunk/nhibernate/src/NHibernate.ByteCode.LinFu.Tests/TestConfigurationHelper.cs Property changes on: trunk/nhibernate/src/NHibernate.ByteCode.Castle ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: svn:ignore + obj .#* *.user *.xsx AssemblyInfo.cs *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle/ByteCode.build 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,37 @@ +<?xml version="1.0" ?> + +<project + name="NHibernate.ProxyGenerators.CastleDynamicProxy" + default="build" + xmlns="http://nant.sf.net/release/0.85-rc3/nant.xsd" +> + + <property name="root.dir" value="../.." /> + <include buildfile="${root.dir}/build-common/common-project.xml" /> + + <target name="init" depends="common.init"> + + <property name="assembly.is-cls-compliant" value="true" /> + <property name="assembly.description" + value="Castle Dynamic proxy generator adapters for NHibernate." /> + <property name="assembly.copyright" + value="Licensed under LGPL." /> + <property name="assembly.allow-partially-trusted-callers" value="true" /> + + <property name="clover.instrument" value="true" /> + + <assemblyfileset basedir="${bin.dir}" id="project.references"> + <include name="System.dll" /> + <include name="Iesi.Collections.dll" /> + <include name="log4net.dll" /> + <include name="Castle.Core.dll" /> + <include name="Castle.DynamicProxy2.dll" /> + <include name="NHibernate.dll" /> + </assemblyfileset> + + </target> + + <target name="generate-assemblyinfo" depends="init common.generate-assemblyinfo" /> + <target name="build" depends="init generate-assemblyinfo common.compile-dll" description="Build Castle ProxyGenerators" /> + +</project> Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle/LazyInitializer.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle/LazyInitializer.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle/LazyInitializer.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,86 @@ +using System; +using System.Reflection; +using Castle.Core.Interceptor; +using NHibernate.Proxy; +using NHibernate.Proxy.Poco; +using NHibernate.Type; +using NHibernate.Engine; + +namespace NHibernate.ByteCode.Castle +{ + /// <summary> + /// A <see cref="ILazyInitializer"/> for use with the Castle Dynamic Class Generator. + /// </summary> + [Serializable] + [CLSCompliant(false)] + public class LazyInitializer : BasicLazyInitializer, global::Castle.Core.Interceptor.IInterceptor + { + private static readonly MethodInfo Exception_InternalPreserveStackTrace = + typeof(Exception).GetMethod("InternalPreserveStackTrace", BindingFlags.Instance | BindingFlags.NonPublic); + + #region Instance + + public bool _constructed; + + /// <summary> + /// Initializes a new <see cref="LazyInitializer"/> object. + /// </summary> + /// <param name="entityName"></param> + /// <param name="persistentClass">The Class to Proxy.</param> + /// <param name="id">The Id of the Object we are Proxying.</param> + /// <param name="getIdentifierMethod"></param> + /// <param name="setIdentifierMethod"></param> + /// <param name="componentIdType"></param> + /// <param name="session">The ISession this Proxy is in.</param> + public LazyInitializer(string entityName, System.Type persistentClass, object id, + MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, + IAbstractComponentType componentIdType, ISessionImplementor session) + :base(entityName, persistentClass, id, getIdentifierMethod, setIdentifierMethod, componentIdType, session) + { + } + + /// <summary> + /// Invoke the actual Property/Method using the Proxy or instantiate the actual + /// object and use it when the Proxy can't handle the method. + /// </summary> + /// <param name="invocation">The <see cref="IInvocation"/> from the generated Castle.DynamicProxy.</param> + public virtual void Intercept(IInvocation invocation) + { + try + { + if (_constructed) + { + // let the generic LazyInitializer figure out if this can be handled + // with the proxy or if the real class needs to be initialized + invocation.ReturnValue = base.Invoke(invocation.Method, invocation.Arguments, invocation.Proxy); + + // the base LazyInitializer could not handle it so we need to Invoke + // the method/property against the real class + if (invocation.ReturnValue == InvokeImplementation) + { + invocation.ReturnValue = invocation.Method.Invoke(GetImplementation(), invocation.Arguments); + return; + } + else + { + return; + } + } + else + { + // TODO: Find out equivalent to CGLIB's 'method.invokeSuper'. + return; + } + } + catch (TargetInvocationException tie) + { + // Propagate the inner exception so that the proxy throws the same exception as + // the real object would + Exception_InternalPreserveStackTrace.Invoke(tie.InnerException, new Object[] { }); + throw tie.InnerException; + } + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle/NHibernate.ByteCode.Castle.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle/NHibernate.ByteCode.Castle.csproj (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle/NHibernate.ByteCode.Castle.csproj 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>9.0.30729</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{31C3F0EA-0FED-4A2F-B68D-96CE29844487}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>NHibernate.ByteCode.Castle</RootNamespace> + <AssemblyName>NHibernate.ByteCode.Castle</AssemblyName> + <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="Castle.Core, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\Castle.Core.dll</HintPath> + </Reference> + <Reference Include="Castle.DynamicProxy2, Version=2.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\Castle.DynamicProxy2.dll</HintPath> + </Reference> + <Reference Include="Iesi.Collections, Version=1.0.0.3, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\Iesi.Collections.dll</HintPath> + </Reference> + <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\log4net.dll</HintPath> + </Reference> + <Reference Include="System" /> + </ItemGroup> + <ItemGroup> + <Compile Include="AssemblyInfo.cs" /> + <Compile Include="LazyInitializer.cs" /> + <Compile Include="ProxyFactory.cs" /> + <Compile Include="ProxyFactoryFactory.cs" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\NHibernate\NHibernate.csproj"> + <Project>{5909BFE7-93CF-4E5F-BE22-6293368AF01D}</Project> + <Name>NHibernate</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <None Include="ByteCode.build" /> + </ItemGroup> + <ItemGroup> + <Folder Include="Properties\" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.ByteCode.Castle/Properties ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactory.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,105 @@ +using System; +using System.Reflection; +using Castle.DynamicProxy; +using Iesi.Collections.Generic; +using log4net; +using NHibernate.Engine; +using NHibernate.Proxy; +using NHibernate.Type; + +namespace NHibernate.ByteCode.Castle +{ + public class ProxyFactory : IProxyFactory + { + protected static readonly ILog log = LogManager.GetLogger(typeof (ProxyFactory)); + private static readonly ProxyGenerator _proxyGenerator = new ProxyGenerator(); + + private System.Type _persistentClass; + private System.Type[] _interfaces; + private MethodInfo _getIdentifierMethod; + private MethodInfo _setIdentifierMethod; + private string _entityName; + private IAbstractComponentType _componentIdType; + + public virtual void PostInstantiate(string entityName, System.Type persistentClass, ISet<System.Type> interfaces, + MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, + IAbstractComponentType componentIdType) + { + _entityName = entityName; + _persistentClass = persistentClass; + _interfaces = new System.Type[interfaces.Count]; + interfaces.CopyTo(_interfaces, 0); + _getIdentifierMethod = getIdentifierMethod; + _setIdentifierMethod = setIdentifierMethod; + _componentIdType = componentIdType; + } + + protected static ProxyGenerator DefaultProxyGenerator + { + get { return _proxyGenerator; } + } + + protected System.Type PersistentClass + { + get { return _persistentClass; } + } + + protected System.Type[] Interfaces + { + get { return _interfaces; } + } + + protected MethodInfo GetIdentifierMethod + { + get { return _getIdentifierMethod; } + } + + protected MethodInfo SetIdentifierMethod + { + get { return _setIdentifierMethod; } + } + + protected bool IsClassProxy + { + get { return _interfaces.Length == 1; } + } + + public string EntityName + { + get { return _entityName; } + } + + public IAbstractComponentType ComponentIdType + { + get { return _componentIdType; } + } + + /// <summary> + /// Build a proxy using the Castle.DynamicProxy library. + /// </summary> + /// <param name="id">The value for the Id.</param> + /// <param name="session">The Session the proxy is in.</param> + /// <returns>A fully built <c>INHibernateProxy</c>.</returns> + public virtual INHibernateProxy GetProxy(object id, ISessionImplementor session) + { + try + { + var initializer = new LazyInitializer(EntityName, _persistentClass, id, _getIdentifierMethod, + _setIdentifierMethod, ComponentIdType, session); + + object generatedProxy = IsClassProxy + ? _proxyGenerator.CreateClassProxy(_persistentClass, _interfaces, initializer) + : _proxyGenerator.CreateInterfaceProxyWithoutTarget(_interfaces[0], _interfaces, + initializer); + + initializer._constructed = true; + return (INHibernateProxy) generatedProxy; + } + catch (Exception e) + { + log.Error("Creating a proxy instance failed", e); + throw new HibernateException("Creating a proxy instance failed", e); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactoryFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactoryFactory.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle/ProxyFactoryFactory.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,22 @@ +using NHibernate.Bytecode; +using NHibernate.Proxy; + +namespace NHibernate.ByteCode.Castle +{ + public class ProxyFactoryFactory : IProxyFactoryFactory + { + #region IProxyFactoryFactory Members + + public IProxyFactory BuildProxyFactory() + { + return new ProxyFactory(); + } + + public IProxyValidator ProxyValidator + { + get { return new DynProxyTypeValidator(); } + } + + #endregion + } +} \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: svn:ignore + obj .#* *.user *.xsx AssemblyInfo.cs hibernate.cfg.xml *.aps *.eto [Bb]in [Dd]ebug [Rr]elease *resharper* Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/App.config (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/App.config 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,102 @@ +<?xml version="1.0" encoding="utf-8" ?> +<configuration> + <configSections> + <section name="hibernate-configuration" + type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> + <section name="log4net" + type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> + </configSections> + + <!-- + hibernate-configuration section + + You don't need to change this section for your own use. + You can write your own hibernate.cfg.xml to override all session-factory configuration. + Templates are available in NHibernate.Config.Templates folder. + --> + <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> + <bytecode-provider type="lcg"/> + <reflection-optimizer use="true"/> + <session-factory name="NHibernate.Test"> + <property name="connection.provider">NHibernate.ByteCode.Castle.Tests.DebugConnectionProvider, NHibernate.ByteCode.Castle.Tests</property> + <property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider, NHibernate</property> + <property name="cache.use_query_cache">true</property> + <property name="prepare_sql">false</property> + <property name="query.startup_check">false</property> + <property name="connection.isolation">ReadCommitted</property> + <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> + <property name="connection.connection_string"> + Server=(local);initial catalog=nhibernate;Integrated Security=SSPI + </property> + <property name="show_sql">false</property> + <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> + <property name="use_outer_join">true</property> + <property name="command_timeout">10</property> + <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> + <property name="adonet.wrap_result_sets">false</property> + + <!-- This property is the default value in NH Core --> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> + + </session-factory> + </hibernate-configuration> + + <!-- This section contains the log4net configuration settings --> + <log4net debug="false"> + + <!-- Define some output appenders --> + <appender name="trace" + type="log4net.Appender.TraceAppender, log4net"> + <layout type="log4net.Layout.PatternLayout,log4net"> + <param name="ConversionPattern" + value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" /> + </layout> + </appender> + + <appender name="console" + type="log4net.Appender.ConsoleAppender, log4net"> + <layout type="log4net.Layout.PatternLayout,log4net"> + <param name="ConversionPattern" + value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" /> + </layout> + </appender> + + <appender name="rollingFile" + type="log4net.Appender.RollingFileAppender,log4net" > + + <param name="File" + value="log.txt" /> + <param name="AppendToFile" + value="false" /> + <param name="RollingStyle" + value="Date" /> + <param name="DatePattern" + value="yyyy.MM.dd" /> + <param name="StaticLogFileName" + value="true" /> + + <layout type="log4net.Layout.PatternLayout,log4net"> + <param name="ConversionPattern" + value="%d [%t] %-5p %c - %m%n" /> + </layout> + </appender> + + <root> + <priority value="WARN" /> + <appender-ref ref="console" /> + </root> + + <logger name="NHibernate"> + <priority value="ERROR" /> + </logger> + + <logger name="NHibernate.Tool.hbm2ddl.SchemaExport"> + <level value="ERROR" /> + </logger> + </log4net> + + +</configuration> + + + Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,45 @@ +<?xml version="1.0" ?> + +<project + name="NHibernate.ProxyGenerators.CastleDynamicProxy.Tests" + default="build" + xmlns="http://nant.sf.net/release/0.85-rc3/nant.xsd" +> + + <property name="root.dir" value="../.." /> + + <include buildfile="${root.dir}/build-common/common-project.xml" /> + + <target name="init" depends="common.init"> + + <property name="assembly.is-cls-compliant" value="false" /> + <property name="assembly.description" value="The Unit Tests for Castle ProxyGenerators." /> + <property name="assembly.version" value="1.0.0.1" /> + <property name="assembly.version.informational" value="1.0" /> + + <property name="clover.instrument" value="false" /> + + <assemblyfileset id="project.references" basedir="${bin.dir}"> + <include name="System.dll" /> + <include name="System.XML.dll" /> + <include name="System.Data.dll" /> + <include name="Iesi.Collections.dll" /> + <include name="log4net.dll" /> + <include name="Castle.Core.dll" /> + <include name="Castle.DynamicProxy2.dll" /> + <include name="NHibernate.dll" /> + <include name="NHibernate.ByteCode.Castle.dll" /> + <include name="nunit.framework.dll"/> + </assemblyfileset> + + <resourcefileset id="project.resources" prefix="NHibernate.ByteCode.Castle.Tests" dynamicprefix="true"> + <include name="**/*.xml" /> + <exclude name="bin/**/*.xml" /> + </resourcefileset> + </target> + + <target name="generate-assemblyinfo" depends="init common.generate-assemblyinfo" /> + <target name="build" depends="init generate-assemblyinfo common.compile-tests" /> + <target name="test" depends="init build common.run-tests" /> + +</project> Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/DebugConnectionProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/DebugConnectionProvider.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/DebugConnectionProvider.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,72 @@ +using System.Collections; +using System.Data; +using Iesi.Collections; +using NHibernate.Connection; + +namespace NHibernate.ByteCode.Castle.Tests +{ + /// <summary> + /// This connection provider keeps a list of all open connections, + /// it is used when testing to check that tests clean up after themselves. + /// </summary> + public class DebugConnectionProvider : DriverConnectionProvider + { + private readonly ISet connections = new ListSet(); + + public override IDbConnection GetConnection() + { + IDbConnection connection = base.GetConnection(); + connections.Add(connection); + return connection; + } + + public override void CloseConnection(IDbConnection conn) + { + base.CloseConnection(conn); + connections.Remove(conn); + } + + public bool HasOpenConnections + { + get + { + // check to see if all connections that were at one point opened + // have been closed through the CloseConnection + // method + if (connections.IsEmpty) + { + // there are no connections, either none were opened or + // all of the closings went through CloseConnection. + return false; + } + else + { + // Disposing of an ISession does not call CloseConnection (should it???) + // so a Diposed of ISession will leave an IDbConnection in the list but + // the IDbConnection will be closed (atleast with MsSql it works this way). + foreach (IDbConnection conn in connections) + { + if (conn.State != ConnectionState.Closed) + { + return true; + } + } + + // all of the connections have been Disposed and were closed that way + // or they were Closed through the CloseConnection method. + return false; + } + } + } + + public void CloseAllConnections() + { + while (!connections.IsEmpty) + { + IEnumerator en = connections.GetEnumerator(); + en.MoveNext(); + CloseConnection(en.Current as IDbConnection); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/NHibernate.ByteCode.Castle.Tests.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/NHibernate.ByteCode.Castle.Tests.csproj (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/NHibernate.ByteCode.Castle.Tests.csproj 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>9.0.30729</ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{4972EE96-2417-4D47-9FF1-3B1D6B1D3191}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>NHibernate.ByteCode.Castle.Tests</RootNamespace> + <AssemblyName>NHibernate.ByteCode.Castle.Tests</AssemblyName> + <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="Castle.Core, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\Castle.Core.dll</HintPath> + </Reference> + <Reference Include="Castle.DynamicProxy2, Version=2.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\Castle.DynamicProxy2.dll</HintPath> + </Reference> + <Reference Include="Iesi.Collections, Version=1.0.0.3, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\Iesi.Collections.dll</HintPath> + </Reference> + <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\log4net.dll</HintPath> + </Reference> + <Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\nunit.framework.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="DebugConnectionProvider.cs" /> + <Compile Include="AssemblyInfo.cs" /> + <Compile Include="ProxyInterface\CastleProxy.cs" /> + <Compile Include="ProxyInterface\CastleProxyFixture.cs" /> + <Compile Include="ProxyInterface\CastleProxyImpl.cs" /> + <Compile Include="ProxyInterface\Classes.cs" /> + <Compile Include="ProxyInterface\CustomProxyFixture.cs" /> + <Compile Include="TestCase.cs" /> + <Compile Include="TestConfigurationHelper.cs" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj"> + <Project>{31C3F0EA-0FED-4A2F-B68D-96CE29844487}</Project> + <Name>NHibernate.ByteCode.Castle</Name> + </ProjectReference> + <ProjectReference Include="..\NHibernate\NHibernate.csproj"> + <Project>{5909BFE7-93CF-4E5F-BE22-6293368AF01D}</Project> + <Name>NHibernate</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="ProxyInterface\CastleProxyImpl.hbm.xml" /> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="ProxyInterface\Mappings.hbm.xml" /> + </ItemGroup> + <ItemGroup> + <None Include="App.config" /> + <None Include="ByteCode.Test.build" /> + </ItemGroup> + <ItemGroup> + <Folder Include="Properties\" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> + <PropertyGroup> + <PostBuildEvent>if exist hibernate.cfg.xml (del hibernate.cfg.xml) +if exist "$(ProjectDir)hibernate.cfg.xml" (copy "$(ProjectDir)hibernate.cfg.xml" "hibernate.cfg.xml")</PostBuildEvent> + </PropertyGroup> +</Project> \ No newline at end of file Property changes on: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/Properties ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Property changes on: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxy.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxy.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxy.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,14 @@ +namespace NHibernate.ByteCode.Castle.Tests.ProxyInterface +{ + /// <summary> + /// Summary description for CastleProxy. + /// </summary> + public interface CastleProxy + { + int Id { get; set; } + + string Name { get; set; } + + void ThrowDeepException(); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyFixture.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,144 @@ +using System; +using System.Collections; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using NUnit.Framework; + +namespace NHibernate.ByteCode.Castle.Tests.ProxyInterface +{ + /// <summary> + /// Summary description for CastleProxyFixture. + /// </summary> + [TestFixture] + public class CastleProxyFixture : TestCase + { + protected override IList Mappings + { + get { return new[] {"ProxyInterface.CastleProxyImpl.hbm.xml"}; } + } + + [Test] + public void Proxy() + { + ISession s = OpenSession(); + CastleProxy ap = new CastleProxyImpl {Id = 1, Name = "first proxy"}; + s.Save(ap); + s.Flush(); + s.Close(); + + s = OpenSession(); + ap = (CastleProxy) s.Load(typeof (CastleProxyImpl), ap.Id); + Assert.IsFalse(NHibernateUtil.IsInitialized(ap)); + int id = ap.Id; + Assert.IsFalse(NHibernateUtil.IsInitialized(ap), "get id should not have initialized it."); + string name = ap.Name; + Assert.IsTrue(NHibernateUtil.IsInitialized(ap), "get name should have initialized it."); + s.Delete(ap); + s.Flush(); + s.Close(); + } + + private void SerializeAndDeserialize(ref ISession s) + { + // Serialize the session + using (Stream stream = new MemoryStream()) + { + IFormatter formatter = new BinaryFormatter(); + formatter.Serialize(stream, s); + + // Close the original session + s.Close(); + + // Deserialize the session + stream.Position = 0; + s = (ISession) formatter.Deserialize(stream); + } + } + + [Test] + public void ProxySerialize() + { + ISession s = OpenSession(); + CastleProxy ap = new CastleProxyImpl(); + ap.Id = 1; + ap.Name = "first proxy"; + s.Save(ap); + s.Flush(); + s.Close(); + + s = OpenSession(); + ap = (CastleProxy) s.Load(typeof (CastleProxyImpl), ap.Id); + Assert.AreEqual(1, ap.Id); + s.Disconnect(); + + SerializeAndDeserialize(ref s); + + s.Reconnect(); + s.Disconnect(); + + // serialize and then deserialize the session again - make sure Castle.DynamicProxy + // has no problem with serializing two times - earlier versions of it did. + SerializeAndDeserialize(ref s); + + s.Close(); + + s = OpenSession(); + s.Delete(ap); + s.Flush(); + s.Close(); + } + + [Test] + public void SerializeNotFoundProxy() + { + ISession s = OpenSession(); + // this does not actually exists in db + var notThere = (CastleProxy) s.Load(typeof (CastleProxyImpl), 5); + Assert.AreEqual(5, notThere.Id); + s.Disconnect(); + + // serialize and then deserialize the session. + SerializeAndDeserialize(ref s); + + Assert.IsNotNull(s.Load(typeof (CastleProxyImpl), 5), "should be proxy - even though it doesn't exists in db"); + s.Close(); + } + + [Test] + public void ExceptionStackTrace() + { + ISession s = OpenSession(); + CastleProxy ap = new CastleProxyImpl(); + ap.Id = 1; + ap.Name = "first proxy"; + s.Save(ap); + s.Flush(); + s.Close(); + + s = OpenSession(); + ap = (CastleProxy) s.Load(typeof (CastleProxyImpl), ap.Id); + Assert.IsFalse(NHibernateUtil.IsInitialized(ap), "check we have a proxy"); + + try + { + ap.ThrowDeepException(); + Assert.Fail("Exception not thrown"); + } + catch (ArgumentException ae) + { + Assert.AreEqual("thrown from Level2", ae.Message); + + string[] stackTraceLines = ae.StackTrace.Split('\n'); + Assert.IsTrue(stackTraceLines[0].Contains("Level2"), "top of exception stack is Level2()"); + Assert.IsTrue(stackTraceLines[1].Contains("Level1"), "next on exception stack is Level1()"); + } + finally + { + s.Delete(ap); + s.Flush(); + s.Close(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,35 @@ +using System; +using NHibernate.ByteCode.Castle.Tests.ProxyInterface; + +namespace NHibernate.ByteCode.Castle.Tests.ProxyInterface +{ + /// <summary> + /// Summary description for CastleProxyImpl. + /// </summary> + [Serializable] + public class CastleProxyImpl : CastleProxy + { + private static void Level1() + { + Level2(); + } + + private static void Level2() + { + throw new ArgumentException("thrown from Level2"); + } + + #region CastleProxy Members + + public int Id { get; set; } + + public string Name { get; set; } + + public void ThrowDeepException() + { + Level1(); + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CastleProxyImpl.hbm.xml 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.ByteCode.Castle.Tests" + namespace="NHibernate.ByteCode.Castle.Tests.ProxyInterface"> + <class name="CastleProxyImpl" proxy="CastleProxy" table="avalon_p"> + <id name="Id"> + <generator class="assigned" /> + </id> + + <property name="Name" /> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Classes.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Classes.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Classes.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,212 @@ +using System.Collections; +using Iesi.Collections; + +namespace NHibernate.ByteCode.Castle.Tests.ProxyInterface +{ + public class Blog + { + private ISet _posts; + private ISet _users; + + private int blog_id; + + public virtual int BlogID + { + get { return blog_id; } + set { blog_id = value; } + } + + private string blog_name; + + public virtual string BlogName + { + get { return blog_name; } + set { blog_name = value; } + } + + public virtual ISet Posts + { + get { return _posts; } + set { _posts = value; } + } + + public virtual ISet Users + { + get { return _users; } + set { _users = value; } + } + + public Blog() + { + _posts = new HashedSet(); + _users = new HashedSet(); + } + + public Blog(string name) : this() + { + blog_name = name; + } + } + + public class Comment + { + private Comment() {} + + public Comment(string text) : this() + { + _text = text; + } + + private int _id; + private int _indexInPost; + private string _text; + private Post _post; + private User commenter; + + public User Commenter + { + get { return commenter; } + set { commenter = value; } + } + + public virtual int IndexInPost + { + get { return _indexInPost; } + set { _indexInPost = value; } + } + + public virtual Post Post + { + get { return _post; } + set { _post = value; } + } + + public virtual int CommentId + { + get { return _id; } + set { _id = value; } + } + + public virtual string Text + { + get { return _text; } + set { _text = value; } + } + } + + public class Post + { + private int post_id; + private Blog _blog; + private string post_title; + private IList _comments; + private ISet categories = new HashedSet(); + + public ISet Categories + { + get { return categories; } + set { categories = value; } + } + + public virtual IList Comments + { + get { return _comments; } + set { _comments = value; } + } + + public virtual int PostId + { + get { return post_id; } + set { post_id = value; } + } + + public virtual string PostTitle + { + get { return post_title; } + set { post_title = value; } + } + + public virtual Blog Blog + { + get { return _blog; } + set { _blog = value; } + } + + public Post() + { + _comments = new ArrayList(); + } + + public Post(string title) : this() + { + post_title = title; + } + } + + public class User + { + private string _userName; + private int _userId; + private ISet _blogs; + + public virtual ISet Blogs + { + get { return _blogs; } + set { _blogs = value; } + } + + public virtual int UserId + { + get { return _userId; } + set { _userId = value; } + } + + public virtual string UserName + { + get { return _userName; } + set { _userName = value; } + } + + public User() + { + _blogs = new HashedSet(); + } + + public User(string name) : this() + { + _userName = name; + } + } + + public class Category + { + private int category_id; + private string name; + private ISet posts = new HashedSet(); + + public Category() {} + + public Category(string name) + { + this.name = name; + } + + public int CategoryId + { + get { return category_id; } + set { category_id = value; } + } + + public string Name + { + get { return name; } + set { name = value; } + } + + public ISet Posts + { + get { return posts; } + set { posts = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CustomProxyFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CustomProxyFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/CustomProxyFixture.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,151 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Reflection; +using Castle.Core.Interceptor; +using Castle.DynamicProxy; +using NHibernate.Bytecode; +using NHibernate.Cfg; +using NHibernate.Engine; +using NHibernate.Proxy; +using NHibernate.Type; +using NUnit.Framework; +using Environment=NHibernate.Cfg.Environment; + +namespace NHibernate.ByteCode.Castle.Tests.ProxyInterface +{ + [TestFixture] + public class CustomProxyFixture : TestCase + { + protected override IList Mappings + { + get { return new[] { "ProxyInterface.Mappings.hbm.xml" }; } + } + + protected override void Configure(Configuration configuration) + { + configuration.Properties[Environment.ProxyFactoryFactoryClass] = + typeof (CustomProxyFactoryFactory).AssemblyQualifiedName; + } + + [Test] + public void CanImplementNotifyPropertyChanged() + { + using (ISession s = OpenSession()) + { + s.Save(new Blog("blah")); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + var blog = (Blog) s.Load(typeof (Blog), 1); + var propertyChanged = (INotifyPropertyChanged) blog; + string propChanged = null; + propertyChanged.PropertyChanged += + delegate(object sender, PropertyChangedEventArgs e) { propChanged = e.PropertyName; }; + + blog.BlogName = "foo"; + Assert.AreEqual("BlogName", propChanged); + } + + using (ISession s = OpenSession()) + { + s.Delete("from Blog"); + s.Flush(); + } + } + } + + public class CustomProxyFactoryFactory : IProxyFactoryFactory + { + #region IProxyFactoryFactory Members + + public IProxyFactory BuildProxyFactory() + { + return new DataBindingProxyFactory(); + } + + public IProxyValidator ProxyValidator + { + get { return new DynProxyTypeValidator(); } + } + + #endregion + } + + public class DataBindingProxyFactory : ProxyFactory + { + public override INHibernateProxy GetProxy(object id, ISessionImplementor session) + { + try + { + LazyInitializer initializer = new DataBindingInterceptor(EntityName, PersistentClass, id, GetIdentifierMethod, + SetIdentifierMethod, ComponentIdType, session); + + object generatedProxy; + + var list = new ArrayList(Interfaces); + list.Add(typeof (INotifyPropertyChanged)); + var interfaces = (System.Type[]) list.ToArray(typeof (System.Type)); + if (IsClassProxy) + { + generatedProxy = DefaultProxyGenerator.CreateClassProxy(PersistentClass, interfaces, ProxyGenerationOptions.Default, + initializer); + } + else + { + generatedProxy = DefaultProxyGenerator.CreateInterfaceProxyWithoutTarget(interfaces[0], interfaces, initializer); + } + + initializer._constructed = true; + return (INHibernateProxy) generatedProxy; + } + catch (Exception e) + { + log.Error("Creating a proxy instance failed", e); + throw new HibernateException("Creating a proxy instance failed", e); + } + } + } + + public class DataBindingInterceptor : LazyInitializer + { + private PropertyChangedEventHandler subscribers = delegate { }; + + public DataBindingInterceptor(string entityName, System.Type persistentClass, object id, + MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, + IAbstractComponentType componentIdType, ISessionImplementor session) + : base(entityName, persistentClass, id, getIdentifierMethod, setIdentifierMethod, componentIdType, session) {} + + //public DataBindingInterceptor(System.Type persistentClass, object id, MethodInfo getIdentifierMethod, MethodInfo setIdentifierMethod, ISessionImplementor session) + // : base(persistentClass, id, getIdentifierMethod, setIdentifierMethod, session) + //{ + //} + + public override void Intercept(IInvocation invocation) + { + object result; + if (invocation.Method.DeclaringType == typeof (INotifyPropertyChanged)) + { + var propertyChangedEventHandler = (PropertyChangedEventHandler) invocation.GetArgumentValue(0); + if (invocation.Method.Name.StartsWith("add_")) + { + subscribers += propertyChangedEventHandler; + } + else + { + subscribers -= propertyChangedEventHandler; + } + return; + } + base.Intercept(invocation); + result = invocation.ReturnValue; + if (invocation.Method.Name.StartsWith("set_")) + { + subscribers(this, new PropertyChangedEventArgs(invocation.Method.Name.Substring(4))); + } + invocation.ReturnValue = result; + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/ProxyInterface/Mappings.hbm.xml 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,156 @@ +<?xml version='1.0' encoding='utf-8'?> +<hibernate-mapping + xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' + xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns='urn:nhibernate-mapping-2.2' + assembly="NHibernate.ByteCode.Castle.Tests" + namespace="NHibernate.ByteCode.Castle.Tests.ProxyInterface" + default-lazy='false'> + + <class + name='Blog' + lazy='true' + table='Blogs'> + <id + name='BlogID' + column='blog_id' + unsaved-value='0'> + <generator + class='native' /> + </id> + <property + name='BlogName' + column='blog_name' /> + <set + name='Posts' + lazy='true' + cascade='all-delete-orphan' + inverse='true'> + <key + column='post_blogid' /> + <one-to-many + class='Post' /> + + </set> + <set + name='Users' + + table='UsersBlogs' + lazy='true' + cascade='save-update' + inverse='true'> + <key + column='blog_id' /> + <many-to-many + class='User' + column='user_id' /> + </set> + </class> + <class + name='User' + lazy='true' + table='`Users`'> + <id + name='UserId' + column='user_id'> + <generator + class='native' /> + </id> + <property + name='UserName' + type='string' + column='user_name' /> + <set + name='Blogs' + + table='UsersBlogs' + lazy='true' + cascade='save-update'> + <key + column='user_id' /> + + <many-to-many + class='Blog' + column='blog_id' /> + </set> + </class> + <class + name='Post' + table='Posts'> + <id + name='PostId' + column='post_id' + unsaved-value='0'> + <generator + class='native' /> + </id> + <many-to-one + name='Blog' + + class='Blog' + column='post_blogid' /> + <bag + name='Comments' + + table='Comments' + lazy='true' + cascade='all-delete-orphan' + inverse='true'> + + <key + column='comment_postid' /> + <one-to-many + class='Comment' /> + </bag> + <set name='Categories' + table='PostsCategories'> + <key column='post_id'/> + <many-to-many class='Category' + column='category_id'/> + </set> + </class> + <class name='Category' + table='Categories'> + <id + name='CategoryId' + column='category_id' + unsaved-value='0'> + <generator + class='native' /> + </id> + <property name='Name'/> + <set name='Posts' inverse='true' + table='PostsCategories'> + <key column='category_id'/> + <many-to-many class='Post' + column='post_id'/> + </set> + </class> + <class + name='Comment' + table='Comments'> + <id + name='CommentId' + column='comment_id' + unsaved-value='0'> + <generator + class='native' /> + </id> + <property + name='Text' + type='string' + column='comment_text' /> + + <property + name='IndexInPost' + column='comment_post_index' /> + <many-to-one + name='Post' + + class='Post' + column='comment_postid' /> + <many-to-one + name='Commenter' + class='User' + column='user_id' /> + </class> +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestCase.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestCase.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestCase.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,323 @@ +using System; +using System.Collections; +using System.Data; +using System.Reflection; +using log4net; +using log4net.Config; +using NHibernate.Cfg; +using NHibernate.Connection; +using NHibernate.Engine; +using NHibernate.Mapping; +using NHibernate.Tool.hbm2ddl; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.ByteCode.Castle.Tests +{ + public abstract class TestCase + { + private const bool OutputDdl = false; + protected Configuration cfg; + protected ISessionFactoryImplementor sessions; + + private static readonly ILog log = LogManager.GetLogger(typeof(TestCase)); + + protected Dialect.Dialect Dialect + { + get { return NHibernate.Dialect.Dialect.GetDialect(cfg.Properties); } + } + + protected ISession lastOpenedSession; + private DebugConnectionProvider connectionProvider; + + /// <summary> + /// Mapping files used in the TestCase + /// </summary> + protected abstract IList Mappings { get; } + + /// <summary> + /// Assembly to load mapping files from (default is NHibernate.DomainModel). + /// </summary> + protected virtual string MappingsAssembly + { + get { return typeof(TestCase).Namespace; } + } + + static TestCase() + { + // Configure log4net here since configuration through an attribute doesn't always work. + XmlConfigurator.Configure(); + } + + /// <summary> + /// Creates the tables used in this TestCase + /// </summary> + [TestFixtureSetUp] + public void TestFixtureSetUp() + { + try + { + Configure(); + if (!AppliesTo(Dialect)) + { + Assert.Ignore(GetType() + " does not apply to " + Dialect); + } + + CreateSchema(); + BuildSessionFactory(); + } + catch (Exception e) + { + log.Error("Error while setting up the test fixture", e); + throw; + } + } + + /// <summary> + /// Removes the tables used in this TestCase. + /// </summary> + /// <remarks> + /// If the tables are not cleaned up sometimes SchemaExport runs into + /// Sql errors because it can't drop tables because of the FKs. This + /// will occur if the TestCase does not have the same hbm.xml files + /// included as a previous one. + /// </remarks> + [TestFixtureTearDown] + public void TestFixtureTearDown() + { + DropSchema(); + Cleanup(); + } + + protected virtual void OnSetUp() + { + } + + /// <summary> + /// Set up the test. This method is not overridable, but it calls + /// <see cref="OnSetUp" /> which is. + /// </summary> + [SetUp] + public void SetUp() + { + OnSetUp(); + } + + protected virtual void OnTearDown() + { + } + + /// <summary> + /// Checks that the test case cleans up after itself. This method + /// is not overridable, but it calls <see cref="OnTearDown" /> which is. + /// </summary> + [TearDown] + public void TearDown() + { + OnTearDown(); + + bool wasClosed = CheckSessionWasClosed(); + bool wasCleaned = CheckDatabaseWasCleaned(); + bool wereConnectionsClosed = CheckConnectionsWereClosed(); + bool fail = !wasClosed || !wasCleaned || !wereConnectionsClosed; + + if (fail) + { + Assert.Fail("Test didn't clean up after itself"); + } + } + + private bool CheckSessionWasClosed() + { + if (lastOpenedSession != null && lastOpenedSession.IsOpen) + { + log.Error("Test case didn't close a session, closing"); + lastOpenedSession.Close(); + return false; + } + + return true; + } + + private bool CheckDatabaseWasCleaned() + { + if (sessions.GetAllClassMetadata().Count == 0) + { + // Return early in the case of no mappings, also avoiding + // a warning when executing the HQL below. + return true; + } + + bool empty; + using (ISession s = sessions.OpenSession()) + { + IList objects = s.CreateQuery("from System.Object o").List(); + empty = objects.Count == 0; + } + + if (!empty) + { + log.Error("Test case didn't clean up the database after itself, re-creating the schema"); + DropSchema(); + CreateSchema(); + } + + return empty; + } + + private bool CheckConnectionsWereClosed() + { + if (connectionProvider == null || !connectionProvider.HasOpenConnections) + { + return true; + } + + log.Error("Test case didn't close all open connections, closing"); + connectionProvider.CloseAllConnections(); + return false; + } + + private void Configure() + { + cfg = new Configuration(); + if (TestConfigurationHelper.hibernateConfigFile != null) + cfg.Configure(TestConfigurationHelper.hibernateConfigFile); + + Assembly assembly = Assembly.Load(MappingsAssembly); + + foreach (string file in Mappings) + { + cfg.AddResource(MappingsAssembly + "." + file, assembly); + } + + Configure(cfg); + + ApplyCacheSettings(cfg); + } + + private void CreateSchema() + { + new SchemaExport(cfg).Create(OutputDdl, true); + } + + private void DropSchema() + { + new SchemaExport(cfg).Drop(OutputDdl, true); + } + + protected virtual void BuildSessionFactory() + { + sessions = (ISessionFactoryImplementor)cfg.BuildSessionFactory(); + connectionProvider = sessions.ConnectionProvider as DebugConnectionProvider; + } + + private void Cleanup() + { + sessions.Close(); + sessions = null; + connectionProvider = null; + lastOpenedSession = null; + cfg = null; + } + + public int ExecuteStatement(string sql) + { + if (cfg == null) + { + cfg = new Configuration(); + } + + using (IConnectionProvider prov = ConnectionProviderFactory.NewConnectionProvider(cfg.Properties)) + { + IDbConnection conn = prov.GetConnection(); + + try + { + using (IDbTransaction tran = conn.BeginTransaction()) + using (IDbCommand comm = conn.CreateCommand()) + { + comm.CommandText = sql; + comm.Transaction = tran; + comm.CommandType = CommandType.Text; + int result = comm.ExecuteNonQuery(); + tran.Commit(); + return result; + } + } + finally + { + prov.CloseConnection(conn); + } + } + } + + protected ISessionFactoryImplementor Sfi + { + get { return sessions; } + } + + protected virtual ISession OpenSession() + { + lastOpenedSession = sessions.OpenSession(); + return lastOpenedSession; + } + + protected virtual ISession OpenSession(IInterceptor sessionLocalInterceptor) + { + lastOpenedSession = sessions.OpenSession(sessionLocalInterceptor); + return lastOpenedSession; + } + + protected void ApplyCacheSettings(Configuration configuration) + { + if (CacheConcurrencyStrategy == null) + { + return; + } + + foreach (PersistentClass clazz in configuration.ClassMappings) + { + bool hasLob = false; + foreach (Property prop in clazz.PropertyClosureIterator) + { + if (prop.Value.IsSimpleValue) + { + IType type = ((SimpleValue)prop.Value).Type; + if (type == NHibernateUtil.BinaryBlob) + { + hasLob = true; + } + } + } + if (!hasLob && !clazz.IsInherited) + { + configuration.SetCacheConcurrencyStrategy(clazz.EntityName, CacheConcurrencyStrategy); + } + } + + foreach (Mapping.Collection coll in configuration.CollectionMappings) + { + configuration.SetCollectionCacheConcurrencyStrategy(coll.Role, CacheConcurrencyStrategy); + } + } + + #region Properties overridable by subclasses + + protected virtual bool AppliesTo(Dialect.Dialect dialect) + { + return true; + } + + protected virtual void Configure(Configuration configuration) + { + } + + protected virtual string CacheConcurrencyStrategy + { + get { return "nonstrict-read-write"; } + //get { return null; } + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestConfigurationHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestConfigurationHelper.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.ByteCode.Castle.Tests/TestConfigurationHelper.cs 2008-11-07 22:32:55 UTC (rev 3894) @@ -0,0 +1,40 @@ +using System; +using System.IO; +using NHibernate.Cfg; + +namespace NHibernate.ByteCode.Castle.Tests +{ + public static class TestConfigurationHelper + { + public static readonly string hibernateConfigFile; + + static TestConfigurationHelper() + { + // Verify if hibernate.cfg.xml exists + hibernateConfigFile = GetDefaultConfigurationFilePath(); + } + + public static string GetDefaultConfigurationFilePath() + { + string baseDir = AppDomain.CurrentDomain.BaseDirectory; + string relativeSearchPath = AppDo... [truncated message content] |
From: <fab...@us...> - 2008-11-07 21:44:04
|
Revision: 3893 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3893&view=rev Author: fabiomaulo Date: 2008-11-07 21:41:22 +0000 (Fri, 07 Nov 2008) Log Message: ----------- Modified Paths: -------------- trunk/nhibernate/default.build trunk/nhibernate/releasenotes.txt trunk/nhibernate/src/NHibernate.Config.Templates/FireBird.cfg.xml.tmpl trunk/nhibernate/src/NHibernate.Config.Templates/MSSQL.cfg.xml.tmpl trunk/nhibernate/src/NHibernate.Config.Templates/MySql.cfg.xml.tmpl trunk/nhibernate/src/NHibernate.Config.Templates/Oracle.cfg.xml.tmpl trunk/nhibernate/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml.tmpl trunk/nhibernate/src/NHibernate.Config.Templates/SQLite.cfg.xml.tmpl trunk/nhibernate/src/NHibernate.Everything.sln trunk/nhibernate/src/NHibernate.Example.Web/Web.Config trunk/nhibernate/src/NHibernate.Test/App.config trunk/nhibernate/src/NHibernate.Test/DynamicEntity/DataProxyHandler.cs trunk/nhibernate/src/NHibernate.Test/DynamicEntity/ProxyHelper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.build trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.sln Removed Paths: ------------- trunk/nhibernate/src/NHibernate.ProxyGenerators.CastleDynamicProxy/ trunk/nhibernate/src/NHibernate.ProxyGenerators.CastleDynamicProxy.Tests/ trunk/nhibernate/src/NHibernate.ProxyGenerators.LinFuDynamicProxy/ trunk/nhibernate/src/NHibernate.ProxyGenerators.LinFuDynamicProxy.Tests/ Modified: trunk/nhibernate/default.build =================================================================== --- trunk/nhibernate/default.build 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/default.build 2008-11-07 21:41:22 UTC (rev 3893) @@ -26,10 +26,10 @@ <include name="Iesi.Collections/Iesi.Collections.build" /> <include name="Iesi.Collections.Test/Iesi.Collections.Test.build" /> <include name="NHibernate/NHibernate.build" /> - <include name="NHibernate.ProxyGenerators.LinFuDynamicProxy/ProxyGenerators.build" /> - <include name="NHibernate.ProxyGenerators.LinFuDynamicProxy.Tests/ProxyGenerators.Test.build" /> - <include name="NHibernate.ProxyGenerators.CastleDynamicProxy/ProxyGenerators.build" /> - <include name="NHibernate.ProxyGenerators.CastleDynamicProxy.Tests/ProxyGenerators.Test.build" /> + <include name="NHibernate.ByteCode.LinFu/ByteCode.build" /> + <include name="NHibernate.ByteCode.LinFu.Tests/ByteCode.Test.build" /> + <include name="NHibernate.ByteCode.Castle/ByteCode.build" /> + <include name="NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build" /> <include name="NHibernate.DomainModel/NHibernate.DomainModel.build" /> <include name="NHibernate.Test/NHibernate.Test.build" /> <include name="NHibernate.Test.Performance/NHibernate.Test.Performance.build" /> @@ -39,8 +39,8 @@ <fileset id="buildfiles.tests" basedir="src"> <include name="Iesi.Collections.Test/Iesi.Collections.Test.build" /> - <include name="NHibernate.ProxyGenerators.LinFuDynamicProxy.Tests/ProxyGenerators.Test.build" /> - <include name="NHibernate.ProxyGenerators.CastleDynamicProxy.Tests/ProxyGenerators.Test.build" /> + <include name="NHibernate.ByteCode.LinFu.Tests/ByteCode.Test.build" /> + <include name="NHibernate.ByteCode.Castle.Tests/ByteCode.Test.build" /> <include name="NHibernate.Test/NHibernate.Test.build" /> <include name="NHibernate.Test.Performance/NHibernate.Test.Performance.build" if="${run.performance.tests}" /> @@ -89,10 +89,10 @@ --> <exclude name="Iesi.Collections.dll" /> <exclude name="Iesi.Collections.xml" /> - <exclude name="NHibernate.ProxyGenerators.LinFuDynamicProxy.dll" /> - <exclude name="NHibernate.ProxyGenerators.LinFuDynamicProxy.xml" /> - <exclude name="NHibernate.ProxyGenerators.CastleDynamicProxy.dll" /> - <exclude name="NHibernate.ProxyGenerators.CastleDynamicProxy.xml" /> + <exclude name="NHibernate.ByteCode.LinFuDynamicProxy.dll" /> + <exclude name="NHibernate.ByteCode.LinFuDynamicProxy.xml" /> + <exclude name="NHibernate.ByteCode.CastleDynamicProxy.dll" /> + <exclude name="NHibernate.ByteCode.CastleDynamicProxy.xml" /> <include name="*.dll" /> <include name="*.xml" /> <include name="*.license.txt" /> Modified: trunk/nhibernate/releasenotes.txt =================================================================== --- trunk/nhibernate/releasenotes.txt 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/releasenotes.txt 2008-11-07 21:41:22 UTC (rev 3893) @@ -2,15 +2,17 @@ ======================== ** BREAKING CHANGES from NH2.0.xGA to NH2.1.0 ##### Run time ##### - * If you want work using lazy loading with Castle.DynamicProxy2 now you must deploy NHibernate.ProxyGenerators.CastleDynamicProxy.dll + * If you want work using lazy loading with LinFu.DynamicProxy now you must deploy NHibernate.ByteCode.LinFu.dll + * If you want work using lazy loading with Castle.DynamicProxy2 now you must deploy NHibernate.ByteCode.Castle.dll ##### Possible Breaking Changes for external frameworks ##### * ISession interface have additional methods - * DefaultProxyFactoryFactory moved to NHibernate.Bytecode.Castle.ProxyFactoryFactory + * DefaultProxyFactoryFactory removed * IProxyFactoryFactory now provide the IProxyValidator implementation ##### Initialization time ##### * The ProxyValidator check for "internal virtual" (to be intercepted by proxy need "protected internal virtual") + * The session-factory configuration property "proxyfactory.factory_class" is mandatory; You must choose one of the availables NHibernate.ByteCode Build 2.0.1.GA Modified: trunk/nhibernate/src/NHibernate.Config.Templates/FireBird.cfg.xml.tmpl =================================================================== --- trunk/nhibernate/src/NHibernate.Config.Templates/FireBird.cfg.xml.tmpl 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Config.Templates/FireBird.cfg.xml.tmpl 2008-11-07 21:41:22 UTC (rev 3893) @@ -24,7 +24,8 @@ </property> <property name="show_sql">false</property> <property name="dialect">NHibernate.Dialect.FirebirdDialect</property> - <property name="command_timeout">444</property> + <property name="command_timeout">60</property> <property name="query.substitutions">true 1, false 0, yes 1, no 0</property> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> Modified: trunk/nhibernate/src/NHibernate.Config.Templates/MSSQL.cfg.xml.tmpl =================================================================== --- trunk/nhibernate/src/NHibernate.Config.Templates/MSSQL.cfg.xml.tmpl 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Config.Templates/MSSQL.cfg.xml.tmpl 2008-11-07 21:41:22 UTC (rev 3893) @@ -15,7 +15,8 @@ <property name="show_sql">false</property> <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> <property name="use_outer_join">true</property> - <property name="command_timeout">444</property> + <property name="command_timeout">60</property> <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Config.Templates/MySql.cfg.xml.tmpl =================================================================== --- trunk/nhibernate/src/NHibernate.Config.Templates/MySql.cfg.xml.tmpl 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Config.Templates/MySql.cfg.xml.tmpl 2008-11-07 21:41:22 UTC (rev 3893) @@ -12,5 +12,6 @@ Database=test;Data Source=someip;User Id=blah;Password=blah </property> <property name="dialect">NHibernate.Dialect.MySQLDialect</property> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Config.Templates/Oracle.cfg.xml.tmpl =================================================================== --- trunk/nhibernate/src/NHibernate.Config.Templates/Oracle.cfg.xml.tmpl 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Config.Templates/Oracle.cfg.xml.tmpl 2008-11-07 21:41:22 UTC (rev 3893) @@ -14,5 +14,6 @@ <property name="show_sql">false</property> <property name="dialect">NHibernate.Dialect.OracleDialect</property> <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml.tmpl =================================================================== --- trunk/nhibernate/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml.tmpl 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Config.Templates/PostgreSQL.cfg.xml.tmpl 2008-11-07 21:41:22 UTC (rev 3893) @@ -11,5 +11,6 @@ Server=localhost;initial catalog=nhibernate;User ID=nhibernate;Password=nhibernate; </property> <property name="dialect">NHibernate.Dialect.PostgreSQLDialect</property> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Config.Templates/SQLite.cfg.xml.tmpl =================================================================== --- trunk/nhibernate/src/NHibernate.Config.Templates/SQLite.cfg.xml.tmpl 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Config.Templates/SQLite.cfg.xml.tmpl 2008-11-07 21:41:22 UTC (rev 3893) @@ -12,5 +12,6 @@ </property> <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> <property name="query.substitutions">true=1;false=0</property> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Everything.sln =================================================================== --- trunk/nhibernate/src/NHibernate.Everything.sln 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Everything.sln 2008-11-07 21:41:22 UTC (rev 3893) @@ -99,12 +99,16 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.Tool.HbmXsd", "NHibernate.Tool.HbmXsd\NHibernate.Tool.HbmXsd.csproj", "{446E148D-A9D5-4D7D-A706-BEDD45B2BC7D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Default proxy generator", "Default proxy generator", "{D2E4E87F-2531-4C7A-BBE9-FE8BFEDECECE}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ByteCode providers", "ByteCode providers", "{D2E4E87F-2531-4C7A-BBE9-FE8BFEDECECE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ProxyGenerators.CastleDynamicProxy", "NHibernate.ProxyGenerators.CastleDynamicProxy\NHibernate.ProxyGenerators.CastleDynamicProxy.csproj", "{31C3F0EA-0FED-4A2F-B68D-96CE29844487}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ByteCode.Castle", "NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj", "{31C3F0EA-0FED-4A2F-B68D-96CE29844487}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ProxyGenerators.CastleDynamicProxy.Tests", "NHibernate.ProxyGenerators.CastleDynamicProxy.Tests\NHibernate.ProxyGenerators.CastleDynamicProxy.Tests.csproj", "{4972EE96-2417-4D47-9FF1-3B1D6B1D3191}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ByteCode.Castle.Tests", "NHibernate.ByteCode.Castle.Tests\NHibernate.ByteCode.Castle.Tests.csproj", "{4972EE96-2417-4D47-9FF1-3B1D6B1D3191}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ByteCode.LinFu", "NHibernate.ByteCode.LinFu\NHibernate.ByteCode.LinFu.csproj", "{8289D6AD-9714-42D3-A94D-D4D9814D1281}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ByteCode.LinFu.Tests", "NHibernate.ByteCode.LinFu.Tests\NHibernate.ByteCode.LinFu.Tests.csproj", "{94FDD99B-8275-4E51-8F43-958B2C632120}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|.NET = Debug|.NET @@ -226,6 +230,26 @@ {4972EE96-2417-4D47-9FF1-3B1D6B1D3191}.Release|Any CPU.Build.0 = Release|Any CPU {4972EE96-2417-4D47-9FF1-3B1D6B1D3191}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {4972EE96-2417-4D47-9FF1-3B1D6B1D3191}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Debug|.NET.ActiveCfg = Debug|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Release|.NET.ActiveCfg = Release|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Release|Any CPU.Build.0 = Release|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Debug|.NET.ActiveCfg = Debug|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Release|.NET.ActiveCfg = Release|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Release|Any CPU.Build.0 = Release|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {94FDD99B-8275-4E51-8F43-958B2C632120}.Release|Mixed Platforms.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -246,8 +270,10 @@ {446E148D-A9D5-4D7D-A706-BEDD45B2BC7D} = {92509065-DAEA-4457-8300-C7B64CD0E9F4} {4C251E3E-6EA1-4A51-BBCB-F9C42AE55344} = {C91E7018-3C67-4830-963A-C388C75E1BD5} {58CE4584-31B9-4E74-A7FB-5D40BFAD0876} = {C91E7018-3C67-4830-963A-C388C75E1BD5} + {4972EE96-2417-4D47-9FF1-3B1D6B1D3191} = {D2E4E87F-2531-4C7A-BBE9-FE8BFEDECECE} + {8289D6AD-9714-42D3-A94D-D4D9814D1281} = {D2E4E87F-2531-4C7A-BBE9-FE8BFEDECECE} + {94FDD99B-8275-4E51-8F43-958B2C632120} = {D2E4E87F-2531-4C7A-BBE9-FE8BFEDECECE} {31C3F0EA-0FED-4A2F-B68D-96CE29844487} = {D2E4E87F-2531-4C7A-BBE9-FE8BFEDECECE} - {4972EE96-2417-4D47-9FF1-3B1D6B1D3191} = {D2E4E87F-2531-4C7A-BBE9-FE8BFEDECECE} EndGlobalSection GlobalSection(TextTemplating) = postSolution TextTemplating = 1 Modified: trunk/nhibernate/src/NHibernate.Example.Web/Web.Config =================================================================== --- trunk/nhibernate/src/NHibernate.Example.Web/Web.Config 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Example.Web/Web.Config 2008-11-07 21:41:22 UTC (rev 3893) @@ -61,6 +61,7 @@ </property> <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> <property name="current_session_context_class">managed_web</property> + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2008-11-07 21:41:22 UTC (rev 3893) @@ -66,6 +66,8 @@ <property name="command_timeout">444</property> <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> <property name="adonet.wrap_result_sets">false</property> + + <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> </session-factory> </hibernate-configuration> Modified: trunk/nhibernate/src/NHibernate.Test/DynamicEntity/DataProxyHandler.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DynamicEntity/DataProxyHandler.cs 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Test/DynamicEntity/DataProxyHandler.cs 2008-11-07 21:41:22 UTC (rev 3893) @@ -1,9 +1,9 @@ using System.Collections; -using Castle.Core.Interceptor; +using LinFu.DynamicProxy; namespace NHibernate.Test.DynamicEntity { - public sealed class DataProxyHandler : Castle.Core.Interceptor.IInterceptor + public sealed class DataProxyHandler : LinFu.DynamicProxy.IInterceptor { private readonly Hashtable data = new Hashtable(); private readonly string entityName; @@ -26,32 +26,32 @@ #region IInterceptor Members - public void Intercept(IInvocation invocation) + public object Intercept(InvocationInfo info) { - invocation.ReturnValue = null; - string methodName = invocation.Method.Name; + string methodName = info.TargetMethod.Name; if ("get_DataHandler".Equals(methodName)) { - invocation.ReturnValue = this; + return this; } else if (methodName.StartsWith("set_")) { string propertyName = methodName.Substring(4); - data[propertyName] = invocation.Arguments[0]; + data[propertyName] = info.Arguments[0]; } else if (methodName.StartsWith("get_")) { string propertyName = methodName.Substring(4); - invocation.ReturnValue = data[propertyName]; + return data[propertyName]; } else if ("ToString".Equals(methodName)) { - invocation.ReturnValue = entityName + "#" + data["Id"]; + return entityName + "#" + data["Id"]; } else if ("GetHashCode".Equals(methodName)) { - invocation.ReturnValue = GetHashCode(); + return GetHashCode(); } + return null; } #endregion Modified: trunk/nhibernate/src/NHibernate.Test/DynamicEntity/ProxyHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/DynamicEntity/ProxyHelper.cs 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Test/DynamicEntity/ProxyHelper.cs 2008-11-07 21:41:22 UTC (rev 3893) @@ -1,65 +1,56 @@ -using Castle.DynamicProxy; +using LinFu.DynamicProxy; namespace NHibernate.Test.DynamicEntity { public class ProxyHelper { - private static readonly ProxyGenerator proxyGenerator = new ProxyGenerator(); + private static readonly ProxyFactory proxyGenerator = new ProxyFactory(); + private static T NewProxy<T>(object id) + { + return proxyGenerator.CreateProxy<T>(new DataProxyHandler(typeof (T).FullName, id), + new[] {typeof (IProxyMarker), typeof (T)}); + + } + public static Person NewPersonProxy() { - return NewPersonProxy(0L); + return NewProxy<Person>(0L); } public static Person NewPersonProxy(object id) { - return - (Person) - proxyGenerator.CreateInterfaceProxyWithoutTarget(typeof (Person), - new System.Type[] {typeof (IProxyMarker), typeof (Person)}, - new DataProxyHandler(typeof (Person).FullName, id)); + return NewProxy<Person>(id); } public static Customer NewCustomerProxy() { - return NewCustomerProxy(0L); + return NewProxy<Customer>(0L); } public static Customer NewCustomerProxy(object id) { - return - (Customer) - proxyGenerator.CreateInterfaceProxyWithoutTarget(typeof (Customer), - new System.Type[] {typeof (IProxyMarker), typeof (Customer)}, - new DataProxyHandler(typeof (Customer).FullName, id)); + return NewProxy<Customer>(id); } public static Company NewCompanyProxy() { - return NewCompanyProxy(0L); + return NewProxy<Company>(0L); } public static Company NewCompanyProxy(object id) { - return - (Company) - proxyGenerator.CreateInterfaceProxyWithoutTarget(typeof (Company), - new System.Type[] {typeof (IProxyMarker), typeof (Company)}, - new DataProxyHandler(typeof (Company).FullName, id)); + return NewProxy<Company>(id); } public static Address NewAddressProxy() { - return NewAddressProxy(0L); + return NewProxy<Address>(0L); } public static Address NewAddressProxy(object id) { - return - (Address) - proxyGenerator.CreateInterfaceProxyWithoutTarget(typeof (Address), - new System.Type[] {typeof (IProxyMarker), typeof (Address)}, - new DataProxyHandler(typeof (Address).FullName, id)); + return NewProxy<Address>(id); } public static string ExtractEntityName(object obj) Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.build =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.build 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.build 2008-11-07 21:41:22 UTC (rev 3893) @@ -11,14 +11,13 @@ <include name="System.dll" /> <include name="System.Transactions.dll" /> <include name="System.Configuration.dll" /> - <include name="System.XML.dll" /> + <include name="System.Xml.dll" /> <include name="System.Data.dll" /> <include name="Iesi.Collections.dll" /> <include name="log4net.dll" /> <include name="NHibernate.DomainModel.dll" /> <include name="NHibernate.dll" /> - <include name="Castle.DynamicProxy2.dll" /> - <include name="Castle.Core.dll" /> + <include name="LinFu.DynamicProxy.dll" /> <include name="nunit.framework.dll" /> </assemblyfileset> <resourcefileset id="project.resources" prefix="NHibernate.Test" dynamicprefix="true"> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-07 21:41:22 UTC (rev 3893) @@ -39,18 +39,14 @@ <UseVSHostingProcess>false</UseVSHostingProcess> </PropertyGroup> <ItemGroup> - <Reference Include="Castle.Core, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\..\lib\net\2.0\Castle.Core.dll</HintPath> - </Reference> - <Reference Include="Castle.DynamicProxy2, Version=2.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\..\lib\net\2.0\Castle.DynamicProxy2.dll</HintPath> - </Reference> <Reference Include="Iesi.Collections, Version=1.0.0.1, Culture=neutral, PublicKeyToken=154fdcb44c4484fc"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\lib\net\2.0\Iesi.Collections.dll</HintPath> </Reference> + <Reference Include="LinFu.DynamicProxy, Version=1.0.3233.760, Culture=neutral, PublicKeyToken=62a6874124340d6e, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\2.0\LinFu.DynamicProxy.dll</HintPath> + </Reference> <Reference Include="log4net, Version=1.2.9.0, Culture=neutral, PublicKeyToken=b32731d11ce58905"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\lib\net\2.0\log4net.dll</HintPath> @@ -1026,14 +1022,14 @@ <None Include="NHibernate.Test.nunit" /> </ItemGroup> <ItemGroup> + <ProjectReference Include="..\NHibernate.ByteCode.LinFu\NHibernate.ByteCode.LinFu.csproj"> + <Project>{8289D6AD-9714-42D3-A94D-D4D9814D1281}</Project> + <Name>NHibernate.ByteCode.LinFu</Name> + </ProjectReference> <ProjectReference Include="..\NHibernate.DomainModel\NHibernate.DomainModel.csproj"> <Project>{5C649B55-1B3F-4C38-9998-1B043E94A244}</Project> <Name>NHibernate.DomainModel</Name> </ProjectReference> - <ProjectReference Include="..\NHibernate.ProxyGenerators.CastleDynamicProxy\NHibernate.ProxyGenerators.CastleDynamicProxy.csproj"> - <Project>{31C3F0EA-0FED-4A2F-B68D-96CE29844487}</Project> - <Name>NHibernate.ProxyGenerators.CastleDynamicProxy</Name> - </ProjectReference> <ProjectReference Include="..\NHibernate\NHibernate.csproj"> <Project>{5909BFE7-93CF-4E5F-BE22-6293368AF01D}</Project> <Name>NHibernate</Name> Modified: trunk/nhibernate/src/NHibernate.sln =================================================================== --- trunk/nhibernate/src/NHibernate.sln 2008-11-07 07:37:36 UTC (rev 3892) +++ trunk/nhibernate/src/NHibernate.sln 2008-11-07 21:41:22 UTC (rev 3893) @@ -12,14 +12,10 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.Test", "NHibernate.Test\NHibernate.Test.csproj", "{7AEE5B37-C552-4E59-9B6F-88755BCB5070}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ProxyGenerators.CastleDynamicProxy", "NHibernate.ProxyGenerators.CastleDynamicProxy\NHibernate.ProxyGenerators.CastleDynamicProxy.csproj", "{31C3F0EA-0FED-4A2F-B68D-96CE29844487}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ByteCode.LinFu", "NHibernate.ByteCode.LinFu\NHibernate.ByteCode.LinFu.csproj", "{8289D6AD-9714-42D3-A94D-D4D9814D1281}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ProxyGenerators.CastleDynamicProxy.Tests", "NHibernate.ProxyGenerators.CastleDynamicProxy.Tests\NHibernate.ProxyGenerators.CastleDynamicProxy.Tests.csproj", "{4972EE96-2417-4D47-9FF1-3B1D6B1D3191}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ByteCode.LinFu.Tests", "NHibernate.ByteCode.LinFu.Tests\NHibernate.ByteCode.LinFu.Tests.csproj", "{94FDD99B-8275-4E51-8F43-958B2C632120}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ProxyGenerators.LinFuDynamicProxy", "NHibernate.ProxyGenerators.LinFuDynamicProxy\NHibernate.ProxyGenerators.LinFuDynamicProxy.csproj", "{8289D6AD-9714-42D3-A94D-D4D9814D1281}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NHibernate.ProxyGenerators.LinFuDynamicProxy.Tests", "NHibernate.ProxyGenerators.LinFuDynamicProxy.Tests\NHibernate.ProxyGenerators.LinFuDynamicProxy.Tests.csproj", "{94FDD99B-8275-4E51-8F43-958B2C632120}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -38,14 +34,6 @@ {7AEE5B37-C552-4E59-9B6F-88755BCB5070}.Debug|Any CPU.Build.0 = Debug|Any CPU {7AEE5B37-C552-4E59-9B6F-88755BCB5070}.Release|Any CPU.ActiveCfg = Release|Any CPU {7AEE5B37-C552-4E59-9B6F-88755BCB5070}.Release|Any CPU.Build.0 = Release|Any CPU - {31C3F0EA-0FED-4A2F-B68D-96CE29844487}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {31C3F0EA-0FED-4A2F-B68D-96CE29844487}.Debug|Any CPU.Build.0 = Debug|Any CPU - {31C3F0EA-0FED-4A2F-B68D-96CE29844487}.Release|Any CPU.ActiveCfg = Release|Any CPU - {31C3F0EA-0FED-4A2F-B68D-96CE29844487}.Release|Any CPU.Build.0 = Release|Any CPU - {4972EE96-2417-4D47-9FF1-3B1D6B1D3191}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4972EE96-2417-4D47-9FF1-3B1D6B1D3191}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4972EE96-2417-4D47-9FF1-3B1D6B1D3191}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4972EE96-2417-4D47-9FF1-3B1D6B1D3191}.Release|Any CPU.Build.0 = Release|Any CPU {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Debug|Any CPU.Build.0 = Debug|Any CPU {8289D6AD-9714-42D3-A94D-D4D9814D1281}.Release|Any CPU.ActiveCfg = Release|Any CPU This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <te...@us...> - 2008-11-07 07:37:41
|
Revision: 3892 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3892&view=rev Author: tehlike Date: 2008-11-07 07:37:36 +0000 (Fri, 07 Nov 2008) Log Message: ----------- Implementing AbstractEnumType for enum bases. Also fixes NH-1232 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2008-11-07 07:37:36 UTC (rev 3892) @@ -1046,6 +1046,7 @@ <Compile Include="Tuple\VersionProperty.cs" /> <Compile Include="TypeMismatchException.cs" /> <Compile Include="Type\AbstractBynaryType.cs" /> + <Compile Include="Type\AbstractEnumType.cs" /> <Compile Include="Type\AbstractStringType.cs" /> <Compile Include="Type\AnsiCharType.cs" /> <Compile Include="Type\AnyType.cs" /> Added: trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/AbstractEnumType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Text; +using NHibernate.SqlTypes; + +namespace NHibernate.Type +{ + + /// <summary> + /// Base class for enum types. + /// </summary> + [Serializable] + public abstract class AbstractEnumType : PrimitiveType, IDiscriminatorType + { + protected AbstractEnumType(SqlType sqlType,System.Type enumType) + : base(sqlType) + { + if (enumType.IsEnum) + { + this.enumType = enumType; + } + else + { + throw new MappingException(enumType.Name + " did not inherit from System.Enum"); + } + defaultValue = Enum.GetValues(enumType).GetValue(0); + } + + private readonly object defaultValue; + private readonly System.Type enumType; + + public override System.Type ReturnedClass + { + get { return enumType; } + } + + + #region IIdentifierType Members + + public object StringToObject(string xml) + { + return Enum.Parse(enumType, xml); + } + + #endregion + + + public override object FromStringValue(string xml) + { + return StringToObject(xml); + } + + public override System.Type PrimitiveClass + { + get { return this.enumType; } + } + + public override object DefaultValue + { + get { return defaultValue; } + } + } +} Modified: trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/Type/EnumCharType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -6,21 +6,12 @@ namespace NHibernate.Type { [Serializable] - public class EnumCharType<T> : ImmutableType, IDiscriminatorType + public class EnumCharType<T> : AbstractEnumType { - public EnumCharType() : base(new StringFixedLengthSqlType(1)) + public EnumCharType() : base(new StringFixedLengthSqlType(1),typeof(T)) { - if (typeof(T).IsEnum) - { - this.enumClass = typeof(T); - } - else - { - throw new MappingException(enumClass.Name + " did not inherit from System.Enum"); - } } - private readonly System.Type enumClass; public virtual object GetInstance(object code) { @@ -34,13 +25,13 @@ } else { - throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, enumClass.Name)); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, ReturnedClass.Name)); } } private object GetInstanceFromString(String s) { - if (s.Length == 0) throw new HibernateException(string.Format("Can't Parse empty string as {0}", enumClass.Name)); + if (s.Length == 0) throw new HibernateException(string.Format("Can't Parse empty string as {0}", this.ReturnedClass.Name)); if (s.Length == 1) { @@ -52,17 +43,17 @@ //Name of enum value e.g. "Red" try { - return Enum.Parse(enumClass, s, false); + return Enum.Parse(this.ReturnedClass, s, false); } catch (ArgumentException) { try { - return Enum.Parse(enumClass, s, true); + return Enum.Parse(this.ReturnedClass, s, true); } catch (ArgumentException ae) { - throw new HibernateException(string.Format("Can't Parse {0} as {1}", s, enumClass.Name), ae); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", s, this.ReturnedClass.Name), ae); } } } @@ -72,13 +63,13 @@ { Object instance; - instance = Enum.ToObject(enumClass, c); - if (Enum.IsDefined(enumClass, instance)) return instance; + instance = Enum.ToObject(this.ReturnedClass, c); + if (Enum.IsDefined(this.ReturnedClass, instance)) return instance; - instance = Enum.ToObject(enumClass, Alternate(c)); - if (Enum.IsDefined(enumClass, instance)) return instance; + instance = Enum.ToObject(this.ReturnedClass, Alternate(c)); + if (Enum.IsDefined(this.ReturnedClass, instance)) return instance; - throw new HibernateException(string.Format("Can't Parse {0} as {1}", c, enumClass.Name)); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", c, this.ReturnedClass.Name)); } private Char Alternate(Char c) @@ -103,10 +94,6 @@ } } - public override System.Type ReturnedClass - { - get { return enumClass; } - } public override void Set(IDbCommand cmd, object value, int index) { @@ -141,7 +128,7 @@ public override string Name { - get { return "enumchar - " + enumClass.Name; } + get { return "enumchar - " + this.ReturnedClass.Name; } } public override string ToString(object value) @@ -166,17 +153,13 @@ return (value == null) ? null : GetValue(value); } - public virtual object StringToObject(string xml) - { - return (string.IsNullOrEmpty(xml)) ? null : FromStringValue(xml); - } public override object FromStringValue(string xml) { return GetInstance(xml); } - public virtual string ObjectToSQLString(object value, Dialect.Dialect dialect) + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) { return '\'' + GetValue(value).ToString() + '\''; } Modified: trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/Type/EnumStringType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -62,9 +62,8 @@ /// </para> /// </remarks> [Serializable] - public abstract class EnumStringType : ImmutableType, IDiscriminatorType + public abstract class EnumStringType : AbstractEnumType { - private readonly System.Type enumClass; /// <summary> /// Hardcoding of <c>255</c> for the maximum length @@ -91,16 +90,9 @@ /// <param name="enumClass">The <see cref="System.Type"/> of the Enum.</param> /// <param name="length">The length of the string that can be written to the column.</param> protected EnumStringType(System.Type enumClass, int length) - : base(SqlTypeFactory.GetString(length)) + :base(SqlTypeFactory.GetString(length),enumClass) { - if (enumClass.IsEnum) - { - this.enumClass = enumClass; - } - else - { - throw new MappingException(enumClass.Name + " did not inherit from System.Enum"); - } + } /// <summary> @@ -113,11 +105,11 @@ //code is an named constants defined for the enumeration. try { - return Enum.Parse(enumClass, code as string, true); + return StringToObject(code as string); } catch (ArgumentException ae) { - throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, enumClass.Name), ae); + throw new HibernateException(string.Format("Can't Parse {0} as {1}", code, this.ReturnedClass.Name), ae); } } @@ -135,14 +127,6 @@ /// <summary> /// /// </summary> - public override System.Type ReturnedClass - { - get { return enumClass; } - } - - /// <summary> - /// - /// </summary> /// <param name="cmd"></param> /// <param name="value"></param> /// <param name="index"></param> @@ -155,7 +139,7 @@ } else { - par.Value = Enum.Format(this.enumClass, value, "G"); + par.Value = Enum.Format(this.ReturnedClass, value, "G"); } } @@ -200,7 +184,7 @@ /// </remarks> public override string Name { - get { return "enumstring - " + enumClass.Name; } + get { return "enumstring - " + this.ReturnedClass.Name; } } /// <summary> @@ -237,23 +221,9 @@ return (value == null) ? null : GetValue(value); } - /// <summary> - /// - /// </summary> - /// <param name="xml"></param> - /// <returns></returns> - public object StringToObject(string xml) - { - return (string.IsNullOrEmpty(xml)) ? null : FromStringValue(xml); - } - public override object FromStringValue(string xml) + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) { - return GetInstance(xml); - } - - public string ObjectToSQLString(object value, Dialect.Dialect dialect) - { return GetValue(value).ToString(); } } Modified: trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate/Type/PersistentEnumType.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -10,7 +10,7 @@ /// PersistentEnumType /// </summary> [Serializable] - public class PersistentEnumType : PrimitiveType + public class PersistentEnumType : AbstractEnumType { #region Converters @@ -160,19 +160,11 @@ } private static readonly Dictionary<System.Type, IEnumConverter> converters; - private readonly System.Type enumClass; private readonly IEnumConverter converter; - private readonly object defaultValue; - public PersistentEnumType(System.Type enumClass) : base(GetEnumCoverter(enumClass).SqlType) + public PersistentEnumType(System.Type enumClass) : base(GetEnumCoverter(enumClass).SqlType,enumClass) { - if (!enumClass.IsEnum) - { - throw new MappingException(enumClass.Name + " did not inherit from System.Enum"); - } converter = GetEnumCoverter(enumClass); - this.enumClass = enumClass; - defaultValue = Enum.GetValues(enumClass).GetValue(0); } public static IEnumConverter GetEnumCoverter(System.Type enumClass) @@ -207,7 +199,7 @@ { try { - return converter.ToObject(enumClass, code); + return converter.ToObject(this.ReturnedClass, code); } catch (ArgumentException ae) { @@ -230,10 +222,6 @@ return converter.ToEnumValue(code); } - public override System.Type ReturnedClass - { - get { return enumClass; } - } public override void Set(IDbCommand cmd, object value, int index) { @@ -248,7 +236,7 @@ public override string Name { - get { return enumClass.FullName; } + get { return ReturnedClass.FullName; } } public override string ToString(object value) @@ -283,22 +271,13 @@ return false; } - return ((PersistentEnumType) obj).enumClass == enumClass; + return ((PersistentEnumType)obj).ReturnedClass == ReturnedClass; } public override int GetHashCode() { - return enumClass.GetHashCode(); + return ReturnedClass.GetHashCode(); } - public override System.Type PrimitiveClass - { - get { return enumClass; } - } - - public override object DefaultValue - { - get { return defaultValue; } - } } } Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-07 04:49:41 UTC (rev 3891) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2008-11-07 07:37:36 UTC (rev 3892) @@ -858,6 +858,11 @@ <Compile Include="SubclassFilterTest\DiscrimSubclassFilterTest.cs" /> <Compile Include="SubclassFilterTest\Employee.cs" /> <Compile Include="SubclassFilterTest\Person.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Bar.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Baz.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Colors.cs" /> + <Compile Include="Subclass\EnumDiscriminator\EnumDiscriminatorFixture.cs" /> + <Compile Include="Subclass\EnumDiscriminator\Foo.cs" /> <Compile Include="Subclass\SubclassAssert.cs" /> <Compile Include="Subclass\SubclassBase.cs" /> <Compile Include="Subclass\SubclassExtendsFixture.cs" /> @@ -1517,6 +1522,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="Subclass\EnumDiscriminator\EnumDiscriminator.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\Select\MyEntity.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1478\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1447\Mappings.hbm.xml" /> Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Bar.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,4 @@ +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public class Bar : Foo {} +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Baz.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,22 @@ +using System; + +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public class Baz + { + private Int64 id; + private Colors color; + + public virtual Int64 Id + { + get { return id; } + set { id = value; } + } + + public virtual Colors Color + { + get { return color; } + set { color = value; } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Colors.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,9 @@ +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public enum Colors + { + Red, + Green, + Blue + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminator.hbm.xml 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,17 @@ +<?xml version="1.0"?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" namespace="NHibernate.Test.Subclass.EnumDiscriminator" assembly="NHibernate.Test"> + <class name="Foo" table="subclass_enumdiscriminator" discriminator-value="Green"> + <id name="Id" type="Int64"> + <generator class="assigned"/> + </id> + <discriminator column="Color" type="NHibernate.Test.Subclass.EnumDiscriminator.Colors, NHibernate.Test"/> + <subclass name="Bar" discriminator-value="Blue"/> + </class> + + <class name="Baz" table="subclass_enumdiscriminator"> + <id name="Id" type="Int64"> + <generator class="assigned"/> + </id> + <property name="Color"/> + </class> +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/EnumDiscriminatorFixture.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,74 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + [TestFixture] + public class EnumDiscriminatorFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new String[] {"Subclass.EnumDiscriminator.EnumDiscriminator.hbm.xml"}; } + } + + [Test] + public void PersistsDefaultDiscriminatorValue() + { + Foo foo = new Foo(); + foo.Id = 1; + + using (ISession s = OpenSession()) + { + s.Save(foo); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + Baz baz = s.Load<Baz>(1L); + Assert.AreEqual(Colors.Green, baz.Color); + } + } + + [Test] + public void CanConvertOneTypeToAnother() + { + Foo foo = new Foo(); + foo.Id = 1; + + using (ISession s = OpenSession()) + { + s.Save(foo); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + Baz baz = s.Load<Baz>(1L); + baz.Color = Colors.Blue; + s.Save(baz); + s.Flush(); + } + + using (ISession s = OpenSession()) + { + Bar bar = s.Load<Bar>(1L); + } + } + + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + { + s.Delete("from Baz"); + s.Flush(); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/Subclass/EnumDiscriminator/Foo.cs 2008-11-07 07:37:36 UTC (rev 3892) @@ -0,0 +1,15 @@ +using System; + +namespace NHibernate.Test.Subclass.EnumDiscriminator +{ + public class Foo + { + private Int64 id; + + public long Id + { + get { return id; } + set { id = value; } + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |