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: <dav...@us...> - 2009-04-18 14:16:03
|
Revision: 4189 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4189&view=rev Author: davybrion Date: 2009-04-18 14:15:48 +0000 (Sat, 18 Apr 2009) Log Message: ----------- applying (updated) patch from James Lanng for NH-1670 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/IMultiCriteria.cs trunk/nhibernate/src/NHibernate/IMultiQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs Modified: trunk/nhibernate/src/NHibernate/IMultiCriteria.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IMultiCriteria.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/IMultiCriteria.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -10,11 +10,49 @@ public interface IMultiCriteria { /// <summary> - /// Get all the + /// Get all the results /// </summary> IList List(); /// <summary> + /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="resultGenericListType">Return results in a <see cref="System.Collections.Generic.List{resultGenericListType}"/></param> + /// <param name="criteria">The criteria.</param> + /// <returns></returns> + IMultiCriteria Add(System.Type resultGenericListType, ICriteria criteria); + + /// <summary> + /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="criteria">The criteria.</param> + /// <returns></returns> + IMultiCriteria Add<T>(ICriteria criteria); + + /// <summary> + /// Adds the specified criteria to the query, and associates it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key">The key</param> + /// <param name="criteria">The criteria</param> + /// <returns></returns> + IMultiCriteria Add<T>(string key, ICriteria criteria); + + /// <summary> + /// Adds the specified detached criteria. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="detachedCriteria">The detached criteria.</param> + /// <returns></returns> + IMultiCriteria Add<T>(DetachedCriteria detachedCriteria); + + /// <summary> + /// Adds the specified detached criteria, and associates it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key">The key</param> + /// <param name="detachedCriteria">The detached criteria</param> + /// <returns></returns> + IMultiCriteria Add<T>(string key, DetachedCriteria detachedCriteria); + + /// <summary> /// Adds the specified criteria to the query /// </summary> /// <param name="criteria">The criteria.</param> Modified: trunk/nhibernate/src/NHibernate/IMultiQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/IMultiQuery.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -11,11 +11,58 @@ public interface IMultiQuery { /// <summary> - /// Get all the + /// Get all the results /// </summary> IList List(); /// <summary> + /// Adds the specified criteria to the query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="resultGenericListType">Return results in a <see cref="System.Collections.Generic.List{resultGenericListType}"/></param> + /// <param name="criteria">The criteria.</param> + /// <returns></returns> + IMultiQuery Add(System.Type resultGenericListType, IQuery criteria); + + /// <summary> + /// Add the specified HQL query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + IMultiQuery Add<T>(IQuery query); + + /// <summary> + /// Add the specified HQL query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key"></param> + /// <param name="query"></param> + /// <returns></returns> + IMultiQuery Add<T>(string key, IQuery query); + + /// <summary> + /// Add the specified HQL Query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key"></param> + /// <param name="hql"></param> + /// <returns></returns> + IMultiQuery Add<T>(string key, string hql); + + /// <summary> + /// Add the specified HQL query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + IMultiQuery Add<T>(string hql); + + /// <summary> + /// Add a named query to the multi query. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + IMultiQuery AddNamedQuery<T>(string namedQuery); + + /// <summary> + /// Add a named query to the multi query, and associate it with the given key. The result will be contained in a <see cref="System.Collections.Generic.List{T}"/> + /// </summary> + /// <param name="key"></param> + /// <param name="namedKey"></param> + /// <returns></returns> + IMultiQuery AddNamedQuery<T>(string key, string namedKey); + + /// <summary> /// Add the specified HQL query to the multi query, and associate it with the given key /// </summary> /// <param name="key"></param> Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -833,7 +833,7 @@ return List<T>(); } - session.FutureQueryBatch.Add(this); + session.FutureQueryBatch.Add<T>(this); return session.FutureQueryBatch.GetEnumerator<T>(); } @@ -841,10 +841,10 @@ { if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) { - return new FutureValue<T>(List); + return new FutureValue<T>(List<T>); } - session.FutureQueryBatch.Add(this); + session.FutureQueryBatch.Add<T>(this); return session.FutureQueryBatch.GetFutureValue<T>(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -375,25 +375,25 @@ { if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) { - return new FutureValue<T>(List); + return new FutureValue<T>(List<T>); } - session.FutureCriteriaBatch.Add(this); + session.FutureCriteriaBatch.Add<T>(this); return session.FutureCriteriaBatch.GetFutureValue<T>(); } - public IEnumerable<T> Future<T>() - { - if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) - { + public IEnumerable<T> Future<T>() + { + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { return List<T>(); - } + } - session.FutureCriteriaBatch.Add(this); - return session.FutureCriteriaBatch.GetEnumerator<T>(); - } + session.FutureCriteriaBatch.Add<T>(this); + return session.FutureCriteriaBatch.GetEnumerator<T>(); + } - public object UniqueResult() + public object UniqueResult() { return AbstractQueryImpl.UniqueElement(List()); } Modified: trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/DelayedEnumerator.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -5,7 +5,7 @@ { internal class DelayedEnumerator<T> : IEnumerable<T> { - public delegate IList GetResult(); + public delegate IList<T> GetResult(); private readonly GetResult result; Modified: trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/FutureCriteriaBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -6,6 +6,8 @@ public class FutureCriteriaBatch { private readonly List<ICriteria> criterias = new List<ICriteria>(); + private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + private int index; private IList results; private readonly ISession session; @@ -22,9 +24,9 @@ if (results == null) { var multiCriteria = session.CreateMultiCriteria(); - foreach (var crit in criterias) + for (int i = 0; i < criterias.Count; i++) { - multiCriteria.Add(crit); + multiCriteria.Add(resultCollectionGenericType[i], criterias[i]); } results = multiCriteria.List(); ((SessionImpl)session).FutureCriteriaBatch = null; @@ -33,22 +35,28 @@ } } - public void Add(ICriteria criteria) + public void Add<T>(ICriteria criteria) { criterias.Add(criteria); + resultCollectionGenericType.Add(typeof(T)); index = criterias.Count - 1; } + public void Add(ICriteria criteria) + { + Add<object>(criteria); + } + public IFutureValue<T> GetFutureValue<T>() { int currentIndex = index; - return new FutureValue<T>(() => (IList)Results[currentIndex]); + return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); } public IEnumerable<T> GetEnumerator<T>() { int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList)Results[currentIndex]); + return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); } } } Modified: trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/FutureQueryBatch.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -6,6 +6,8 @@ public class FutureQueryBatch { private readonly List<IQuery> queries = new List<IQuery>(); + private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); + private int index; private IList results; private readonly ISession session; @@ -22,33 +24,39 @@ if (results == null) { var multiQuery = session.CreateMultiQuery(); - foreach (var crit in queries) - { - multiQuery.Add(crit); - } - results = multiQuery.List(); + for (int i = 0; i < queries.Count; i++) + { + multiQuery.Add(resultCollectionGenericType[i], queries[i]); + } + results = multiQuery.List(); ((SessionImpl)session).FutureQueryBatch = null; } return results; } } - public void Add(IQuery query) + public void Add<T>(IQuery query) + { + queries.Add(query); + resultCollectionGenericType.Add(typeof(T)); + index = queries.Count - 1; + } + + public void Add(IQuery query) { - queries.Add(query); - index = queries.Count - 1; + Add<object>(query); } public IFutureValue<T> GetFutureValue<T>() { int currentIndex = index; - return new FutureValue<T>(() => (IList)Results[currentIndex]); + return new FutureValue<T>(() => (IList<T>)Results[currentIndex]); } public IEnumerable<T> GetEnumerator<T>() { int currentIndex = index; - return new DelayedEnumerator<T>(() => (IList)Results[currentIndex]); + return new DelayedEnumerator<T>(() => (IList<T>)Results[currentIndex]); } } } Modified: trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/FutureValue.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -1,10 +1,11 @@ using System.Collections; +using System.Collections.Generic; namespace NHibernate.Impl { internal class FutureValue<T> : IFutureValue<T> { - public delegate IList GetResult(); + public delegate IList<T> GetResult(); private readonly GetResult getResult; @@ -24,7 +25,7 @@ return default(T); } - return (T)result[0]; + return result[0]; } } } Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -19,8 +19,9 @@ { public class MultiCriteriaImpl : IMultiCriteria { - private static readonly ILog log = LogManager.GetLogger(typeof(MultiCriteriaImpl)); - private readonly IList<ICriteria> criteriaQueries = new List<ICriteria>(); + private static readonly ILog log = LogManager.GetLogger(typeof(MultiCriteriaImpl)); + private readonly IList<ICriteria> criteriaQueries = new List<ICriteria>(); + private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); private readonly SessionImpl session; private readonly ISessionFactoryImplementor factory; @@ -90,6 +91,7 @@ return criteriaResults; } + private IList ListUsingQueryCache() { IQueryCache queryCache = session.Factory.GetQueryCache(cacheRegion); @@ -202,7 +204,16 @@ hydratedObjects[i] = entitySpan == 0 ? null : new ArrayList(entitySpan); EntityKey[] keys = new EntityKey[entitySpan]; QueryParameters queryParameters = parameters[i]; - IList tmpResults = new ArrayList(); + IList tmpResults; + if (resultCollectionGenericType[i] == typeof(object)) + { + tmpResults = new ArrayList(); + } + else + { + tmpResults = (IList) Activator.CreateInstance(typeof (List<>).MakeGenericType(resultCollectionGenericType[i])); + } + RowSelection selection = parameters[i].RowSelection; createSubselects[i] = loader.IsSubselectLoadingEnabled; subselectResultKeys[i] = createSubselects[i] ? new List<EntityKey[]>() : null; @@ -327,37 +338,73 @@ } return colIndex; } + + public IMultiCriteria Add(System.Type resultGenericListType, ICriteria criteria) + { + criteriaQueries.Add(criteria); + resultCollectionGenericType.Add(resultGenericListType); - public IMultiCriteria Add(ICriteria criteria) + return this; + } + + public IMultiCriteria Add(ICriteria criteria) { + return Add<object>(criteria); + } + + public IMultiCriteria Add(string key, ICriteria criteria) + { + return Add<object>(key, criteria); + } + + public IMultiCriteria Add(DetachedCriteria detachedCriteria) + { + return Add<object>(detachedCriteria); + } + + public IMultiCriteria Add(string key, DetachedCriteria detachedCriteria) + { + return Add<object>(key, detachedCriteria); + } + + public IMultiCriteria Add<T>(ICriteria criteria) + { criteriaQueries.Add(criteria); + resultCollectionGenericType.Add(typeof(T)); + return this; } - public IMultiCriteria Add(string key, ICriteria criteria) + public IMultiCriteria Add<T>(string key, ICriteria criteria) { ThrowIfKeyAlreadyExists(key); criteriaQueries.Add(criteria); criteriaResultPositions.Add(key, criteriaQueries.Count - 1); + resultCollectionGenericType.Add(typeof(T)); + return this; } - public IMultiCriteria Add(DetachedCriteria detachedCriteria) + public IMultiCriteria Add<T>(DetachedCriteria detachedCriteria) { criteriaQueries.Add( detachedCriteria.GetExecutableCriteria(session) ); - return this; - } + resultCollectionGenericType.Add(typeof (T)); - public IMultiCriteria Add(string key, DetachedCriteria detachedCriteria) - { - ThrowIfKeyAlreadyExists(key); - criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session)); - criteriaResultPositions.Add(key, criteriaQueries.Count-1); return this; } + + public IMultiCriteria Add<T>(string key, DetachedCriteria detachedCriteria) + { + ThrowIfKeyAlreadyExists(key); + criteriaQueries.Add(detachedCriteria.GetExecutableCriteria(session)); + criteriaResultPositions.Add(key, criteriaQueries.Count - 1); + resultCollectionGenericType.Add(typeof(T)); + return this; + } + public IMultiCriteria SetCacheable(bool cachable) { isCacheable = cachable; Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -22,9 +22,7 @@ private static readonly ILog log = LogManager.GetLogger(typeof(MultiQueryImpl)); private readonly List<IQuery> queries = new List<IQuery>(); - private readonly List<IQueryTranslator> translators = new List<IQueryTranslator>(); - private readonly List<QueryParameters> parameters = new List<QueryParameters>(); - private IList queryResults; + private readonly List<IQueryTranslator> translators = new List<IQueryTranslator>(); private readonly IList<System.Type> resultCollectionGenericType = new List<System.Type>(); private readonly List<QueryParameters> parameters = new List<QueryParameters>(); private IList queryResults; private readonly Dictionary<string, int> criteriaResultPositions = new Dictionary<string, int>(); private string cacheRegion; private int commandTimeout = RowSelection.NoValue; @@ -290,44 +288,80 @@ } return this; } + + public IMultiQuery AddNamedQuery<T>(string key, string namedQuery) + { + ThrowIfKeyAlreadyExists(key); + return Add<T>(key, session.GetNamedQuery(namedQuery)); + } - public IMultiQuery Add(IQuery query) + public IMultiQuery Add(System.Type resultGenericListType, IQuery query) { - AddQueryForLaterExecutionAndReturnIndexOfQuery(query); - return this; - } + AddQueryForLaterExecutionAndReturnIndexOfQuery(resultGenericListType, query); - public IMultiQuery Add(string key, IQuery query) - { - ThrowIfKeyAlreadyExists(key); - criteriaResultPositions.Add(key, AddQueryForLaterExecutionAndReturnIndexOfQuery(query)); return this; } - public IMultiQuery Add(string hql) - { - return Add(((ISession)session).CreateQuery(hql)); - } + public IMultiQuery Add(string key, IQuery query) + { + return Add<object>(key, query); + } - public IMultiQuery Add(string key, string hql) - { - ThrowIfKeyAlreadyExists(key); - return Add(key, ((ISession)session).CreateQuery(hql)); - } + public IMultiQuery Add(IQuery query) + { + return Add<object>(query); + } - public IMultiQuery AddNamedQuery(string namedQuery) - { - return Add(session.GetNamedQuery(namedQuery)); - } + public IMultiQuery Add(string key, string hql) + { + return Add<object>(key, hql); + } + public IMultiQuery Add(string hql) + { + return Add<object>(hql); + } - public IMultiQuery AddNamedQuery(string key, string namedQuery) - { - ThrowIfKeyAlreadyExists(key); - return Add(key, session.GetNamedQuery(namedQuery)); - } + public IMultiQuery AddNamedQuery(string namedQuery) + { + return AddNamedQuery<object>(namedQuery); + } - public IMultiQuery SetCacheable(bool cacheable) + public IMultiQuery AddNamedQuery(string key, string namedQuery) + { + return AddNamedQuery<object>(key, namedQuery); + } + + public IMultiQuery Add<T>(IQuery query) + { + AddQueryForLaterExecutionAndReturnIndexOfQuery(typeof(T), query); + return this; + } + + public IMultiQuery Add<T>(string key, IQuery query) + { + ThrowIfKeyAlreadyExists(key); + criteriaResultPositions.Add(key, AddQueryForLaterExecutionAndReturnIndexOfQuery(typeof(T), query)); + return this; + } + + public IMultiQuery Add<T>(string hql) + { + return Add<T>(((ISession)session).CreateQuery(hql)); + } + + public IMultiQuery Add<T>(string key, string hql) + { + ThrowIfKeyAlreadyExists(key); + return Add<T>(key, ((ISession)session).CreateQuery(hql)); + } + + public IMultiQuery AddNamedQuery<T>(string namedQuery) + { + return Add<T>(session.GetNamedQuery(namedQuery)); + } + + public IMultiQuery SetCacheable(bool cacheable) { isCacheable = cacheable; return this; @@ -455,7 +489,15 @@ { IQueryTranslator translator = Translators[i]; QueryParameters parameter = Parameters[i]; - ArrayList tempResults = new ArrayList(); + IList tempResults; + if (resultCollectionGenericType[i] == typeof(object)) + { + tempResults = new ArrayList(); + } + else + { + tempResults = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(resultCollectionGenericType[i])); + } int entitySpan = translator.Loader.EntityPersisters.Length; hydratedObjects[i] = entitySpan > 0 ? new ArrayList() : null; RowSelection selection = parameter.RowSelection; @@ -496,8 +538,9 @@ hydratedObjects[i], keys, false); - tempResults.Add(result); + tempResults.Add(result); + if (createSubselects[i]) { subselectResultKeys[i].Add(keys); @@ -792,11 +835,12 @@ } } - private int AddQueryForLaterExecutionAndReturnIndexOfQuery(IQuery query) + private int AddQueryForLaterExecutionAndReturnIndexOfQuery(System.Type resultGenericListType, IQuery query) { ThrowNotSupportedIfSqlQuery(query); ((AbstractQueryImpl)query).SetIgnoreUknownNamedParameters(true); queries.Add(query); + resultCollectionGenericType.Add(resultGenericListType); return queries.Count - 1; } protected void ThrowNotSupportedIfSqlQuery(IQuery query) Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultiCriteriaFixture.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Reflection; using NHibernate.Cache; using NHibernate.Criterion; @@ -504,5 +505,24 @@ s.Flush(); } } + + [Test] + public void CanGetResultInAGenericList() + { + using (ISession s = OpenSession()) + { + ICriteria getItems = s.CreateCriteria(typeof(Item)); + ICriteria countItems = s.CreateCriteria(typeof(Item)) + .SetProjection(Projections.RowCount()); + + IMultiCriteria multiCriteria = s.CreateMultiCriteria() + .Add(getItems) // we expect a non-generic result from this (ArrayList) + .Add<int>(countItems); // we expect a generic result from this (List<int>) + IList results = multiCriteria.List(); + + Assert.IsInstanceOfType(typeof(ArrayList), results[0]); + Assert.IsInstanceOfType(typeof(List<int>), results[1]); + } + } } } Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2009-04-18 03:42:49 UTC (rev 4188) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/MultipleQueriesFixture.cs 2009-04-18 14:15:48 UTC (rev 4189) @@ -1,4 +1,5 @@ using System.Collections; +using System.Collections.Generic; using System.Reflection; using NHibernate.Cache; using NHibernate.Driver; @@ -484,6 +485,24 @@ RemoveAllItems(); } + [Test] + public void CanGetResultsInAGenericList() + { + using (ISession s = OpenSession()) + { + IQuery getItems = s.CreateQuery("from Item"); + IQuery countItems = s.CreateQuery("select count(*) from Item"); + + IList results = s.CreateMultiQuery() + .Add(getItems) + .Add<long>(countItems) + .List(); + + Assert.IsInstanceOfType(typeof(ArrayList), results[0]); + Assert.IsInstanceOfType(typeof(List<long>), results[1]); + } + } + public class ResultTransformerStub : IResultTransformer { private bool _wasTransformTupleCalled; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-18 03:42:55
|
Revision: 4188 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4188&view=rev Author: fabiomaulo Date: 2009-04-18 03:42:49 +0000 (Sat, 18 Apr 2009) Log Message: ----------- Sorry... test broken Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 03:25:17 UTC (rev 4187) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 03:42:49 UTC (rev 4188) @@ -420,10 +420,7 @@ protected void LogCommand(IDbCommand command) { - if (!string.IsNullOrEmpty(command.CommandText)) - { - factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); - } + factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); } private void LogOpenPreparedCommand() Modified: trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-18 03:25:17 UTC (rev 4187) +++ trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-18 03:42:49 UTC (rev 4188) @@ -197,8 +197,7 @@ qps.CommandText = query; qps.CommandType = CommandType.Text; qps.Transaction = trans; - log.Debug(string.Format("Reading high value:")); - PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(qps, FormatStyle.Basic); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Reading high value:", qps, FormatStyle.Basic); try { rs = qps.ExecuteReader(); @@ -226,8 +225,7 @@ session.Factory.ConnectionProvider.Driver.GenerateCommand(CommandType.Text, updateSql, parameterTypes); ups.Connection = conn; ups.Transaction = trans; - log.Debug(string.Format("Updating high value:")); - PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(ups, FormatStyle.Basic); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand("Updating high value:", ups, FormatStyle.Basic); try { Modified: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs 2009-04-18 03:25:17 UTC (rev 4187) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/MsSQL/MSSQLIdentityInsertWithStoredProcsTest.cs 2009-04-18 03:42:49 UTC (rev 4188) @@ -14,7 +14,7 @@ protected override string GetExpectedInsertOrgLogStatement(string orgName) { - return string.Format("exec nh_organization_native_id_insert @p0; @p0 = '{0}'", orgName); + return string.Format("exec nh_organization_native_id_insert @p0;@p0 = '{0}'", orgName); } protected override IList Mappings This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-18 03:25:25
|
Revision: 4187 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4187&view=rev Author: fabiomaulo Date: 2009-04-18 03:25:17 +0000 (Sat, 18 Apr 2009) Log Message: ----------- Minor adjustments of SQL log Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs trunk/nhibernate/src/NHibernate.Test/App.config Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 03:25:17 UTC (rev 4187) @@ -45,7 +45,7 @@ /// </summary> /// <param name="connectionManager">The <see cref="ConnectionManager"/> owning this batcher.</param> /// <param name="interceptor"></param> - public AbstractBatcher(ConnectionManager connectionManager, IInterceptor interceptor) + protected AbstractBatcher(ConnectionManager connectionManager, IInterceptor interceptor) { this.connectionManager = connectionManager; this.interceptor = interceptor; @@ -420,7 +420,10 @@ protected void LogCommand(IDbCommand command) { - factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); + if (!string.IsNullOrEmpty(command.CommandText)) + { + factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); + } } private void LogOpenPreparedCommand() Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-18 03:25:17 UTC (rev 4187) @@ -12,13 +12,17 @@ private int batchSize; private int totalExpectedRowsAffected; private SqlClientSqlCommandSet currentBatch; - private StringBuilder currentBatchCommandsLog = new StringBuilder(); + private StringBuilder currentBatchCommandsLog; public SqlClientBatchingBatcher(ConnectionManager connectionManager, IInterceptor interceptor) : base(connectionManager, interceptor) { batchSize = Factory.Settings.AdoBatchSize; currentBatch = new SqlClientSqlCommandSet(); + if(log.IsDebugEnabled) + { + currentBatchCommandsLog = new StringBuilder(); + } } public override int BatchSize @@ -30,13 +34,24 @@ public override void AddToBatch(IExpectation expectation) { totalExpectedRowsAffected += expectation.ExpectedRowCount; - log.Debug("Adding to batch:"); IDbCommand batchUpdate = CurrentCommand; if (log.IsDebugEnabled) { - string commandLoggedText = Factory.Settings.SqlStatementLogger.LogCommand(batchUpdate, FormatStyle.Basic); - currentBatchCommandsLog.Append("Batch command: ").AppendLine(commandLoggedText); + string lineWithParameters = Factory.Settings.SqlStatementLogger.GetCommandLineWithParameters(batchUpdate); + if (Factory.Settings.SqlStatementLogger.IsDebugEnabled) + { + Factory.Settings.SqlStatementLogger.LogCommand("Adding to batch:", batchUpdate, FormatStyle.Basic); + } + else + { + log.Debug("Adding to batch:" + lineWithParameters); + } + currentBatchCommandsLog.Append("Batch command: ").AppendLine(lineWithParameters); } + else + { + Factory.Settings.SqlStatementLogger.LogCommand(batchUpdate, FormatStyle.Basic); + } currentBatch.Append((System.Data.SqlClient.SqlCommand) batchUpdate); if (currentBatch.CountOfCommands >= batchSize) { @@ -49,9 +64,11 @@ log.Debug("Executing batch"); CheckReaders(); Prepare(currentBatch.BatchCommand); - - Factory.Settings.SqlStatementLogger.LogInfo(currentBatchCommandsLog.ToString()); - currentBatchCommandsLog = new StringBuilder(); + if (log.IsDebugEnabled) + { + log.Debug(currentBatchCommandsLog.ToString()); + currentBatchCommandsLog = new StringBuilder(); + } int rowsAffected = currentBatch.ExecuteNonQuery(); Expectations.VerifyOutcomeBatched(totalExpectedRowsAffected, rowsAffected); Modified: trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-04-18 03:25:17 UTC (rev 4187) @@ -26,49 +26,49 @@ public bool FormatSql { get; set; } - /// <summary> Log a SQL statement string. </summary> - /// <param name="statement">The SQL statement. </param> + public bool IsDebugEnabled + { + get { return log.IsDebugEnabled; } + } + + /// <summary> Log a IDbCommand. </summary> + /// <param name="message">Title</param> + /// <param name="command">The SQL statement. </param> /// <param name="style">The requested formatting style. </param> - public virtual void LogStatement(string statement, FormatStyle style) + public virtual void LogCommand(string message, IDbCommand command, FormatStyle style) { - if (!log.IsDebugEnabled && !LogToStdout) + if (!log.IsDebugEnabled && !LogToStdout || string.IsNullOrEmpty(command.CommandText)) { return; } + style = DetermineActualStyle(style); - statement = style.Formatter.Format(statement); - log.Debug(statement); + string statement = style.Formatter.Format(GetCommandLineWithParameters(command)); + string logMessage; + if (string.IsNullOrEmpty(message)) + { + logMessage= statement; + } + else + { + logMessage= message + statement; + } + log.Debug(logMessage); if (LogToStdout) { Console.Out.WriteLine("NHibernate: " + statement); } } - public virtual void LogInfo(string info) - { - log.Debug(info); - } - /// <summary> Log a IDbCommand. </summary> /// <param name="command">The SQL statement. </param> /// <param name="style">The requested formatting style. </param> - public virtual string LogCommand(IDbCommand command, FormatStyle style) + public virtual void LogCommand(IDbCommand command, FormatStyle style) { - if (log.IsDebugEnabled || LogToStdout) - { - style = DetermineActualStyle(style); - string statement = style.Formatter.Format(GetCommandLineWithParameters(command)); - log.Debug(statement); - if (LogToStdout) - { - Console.Out.WriteLine("NHibernate: " + statement); - } - return statement; - } - return null; + LogCommand(null, command, style); } - protected string GetCommandLineWithParameters(IDbCommand command) + public string GetCommandLineWithParameters(IDbCommand command) { string outputText; @@ -79,8 +79,8 @@ else { var output = new StringBuilder(command.CommandText.Length + (command.Parameters.Count * 20)); - output.Append(command.CommandText); - output.Append("; "); + output.Append(command.CommandText.TrimEnd(' ',';','\n')); + output.Append(";"); IDataParameter p; int count = command.Parameters.Count; @@ -93,13 +93,32 @@ } appendComma = true; p = (IDataParameter)command.Parameters[i]; - output.Append(string.Format("{0} = '{1}'", p.ParameterName, p.Value)); + output.Append(string.Format("{0} = {1}", p.ParameterName, GetParameterLogableValue(p))); } outputText = output.ToString(); } return outputText; } + public string GetParameterLogableValue(IDataParameter parameter) + { + if(parameter.Value == null || DBNull.Value.Equals(parameter.Value)) + { + return "null"; + } + else if (IsStringType(parameter.DbType)) + { + return string.Concat("'", parameter.Value.ToString(), "'"); + } + return parameter.Value.ToString(); + } + + private static bool IsStringType(DbType dbType) + { + return DbType.String.Equals(dbType) || DbType.AnsiString.Equals(dbType) + || DbType.AnsiStringFixedLength.Equals(dbType) || DbType.StringFixedLength.Equals(dbType); + } + private FormatStyle DetermineActualStyle(FormatStyle style) { return FormatSql ? style : FormatStyle.None; Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-18 00:30:01 UTC (rev 4186) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-18 03:25:17 UTC (rev 4187) @@ -125,6 +125,10 @@ <logger name="NHibernate.SQL"> <level value="OFF" /> </logger> + + <logger name="NHibernate.AdoNet.AbstractBatcher"> + <level value="OFF" /> + </logger> <logger name="NHibernate.Tool.hbm2ddl.SchemaExport"> <level value="ERROR" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-18 00:30:04
|
Revision: 4186 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4186&view=rev Author: fabiomaulo Date: 2009-04-18 00:30:01 +0000 (Sat, 18 Apr 2009) Log Message: ----------- - Fix NH-1745 - by default we are using format_sql=true in ours tests Modified Paths: -------------- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs trunk/nhibernate/src/NHibernate/Cfg/Settings.cs trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs trunk/nhibernate/src/NHibernate.Test/App.config trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/AdoNet/Util/ trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Pretty/ Modified: trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/AdoNet/AbstractBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,6 +1,5 @@ using System; using System.Data; -using System.Text; using Iesi.Collections.Generic; using log4net; using NHibernate.Driver; @@ -9,6 +8,7 @@ using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Util; +using NHibernate.AdoNet.Util; namespace NHibernate.AdoNet { @@ -18,7 +18,6 @@ public abstract class AbstractBatcher : IBatcher { protected static readonly ILog log = LogManager.GetLogger(typeof(AbstractBatcher)); - protected static readonly ILog logSql = LogManager.GetLogger("NHibernate.SQL"); private static int openCommandCount; private static int openReaderCount; @@ -421,50 +420,9 @@ protected void LogCommand(IDbCommand command) { - if (logSql.IsDebugEnabled || factory.Settings.IsShowSqlEnabled) - { - string outputText = GetCommandLogString(command); - logSql.Debug(outputText); - - if (factory.Settings.IsShowSqlEnabled) - { - Console.Out.Write("NHibernate: "); - Console.Out.WriteLine(outputText); - } - } + factory.Settings.SqlStatementLogger.LogCommand(command, FormatStyle.Basic); } - protected string GetCommandLogString(IDbCommand command) - { - string outputText; - - if (command.Parameters.Count == 0) - { - outputText = command.CommandText; - } - else - { - StringBuilder output = new StringBuilder(); - output.Append(command.CommandText); - output.Append("; "); - - IDataParameter p; - int count = command.Parameters.Count; - for (int i = 0; i < count; i++) - { - p = (IDataParameter) command.Parameters[i]; - output.Append(string.Format("{0} = '{1}'", p.ParameterName, p.Value)); - - if (i + 1 < count) - { - output.Append(", "); - } - } - outputText = output.ToString(); - } - return outputText; - } - private void LogOpenPreparedCommand() { if (log.IsDebugEnabled) Modified: trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/AdoNet/SqlClientBatchingBatcher.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,5 +1,6 @@ using System.Data; using System.Text; +using NHibernate.AdoNet.Util; namespace NHibernate.AdoNet { @@ -31,9 +32,11 @@ totalExpectedRowsAffected += expectation.ExpectedRowCount; log.Debug("Adding to batch:"); IDbCommand batchUpdate = CurrentCommand; - string commandLoggedText = GetCommandLogString(batchUpdate); - currentBatchCommandsLog.Append("Batch command: "). - AppendLine(commandLoggedText); + if (log.IsDebugEnabled) + { + string commandLoggedText = Factory.Settings.SqlStatementLogger.LogCommand(batchUpdate, FormatStyle.Basic); + currentBatchCommandsLog.Append("Batch command: ").AppendLine(commandLoggedText); + } currentBatch.Append((System.Data.SqlClient.SqlCommand) batchUpdate); if (currentBatch.CountOfCommands >= batchSize) { @@ -47,7 +50,7 @@ CheckReaders(); Prepare(currentBatch.BatchCommand); - logSql.Debug(currentBatchCommandsLog.ToString()); + Factory.Settings.SqlStatementLogger.LogInfo(currentBatchCommandsLog.ToString()); currentBatchCommandsLog = new StringBuilder(); int rowsAffected = currentBatch.ExecuteNonQuery(); Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/BasicFormatter.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,435 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Iesi.Collections.Generic; +using NHibernate.Util; + +namespace NHibernate.AdoNet.Util +{ + public class BasicFormatter : IFormatter + { + protected const string IndentString = " "; + protected const string Initial = "\n "; + protected static readonly HashedSet<string> beginClauses = new HashedSet<string>(); + protected static readonly HashedSet<string> dml = new HashedSet<string>(); + protected static readonly HashedSet<string> endClauses = new HashedSet<string>(); + protected static readonly HashedSet<string> logical = new HashedSet<string>(); + protected static readonly HashedSet<string> misc = new HashedSet<string>(); + protected static readonly HashedSet<string> quantifiers = new HashedSet<string>(); + + static BasicFormatter() + { + beginClauses.Add("left"); + beginClauses.Add("right"); + beginClauses.Add("inner"); + beginClauses.Add("outer"); + beginClauses.Add("group"); + beginClauses.Add("order"); + + endClauses.Add("where"); + endClauses.Add("set"); + endClauses.Add("having"); + endClauses.Add("join"); + endClauses.Add("from"); + endClauses.Add("by"); + endClauses.Add("join"); + endClauses.Add("into"); + endClauses.Add("union"); + + logical.Add("and"); + logical.Add("or"); + logical.Add("when"); + logical.Add("else"); + logical.Add("end"); + + quantifiers.Add("in"); + quantifiers.Add("all"); + quantifiers.Add("exists"); + quantifiers.Add("some"); + quantifiers.Add("any"); + + dml.Add("insert"); + dml.Add("update"); + dml.Add("delete"); + + misc.Add("select"); + misc.Add("on"); + } + + #region IFormatter Members + + public virtual string Format(string source) + { + return new FormatProcess(source).Perform(); + } + + #endregion + + #region Nested type: FormatProcess + + private class FormatProcess + { + private readonly List<bool> afterByOrFromOrSelects = new List<bool>(); + private readonly List<int> parenCounts = new List<int>(); + private readonly StringBuilder result = new StringBuilder(); + private readonly IEnumerator<string> tokens; + private bool afterBeginBeforeEnd; + private bool afterBetween; + private bool afterByOrSetOrFromOrSelect; + private bool afterInsert; + private bool afterOn; + private bool beginLine = true; + + private int indent = 1; + private int inFunction; + + private string lastToken; + private string lcToken; + private int parensSinceSelect; + private string token; + + public FormatProcess(string sql) + { + // TODO : some delimiter may depend from a specific Dialect/Drive (as ';' to separate multi query) + tokens = new StringTokenizer(sql, "()+*/-=<>'`\"[],;" + StringHelper.WhiteSpace, true).GetEnumerator(); + } + + public string Perform() + { + result.Append(Initial); + + while (tokens.MoveNext()) + { + token = tokens.Current; + lcToken = token.ToLowerInvariant(); + + if ("'".Equals(token)) + { + ExtractStringEnclosedBy("'"); + } + else if ("\"".Equals(token)) + { + ExtractStringEnclosedBy("\""); + } + + if(IsMultiQueryDelimiter(token)) + { + StartingNewQuery(); + } + else if (afterByOrSetOrFromOrSelect && ",".Equals(token)) + { + CommaAfterByOrFromOrSelect(); + } + else if (afterOn && ",".Equals(token)) + { + CommaAfterOn(); + } + else if ("(".Equals(token)) + { + OpenParen(); + } + else if (")".Equals(token)) + { + CloseParen(); + } + else if (beginClauses.Contains(lcToken)) + { + BeginNewClause(); + } + else if (endClauses.Contains(lcToken)) + { + EndNewClause(); + } + else if ("select".Equals(lcToken)) + { + Select(); + } + else if (dml.Contains(lcToken)) + { + UpdateOrInsertOrDelete(); + } + else if ("values".Equals(lcToken)) + { + Values(); + } + else if ("on".Equals(lcToken)) + { + On(); + } + else if (afterBetween && lcToken.Equals("and")) + { + Misc(); + afterBetween = false; + } + else if (logical.Contains(lcToken)) + { + Logical(); + } + else if (IsWhitespace(token)) + { + White(); + } + else + { + Misc(); + } + + if (!IsWhitespace(token)) + { + lastToken = lcToken; + } + } + return result.ToString(); + } + + private void StartingNewQuery() + { + Out(); + indent = 1; + Newline(); + } + + private bool IsMultiQueryDelimiter(string delimiter) + { + return ";".Equals(delimiter); + } + + private void ExtractStringEnclosedBy(string stringDelimiter) + { + while (tokens.MoveNext()) + { + string t = tokens.Current; + token += t; + if (stringDelimiter.Equals(t)) + { + break; + } + } + } + + private void CommaAfterOn() + { + Out(); + indent--; + Newline(); + afterOn = false; + afterByOrSetOrFromOrSelect = true; + } + + private void CommaAfterByOrFromOrSelect() + { + Out(); + Newline(); + } + + private void Logical() + { + if ("end".Equals(lcToken)) + { + indent--; + } + Newline(); + Out(); + beginLine = false; + } + + private void On() + { + indent++; + afterOn = true; + Newline(); + Out(); + beginLine = false; + } + + private void Misc() + { + Out(); + if ("between".Equals(lcToken)) + { + afterBetween = true; + } + if (afterInsert) + { + Newline(); + afterInsert = false; + } + else + { + beginLine = false; + if ("case".Equals(lcToken)) + { + indent++; + } + } + } + + private void White() + { + if (!beginLine) + { + result.Append(" "); + } + } + + private void UpdateOrInsertOrDelete() + { + Out(); + indent++; + beginLine = false; + if ("update".Equals(lcToken)) + { + Newline(); + } + if ("insert".Equals(lcToken)) + { + afterInsert = true; + } + } + + private void Select() + { + Out(); + indent++; + Newline(); + parenCounts.Insert(parenCounts.Count, parensSinceSelect); + afterByOrFromOrSelects.Insert(afterByOrFromOrSelects.Count, afterByOrSetOrFromOrSelect); + parensSinceSelect = 0; + afterByOrSetOrFromOrSelect = true; + } + + private void Out() + { + result.Append(token); + } + + private void EndNewClause() + { + if (!afterBeginBeforeEnd) + { + indent--; + if (afterOn) + { + indent--; + afterOn = false; + } + Newline(); + } + Out(); + if (!"union".Equals(lcToken)) + { + indent++; + } + Newline(); + afterBeginBeforeEnd = false; + afterByOrSetOrFromOrSelect = "by".Equals(lcToken) || "set".Equals(lcToken) || "from".Equals(lcToken); + } + + private void BeginNewClause() + { + if (!afterBeginBeforeEnd) + { + if (afterOn) + { + indent--; + afterOn = false; + } + indent--; + Newline(); + } + Out(); + beginLine = false; + afterBeginBeforeEnd = true; + } + + private void Values() + { + indent--; + Newline(); + Out(); + indent++; + Newline(); + } + + private void CloseParen() + { + parensSinceSelect--; + if (parensSinceSelect < 0) + { + indent--; + int tempObject = parenCounts[parenCounts.Count - 1]; + parenCounts.RemoveAt(parenCounts.Count - 1); + parensSinceSelect = tempObject; + + bool tempObject2 = afterByOrFromOrSelects[afterByOrFromOrSelects.Count - 1]; + afterByOrFromOrSelects.RemoveAt(afterByOrFromOrSelects.Count - 1); + afterByOrSetOrFromOrSelect = tempObject2; + } + if (inFunction > 0) + { + inFunction--; + Out(); + } + else + { + if (!afterByOrSetOrFromOrSelect) + { + indent--; + Newline(); + } + Out(); + } + beginLine = false; + } + + private void OpenParen() + { + if (IsFunctionName(lastToken) || inFunction > 0) + { + inFunction++; + } + beginLine = false; + if (inFunction > 0) + { + Out(); + } + else + { + Out(); + if (!afterByOrSetOrFromOrSelect) + { + indent++; + Newline(); + beginLine = true; + } + } + parensSinceSelect++; + } + + private static bool IsFunctionName(string tok) + { + char begin = tok[0]; + bool isIdentifier = (char.IsLetter(begin) || begin.CompareTo('$') == 0 || begin.CompareTo('_') == 0) || '"' == begin; + return isIdentifier && !logical.Contains(tok) && !endClauses.Contains(tok) && !quantifiers.Contains(tok) + && !dml.Contains(tok) && !misc.Contains(tok); + } + + private static bool IsWhitespace(string token) + { + return StringHelper.WhiteSpace.IndexOf(token) >= 0; + } + + private void Newline() + { + result.Append("\n"); + for (int i = 0; i < indent; i++) + { + result.Append(IndentString); + } + beginLine = true; + } + } + + #endregion + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs (from rev 4185, trunk/nhibernate/src/NHibernate/Pretty/DdlFormatter.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/DdlFormatter.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,150 @@ +using System.Collections.Generic; +using System.Text; +using NHibernate.Util; + +namespace NHibernate.AdoNet.Util +{ + public class DdlFormatter: IFormatter + { + private const string Indent1 = "\n "; + private const string Indent2 = "\n "; + private const string Indent3 = "\n "; + + /// <summary> Format an SQL statement using simple rules: + /// a) Insert newline after each comma; + /// b) Indent three spaces after each inserted newline; + /// If the statement contains single/double quotes return unchanged, + /// it is too complex and could be broken by simple formatting. + /// </summary> + public virtual string Format(string sql) + { + if (sql.ToLowerInvariant().StartsWith("create table")) + { + return FormatCreateTable(sql); + } + else if (sql.ToLowerInvariant().StartsWith("alter table")) + { + return FormatAlterTable(sql); + } + else if (sql.ToLowerInvariant().StartsWith("comment on")) + { + return FormatCommentOn(sql); + } + else + { + return Indent1 + sql; + } + } + + protected virtual string FormatCommentOn(string sql) + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, " '[]\"", true)).GetEnumerator(); + + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + result.Append(token); + if (IsQuote(token)) + { + quoted = !quoted; + } + else if (!quoted) + { + if ("is".Equals(token)) + { + result.Append(Indent2); + } + } + } + + return result.ToString(); + } + + protected virtual string FormatAlterTable(string sql) + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, " (,)'[]\"", true)).GetEnumerator(); + + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + if (IsQuote(token)) + { + quoted = !quoted; + } + else if (!quoted) + { + if (IsBreak(token)) + { + result.Append(Indent3); + } + } + result.Append(token); + } + + return result.ToString(); + } + + protected virtual string FormatCreateTable(string sql) + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, "(,)'[]\"", true)).GetEnumerator(); + + int depth = 0; + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + if (IsQuote(token)) + { + quoted = !quoted; + result.Append(token); + } + else if (quoted) + { + result.Append(token); + } + else + { + if (")".Equals(token)) + { + depth--; + if (depth == 0) + { + result.Append(Indent1); + } + } + result.Append(token); + if (",".Equals(token) && depth == 1) + { + result.Append(Indent2); + } + if ("(".Equals(token)) + { + depth++; + if (depth == 1) + { + result.Append(Indent3); + } + } + } + } + + return result.ToString(); + } + + private static bool IsBreak(string token) + { + return "drop".Equals(token) || "add".Equals(token) || "references".Equals(token) || "foreign".Equals(token) + || "on".Equals(token); + } + + private static bool IsQuote(string token) + { + return "\"".Equals(token) || "`".Equals(token) || "]".Equals(token) || "[".Equals(token) || "'".Equals(token); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/FormatStyle.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,59 @@ +namespace NHibernate.AdoNet.Util +{ + /// <summary> Represents the the understood types or styles of formatting. </summary> + public class FormatStyle + { + public static readonly FormatStyle Basic = new FormatStyle("basic", new BasicFormatter()); + public static readonly FormatStyle Ddl = new FormatStyle("ddl", new DdlFormatter()); + public static readonly FormatStyle None = new FormatStyle("none", new NoFormatImpl()); + + private FormatStyle(string name, IFormatter formatter) + { + Name = name; + Formatter = formatter; + } + + public string Name { get; private set; } + + public IFormatter Formatter { get; private set; } + + public override bool Equals(object obj) + { + return Equals(obj as FormatStyle); + } + + public bool Equals(FormatStyle other) + { + if (other == null) + { + return false; + } + if (ReferenceEquals(this, other)) + { + return true; + } + return Equals(other.Name, Name); + } + + public override int GetHashCode() + { + return (Name != null ? Name.GetHashCode() : 0); + } + + #region Nested type: NoFormatImpl + + private class NoFormatImpl : IFormatter + { + #region IFormatter Members + + public string Format(string source) + { + return source; + } + + #endregion + } + + #endregion + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/IFormatter.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,7 @@ +namespace NHibernate.AdoNet.Util +{ + public interface IFormatter + { + string Format(string source); + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs =================================================================== --- trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/AdoNet/Util/SqlStatementLogger.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -0,0 +1,108 @@ +using System; +using System.Data; +using System.Text; +using log4net; + +namespace NHibernate.AdoNet.Util +{ + /// <summary> Centralize logging handling for SQL statements. </summary> + public class SqlStatementLogger + { + private static readonly ILog log = LogManager.GetLogger("NHibernate.SQL"); + + /// <summary> Constructs a new SqlStatementLogger instance.</summary> + public SqlStatementLogger() : this(false, false) {} + + /// <summary> Constructs a new SqlStatementLogger instance. </summary> + /// <param name="logToStdout">Should we log to STDOUT in addition to our internal logger. </param> + /// <param name="formatSql">Should we format SQL ('prettify') prior to logging. </param> + public SqlStatementLogger(bool logToStdout, bool formatSql) + { + LogToStdout = logToStdout; + FormatSql = formatSql; + } + + public bool LogToStdout { get; set; } + + public bool FormatSql { get; set; } + + /// <summary> Log a SQL statement string. </summary> + /// <param name="statement">The SQL statement. </param> + /// <param name="style">The requested formatting style. </param> + public virtual void LogStatement(string statement, FormatStyle style) + { + if (!log.IsDebugEnabled && !LogToStdout) + { + return; + } + style = DetermineActualStyle(style); + statement = style.Formatter.Format(statement); + log.Debug(statement); + if (LogToStdout) + { + Console.Out.WriteLine("NHibernate: " + statement); + } + } + + public virtual void LogInfo(string info) + { + log.Debug(info); + } + + /// <summary> Log a IDbCommand. </summary> + /// <param name="command">The SQL statement. </param> + /// <param name="style">The requested formatting style. </param> + public virtual string LogCommand(IDbCommand command, FormatStyle style) + { + if (log.IsDebugEnabled || LogToStdout) + { + style = DetermineActualStyle(style); + string statement = style.Formatter.Format(GetCommandLineWithParameters(command)); + log.Debug(statement); + if (LogToStdout) + { + Console.Out.WriteLine("NHibernate: " + statement); + } + return statement; + } + return null; + } + + protected string GetCommandLineWithParameters(IDbCommand command) + { + string outputText; + + if (command.Parameters.Count == 0) + { + outputText = command.CommandText; + } + else + { + var output = new StringBuilder(command.CommandText.Length + (command.Parameters.Count * 20)); + output.Append(command.CommandText); + output.Append("; "); + + IDataParameter p; + int count = command.Parameters.Count; + bool appendComma = false; + for (int i = 0; i < count; i++) + { + if (appendComma) + { + output.Append(", "); + } + appendComma = true; + p = (IDataParameter)command.Parameters[i]; + output.Append(string.Format("{0} = '{1}'", p.ParameterName, p.Value)); + } + outputText = output.ToString(); + } + return outputText; + } + + private FormatStyle DetermineActualStyle(FormatStyle style) + { + return FormatSql ? style : FormatStyle.None; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1530,7 +1530,11 @@ //protected Settings BuildSettings() private Settings BuildSettings() { - return settingsFactory.BuildSettings(properties); + var result = settingsFactory.BuildSettings(properties); + // NH : Set configuration for IdGenerator SQL logging + PersistentIdGeneratorParmsNames.SqlStatementLogger.FormatSql = result.SqlStatementLogger.FormatSql; + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogToStdout = result.SqlStatementLogger.LogToStdout; + return result; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Cfg/Settings.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Settings.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Cfg/Settings.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Data; using NHibernate.AdoNet; +using NHibernate.AdoNet.Util; using NHibernate.Cache; using NHibernate.Connection; using NHibernate.Exceptions; @@ -14,7 +15,11 @@ /// </summary> public sealed class Settings { - private int maximumFetchDepth = -1; + public Settings() + { + MaximumFetchDepth = -1; + } + // not ported - private TransactionManagerLookup transactionManagerLookup; // not ported - private bool strictJPAQLCompliance; @@ -24,17 +29,10 @@ //private bool isJdbcBatchVersionedData; #endregion + public SqlStatementLogger SqlStatementLogger { get; internal set; } - public bool IsShowSqlEnabled { get; internal set; } + public int MaximumFetchDepth { get; internal set; } - public bool IsFormatSqlEnabled { get; internal set; } - - public int MaximumFetchDepth - { - get { return maximumFetchDepth; } - internal set { maximumFetchDepth = value; } - } - public IDictionary<string, string> QuerySubstitutions { get; internal set; } public Dialect.Dialect Dialect { get; internal set; } Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -4,6 +4,7 @@ using System.Data; using log4net; using NHibernate.AdoNet; +using NHibernate.AdoNet.Util; using NHibernate.Cache; using NHibernate.Connection; using NHibernate.Dialect; @@ -118,6 +119,7 @@ { log.Info("echoing all SQL to stdout"); } + bool formatSql = PropertiesHelper.GetBoolean(Environment.FormatSql, properties); bool useStatistics = PropertiesHelper.GetBoolean(Environment.GenerateStatistics, properties); log.Info("Statistics: " + EnabledDisabled(useStatistics)); @@ -232,7 +234,8 @@ // Not ported - settings.StatementFetchSize = statementFetchSize; // Not ported - ScrollableResultSetsEnabled // Not ported - GetGeneratedKeysEnabled - settings.IsShowSqlEnabled = showSql; + settings.SqlStatementLogger = new SqlStatementLogger(showSql, formatSql); + settings.ConnectionProvider = connectionProvider; settings.QuerySubstitutions = querySubstitutions; settings.TransactionFactory = transactionFactory; Modified: trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Id/IPersistentIdentifierGenerator.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,9 +1,15 @@ using System; +using NHibernate.AdoNet.Util; namespace NHibernate.Id { public struct PersistentIdGeneratorParmsNames { + static PersistentIdGeneratorParmsNames() + { + SqlStatementLogger = new SqlStatementLogger(false, false); + } + /// <summary> The configuration parameter holding the schema name</summary> public readonly static string Schema = "schema"; @@ -27,6 +33,8 @@ /// <summary> The configuration parameter holding the catalog name</summary> public readonly static string Catalog = "catalog"; + + public readonly static SqlStatementLogger SqlStatementLogger; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Id/TableGenerator.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -14,6 +14,7 @@ namespace NHibernate.Id { using System.Transactions; + using NHibernate.AdoNet.Util; /// <summary> /// An <see cref="IIdentifierGenerator" /> that uses a database table to store the last @@ -196,9 +197,10 @@ qps.CommandText = query; qps.CommandType = CommandType.Text; qps.Transaction = trans; + log.Debug(string.Format("Reading high value:")); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(qps, FormatStyle.Basic); try { - log.Debug(string.Format("Reading high value:{0}", qps.CommandText)); rs = qps.ExecuteReader(); if (!rs.Read()) { @@ -224,16 +226,17 @@ session.Factory.ConnectionProvider.Driver.GenerateCommand(CommandType.Text, updateSql, parameterTypes); ups.Connection = conn; ups.Transaction = trans; + log.Debug(string.Format("Updating high value:")); + PersistentIdGeneratorParmsNames.SqlStatementLogger.LogCommand(ups, FormatStyle.Basic); try { columnType.Set(ups, result + 1, 0); columnType.Set(ups, result, 1); - log.Debug(string.Format("Updating high value:{0}", ups.CommandText)); rows = ups.ExecuteNonQuery(); } - // TODO: change to SqlException + // TODO: change to SqlException catch (Exception e) { log.Error("could not update hi value in: " + tableName, e); Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-18 00:30:01 UTC (rev 4186) @@ -443,6 +443,10 @@ <Compile Include="AdoNet\ResultSetWrapper.cs" /> <Compile Include="AdoNet\SqlClientBatchingBatcherFactory.cs" /> <Compile Include="AdoNet\TooManyRowsAffectedException.cs" /> + <Compile Include="AdoNet\Util\BasicFormatter.cs" /> + <Compile Include="AdoNet\Util\FormatStyle.cs" /> + <Compile Include="AdoNet\Util\IFormatter.cs" /> + <Compile Include="AdoNet\Util\SqlStatementLogger.cs" /> <Compile Include="Bytecode\HibernateByteCodeException.cs" /> <Compile Include="Bytecode\ProxyFactoryFactoryNotConfiguredException.cs" /> <Compile Include="Bytecode\UnableToLoadProxyFactoryFactoryException.cs" /> @@ -479,7 +483,7 @@ <Compile Include="Impl\FutureQueryBatch.cs" /> <Compile Include="Impl\FutureCriteriaBatch.cs" /> <Compile Include="Impl\FutureValue.cs" /> - <Compile Include="Pretty\DdlFormatter.cs" /> + <Compile Include="AdoNet\Util\DdlFormatter.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> <Compile Include="Bytecode\IAccessOptimizer.cs" /> Modified: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -3,9 +3,9 @@ using System.Data; using System.IO; using log4net; +using NHibernate.AdoNet.Util; using NHibernate.Cfg; using NHibernate.Connection; -using NHibernate.Pretty; using NHibernate.Util; using Environment=NHibernate.Cfg.Environment; @@ -27,7 +27,7 @@ private readonly string[] dropSQL; private string delimiter; private string outputFile; - private readonly bool format; + private readonly IFormatter formatter; /// <summary> /// Create a schema exported for a given Configuration @@ -47,7 +47,7 @@ dialect = Dialect.Dialect.GetDialect(configProperties); dropSQL = cfg.GenerateDropSchemaScript(dialect); createSQL = cfg.GenerateSchemaCreationScript(dialect); - format = PropertiesHelper.GetBoolean(Environment.FormatSql, configProperties, true); + formatter = (PropertiesHelper.GetBoolean(Environment.FormatSql, configProperties, true) ? FormatStyle.Ddl : FormatStyle.None).Formatter; } /// <summary> @@ -110,7 +110,7 @@ { try { - string formatted = Format(sql); + string formatted = formatter.Format(sql); if (delimiter != null) { @@ -303,15 +303,5 @@ } } } - - /// <summary> - /// Format an SQL statement. - /// </summary> - /// <param name="sql">The string containing the sql to format.</param> - /// <returns>A string that contains formatted sql.</returns> - private string Format(string sql) - { - return format ? new DdlFormatter(sql).Format() : sql; - } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaUpdate.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -5,6 +5,8 @@ using log4net; using NHibernate.Cfg; using NHibernate.Util; +using Environment=NHibernate.Cfg.Environment; +using NHibernate.AdoNet.Util; namespace NHibernate.Tool.hbm2ddl { @@ -15,20 +17,22 @@ private readonly IConnectionHelper connectionHelper; private readonly Dialect.Dialect dialect; private readonly List<Exception> exceptions; + private IFormatter formatter; public SchemaUpdate(Configuration cfg) : this(cfg, cfg.Properties) {} - public SchemaUpdate(Configuration cfg, IDictionary<string, string> connectionProperties) + public SchemaUpdate(Configuration cfg, IDictionary<string, string> configProperties) { configuration = cfg; - dialect = Dialect.Dialect.GetDialect(connectionProperties); + dialect = Dialect.Dialect.GetDialect(configProperties); var props = new Dictionary<string, string>(dialect.DefaultProperties); - foreach (var prop in connectionProperties) + foreach (var prop in configProperties) { props[prop.Key] = prop.Value; } connectionHelper = new ManagedProviderConnectionHelper(props); exceptions = new List<Exception>(); + formatter = (PropertiesHelper.GetBoolean(Environment.FormatSql, configProperties, true) ? FormatStyle.Ddl : FormatStyle.None).Formatter; } public SchemaUpdate(Configuration cfg, Settings settings) @@ -37,6 +41,7 @@ dialect = settings.Dialect; connectionHelper = new SuppliedConnectionProviderConnectionHelper(settings.ConnectionProvider); exceptions = new List<Exception>(); + formatter = (settings.SqlStatementLogger.FormatSql ? FormatStyle.Ddl : FormatStyle.None).Formatter; } /// <summary> @@ -162,11 +167,13 @@ for (int j = 0; j < createSQL.Length; j++) { string sql = createSQL[j]; + string formatted = formatter.Format(sql); + try { if (scriptAction != null) { - scriptAction(sql); + scriptAction(formatted); } if (doUpdate) { Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2009-04-18 00:30:01 UTC (rev 4186) @@ -53,6 +53,7 @@ Use the member names - not the values. --> <property name="connection.isolation">ReadCommitted</property> + <property name="format_sql">true</property> <!-- This is the System.Data.dll provider for MSSQL Server --> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> Modified: trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs 2009-04-17 18:01:35 UTC (rev 4185) +++ trunk/nhibernate/src/NHibernate.Test/SqlTest/Identity/IdentityInsertWithStoredProcsTest.cs 2009-04-18 00:30:01 UTC (rev 4186) @@ -1,3 +1,4 @@ +using NHibernate.Cfg; using NUnit.Framework; namespace NHibernate.Test.SqlTest.Identity @@ -9,6 +10,12 @@ get { return "NHibernate.Test"; } } + protected override void Configure(NHibernate.Cfg.Configuration configuration) + { + base.Configure(configuration); + configuration.SetProperty(Environment.FormatSql, "false"); + } + protected abstract string GetExpectedInsertOrgLogStatement(string orgName); /// <summary> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-17 18:01:48
|
Revision: 4185 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4185&view=rev Author: fabiomaulo Date: 2009-04-17 18:01:35 +0000 (Fri, 17 Apr 2009) Log Message: ----------- Fix NH-1701 BREAKING CHANGES : see releasenotes.txt Modified Paths: -------------- trunk/nhibernate/releasenotes.txt trunk/nhibernate/src/NHibernate/Cfg/Environment.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSerializationTests.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1521/Fixture.cs trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaExportTests/WithColumnTagFixture.cs trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Pretty/ trunk/nhibernate/src/NHibernate/Pretty/DdlFormatter.cs Modified: trunk/nhibernate/releasenotes.txt =================================================================== --- trunk/nhibernate/releasenotes.txt 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/releasenotes.txt 2009-04-17 18:01:35 UTC (rev 4185) @@ -6,6 +6,7 @@ * If you want work using lazy loading with Castle.DynamicProxy2 now you must deploy NHibernate.ByteCode.Castle.dll * If you want work using lazy loading with Spring.Aop now you must deploy NHibernate.ByteCode.Spring.dll * compatible only with .NET2.0 SP1 or above (System.DateTimeOffset) + * In SchemaExport.Execute the parameter "format" was removed; (NH-1701) enabled configuration property format_sql (default true) ##### Possible Breaking Changes for external frameworks ##### * ISession interface has additional methods Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -95,6 +95,9 @@ public const string CurrentSessionContextClass = "current_session_context_class"; public const string UseSqlComments = "use_sql_comments"; + /// <summary> Enable formatting of SQL logged to the console</summary> + public const string FormatSql = "format_sql"; + // Unused, Java-specific public const string UseGetGeneratedKeys = "jdbc.use_get_generated_keys"; Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-04-17 18:01:35 UTC (rev 4185) @@ -479,6 +479,7 @@ <Compile Include="Impl\FutureQueryBatch.cs" /> <Compile Include="Impl\FutureCriteriaBatch.cs" /> <Compile Include="Impl\FutureValue.cs" /> + <Compile Include="Pretty\DdlFormatter.cs" /> <Compile Include="Properties\BackFieldStrategy.cs" /> <Compile Include="Bytecode\CodeDom\BytecodeProviderImpl.cs" /> <Compile Include="Bytecode\IAccessOptimizer.cs" /> Added: trunk/nhibernate/src/NHibernate/Pretty/DdlFormatter.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Pretty/DdlFormatter.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Pretty/DdlFormatter.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -0,0 +1,157 @@ +using System.Collections.Generic; +using System.Text; +using NHibernate.Util; + +namespace NHibernate.Pretty +{ + public class DdlFormatter + { + private const string Indent1 = "\n "; + private const string Indent2 = "\n "; + private const string Indent3 = "\n "; + + private readonly string sql; + + public DdlFormatter(string sql) + { + this.sql = sql; + } + + /// <summary> Format an SQL statement using simple rules: + /// a) Insert newline after each comma; + /// b) Indent three spaces after each inserted newline; + /// If the statement contains single/double quotes return unchanged, + /// it is too complex and could be broken by simple formatting. + /// </summary> + public virtual string Format() + { + if (sql.ToLowerInvariant().StartsWith("create table")) + { + return FormatCreateTable(); + } + else if (sql.ToLowerInvariant().StartsWith("alter table")) + { + return FormatAlterTable(); + } + else if (sql.ToLowerInvariant().StartsWith("comment on")) + { + return FormatCommentOn(); + } + else + { + return Indent1 + sql; + } + } + + private string FormatCommentOn() + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, " '[]\"", true)).GetEnumerator(); + + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + result.Append(token); + if (IsQuote(token)) + { + quoted = !quoted; + } + else if (!quoted) + { + if ("is".Equals(token)) + { + result.Append(Indent2); + } + } + } + + return result.ToString(); + } + + private string FormatAlterTable() + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, " (,)'[]\"", true)).GetEnumerator(); + + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + if (IsQuote(token)) + { + quoted = !quoted; + } + else if (!quoted) + { + if (IsBreak(token)) + { + result.Append(Indent3); + } + } + result.Append(token); + } + + return result.ToString(); + } + + private string FormatCreateTable() + { + StringBuilder result = new StringBuilder(60).Append(Indent1); + IEnumerator<string> tokens = (new StringTokenizer(sql, "(,)'[]\"", true)).GetEnumerator(); + + int depth = 0; + bool quoted = false; + while (tokens.MoveNext()) + { + string token = tokens.Current; + if (IsQuote(token)) + { + quoted = !quoted; + result.Append(token); + } + else if (quoted) + { + result.Append(token); + } + else + { + if (")".Equals(token)) + { + depth--; + if (depth == 0) + { + result.Append(Indent1); + } + } + result.Append(token); + if (",".Equals(token) && depth == 1) + { + result.Append(Indent2); + } + if ("(".Equals(token)) + { + depth++; + if (depth == 1) + { + result.Append(Indent3); + } + } + } + } + + return result.ToString(); + } + + private static bool IsBreak(string token) + { + return "drop".Equals(token) || "add".Equals(token) || "references".Equals(token) || "foreign".Equals(token) + || "on".Equals(token); + } + + private static bool IsQuote(string token) + { + return "\"".Equals(token) || "`".Equals(token) || "]".Equals(token) || "[".Equals(token) || "'".Equals(token); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate/Tool/hbm2ddl/SchemaExport.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -2,11 +2,12 @@ using System.Collections.Generic; using System.Data; using System.IO; -using System.Text; using log4net; using NHibernate.Cfg; using NHibernate.Connection; +using NHibernate.Pretty; using NHibernate.Util; +using Environment=NHibernate.Cfg.Environment; namespace NHibernate.Tool.hbm2ddl { @@ -20,12 +21,13 @@ public class SchemaExport { private static readonly ILog log = LogManager.GetLogger(typeof (SchemaExport)); - private readonly IDictionary<string, string> connectionProperties; + private readonly IDictionary<string, string> configProperties; private readonly string[] createSQL; private readonly Dialect.Dialect dialect; private readonly string[] dropSQL; private string delimiter; private string outputFile; + private readonly bool format; /// <summary> /// Create a schema exported for a given Configuration @@ -38,13 +40,14 @@ /// database connection properties /// </summary> /// <param name="cfg">The NHibernate Configuration to generate the schema from.</param> - /// <param name="connectionProperties">The Properties to use when connecting to the Database.</param> - public SchemaExport(Configuration cfg, IDictionary<string, string> connectionProperties) + /// <param name="configProperties">The Properties to use when connecting to the Database.</param> + public SchemaExport(Configuration cfg, IDictionary<string, string> configProperties) { - this.connectionProperties = connectionProperties; - dialect = Dialect.Dialect.GetDialect(connectionProperties); + this.configProperties = configProperties; + dialect = Dialect.Dialect.GetDialect(configProperties); dropSQL = cfg.GenerateDropSchemaScript(dialect); createSQL = cfg.GenerateSchemaCreationScript(dialect); + format = PropertiesHelper.GetBoolean(Environment.FormatSql, configProperties, true); } /// <summary> @@ -75,17 +78,17 @@ /// <param name="script"><see langword="true" /> if the ddl should be outputted in the Console.</param> /// <param name="export"><see langword="true" /> if the ddl should be executed against the Database.</param> /// <remarks> - /// This is a convenience method that calls <see cref="Execute(bool, bool, bool, bool)"/> and sets - /// the justDrop parameter to false and the format parameter to true. + /// This is a convenience method that calls <see cref="Execute(bool, bool, bool)"/> and sets + /// the justDrop parameter to false. /// </remarks> public void Create(bool script, bool export) { - Execute(script, export, false, true); + Execute(script, export, false); } public void Create(Action<string> scriptAction, bool export) { - Execute(scriptAction, export, false, true); + Execute(scriptAction, export, false); } /// <summary> @@ -94,28 +97,20 @@ /// <param name="script"><see langword="true" /> if the ddl should be outputted in the Console.</param> /// <param name="export"><see langword="true" /> if the ddl should be executed against the Database.</param> /// <remarks> - /// This is a convenience method that calls <see cref="Execute(bool, bool, bool, bool)"/> and sets - /// the justDrop and format parameter to true. + /// This is a convenience method that calls <see cref="Execute(bool, bool, bool)"/> and sets + /// the justDrop parameter to true. /// </remarks> public void Drop(bool script, bool export) { - Execute(script, export, true, true); + Execute(script, export, true); } - private void Execute(Action<string> scriptAction, bool export, bool format, bool throwOnError, TextWriter exportOutput, + private void Execute(Action<string> scriptAction, bool export, bool throwOnError, TextWriter exportOutput, IDbCommand statement, string sql) { try { - string formatted; - if (format) - { - formatted = Format(sql); - } - else - { - formatted = sql; - } + string formatted = Format(sql); if (delimiter != null) { @@ -154,7 +149,6 @@ /// <param name="script"><see langword="true" /> if the ddl should be outputted in the Console.</param> /// <param name="export"><see langword="true" /> if the ddl should be executed against the Database.</param> /// <param name="justDrop"><see langword="true" /> if only the ddl to drop the Database objects should be executed.</param> - /// <param name="format"><see langword="true" /> if the ddl should be nicely formatted instead of one statement per line.</param> /// <param name="connection"> /// The connection to use when executing the commands when export is <see langword="true" />. /// Must be an opened connection. The method doesn't close the connection. @@ -165,20 +159,20 @@ /// This overload is provided mainly to enable use of in memory databases. /// It does NOT close the given connection! /// </remarks> - public void Execute(bool script, bool export, bool justDrop, bool format, IDbConnection connection, + public void Execute(bool script, bool export, bool justDrop, IDbConnection connection, TextWriter exportOutput) { if (script) { - Execute(Console.WriteLine, export, justDrop, format, connection, exportOutput); + Execute(Console.WriteLine, export, justDrop, connection, exportOutput); } else { - Execute(null, export, justDrop, format, connection, exportOutput); + Execute(null, export, justDrop, connection, exportOutput); } } - public void Execute(Action<string> scriptAction, bool export, bool justDrop, bool format, IDbConnection connection, + public void Execute(Action<string> scriptAction, bool export, bool justDrop, IDbConnection connection, TextWriter exportOutput) { IDbCommand statement = null; @@ -196,14 +190,14 @@ { for (int i = 0; i < dropSQL.Length; i++) { - Execute(scriptAction, export, format, false, exportOutput, statement, dropSQL[i]); + Execute(scriptAction, export, false, exportOutput, statement, dropSQL[i]); } if (!justDrop) { for (int j = 0; j < createSQL.Length; j++) { - Execute(scriptAction, export, format, true, exportOutput, statement, createSQL[j]); + Execute(scriptAction, export, true, exportOutput, statement, createSQL[j]); } } } @@ -240,23 +234,22 @@ /// <param name="script"><see langword="true" /> if the ddl should be outputted in the Console.</param> /// <param name="export"><see langword="true" /> if the ddl should be executed against the Database.</param> /// <param name="justDrop"><see langword="true" /> if only the ddl to drop the Database objects should be executed.</param> - /// <param name="format"><see langword="true" /> if the ddl should be nicely formatted instead of one statement per line.</param> /// <remarks> /// This method allows for both the drop and create ddl script to be executed. /// </remarks> - public void Execute(bool script, bool export, bool justDrop, bool format) + public void Execute(bool script, bool export, bool justDrop) { if (script) { - Execute(Console.WriteLine, export, justDrop, format); + Execute(Console.WriteLine, export, justDrop); } else { - Execute(null, export, justDrop, format); + Execute(null, export, justDrop); } } - public void Execute(Action<string> scriptAction, bool export, bool justDrop, bool format) + public void Execute(Action<string> scriptAction, bool export, bool justDrop) { IDbConnection connection = null; StreamWriter fileOutput = null; @@ -268,9 +261,9 @@ props[de.Key] = de.Value; } - if (connectionProperties != null) + if (configProperties != null) { - foreach (var de in connectionProperties) + foreach (var de in configProperties) { props[de.Key] = de.Value; } @@ -289,7 +282,7 @@ connection = connectionProvider.GetConnection(); } - Execute(scriptAction, export, justDrop, format, connection, fileOutput); + Execute(scriptAction, export, justDrop, connection, fileOutput); } catch (HibernateException) { @@ -312,76 +305,13 @@ } /// <summary> - /// Format an SQL statement using simple rules + /// Format an SQL statement. /// </summary> /// <param name="sql">The string containing the sql to format.</param> /// <returns>A string that contains formatted sql.</returns> - /// <remarks> - /// The simple rules to used when formatting are: - /// <list type="number"> - /// <item> - /// <description>Insert a newline after each comma</description> - /// </item> - /// <item> - /// <description>Indent three spaces after each inserted newline</description> - /// </item> - /// <item> - /// <description> - /// If the statement contains single/double quotes return unchanged because - /// it is too complex and could be broken by simple formatting. - /// </description> - /// </item> - /// </list> - /// </remarks> - private static string Format(string sql) + private string Format(string sql) { - if (sql.IndexOf("\"") > 0 || sql.IndexOf("'") > 0) - { - return sql; - } - - string formatted; - - if (StringHelper.StartsWithCaseInsensitive(sql, "create table")) - { - var result = new StringBuilder(60); - var tokens = new StringTokenizer(sql, "(,)", true); - - int depth = 0; - - foreach (string tok in tokens) - { - if (StringHelper.ClosedParen.Equals(tok)) - { - depth--; - if (depth == 0) - { - result.Append("\n"); - } - } - result.Append(tok); - if (StringHelper.Comma.Equals(tok) && depth == 1) - { - result.Append("\n "); - } - if (StringHelper.OpenParen.Equals(tok)) - { - depth++; - if (depth == 1) - { - result.Append("\n "); - } - } - } - - formatted = result.ToString(); - } - else - { - formatted = sql; - } - - return formatted; + return format ? new DdlFormatter(sql).Format() : sql; } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd =================================================================== --- trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2009-04-17 18:01:35 UTC (rev 4185) @@ -98,7 +98,8 @@ <xs:enumeration value="adonet.factory_class" /> <xs:enumeration value="default_batch_fetch_size" /> <xs:enumeration value="default_entity_mode" /> - <xs:enumeration value="use_sql_comments" /> + <xs:enumeration value="use_sql_comments" /> + <xs:enumeration value="format_sql" /> </xs:restriction> </xs:simpleType> </xs:attribute> Modified: trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSerializationTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSerializationTests.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate.Test/CfgTest/ConfigurationSerializationTests.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -37,7 +37,7 @@ Assert.That(cfg, Is.Not.Null); var export = new SchemaExport(cfg); - export.Execute(true, true, false, true); + export.Execute(true, true, false); ISessionFactory sf = cfg.BuildSessionFactory(); using (ISession session = sf.OpenSession()) { Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1443/Fixture.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -13,7 +13,7 @@ { var su = new SchemaExport(cfg); var sb = new StringBuilder(500); - su.Execute(x => sb.AppendLine(x), false, false, true); + su.Execute(x => sb.AppendLine(x), false, false); string script = sb.ToString(); Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1521/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1521/Fixture.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1521/Fixture.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -20,7 +20,7 @@ { var su = new SchemaExport(configuration); var sb = new StringBuilder(500); - su.Execute(x => sb.AppendLine(x), false, false, true); + su.Execute(x => sb.AppendLine(x), false, false); string script = sb.ToString(); Assert.That(script, Text.Contains("if exists (select * from dbo.sysobjects where id = object_id(N'nhibernate.dbo.Aclass') and OBJECTPROPERTY(id, N'IsUserTable') = 1)")); } Modified: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaExportTests/WithColumnTagFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaExportTests/WithColumnTagFixture.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaExportTests/WithColumnTagFixture.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -20,7 +20,7 @@ Configuration cfg = TestConfigurationHelper.GetDefaultConfiguration(); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(mapping)) cfg.AddInputStream(stream); - new SchemaExport(cfg).Execute(s => script.AppendLine(s), false, false, false); + new SchemaExport(cfg).Execute(s => script.AppendLine(s), false, false); string wholeScript = script.ToString(); Assert.That(wholeScript, Text.Contains("default SYSTEM_USER")); Modified: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaUpdate/MigrationFixture.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -19,7 +19,7 @@ Configuration v1cfg = TestConfigurationHelper.GetDefaultConfiguration(); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource1)) v1cfg.AddInputStream(stream); - new SchemaExport(v1cfg).Execute(false, true, true, false); + new SchemaExport(v1cfg).Execute(false, true, true); Tool.hbm2ddl.SchemaUpdate v1schemaUpdate = new Tool.hbm2ddl.SchemaUpdate(v1cfg); v1schemaUpdate.Execute(true, true); Modified: trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs 2009-04-17 15:18:39 UTC (rev 4184) +++ trunk/nhibernate/src/NHibernate.Test/Tools/hbm2ddl/SchemaValidator/SchemaValidateFixture.cs 2009-04-17 18:01:35 UTC (rev 4185) @@ -19,7 +19,7 @@ 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); + new NHibernate.Tool.hbm2ddl.SchemaExport(v1cfg).Execute(true,true,false); var v1schemaValidator = new NHibernate.Tool.hbm2ddl.SchemaValidator((v1cfg)); v1schemaValidator.Validate(); @@ -37,7 +37,7 @@ v1cfg.AddInputStream(stream); using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource2)) v2cfg.AddInputStream(stream); - new NHibernate.Tool.hbm2ddl.SchemaExport(v1cfg).Execute(true, true, false, true); + new NHibernate.Tool.hbm2ddl.SchemaExport(v1cfg).Execute(true, true, false); var v2schemaValidator = new NHibernate.Tool.hbm2ddl.SchemaValidator((v2cfg)); try { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-17 15:18:49
|
Revision: 4184 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4184&view=rev Author: fabiomaulo Date: 2009-04-17 15:18:39 +0000 (Fri, 17 Apr 2009) Log Message: ----------- Actualized to the new version 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: <fab...@us...> - 2009-04-17 14:24:56
|
Revision: 4183 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4183&view=rev Author: fabiomaulo Date: 2009-04-17 14:24:40 +0000 (Fri, 17 Apr 2009) Log Message: ----------- Fix NH-1736 and some related issues (as the one in SessionFactoryHelper) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs trunk/nhibernate/src/NHibernate/Util/StringHelper.cs trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs Modified: trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate/Hql/Util/SessionFactoryHelper.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -11,6 +11,17 @@ { public static IQueryable FindQueryableUsingImports(ISessionFactoryImplementor sfi, string className) { + // NH : short cut + if(string.IsNullOrEmpty(className)) + { + return null; + } + + if(!char.IsLetter(className[0]) && !className[0].Equals('_')) + { + return null; + } + // NH : this method prevent unrecognized class when entityName != class.FullName // this is a patch for the TODO below var possibleResult = sfi.TryGetEntityPersister(GetEntityName(className)) as IQueryable; Modified: trunk/nhibernate/src/NHibernate/Util/StringHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate/Util/StringHelper.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -235,7 +235,7 @@ /// <returns></returns> public static string GetFullClassname(string typeName) { - return new TypeNameParser().ParseTypeName(typeName, null, null).Type; + return new TypeNameParser(null, null).ParseTypeName(typeName).Type; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate/Util/TypeNameParser.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -1,193 +1,230 @@ using System; +using System.Collections.Generic; using System.Diagnostics; -using System.IO; using System.Text; namespace NHibernate.Util { public class ParserException : ApplicationException { - public ParserException(string message) : base(message) {} + public ParserException(string message) : base(message) { } } public class TypeNameParser { - private TextReader input; + private readonly string defaultNamespace; + private readonly string defaultAssembly; - private void SkipSpaces() + public TypeNameParser(string defaultNamespace, string defaultAssembly) { - while (input.Peek() == ' ') - { - input.Read(); - } + this.defaultNamespace = defaultNamespace; + this.defaultAssembly = defaultAssembly; } - private char[] Characters(int count) + public static AssemblyQualifiedTypeName Parse(string type) { - var chars = new char[count]; - if (input.ReadBlock(chars, 0, count) < count) - { - throw new ParserException(count + " characters expected"); - } + return Parse(type, null, null); + } - return chars; + public static AssemblyQualifiedTypeName Parse(string type, string defaultNamespace, string defaultAssembly) + { + return new TypeNameParser(defaultNamespace, defaultAssembly).ParseTypeName(type); } - private char[] PossiblyEscapedCharacter() + public AssemblyQualifiedTypeName ParseTypeName(string type) { - if (input.Peek() == '\\') + if (type == null) { - return Characters(2); + throw new ArgumentNullException("type"); } - else + if (type.Trim('[',']','\\', ',') == string.Empty) { - return Characters(1); + throw new ArgumentException(string.Format("The type to parse is not a type name:{0}", type), "type"); } - } - private string AssemblyName() - { - var result = new StringBuilder(); - SkipSpaces(); + int genericTypeArgsStartIdx = type.IndexOf('['); + int genericTypeArgsEndIdx = type.LastIndexOf(']'); + int genericTypeCardinalityIdx = -1; + if (genericTypeArgsStartIdx >= 0) + { + genericTypeCardinalityIdx = type.IndexOf('`', 0, genericTypeArgsStartIdx); + } - int code; - while ((code = input.Peek()) != -1) + if (genericTypeArgsStartIdx == -1 || genericTypeCardinalityIdx == -1) { - var ch = (char) code; + return ParseNonGenericType(type); + } + else + { + var isArrayType = type.EndsWith("[]"); + if(genericTypeCardinalityIdx < 0) + { + throw new ParserException("Invalid generic fully-qualified type name:" + type); + } + string cardinalityString = type.Substring(genericTypeCardinalityIdx + 1, genericTypeArgsStartIdx - genericTypeCardinalityIdx - 1); + int genericTypeCardinality = int.Parse(cardinalityString); - if (ch == ']') + // get the FullName of the non-generic type + string fullName = type.Substring(0, genericTypeArgsStartIdx); + if (type.Length - genericTypeArgsEndIdx - 1 > 0) + fullName += type.Substring(genericTypeArgsEndIdx + 1, type.Length - genericTypeArgsEndIdx - 1); + + // parse the type arguments + var genericTypeArgs = new List<AssemblyQualifiedTypeName>(); + string typeArguments = type.Substring(genericTypeArgsStartIdx + 1, genericTypeArgsEndIdx - genericTypeArgsStartIdx - 1); + foreach (string item in GenericTypesArguments(typeArguments, genericTypeCardinality)) { - break; + var typeArgument = ParseTypeName(item); + genericTypeArgs.Add(typeArgument); } - result.Append(PossiblyEscapedCharacter()); + // construct the generic type definition + return MakeGenericType(ParseNonGenericType(fullName), isArrayType, genericTypeArgs.ToArray()); } - - return result.ToString(); } - private string BracketedPart(string defaultNamespace, string defaultAssembly) + public AssemblyQualifiedTypeName MakeGenericType(AssemblyQualifiedTypeName qualifiedName, bool isArrayType, + AssemblyQualifiedTypeName[] typeArguments) { - Debug.Assert(input.Peek() == '['); + Debug.Assert(typeArguments.Length > 0); - var result = new StringBuilder(); - var genericTypeName = new StringBuilder(200); - - int depth = 0; - do + var baseType = qualifiedName.Type; + var sb = new StringBuilder(typeArguments.Length * 200); + sb.Append(baseType); + sb.Append('['); + for (int i = 0; i < typeArguments.Length; i++) { - int c = input.Peek(); - if (c == '[') + if(i>0) { - depth++; - result.Append(PossiblyEscapedCharacter()); + sb.Append(","); } - else if (c == ']') - { - depth--; - if (genericTypeName.Length > 0) - { - var r = Parse(genericTypeName.ToString(), defaultNamespace, defaultAssembly); - result.Append(r.ToString()); - genericTypeName.Remove(0, genericTypeName.Length); - } - result.Append(PossiblyEscapedCharacter()); - } - else if (c == ',' || c == ' ') - { - if (genericTypeName.Length > 0) - genericTypeName.Append(PossiblyEscapedCharacter()); - else - result.Append(PossiblyEscapedCharacter()); - } - else - { - genericTypeName.Append(PossiblyEscapedCharacter()); - } + sb.Append('[').Append(typeArguments[i].ToString()).Append(']'); } - while (depth > 0 && input.Peek() != -1); - - if (depth > 0 && input.Peek() == -1) + sb.Append(']'); + if(isArrayType) { - throw new ParserException("Unmatched left bracket ('[')"); + sb.Append("[]"); } - - return result.ToString(); + return new AssemblyQualifiedTypeName(sb.ToString(), qualifiedName.Assembly); } - public AssemblyQualifiedTypeName ParseTypeName(string text, string defaultNamespace, string defaultAssembly) + private static IEnumerable<string> GenericTypesArguments(string s, int cardinality) { - text = text.Trim(); - if (IsSystemType(text)) - { - defaultNamespace = null; - defaultAssembly = null; - } - var type = new StringBuilder(text.Length); - string assembly = StringHelper.IsEmpty(defaultAssembly) ? null : defaultAssembly; + Debug.Assert(cardinality != 0); + Debug.Assert(string.IsNullOrEmpty(s) == false); + Debug.Assert(s.Length > 0); - try + int startIndex = 0; + while (cardinality > 0) { - bool seenNamespace = false; + var sb = new StringBuilder(s.Length); + int bracketCount = 0; - using (input = new StringReader(text)) + for (int i = startIndex; i < s.Length; i++) { - int code; - while ((code = input.Peek()) != -1) + switch (s[i]) { - var ch = (char) code; + case '[': + bracketCount++; + continue; - if (ch == '.') - { - seenNamespace = true; - } - - if (ch == ',') - { - input.Read(); - assembly = AssemblyName(); - if (input.Peek() != -1) + case ']': + if (--bracketCount == 0) { - throw new ParserException("Extra characters found at the end of the type name"); + string item = s.Substring(startIndex + 1, i - startIndex - 1); + yield return item; + sb = new StringBuilder(s.Length); + startIndex = i + 2; // 2 = '[' + ']' } - } - else if (ch == '[') - { - type.Append(BracketedPart(defaultNamespace, defaultAssembly)); - } - else - { - type.Append(PossiblyEscapedCharacter()); - } + break; + + default: + sb.Append(s[i]); + continue; } + } - input.Close(); + if (bracketCount != 0) + { + throw new ParserException(string.Format("The brackets are unbalanced in the type name: {0}", s)); } - if (!seenNamespace && StringHelper.IsNotEmpty(defaultNamespace)) + if (sb.Length > 0) { - type.Insert(0, '.').Insert(0, defaultNamespace); + var result = sb.ToString(); + startIndex += result.Length; + yield return result.TrimStart(' ', ','); } - return new AssemblyQualifiedTypeName(type.ToString(), assembly); + cardinality--; } - catch (Exception e) + } + + private AssemblyQualifiedTypeName ParseNonGenericType(string typeName) + { + string typeFullName; + string assembliQualifiedName; + + if (NeedDefaultAssembly(typeName)) { - throw new ArgumentException("Invalid fully-qualified type name: " + text, "text", e); + assembliQualifiedName = defaultAssembly; + typeFullName = typeName; } + else + { + int assemblyFullNameIdx = FindAssemblyQualifiedNameStartIndex(typeName); + if (assemblyFullNameIdx > 0) + { + assembliQualifiedName = + typeName.Substring(assemblyFullNameIdx + 1, typeName.Length - assemblyFullNameIdx - 1).Trim(); + typeFullName = typeName.Substring(0, assemblyFullNameIdx).Trim(); + } + else + { + assembliQualifiedName = null; + typeFullName = typeName.Trim(); + } + } + + if (NeedDefaultNamespace(typeFullName) && !string.IsNullOrEmpty(defaultNamespace)) + { + typeFullName = string.Concat(defaultNamespace, ".", typeFullName); + } + + return new AssemblyQualifiedTypeName(typeFullName, assembliQualifiedName); } - private bool IsSystemType(string tyname) + private static int FindAssemblyQualifiedNameStartIndex(string typeName) { - return tyname.StartsWith("System."); // ugly + for (int i = 0; i < typeName.Length; i++) + { + if(typeName[i] == ',' && typeName[i-1] != '\\') + { + return i; + } + } + + return -1; } - public static AssemblyQualifiedTypeName Parse(string text) + private static bool NeedDefaultNamespaceOrDefaultAssembly(string typeFullName) { - return Parse(text, null, null); + return !typeFullName.StartsWith("System."); // ugly } - public static AssemblyQualifiedTypeName Parse(string text, string defaultNamespace, string defaultAssembly) + private static bool NeedDefaultNamespace(string typeFullName) { - return new TypeNameParser().ParseTypeName(text, defaultNamespace, defaultAssembly); + if (!NeedDefaultNamespaceOrDefaultAssembly(typeFullName)) + { + return false; + } + int assemblyFullNameIndex = typeFullName.IndexOf(','); + int firstDotIndex = typeFullName.IndexOf('.'); + // does not have a dot or the dot is part of AssemblyFullName + return firstDotIndex < 0 || (firstDotIndex > assemblyFullNameIndex && assemblyFullNameIndex > 0); } + + private static bool NeedDefaultAssembly(string typeFullName) + { + return NeedDefaultNamespaceOrDefaultAssembly(typeFullName) && typeFullName.IndexOf(',') < 0; + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/StringHelperFixture.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -37,7 +37,7 @@ string expected = typeof (IDictionary<int, string>).FullName; Assert.AreEqual(expected, StringHelper.GetFullClassname(typeName)); typeName = "some.namespace.SomeType`1[[System.Int32, mscorlib], System.Int32], some.assembly"; - expected = "some.namespace.SomeType`1[[System.Int32, mscorlib], System.Int32]"; + expected = "some.namespace.SomeType`1[[System.Int32, mscorlib],[System.Int32]]"; Assert.AreEqual(expected, StringHelper.GetFullClassname(typeName)); } @@ -107,7 +107,7 @@ public void GetClassnameFromGenericType() { const string typeName = "classname`1[innerns1.innerClass]"; - const string expected = "classname`1[innerns1.innerClass]"; + const string expected = "classname`1[[innerns1.innerClass]]"; Assert.AreEqual(expected, StringHelper.GetClassname(typeName)); } @@ -116,7 +116,7 @@ public void GetClassnameFromGenericFQClass() { const string typeName = "ns1.ns2.classname`1[innerns1.innerClass]"; - const string expected = "classname`1[innerns1.innerClass]"; + const string expected = "classname`1[[innerns1.innerClass]]"; Assert.AreEqual(expected, StringHelper.GetClassname(typeName)); } Modified: trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs 2009-04-16 16:44:03 UTC (rev 4182) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/TypeNameParserFixture.cs 2009-04-17 14:24:40 UTC (rev 4183) @@ -1,13 +1,14 @@ using System; using NHibernate.Util; using NUnit.Framework; +using System.Collections.Generic; namespace NHibernate.Test.UtilityTest { [TestFixture] public class TypeNameParserFixture { - private void CheckInput(string input, string expectedType, string expectedAssembly) + private static void CheckInput(string input, string expectedType, string expectedAssembly) { AssemblyQualifiedTypeName tn = TypeNameParser.Parse(input); Assert.AreEqual(expectedType, tn.Type, "Type name should match"); @@ -35,31 +36,33 @@ [Test] public void ParseFullAssemblyName() { - string assemblyName = "SomeAssembly, SomeCulture, SomethingElse"; + const string assemblyName = "SomeAssembly, SomeCulture, SomethingElse"; CheckInput("SomeType, " + assemblyName, "SomeType", assemblyName); } [Test] public void ParseGenericTypeName() { - string assemblyName = "SomeAssembly"; - string typeName = "SomeType`1[System.Int32]"; + const string assemblyName = "SomeAssembly"; + const string typeName = "SomeType`1[System.Int32]"; + const string expectedTypeName = "SomeType`1[[System.Int32]]"; - CheckInput(typeName + ", " + assemblyName, typeName, assemblyName); + CheckInput(typeName + ", " + assemblyName, expectedTypeName, assemblyName); } [Test] public void ParseComplexGenericTypeName() { - string typeName = "SomeType`1[[System.Int32, mscorlib], System.Int32]"; + const string typeName = "SomeType`2[[System.Int32, mscorlib], System.Int32]"; + const string expectedTypeName = "SomeType`2[[System.Int32, mscorlib],[System.Int32]]"; - CheckInput(typeName, typeName, null); + CheckInput(typeName, expectedTypeName, null); } - [Test, ExpectedException(typeof(ArgumentException))] + [Test, Ignore("Not a big problem because the next type request will throw the exception"), ExpectedException(typeof(ParserException))] public void ParseUnmatchedBracket() { - TypeNameParser.Parse("SomeName["); + TypeNameParser.Parse("SomeName["); } [Test] @@ -71,7 +74,7 @@ [Test] public void ParseWithDefaultAssemblyUnused() { - string defaultAssembly = "DefaultAssembly"; + const string defaultAssembly = "DefaultAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType, AnotherAssembly", null, defaultAssembly); Assert.AreEqual("SomeType", tn.Type); Assert.AreEqual("AnotherAssembly", tn.Assembly); @@ -80,7 +83,7 @@ [Test] public void ParseWithDefaultAssembly() { - string defaultAssembly = "SomeAssembly"; + const string defaultAssembly = "SomeAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType", null, defaultAssembly); Assert.AreEqual("SomeType", tn.Type); Assert.AreEqual(defaultAssembly, tn.Assembly); @@ -89,8 +92,8 @@ [Test] public void ParseWithDefaultNamespaceAndAssembly() { - string defaultAssembly = "DefaultAssembly"; - string defaultNamespace = "DefaultNamespace"; + const string defaultAssembly = "DefaultAssembly"; + const string defaultNamespace = "DefaultNamespace"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType", defaultNamespace, defaultAssembly); Assert.AreEqual("DefaultNamespace.SomeType", tn.Type); @@ -99,7 +102,7 @@ [Test] public void ParseWithDefaultNamespaceNoAssembly() { - string defaultNamespace = "DefaultNamespace"; + const string defaultNamespace = "DefaultNamespace"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeType", defaultNamespace, null); Assert.AreEqual("DefaultNamespace.SomeType", tn.Type); @@ -109,8 +112,8 @@ [Test] public void ParseWithDefaultNamespaceUnused() { - string defaultAssembly = "DefaultAssembly"; - string defaultNamespace = "DefaultNamespace"; + const string defaultAssembly = "DefaultAssembly"; + const string defaultNamespace = "DefaultNamespace"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse("SomeNamespace.SomeType", defaultNamespace, defaultAssembly); Assert.AreEqual("SomeNamespace.SomeType", tn.Type); @@ -134,7 +137,7 @@ string fullSpec = "TName`1[PartialName]"; string defaultassembly = "SomeAssembly"; string defaultNamespace = "SomeAssembly.MyNS"; - string expectedType = "SomeAssembly.MyNS.TName`1[SomeAssembly.MyNS.PartialName, SomeAssembly]"; + string expectedType = "SomeAssembly.MyNS.TName`1[[SomeAssembly.MyNS.PartialName, SomeAssembly]]"; string expectedAssembly = "SomeAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); @@ -167,7 +170,7 @@ string fullSpec = "TName`1[SomeAssembly.MyOtherNS.PartialName]"; string defaultassembly = "SomeAssembly"; string defaultNamespace = "SomeAssembly.MyNS"; - string expectedType = "SomeAssembly.MyNS.TName`1[SomeAssembly.MyOtherNS.PartialName, SomeAssembly]"; + string expectedType = "SomeAssembly.MyNS.TName`1[[SomeAssembly.MyOtherNS.PartialName, SomeAssembly]]"; string expectedAssembly = "SomeAssembly"; AssemblyQualifiedTypeName tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); @@ -177,7 +180,7 @@ fullSpec = "SomeType`1[System.Int32]"; defaultassembly = "SomeAssembly"; defaultNamespace = null; - expectedType = "SomeType`1[System.Int32]"; + expectedType = "SomeType`1[[System.Int32]]"; expectedAssembly = "SomeAssembly"; tn = TypeNameParser.Parse(fullSpec, defaultNamespace, defaultassembly); @@ -196,5 +199,57 @@ { } + + public class MyComplexClass<T1, T2, T3> + { + + } + + [Test] + public void ParseComplexGenericType() + { + var expectedType = typeof(MyComplexClass<MyGClass<int>, IDictionary<string, MyGClass<string>>, string>).AssemblyQualifiedName; + var a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString(), "Type name should match"); + } + + [Test] + [Description("Should parse arrays of System types")] + public void SystemArray() + { + var expectedType = typeof(string[]).AssemblyQualifiedName; + var a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + } + + [Test] + [Description("Should parse arrays of custom types")] + public void CustomArray() + { + var expectedType = "A[]"; + var a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + + expectedType = typeof(MyGClass<int>[]).FullName; + a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + + expectedType = typeof(MyGClass<int[]>[]).FullName; + a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + + expectedType = "MyGClass`1[[System.Int32[]]][]"; + a = TypeNameParser.Parse(expectedType); + Assert.AreEqual(expectedType, a.ToString()); + } + + [Test] + public void NH1736() + { + var typeName = + "Test.NHMapping.CustomCollection`2[[Test.Common.InvoiceDetail, Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872],[Test.ReadOnlyBusinessObjectList`1[[Test.Common.InvoiceDetail, Test.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872]], Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872]], Test.NHMapping, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3a873a127e0d1872"; + var a = TypeNameParser.Parse(typeName); + Assert.AreEqual(typeName, a.ToString()); + } } } \ 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...> - 2009-04-16 16:44:20
|
Revision: 4182 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4182&view=rev Author: fabiomaulo Date: 2009-04-16 16:44:03 +0000 (Thu, 16 Apr 2009) Log Message: ----------- Minor Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-15 14:17:10 UTC (rev 4181) +++ trunk/nhibernate/src/NHibernate/Impl/MultiQueryImpl.cs 2009-04-16 16:44:03 UTC (rev 4182) @@ -8,7 +8,6 @@ using NHibernate.Driver; using NHibernate.Engine; using NHibernate.Hql; -using NHibernate.Hql.Classic; using NHibernate.SqlCommand; using NHibernate.SqlTypes; using NHibernate.Transform; @@ -571,12 +570,12 @@ query.VerifyParameters(); IQueryTranslator[] queryTranslators = session.GetQueries(query.ExpandParameterLists(queryParameters.NamedParameters), false); - foreach (QueryTranslator translator in queryTranslators) + foreach (IQueryTranslator translator in queryTranslators) { translators.Add(translator); parameters.Add(queryParameters); queryParameters = GetFilteredQueryParameters(queryParameters, translator); - SqlCommandInfo commandInfo = translator.GetQueryStringAndTypes(session, queryParameters); + SqlCommandInfo commandInfo = translator.Loader.GetQueryStringAndTypes(session, queryParameters); sqlString = sqlString.Append(commandInfo.Text).Append(session.Factory.ConnectionProvider.Driver.MultipleQueriesSeparator).Append(Environment.NewLine); types.AddRange(commandInfo.ParameterTypes); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-15 14:17:30
|
Revision: 4181 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4181&view=rev Author: fabiomaulo Date: 2009-04-15 14:17:10 +0000 (Wed, 15 Apr 2009) Log Message: ----------- - Fix NH-1741 - Fixed some other issues related with query property set from mapping Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs trunk/nhibernate/src/NHibernate/IDetachedQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/NamedQueryBinder.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -29,7 +29,7 @@ int timeout = string.IsNullOrEmpty(querySchema.timeout) ? RowSelection.NoValue : int.Parse(querySchema.timeout); int fetchSize = querySchema.fetchsizeSpecified ? querySchema.fetchsize : -1; bool readOnly = querySchema.readonlySpecified ? querySchema.@readonly : false; - string comment = null; + string comment = querySchema.comment; FlushMode flushMode = FlushModeConverter.GetFlushMode(querySchema); CacheMode? cacheMode = (querySchema.cachemodeSpecified) Modified: trunk/nhibernate/src/NHibernate/IDetachedQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IDetachedQuery.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/IDetachedQuery.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -1,6 +1,5 @@ using System; using System.Collections; -using NHibernate; using NHibernate.Transform; using NHibernate.Type; @@ -54,6 +53,10 @@ /// <param name="timeout"></param> IDetachedQuery SetTimeout(int timeout); + /// <summary> Set a fetch size for the underlying ADO query.</summary> + /// <param name="fetchSize">the fetch size </param> + IDetachedQuery SetFetchSize(int fetchSize); + /// <summary> /// Set the lockmode for the objects idententified by the /// given alias that appears in the <c>FROM</c> clause. @@ -62,6 +65,10 @@ /// <param name="lockMode"></param> void SetLockMode(string alias, LockMode lockMode); + /// <summary> Add a comment to the generated SQL.</summary> + /// <param name="comment">a human-readable string </param> + IDetachedQuery SetComment(string comment); + /// <summary> /// Bind a value to an indexed parameter. /// </summary> Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractDetachedQuery.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -1,7 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using NHibernate; using NHibernate.Engine; using NHibernate.Proxy; using NHibernate.Transform; @@ -51,6 +50,7 @@ protected IResultTransformer resultTransformer; protected bool shouldIgnoredUnknownNamedParameters; protected CacheMode? cacheMode; + protected string comment; #region IDetachedQuery Members @@ -68,30 +68,42 @@ return this; } - public IDetachedQuery SetCacheable(bool cacheable) + public virtual IDetachedQuery SetComment(string comment) { + this.comment = comment; + return this; + } + + public virtual IDetachedQuery SetCacheable(bool cacheable) + { this.cacheable = cacheable; return this; } - public IDetachedQuery SetCacheRegion(string cacheRegion) + public virtual IDetachedQuery SetCacheRegion(string cacheRegion) { this.cacheRegion = cacheRegion; return this; } - public IDetachedQuery SetReadOnly(bool readOnly) + public virtual IDetachedQuery SetReadOnly(bool readOnly) { this.readOnly = readOnly; return this; } - public IDetachedQuery SetTimeout(int timeout) + public virtual IDetachedQuery SetTimeout(int timeout) { selection.Timeout = timeout; return this; } + public virtual IDetachedQuery SetFetchSize(int fetchSize) + { + selection.FetchSize = fetchSize; + return this; + } + public void SetLockMode(string alias, LockMode lockMode) { if (string.IsNullOrEmpty(alias)) @@ -368,7 +380,7 @@ return this; } - public IDetachedQuery SetFlushMode(FlushMode flushMode) + public virtual IDetachedQuery SetFlushMode(FlushMode flushMode) { this.flushMode = flushMode; return this; @@ -389,7 +401,7 @@ /// <summary> Override the current session cache mode, just for this query. </summary> /// <param name="cacheMode">The cache mode to use. </param> /// <returns> this (for method chaining) </returns> - public IDetachedQuery SetCacheMode(CacheMode cacheMode) + public virtual IDetachedQuery SetCacheMode(CacheMode cacheMode) { this.cacheMode = cacheMode; return this; @@ -411,7 +423,10 @@ .SetCacheable(cacheable) .SetReadOnly(readOnly) .SetTimeout(selection.Timeout) - .SetFlushMode(flushMode); + .SetFlushMode(flushMode) + .SetFetchSize(selection.FetchSize); + if (!string.IsNullOrEmpty(comment)) + q.SetComment(comment); if (!string.IsNullOrEmpty(cacheRegion)) q.SetCacheRegion(cacheRegion); if (resultTransformer != null) @@ -474,6 +489,7 @@ flushMode = FlushMode.Unspecified; resultTransformer = null; shouldIgnoredUnknownNamedParameters = false; + comment = null; } private void ClearParameters() @@ -503,7 +519,10 @@ .SetCacheable(cacheable) .SetReadOnly(readOnly) .SetTimeout(selection.Timeout) - .SetFlushMode(flushMode); + .SetFlushMode(flushMode) + .SetFetchSize(selection.FetchSize); + if (!string.IsNullOrEmpty(comment)) + destination.SetComment(comment); if (!string.IsNullOrEmpty(cacheRegion)) destination.SetCacheRegion(cacheRegion); if (cacheMode.HasValue) Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -222,6 +222,7 @@ { query.SetComment(nqd.Comment); } + query.SetFlushMode(nqd.FlushMode); } public virtual IQuery CreateQuery(string queryString) Modified: trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate/Impl/DetachedNamedQuery.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -1,4 +1,5 @@ using System; +using NHibernate.Engine; namespace NHibernate.Impl { @@ -13,6 +14,15 @@ public class DetachedNamedQuery : AbstractDetachedQuery { private readonly string queryName; + private bool cacheableWasSet; + private bool cacheModeWasSet; + private bool cacheRegionWasSet; + private bool readOnlyWasSet; + private bool timeoutWasSet; + private bool fetchSizeWasSet; + private bool commentWasSet; + private bool flushModeWasSet; + /// <summary> /// Create a new instance of <see cref="DetachedNamedQuery"/> for a named query string defined in the mapping file. /// </summary> @@ -39,19 +49,112 @@ public override IQuery GetExecutableQuery(ISession session) { IQuery result = session.GetNamedQuery(queryName); + SetDefaultProperties((ISessionFactoryImplementor)session.SessionFactory); SetQueryProperties(result); return result; } + private void SetDefaultProperties(ISessionFactoryImplementor factory) + { + NamedQueryDefinition nqd = factory.GetNamedQuery(queryName) ?? factory.GetNamedSQLQuery(queryName); + + if (!cacheableWasSet) + { + cacheable = nqd.IsCacheable; + } + + if (!cacheRegionWasSet) + { + cacheRegion = nqd.CacheRegion; + } + + if(!timeoutWasSet && nqd.Timeout != -1) + { + selection.Timeout= nqd.Timeout; + } + + if (!fetchSizeWasSet && nqd.FetchSize != -1) + { + selection.FetchSize = nqd.FetchSize; + } + + if (!cacheModeWasSet && nqd.CacheMode.HasValue) + { + cacheMode = nqd.CacheMode.Value; + } + + if (!readOnlyWasSet) + { + readOnly = nqd.IsReadOnly; + } + + if (!commentWasSet && nqd.Comment != null) + { + comment = nqd.Comment; + } + + if(!flushModeWasSet) + { + flushMode = nqd.FlushMode; + } + } + /// <summary> /// Creates a new DetachedNamedQuery that is a deep copy of the current instance. /// </summary> /// <returns>The clone.</returns> public DetachedNamedQuery Clone() { - DetachedNamedQuery result = new DetachedNamedQuery(queryName); + var result = new DetachedNamedQuery(queryName); CopyTo(result); return result; } + + public override IDetachedQuery SetCacheable(bool cacheable) + { + cacheableWasSet = true; + return base.SetCacheable(cacheable); + } + + public override IDetachedQuery SetCacheMode(CacheMode cacheMode) + { + cacheModeWasSet = true; + return base.SetCacheMode(cacheMode); + } + public override IDetachedQuery SetCacheRegion(string cacheRegion) + { + cacheRegionWasSet = true; + return base.SetCacheRegion(cacheRegion); + } + + public override IDetachedQuery SetReadOnly(bool readOnly) + { + readOnlyWasSet = true; + return base.SetReadOnly(readOnly); + } + + public override IDetachedQuery SetTimeout(int timeout) + { + timeoutWasSet = true; + return base.SetTimeout(timeout); + } + + public override IDetachedQuery SetFetchSize(int fetchSize) + { + fetchSizeWasSet = true; + return base.SetFetchSize(fetchSize); + } + + public override IDetachedQuery SetComment(string comment) + { + commentWasSet = true; + return base.SetComment(comment); + } + + public override IDetachedQuery SetFlushMode(FlushMode flushMode) + { + flushModeWasSet = true; + return base.SetFlushMode(flushMode); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Domain.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -0,0 +1,7 @@ +namespace NHibernate.Test.NHSpecificTest.NH1741 +{ + public class A + { + public virtual string Name { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Fixture.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -0,0 +1,139 @@ +using System.Reflection; +using NHibernate.Engine; +using NHibernate.Impl; +using NUnit.Framework; +using NHibernate.Util; +using NUnit.Framework.SyntaxHelpers; + +namespace NHibernate.Test.NHSpecificTest.NH1741 +{ + [TestFixture] + public class Fixture: BugTestCase + { + private const string QueryName = "NH1741_All"; + + public class DetachedNamedQueryCrack : DetachedNamedQuery + { + private readonly FieldInfo fiCacheable = typeof(AbstractQueryImpl).GetField("cacheable", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiCacheRegion = typeof(AbstractQueryImpl).GetField("cacheRegion", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiCacheMode = typeof(AbstractQueryImpl).GetField("cacheMode", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiReadOnly = typeof(AbstractQueryImpl).GetField("readOnly", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiSelection = typeof(AbstractQueryImpl).GetField("selection", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiComment = typeof(AbstractQueryImpl).GetField("comment", ReflectHelper.AnyVisibilityInstance); + private readonly FieldInfo fiFlushMode = typeof(AbstractQueryImpl).GetField("flushMode", ReflectHelper.AnyVisibilityInstance); + + private QueryImpl queryExecutable; + public DetachedNamedQueryCrack(string queryName) : base(queryName) { } + public override IQuery GetExecutableQuery(ISession session) + { + var result = base.GetExecutableQuery(session); + queryExecutable = (QueryImpl)result; + return result; + } + + public bool Cacheable + { + get + { + return (bool)fiCacheable.GetValue(queryExecutable); + } + } + + public string CacheRegion + { + get + { + return (string)fiCacheRegion.GetValue(queryExecutable); + } + } + + public int Timeout + { + get + { + return ((RowSelection)fiSelection.GetValue(queryExecutable)).Timeout; + } + } + + public int FetchSize + { + get + { + return ((RowSelection)fiSelection.GetValue(queryExecutable)).FetchSize; + } + } + + public CacheMode? CacheMode + { + get + { + return (CacheMode?)fiCacheMode.GetValue(queryExecutable); + } + } + + public bool ReadOnly + { + get + { + return (bool)fiReadOnly.GetValue(queryExecutable); + } + } + + public string Comment + { + get + { + return (string)fiComment.GetValue(queryExecutable); + } + } + + public FlushMode FlushMode + { + get + { + return (FlushMode)fiFlushMode.GetValue(queryExecutable); + } + } + } + + [Test] + [Description("DetachedNamedQuery should read all mapped parameters when not explicitly set.")] + public void Bug() + { + var dq = new DetachedNamedQueryCrack(QueryName); + ISession s = sessions.OpenSession(); + dq.GetExecutableQuery(s); + s.Close(); + + Assert.That(dq.Cacheable); + Assert.That(dq.CacheRegion, Is.EqualTo("region")); + Assert.That(dq.ReadOnly); + Assert.That(dq.Timeout, Is.EqualTo(10)); + Assert.That(dq.CacheMode, Is.EqualTo(CacheMode.Normal)); + Assert.That(dq.FetchSize, Is.EqualTo(11)); + Assert.That(dq.Comment, Is.EqualTo("the comment")); + Assert.That(dq.FlushMode, Is.EqualTo(FlushMode.Auto)); + } + + [Test] + [Description("DetachedNamedQuery should override all mapped parameters when explicitly set.")] + public void Override() + { + var dq = new DetachedNamedQueryCrack(QueryName); + dq.SetCacheable(false).SetCacheRegion("another region").SetReadOnly(false).SetTimeout(20).SetCacheMode( + CacheMode.Refresh).SetFetchSize(22).SetComment("another comment").SetFlushMode(FlushMode.Commit); + ISession s = sessions.OpenSession(); + dq.GetExecutableQuery(s); + s.Close(); + + Assert.That(!dq.Cacheable); + Assert.That(dq.CacheRegion, Is.EqualTo("another region")); + Assert.That(!dq.ReadOnly); + Assert.That(dq.Timeout, Is.EqualTo(20)); + Assert.That(dq.CacheMode, Is.EqualTo(CacheMode.Refresh)); + Assert.That(dq.FetchSize, Is.EqualTo(22)); + Assert.That(dq.Comment, Is.EqualTo("another comment")); + Assert.That(dq.FlushMode, Is.EqualTo(FlushMode.Commit)); + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1741/Mappings.hbm.xml 2009-04-15 14:17:10 UTC (rev 4181) @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH1741"> + + <class name="A"> + <id type="int"> + <generator class="native" /> + </id> + <property name="Name"/> + </class> + + <query name="NH1741_All" + cacheable="true" + cache-region="region" + read-only="true" + timeout="10" + cache-mode="normal" + fetch-size="11" + flush-mode="auto" + comment="the comment"> + from A + </query> +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-15 14:17:10 UTC (rev 4181) @@ -320,6 +320,8 @@ <Compile Include="NHSpecificTest\NH1715\ClassA.cs" /> <Compile Include="NHSpecificTest\NH1716\ClassA.cs" /> <Compile Include="NHSpecificTest\NH1716\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH1741\Domain.cs" /> + <Compile Include="NHSpecificTest\NH1741\Fixture.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -1713,6 +1715,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1741\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1716\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\Dates\Mappings\TimeAsTimeSpan.hbm.xml" /> <EmbeddedResource Include="TypesTest\CurrencyClass.hbm.xml" /> Modified: trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs 2009-04-14 22:39:25 UTC (rev 4180) +++ trunk/nhibernate/src/NHibernate.Test/QueryTest/DetachedQueryFixture.cs 2009-04-15 14:17:10 UTC (rev 4181) @@ -6,11 +6,12 @@ using NHibernate.Transform; using NHibernate.Util; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; namespace NHibernate.Test.QueryTest { [TestFixture] - public class DetachedQueryFixture:TestCase + public class DetachedQueryFixture : TestCase { protected override string MappingsAssembly { @@ -23,6 +24,8 @@ } public const int totalFoo = 15; + private const string MyComment = "My Comment"; + protected override void OnSetUp() { using (ISession s = OpenSession()) @@ -50,8 +53,8 @@ { TestDetachedQuery tdq = new TestDetachedQuery(); tdq.SetMaxResults(10).SetFirstResult(5).SetCacheable(true).SetReadOnly(true).SetTimeout(444).SetFlushMode( - FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof (NoFoo))). - SetIgnoreUknownNamedParameters(true); + FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof(NoFoo))). + SetIgnoreUknownNamedParameters(true).SetComment(MyComment); Assert.AreEqual(10, tdq.Selection.MaxRows); Assert.AreEqual(5, tdq.Selection.FirstRow); Assert.AreEqual(444, tdq.Selection.Timeout); @@ -61,6 +64,7 @@ Assert.AreEqual("A_REGION", tdq.CacheRegion); Assert.IsNotNull(tdq.ResultTransformer); Assert.IsTrue(tdq.ShouldIgnoredUnknownNamedParameters); + Assert.That(tdq.Comment, Is.EqualTo(MyComment)); tdq.SetLockMode("LM1", LockMode.Upgrade); tdq.SetLockMode("LM2", LockMode.Write); @@ -77,7 +81,7 @@ Assert.IsTrue(tdq.OptionalUntypeParams[1].Equals(new Foo("Fulano", "De Tal"))); tdq.SetAnsiString(1, ""); - tdq.SetBinary(2, new byte[] {}); + tdq.SetBinary(2, new byte[] { }); tdq.SetBoolean(3, false); tdq.SetByte(4, 255); tdq.SetCharacter(5, 'A'); @@ -158,7 +162,7 @@ Assert.AreEqual(1, tdq.NamedUntypeParams.Count); Assert.IsTrue(tdq.NamedUntypeParams.ContainsKey("Any")); - tdq.SetParameterList("UntypedList", new int[] {1, 2, 3}); + tdq.SetParameterList("UntypedList", new int[] { 1, 2, 3 }); Assert.IsTrue(tdq.NamedUntypeListParams.ContainsKey("UntypedList")); tdq.SetParameterList("TypedList", new Int64[] { 1, 2, 3 }, NHibernateUtil.Int64); @@ -171,18 +175,19 @@ { TestDetachedQuery origin = new TestDetachedQuery(); origin.SetMaxResults(10).SetFirstResult(5).SetCacheable(true).SetReadOnly(true).SetTimeout(444).SetFlushMode - (FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof (NoFoo))); + (FlushMode.Auto).SetCacheRegion("A_REGION").SetResultTransformer(new AliasToBeanResultTransformer(typeof(NoFoo))); + origin.SetComment(MyComment); origin.SetLockMode("LM1", LockMode.Upgrade); origin.SetProperties(new Foo("Pallino", "Pinco")); origin.SetInt64(1, 1); - origin.SetBinary(2, new byte[] {}); + origin.SetBinary(2, new byte[] { }); origin.SetBoolean(3, false); origin.SetDateTime(6, DateTime.MaxValue); origin.SetCharacter("5", 'A'); origin.SetDateTime("6", DateTime.MaxValue); origin.SetDecimal("7", 10.15m); - origin.SetParameterList("UntypedList", new int[] {1, 2, 3}); - origin.SetParameterList("TypedList", new Int64[] {1, 2, 3}, NHibernateUtil.Int64); + origin.SetParameterList("UntypedList", new int[] { 1, 2, 3 }); + origin.SetParameterList("TypedList", new Int64[] { 1, 2, 3 }, NHibernateUtil.Int64); TestDetachedQuery tdq = new TestDetachedQuery(); tdq.SetLockMode("LM1", LockMode.Read); @@ -195,9 +200,9 @@ tdq.SetDateTime("6", DateTime.MinValue); // will be override tdq.SetDouble("8", 8.1f); tdq.SetEntity("9", new Foo("Fulano", "De Tal")); - tdq.SetParameterList("UntypedList", new int[] {5, 6, 7, 8}); // will be override - tdq.SetParameterList("TypedList", new Int64[] {5, 6, 7, 8}, NHibernateUtil.Int64); // will be override - + tdq.SetParameterList("UntypedList", new int[] { 5, 6, 7, 8 }); // will be override + tdq.SetParameterList("TypedList", new Int64[] { 5, 6, 7, 8 }, NHibernateUtil.Int64); // will be override + tdq.SetComment("other comment"); // will be override origin.CopyTo(tdq); Assert.AreEqual(5, tdq.Selection.FirstRow); @@ -207,6 +212,7 @@ Assert.AreEqual(FlushMode.Auto, tdq.FlushMode); Assert.AreEqual("A_REGION", tdq.CacheRegion); Assert.IsNotNull(tdq.ResultTransformer); + Assert.That(tdq.Comment, Is.EqualTo(MyComment)); // merge/override of LockModes Assert.AreEqual(2, tdq.LockModes.Count); @@ -235,7 +241,7 @@ Assert.IsTrue(tdq.NamedParams["6"].Value.Equals(DateTime.MaxValue)); Assert.IsTrue(tdq.NamedParams["7"].Type.Equals(NHibernateUtil.Decimal)); Assert.IsTrue(tdq.NamedParams["8"].Type.Equals(NHibernateUtil.Double)); - Assert.IsTrue(tdq.NamedParams["9"].Type.Equals(NHibernateUtil.Entity(typeof (Foo)))); + Assert.IsTrue(tdq.NamedParams["9"].Type.Equals(NHibernateUtil.Entity(typeof(Foo)))); // merge/override named parameters list int expected = 1; @@ -349,7 +355,7 @@ // With UnTyped Parameter List dq = new DetachedQuery("from Foo f where f.IntValue in (:pn)"); - dq.SetParameterList("pn", new int[] {2 ,3}); + dq.SetParameterList("pn", new int[] { 2, 3 }); using (ISession s = OpenSession()) { IQuery q = dq.GetExecutableQuery(s); @@ -454,10 +460,10 @@ Console.WriteLine("DetachedQueryCycle={0} QueryCycl={1} Diff={2}", sDQStop - sDQStart, sQStop - sQStart, - (sDQStop - sDQStart) - (sQStop - sQStart)); + (sDQStop - sDQStart) - (sQStop - sQStart)); } - private class TestDetachedQuery:AbstractDetachedQuery + private class TestDetachedQuery : AbstractDetachedQuery { public Dictionary<int, object> PosUntypeParams { @@ -548,6 +554,11 @@ { (this as IDetachedQueryImplementor).OverrideInfoFrom(origin); } + + public string Comment + { + get { return comment; } + } } } @@ -593,7 +604,7 @@ } public Foo(string name, string description, int intValue) - :this(name,description) + : this(name, description) { this.intValue = intValue; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-14 22:39:28
|
Revision: 4180 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4180&view=rev Author: fabiomaulo Date: 2009-04-14 22:39:25 +0000 (Tue, 14 Apr 2009) Log Message: ----------- Removed some TODO Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-04-14 18:11:54 UTC (rev 4179) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-04-14 22:39:25 UTC (rev 4180) @@ -25,7 +25,7 @@ { [NonSerialized] private ISessionFactoryImplementor factory; - private bool closed = false; + private bool closed; private System.Transactions.Transaction ambientTransation; private bool isAlreadyDisposed; protected bool shouldCloseSessionOnDtcTransactionCompleted; @@ -105,7 +105,7 @@ throw new MappingException("Named SQL query not known: " + name); } IQuery query = new SqlQueryImpl(nsqlqd, this, factory.QueryPlanCache.GetSQLParameterMetadata(nsqlqd.QueryString)); - //query.SetComment("named native SQL query " + name); + query.SetComment("named native SQL query " + name); InitQuery(query, nsqlqd); return query; } @@ -128,10 +128,10 @@ public abstract IDbConnection Connection { get; } public abstract int ExecuteNativeUpdate(NativeSQLQuerySpecification specification, QueryParameters queryParameters); public abstract int ExecuteUpdate(string query, QueryParameters queryParameters); - public abstract FutureCriteriaBatch FutureCriteriaBatch { get; internal set; } - public abstract FutureQueryBatch FutureQueryBatch { get; internal set; } + public abstract FutureCriteriaBatch FutureCriteriaBatch { get; internal set; } + public abstract FutureQueryBatch FutureQueryBatch { get; internal set; } - public virtual IQuery GetNamedQuery(string queryName) + public virtual IQuery GetNamedQuery(string queryName) { CheckAndUpdateSessionStatus(); NamedQueryDefinition nqd = factory.GetNamedQuery(queryName); @@ -140,7 +140,7 @@ { string queryString = nqd.QueryString; query = new QueryImpl(queryString, nqd.FlushMode, this, GetHQLQueryPlan(queryString, false).ParameterMetadata); - //query.SetComment("named HQL query " + queryName); + query.SetComment("named HQL query " + queryName); } else { @@ -150,7 +150,7 @@ throw new MappingException("Named query not known: " + queryName); } query = new SqlQueryImpl(nsqlqd, this, factory.QueryPlanCache.GetSQLParameterMetadata(nsqlqd.QueryString)); - //query.SetComment("named native SQL query " + queryName); + query.SetComment("named native SQL query " + queryName); nqd = nsqlqd; } InitQuery(query, nqd); @@ -210,25 +210,25 @@ { query.SetTimeout(nqd.Timeout); } - //if (nqd.FetchSize != -1) - //{ - // query.SetFetchSize(nqd.FetchSize); - //} + if (nqd.FetchSize != -1) + { + query.SetFetchSize(nqd.FetchSize); + } if (nqd.CacheMode.HasValue) query.SetCacheMode(nqd.CacheMode.Value); query.SetReadOnly(nqd.IsReadOnly); - //if (nqd.Comment != null) - //{ - // query.SetComment(nqd.Comment); - //} + if (nqd.Comment != null) + { + query.SetComment(nqd.Comment); + } } public virtual IQuery CreateQuery(string queryString) { CheckAndUpdateSessionStatus(); QueryImpl query = new QueryImpl(queryString, this, GetHQLQueryPlan(queryString, false).ParameterMetadata); - //query.SetComment(queryString); + query.SetComment(queryString); return query; } @@ -236,7 +236,7 @@ { CheckAndUpdateSessionStatus(); SqlQueryImpl query = new SqlQueryImpl(sql, this, factory.QueryPlanCache.GetSQLParameterMetadata(sql)); - //query.SetComment("dynamic native SQL query"); + query.SetComment("dynamic native SQL query"); return query; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-14 18:12:01
|
Revision: 4179 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4179&view=rev Author: davybrion Date: 2009-04-14 18:11:54 +0000 (Tue, 14 Apr 2009) Log Message: ----------- fix for NH-1728 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs trunk/nhibernate/src/NHibernate/Transform/Transformers.cs trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs Modified: trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate/Properties/BasicPropertyAccessor.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -130,31 +130,32 @@ return null; } + // the BindingFlags.IgnoreCase is important here because if type is a struct, the GetProperty method does + // not ignore case by default. If type is a class, it _does_ ignore case... we're better off explicitly + // stating that casing should be ignored so we get the same behavior for both structs and classes PropertyInfo property = type.GetProperty(propertyName, - BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.IgnoreCase); if (property != null && property.CanWrite) { return new BasicSetter(type, property, propertyName); } - else + + // recursively call this method for the base Type + BasicSetter setter = GetSetterOrNull(type.BaseType, propertyName); + + // didn't find anything in the base class - check to see if there is + // an explicit interface implementation. + if (setter == null) { - // recursively call this method for the base Type - BasicSetter setter = GetSetterOrNull(type.BaseType, propertyName); - - // didn't find anything in the base class - check to see if there is - // an explicit interface implementation. - if (setter == null) + System.Type[] interfaces = type.GetInterfaces(); + for (int i = 0; setter == null && i < interfaces.Length; i++) { - System.Type[] interfaces = type.GetInterfaces(); - for (int i = 0; setter == null && i < interfaces.Length; i++) - { - setter = GetSetterOrNull(interfaces[i], propertyName); - } + setter = GetSetterOrNull(interfaces[i], propertyName); } - return setter; } + return setter; } /// <summary> Modified: trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate/Transform/AliasToBeanResultTransformer.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -40,8 +40,12 @@ throw new ArgumentNullException("resultClass"); } this.resultClass = resultClass; + constructor = resultClass.GetConstructor(flags, null, System.Type.EmptyTypes, null); - if (constructor == null) + + // if resultClass is a ValueType (struct), GetConstructor will return null... + // in that case, we'll use Activator.CreateInstance instead of the ConstructorInfo to create instances + if (constructor == null && resultClass.IsClass) { throw new ArgumentException("The target class of a AliasToBeanResultTransformer need a parameter-less constructor", "resultClass"); @@ -73,7 +77,9 @@ } } } - result = constructor.Invoke(null); + + // if resultClass is not a class but a value type, we need to use Activator.CreateInstance + result = resultClass.IsClass ? constructor.Invoke(null) : Activator.CreateInstance(resultClass, true); for (int i = 0; i < aliases.Length; i++) { Modified: trunk/nhibernate/src/NHibernate/Transform/Transformers.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Transform/Transformers.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate/Transform/Transformers.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -22,9 +22,9 @@ return new AliasToBeanResultTransformer(target); } - public static IResultTransformer AliasToBean<T>() where T: class + public static IResultTransformer AliasToBean<T>() { - return AliasToBean(typeof (T)); + return AliasToBean(typeof(T)); } public static readonly IResultTransformer DistinctRootEntity = new DistinctRootEntityResultTransformer(); Modified: trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs 2009-04-13 22:21:54 UTC (rev 4178) +++ trunk/nhibernate/src/NHibernate.Test/TransformTests/AliasToBeanResultTransformerFixture.cs 2009-04-14 18:11:54 UTC (rev 4179) @@ -1,3 +1,4 @@ +using System; using System.Collections; using System.Collections.Generic; using NHibernate.Transform; @@ -36,6 +37,11 @@ } } + public struct TestStruct + { + public string Something { get; set; } + } + #region Overrides of TestCase protected override IList Mappings @@ -53,34 +59,66 @@ [Test] public void WorkWithOutPublicParameterLessCtor() { - Setup(); + try + { + Setup(); - using (ISession s = OpenSession()) + using (ISession s = OpenSession()) + { + IList<WithOutPublicParameterLessCtor> l = + s.CreateSQLQuery("select s.Name as something from Simple s").SetResultTransformer( + Transformers.AliasToBean<WithOutPublicParameterLessCtor>()).List<WithOutPublicParameterLessCtor>(); + Assert.That(l.Count, Is.EqualTo(2)); + Assert.That(l, Has.All.Not.Null); + } + } + finally { - IList<WithOutPublicParameterLessCtor> l = - s.CreateSQLQuery("select s.Name as something from Simple s").SetResultTransformer( - Transformers.AliasToBean<WithOutPublicParameterLessCtor>()).List<WithOutPublicParameterLessCtor>(); - Assert.That(l.Count, Is.EqualTo(2)); - Assert.That(l, Has.All.Not.Null); + Cleanup(); } - - Cleanup(); } [Test] public void WorkWithPublicParameterLessCtor() { - Setup(); + try + { + Setup(); - var queryString = "select s.Name as something from Simple s"; - AssertAreWorking(queryString); // working for field access - - queryString = "select s.Name as Something from Simple s"; - AssertAreWorking(queryString); // working for property access + var queryString = "select s.Name as something from Simple s"; + AssertAreWorking(queryString); // working for field access - Cleanup(); + queryString = "select s.Name as Something from Simple s"; + AssertAreWorking(queryString); // working for property access + } + finally + { + Cleanup(); + } } + [Test] + public void WorksWithStruct() + { + try + { + Setup(); + + IList<TestStruct> result; + using (ISession s = OpenSession()) + { + result = s.CreateSQLQuery("select s.Name as something from Simple s") + .SetResultTransformer(Transformers.AliasToBean<TestStruct>()) + .List<TestStruct>(); + } + Assert.AreEqual(2, result.Count); + } + finally + { + Cleanup(); + } + } + private void AssertAreWorking(string queryString) { using (ISession s = OpenSession()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-13 22:21:56
|
Revision: 4178 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4178&view=rev Author: fabiomaulo Date: 2009-04-13 22:21:54 +0000 (Mon, 13 Apr 2009) Log Message: ----------- Minor (changed to work even with other dialects) Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 17:20:26 UTC (rev 4177) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 22:21:54 UTC (rev 4178) @@ -1,7 +1,5 @@ -using System; -using System.Collections; - using NHibernate.Cfg; +using NHibernate.Connection; using NHibernate.Criterion; using NHibernate.Dialect; using NHibernate.Driver; @@ -22,10 +20,10 @@ } /// <summary> - /// I've restricted this fixture to MsSql and am using a Driver which derives from SqlClientDriver to + /// I'm using a Driver which derives from SqlClientDriver to /// return false for the SupportsMultipleQueries property. This is purely to test the way NHibernate /// will behave when the driver that's being used does not support multiple queries... so even though - /// the test is restricted to MsSql, it's only relevant for databases that don't support multiple queries + /// the test is using MsSql, it's only relevant for databases that don't support multiple queries /// but this way it's just much easier to test this /// </summary> [TestFixture] @@ -33,14 +31,18 @@ { protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) { - return dialect is MsSql2000Dialect; + var cp = ConnectionProviderFactory.NewConnectionProvider(cfg.Properties); + return !cp.Driver.SupportsMultipleQueries; } protected override void Configure(Configuration configuration) { - configuration.Properties[Environment.ConnectionDriver] = - "NHibernate.Test.NHSpecificTest.Futures.TestDriverThatDoesntSupportQueryBatching, NHibernate.Test"; base.Configure(configuration); + if (Dialect is MsSql2000Dialect) + { + configuration.Properties[Environment.ConnectionDriver] = + typeof (TestDriverThatDoesntSupportQueryBatching).AssemblyQualifiedName; + } } protected override void OnTearDown() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-13 17:20:36
|
Revision: 4177 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4177&view=rev Author: davybrion Date: 2009-04-13 17:20:26 +0000 (Mon, 13 Apr 2009) Log Message: ----------- NH-1738: Make FutureValue<T> fall back to regular List implementation if the current RDBMS does not support query batching Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 17:20:26 UTC (rev 4177) @@ -839,7 +839,12 @@ public IFutureValue<T> FutureValue<T>() { - session.FutureQueryBatch.Add(this); + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return new FutureValue<T>(List); + } + + session.FutureQueryBatch.Add(this); return session.FutureQueryBatch.GetFutureValue<T>(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 17:20:26 UTC (rev 4177) @@ -373,6 +373,11 @@ public IFutureValue<T> FutureValue<T>() { + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return new FutureValue<T>(List); + } + session.FutureCriteriaBatch.Add(this); return session.FutureCriteriaBatch.GetFutureValue<T>(); } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 17:20:26 UTC (rev 4177) @@ -2,16 +2,18 @@ using System.Collections; using NHibernate.Cfg; +using NHibernate.Criterion; using NHibernate.Dialect; using NHibernate.Driver; using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; using Environment=NHibernate.Cfg.Environment; namespace NHibernate.Test.NHSpecificTest.Futures { - public class TestDriver : SqlClientDriver + public class TestDriverThatDoesntSupportQueryBatching : SqlClientDriver { public override bool SupportsMultipleQueries { @@ -36,12 +38,24 @@ protected override void Configure(Configuration configuration) { - configuration.Properties[Environment.ConnectionDriver] = "NHibernate.Test.NHSpecificTest.Futures.TestDriver, NHibernate.Test"; + configuration.Properties[Environment.ConnectionDriver] = + "NHibernate.Test.NHSpecificTest.Futures.TestDriverThatDoesntSupportQueryBatching, NHibernate.Test"; base.Configure(configuration); } + protected override void OnTearDown() + { + using (var session = sessions.OpenSession()) + { + session.Delete("from Person"); + session.Flush(); + } + + base.OnTearDown(); + } + [Test] - public void CriteriaFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + public void FutureOfCriteriaFallsBackToListImplementationWhenQueryBatchingIsNotSupported() { using (var session = sessions.OpenSession()) { @@ -51,7 +65,7 @@ } [Test] - public void QueryFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + public void FutureOfQueryFallsBackToListImplementationWhenQueryBatchingIsNotSupported() { using (var session = sessions.OpenSession()) { @@ -59,5 +73,71 @@ results.GetEnumerator().MoveNext(); } } + + [Test] + public void FutureValueOfCriteriaCanGetSingleEntityWhenQueryBatchingIsNotSupported() + { + int personId = CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futurePerson = session.CreateCriteria<Person>() + .Add(Restrictions.Eq("Id", personId)) + .FutureValue<Person>(); + Assert.IsNotNull(futurePerson.Value); + } + } + + [Test] + public void FutureValueOfCriteriaCanGetScalarValueWhenQueryBatchingIsNotSupported() + { + CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futureCount = session.CreateCriteria<Person>() + .SetProjection(Projections.RowCount()) + .FutureValue<int>(); + Assert.That(futureCount.Value, Is.EqualTo(1)); + } + } + + [Test] + public void FutureValueOfQueryCanGetSingleEntityWhenQueryBatchingIsNotSupported() + { + int personId = CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futurePerson = session.CreateQuery("from Person where Id = :id") + .SetInt32("id", personId) + .FutureValue<Person>(); + Assert.IsNotNull(futurePerson.Value); + } + } + + [Test] + public void FutureValueOfQueryCanGetScalarValueWhenQueryBatchingIsNotSupported() + { + CreatePerson(); + + using (var session = sessions.OpenSession()) + { + var futureCount = session.CreateQuery("select count(*) from Person") + .FutureValue<long>(); + Assert.That(futureCount.Value, Is.EqualTo(1L)); + } + } + + private int CreatePerson() + { + using (var session = sessions.OpenSession()) + { + var person = new Person(); + session.Save(person); + session.Flush(); + return person.Id; + } + } } } \ 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: <dav...@us...> - 2009-04-13 16:41:57
|
Revision: 4176 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4176&view=rev Author: davybrion Date: 2009-04-13 16:41:52 +0000 (Mon, 13 Apr 2009) Log Message: ----------- NH-1737: Make Future<T> fall back to regular List<T> implementation if the current RDBMS does not support query batching Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -828,7 +828,12 @@ public IEnumerable<T> Future<T>() { - session.FutureQueryBatch.Add(this); + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return List<T>(); + } + + session.FutureQueryBatch.Add(this); return session.FutureQueryBatch.GetEnumerator<T>(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaImpl.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -379,6 +379,11 @@ public IEnumerable<T> Future<T>() { + if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + { + return List<T>(); + } + session.FutureCriteriaBatch.Add(this); return session.FutureCriteriaBatch.GetEnumerator<T>(); } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FallbackFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -0,0 +1,63 @@ +using System; +using System.Collections; + +using NHibernate.Cfg; +using NHibernate.Dialect; +using NHibernate.Driver; + +using NUnit.Framework; + +using Environment=NHibernate.Cfg.Environment; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + public class TestDriver : SqlClientDriver + { + public override bool SupportsMultipleQueries + { + get { return false; } + } + } + + /// <summary> + /// I've restricted this fixture to MsSql and am using a Driver which derives from SqlClientDriver to + /// return false for the SupportsMultipleQueries property. This is purely to test the way NHibernate + /// will behave when the driver that's being used does not support multiple queries... so even though + /// the test is restricted to MsSql, it's only relevant for databases that don't support multiple queries + /// but this way it's just much easier to test this + /// </summary> + [TestFixture] + public class FallbackFixture : FutureFixture + { + protected override bool AppliesTo(NHibernate.Dialect.Dialect dialect) + { + return dialect is MsSql2000Dialect; + } + + protected override void Configure(Configuration configuration) + { + configuration.Properties[Environment.ConnectionDriver] = "NHibernate.Test.NHSpecificTest.Futures.TestDriver, NHibernate.Test"; + base.Configure(configuration); + } + + [Test] + public void CriteriaFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + { + using (var session = sessions.OpenSession()) + { + var results = session.CreateCriteria<Person>().Future<Person>(); + results.GetEnumerator().MoveNext(); + } + } + + [Test] + public void QueryFallsBackToListImplementationWhenQueryBatchingIsNotSupported() + { + using (var session = sessions.OpenSession()) + { + var results = session.CreateQuery("from Person").Future<Person>(); + results.GetEnumerator().MoveNext(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureCriteriaFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -4,32 +4,15 @@ namespace NHibernate.Test.NHSpecificTest.Futures { - using System.Collections; - [TestFixture] - public class FutureCriteriaFixture : TestCase + public class FutureCriteriaFixture : FutureFixture { - - protected override IList Mappings - { - get { return new string[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } - } - - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - [Test] public void CanUseFutureCriteria() { using (var s = sessions.OpenSession()) { - if(((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons10 = s.CreateCriteria(typeof(Person)) .SetMaxResults(10) @@ -56,16 +39,12 @@ } } - [Test] + [Test] public void TwoFuturesRunInTwoRoundTrips() { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); using (var logSpy = new SqlLogSpy()) { @@ -92,11 +71,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons = s.CreateCriteria(typeof(Person)) .SetMaxResults(10) @@ -120,5 +95,5 @@ } } } - } + } } Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -0,0 +1,30 @@ +using System.Collections; + +using NHibernate.Impl; + +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Futures +{ + public abstract class FutureFixture : TestCase + { + protected override IList Mappings + { + get { return new[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } + } + + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected void IgnoreThisTestIfMultipleQueriesArentSupportedByDriver() + { + if (((SessionFactoryImpl)sessions) + .ConnectionProvider.Driver.SupportsMultipleQueries == false) + { + Assert.Ignore("Not applicable for dialects that do not support multiple queries"); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Futures/FutureQueryFixture.cs 2009-04-13 16:41:52 UTC (rev 4176) @@ -6,29 +6,14 @@ using System.Collections; [TestFixture] - public class FutureQueryFixture : TestCase + public class FutureQueryFixture : FutureFixture { - - protected override IList Mappings - { - get { return new string[] { "NHSpecificTest.Futures.Mappings.hbm.xml" }; } - } - - protected override string MappingsAssembly - { - get { return "NHibernate.Test"; } - } - [Test] public void CanUseFutureQuery() { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons10 = s.CreateQuery("from Person") .SetMaxResults(10) @@ -60,11 +45,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); using (var logSpy = new SqlLogSpy()) { @@ -91,11 +72,7 @@ { using (var s = sessions.OpenSession()) { - if (((SessionFactoryImpl)sessions) - .ConnectionProvider.Driver.SupportsMultipleQueries == false) - { - Assert.Ignore("Not applicable for dialects that do not support multiple queries"); - } + IgnoreThisTestIfMultipleQueriesArentSupportedByDriver(); var persons = s.CreateQuery("from Person") .SetMaxResults(10) Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-13 16:32:40 UTC (rev 4175) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-13 16:41:52 UTC (rev 4176) @@ -295,6 +295,8 @@ <Compile Include="NHSpecificTest\Dates\TimeFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\DtcFailuresFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> + <Compile Include="NHSpecificTest\Futures\FallbackFixture.cs" /> + <Compile Include="NHSpecificTest\Futures\FutureFixture.cs" /> <Compile Include="NHSpecificTest\NH1635\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1635\ForumMessage.cs" /> <Compile Include="NHSpecificTest\NH1635\ForumThread.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dav...@us...> - 2009-04-13 16:32:44
|
Revision: 4175 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4175&view=rev Author: davybrion Date: 2009-04-13 16:32:40 +0000 (Mon, 13 Apr 2009) Log Message: ----------- fixed the exception message that was thrown if multiple queries are not supported... now it throws an exception with the same message as MultiQuery does Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs Modified: trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-02 16:12:05 UTC (rev 4174) +++ trunk/nhibernate/src/NHibernate/Impl/MultiCriteriaImpl.cs 2009-04-13 16:32:40 UTC (rev 4175) @@ -6,6 +6,7 @@ using Iesi.Collections.Generic; using log4net; using NHibernate.Cache; +using NHibernate.Driver; using NHibernate.Engine; using NHibernate.Criterion; using NHibernate.Loader.Criteria; @@ -44,12 +45,13 @@ /// <param name="factory">The factory.</param> internal MultiCriteriaImpl(SessionImpl session, ISessionFactoryImplementor factory) { - dialect = session.Factory.Dialect; - if (!session.Factory.ConnectionProvider.Driver.SupportsMultipleQueries) + IDriver driver = session.Factory.ConnectionProvider.Driver; + if (!driver.SupportsMultipleQueries) { throw new NotSupportedException( - string.Format("The dialect {0} does not support multiple queries.", dialect.GetType().FullName)); + string.Format("The driver {0} does not support multiple queries.", driver.GetType().FullName)); } + dialect = session.Factory.Dialect; this.session = session; this.factory = factory; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: United N. <uni...@ya...> - 2009-04-10 00:57:57
|
Estás invitado a "CONTACT OCEANIC BANK FOR YOUR ATM CARD.". Por tu anfitrión United Nation: Fecha: viernes 10 de abril de 2009 Hora: 0:00 - 1:00 (GMT +00:00) Ubicación: UNITED NATIONS(WORLD BANK ASSISTED PRO-GRAMME)DIRECTORATE OF INTERNATIONAL PAYMENT AND TRANSFERS 870, UNITED NATIONS B PLAZA 20-A NEW YORK NY 10017, ATTEN; BENEFICIARY. We have discovered that your payment has been unnecessarily Delayed by corrupt officials of the Bank who are Trying to divert your money into their private accounts. Therefore , we have obtained an irrevocable payment guarantee on your Payment with Oceanic Bank to make your payment through their new ATM CARD system which you can use to withdraw your money in any ATM MACHINE around your area.... This time you will be paid US$7.8m, but the maximum to withdraw is $10.000 per day till your payment of 7.8m is completeted,So, you have to contact the Oceanic Bank ATM CENTER HEAD OFFICE with your full contact information such as follows. 1.YOUR FULL NAME:______ 2.YOUR COUNTRY ______3.YOUR CONTACT ADDRESS:___3.YOUR PHONE AND FAX NUMBER:__ 4.YOUR AGE:____5.YOUR CURRENT OCCUPATION:___ Forward the information to: Oceanic Bank ATM CENTER HEAD OFFICE, Contact person: Marcel Water the MANAGER E-mail;;; atm...@li....... The processing fee has been paid but i did not pay their official security keeping fee because they said no, They said that they don't know when you are going to contact them so that their dumourage will might increase if you contact them late. They told me that their security keeping fee is $75 per a day and i deposited it today being friday 10-4-2009. So contact them today to avoid more increasing of the dumorage for the security keeping fee which is $75, and ask them to give you the name you will use to send them the $75 and immediately you made the payment to them today, then they will send your ATM CARD to you together with your Documentes which is CERTIFICATE OF OWNERSHIP and INSURANCE CERTIFICATE , So feel free to contact them today and let me know once you receive your ATM card. BELOW is your payment cod (0114) you must have to indicate this code when contacting the bank. And don't forget to ask them for the name which you will use to send them the money because they will like to delay your payment of the security keeping fee which is $75 so that their dumorage will increase. Regards ASS.DR.ADAMU FELIS. ¿Querés asistir? Confirmá tu asistencia para esta invitación a las: http://calendar.yahoo.com/unitednation5536?v=126&a1=0&iid=5hBnjgdbEG0W%40LJoLxpbQTd%40oaBban%40OixFImj7%40scv%40&igid=NxQz0ch%40VAPBaOpi8xAtFCpdkbRc%407x0IxAKdob%40dT17%40QJG Copyright © 2009 Todos los derechos reservados ar.yahoo.com Política de privacidad: http://privacy.yahoo.com/privacy/us Condiciones del servicio: http://docs.yahoo.com/info/terms/ |
From: <fab...@us...> - 2009-04-02 16:12:06
|
Revision: 4174 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4174&view=rev Author: fabiomaulo Date: 2009-04-02 16:12:05 +0000 (Thu, 02 Apr 2009) Log Message: ----------- Relax of StandardQueryCache Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs Modified: trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2009-04-02 04:26:33 UTC (rev 4173) +++ trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2009-04-02 16:12:05 UTC (rev 4174) @@ -1,7 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Text; using Iesi.Collections.Generic; using log4net; using NHibernate.Cfg; @@ -75,8 +74,7 @@ log.DebugFormat("caching query results in region: '{0}'; {1}", regionName, key); } - IList cacheable = new List<object>(result.Count + 1); - cacheable.Add(ts); + IList cacheable = new List<object>(result.Count + 1) {ts}; for (int i = 0; i < result.Count; i++) { if (returnTypes.Length == 1) @@ -99,13 +97,13 @@ { log.DebugFormat("checking cached query results in region: '{0}'; {1}", regionName, key); } - IList cacheable = (IList)queryCache.Get(key); + var cacheable = (IList)queryCache.Get(key); if (cacheable == null) { log.DebugFormat("query results were not found in cache: {0}", key); return null; } - long timestamp = (long)cacheable[0]; + var timestamp = (long)cacheable[0]; if (log.IsDebugEnabled) { log.DebugFormat("Checking query spaces for up-to-dateness [{0}]", StringHelper.CollectionToString((ICollection)spaces)); @@ -148,8 +146,7 @@ { //TODO: not really completely correct, since // the UnresolvableObjectException could occur while resolving - // associations, leaving the PC in an - // inconsistent state + // associations, leaving the PC in an inconsistent state log.Debug("could not reassemble cached result set"); queryCache.Remove(key); return null; @@ -175,7 +172,7 @@ #endregion - protected bool IsUpToDate(ISet<string> spaces, long timestamp) + protected virtual bool IsUpToDate(ISet<string> spaces, long timestamp) { return updateTimestampsCache.IsUpToDate(spaces, timestamp); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-04-02 04:26:40
|
Revision: 4173 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4173&view=rev Author: fabiomaulo Date: 2009-04-02 04:26:33 +0000 (Thu, 02 Apr 2009) Log Message: ----------- Additional tests about QueryCache Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-01 19:02:59 UTC (rev 4172) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-04-02 04:26:33 UTC (rev 4173) @@ -969,6 +969,7 @@ <Compile Include="QueryTest\PositionalParametersFixture.cs" /> <Compile Include="QueryTest\QueryParametersFixture.cs" /> <Compile Include="ReflectionOptimizerTest\LcgFixture.cs" /> + <Compile Include="SecondLevelCacheTest\QueryCacheFixture.cs" /> <Compile Include="SqlTest\Custom\CustomSQLSupportTest.cs" /> <Compile Include="SqlTest\Custom\CustomStoredProcSupportTest.cs" /> <Compile Include="SqlTest\Custom\MySQL\MySQLTest.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs 2009-04-01 19:02:59 UTC (rev 4172) +++ trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/AnotherItem.cs 2009-04-02 04:26:33 UTC (rev 4173) @@ -4,6 +4,7 @@ { private int id; private string name; + private string description= string.Empty; public AnotherItem() { @@ -26,5 +27,11 @@ get { return name; } set { name = value; } } + + public virtual string Description + { + get { return description; } + set { description = value; } + } } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml 2009-04-01 19:02:59 UTC (rev 4172) +++ trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/Item.hbm.xml 2009-04-02 04:26:33 UTC (rev 4173) @@ -24,5 +24,10 @@ <generator class="assigned"/> </id> <property name="Name"/> + <property name="Description"/> </class> + + <query name="Stat" cacheable="true" read-only ="true" cache-region="Statistics"> + select ai.Name, count(*) from AnotherItem ai group by ai.Name + </query> </hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/SecondLevelCacheTest/QueryCacheFixture.cs 2009-04-02 04:26:33 UTC (rev 4173) @@ -0,0 +1,318 @@ +using System; +using System.Collections; +using System.Threading; +using NHibernate.Stat; +using NUnit.Framework; +using NUnit.Framework.SyntaxHelpers; +using NHibernate.Transform; + +namespace NHibernate.Test.SecondLevelCacheTests +{ + [TestFixture] + public class ScalarQueryFixture : TestCase + { + protected override string MappingsAssembly + { + get { return "NHibernate.Test"; } + } + + protected override IList Mappings + { + get { return new[] { "SecondLevelCacheTest.Item.hbm.xml" }; } + } + + protected override void Configure(Cfg.Configuration configuration) + { + configuration.SetProperty(Cfg.Environment.GenerateStatistics, "true"); + } + + public void FillDb(int startId) + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + for (int i = startId; i < startId + 10; i++) + { + s.Save(new AnotherItem { Id = i, Name = (i / 2).ToString() }); + } + tx.Commit(); + } + } + + public void CleanUp() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from AnotherItem"); + tx.Commit(); + } + } + + [Test] + public void ShouldHitCacheUsingNamedQueryWithProjection() + { + FillDb(1); + sessions.Statistics.Clear(); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.GetNamedQuery("Stat").List(); + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCachePutCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(0)); + + sessions.Statistics.Clear(); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.GetNamedQuery("Stat").List(); + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(0)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(1)); + + sessions.Statistics.LogSummary(); + CleanUp(); + } + + [Test] + public void ShouldHitCacheUsingQueryWithProjection() + { + FillDb(1); + sessions.Statistics.Clear(); + + int resultCount; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + resultCount = + s.CreateQuery("select ai.Name, count(*) from AnotherItem ai group by ai.Name").SetCacheable(true).SetCacheRegion( + "Statistics").List().Count; + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCachePutCount, Is.EqualTo(1)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(0)); + + sessions.Statistics.Clear(); + + int secondResultCount; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + secondResultCount = s.CreateQuery("select ai.Name, count(*) from AnotherItem ai group by ai.Name") + .SetCacheable(true).SetCacheRegion("Statistics").List().Count; + tx.Commit(); + } + + Assert.That(sessions.Statistics.QueryExecutionCount, Is.EqualTo(0)); + Assert.That(sessions.Statistics.QueryCacheHitCount, Is.EqualTo(1)); + Assert.That(secondResultCount, Is.EqualTo(resultCount)); + + sessions.Statistics.LogSummary(); + CleanUp(); + } + + [Test] + public void QueryCacheInvalidation() + { + sessions.EvictQueries(); + sessions.Statistics.Clear(); + + const string queryString = "from Item i where i.Name='widget'"; + + object savedId = CreateItem(queryString); + + QueryStatistics qs = sessions.Statistics.GetQueryStatistics(queryString); + EntityStatistics es = sessions.Statistics.GetEntityStatistics(typeof(Item).FullName); + + Thread.Sleep(200); + + IList result; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(0)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(1)); + Assert.That(es.FetchCount, Is.EqualTo(0)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(NHibernateUtil.IsInitialized(result[0])); + var i = (Item)result[0]; + i.Name = "Widget"; + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(2)); + Assert.That(qs.CacheMissCount, Is.EqualTo(2)); + Assert.That(es.FetchCount, Is.EqualTo(0)); + + Thread.Sleep(200); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + + var i = s.Get<Item>(savedId); + Assert.That(i.Name, Is.EqualTo("Widget")); + + s.Delete(i); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(2)); + Assert.That(qs.CacheMissCount, Is.EqualTo(3)); + Assert.That(qs.CachePutCount, Is.EqualTo(3)); + Assert.That(qs.ExecutionCount, Is.EqualTo(3)); + Assert.That(es.FetchCount, Is.EqualTo(0)); //check that it was being cached + } + + private object CreateItem(string queryString) + { + object savedId; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + var i = new Item { Name = "widget" }; + savedId = s.Save(i); + tx.Commit(); + } + return savedId; + } + + [Test] + public void SimpleProjections() + { + var transformer = new CustomTrasformer(); + sessions.EvictQueries(); + sessions.Statistics.Clear(); + + const string queryString = "select i.Name, i.Description from AnotherItem i where i.Name='widget'"; + + object savedId; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + var i = new AnotherItem { Name = "widget" }; + savedId = s.Save(i); + tx.Commit(); + } + + QueryStatistics qs = sessions.Statistics.GetQueryStatistics(queryString); + EntityStatistics es = sessions.Statistics.GetEntityStatistics(typeof(AnotherItem).FullName); + + Thread.Sleep(200); + + IList result; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(0)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(1)); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).SetResultTransformer(transformer).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(1), "hit count should not go up since we are adding a resulttransformer"); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).SetResultTransformer(transformer).List(); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(2), "hit count should go up since we are using the same resulttransformer"); + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + result = s.CreateQuery(queryString).SetCacheable(true).List(); + Assert.That(result.Count, Is.EqualTo(1)); + var i = s.Get<AnotherItem>(savedId); + i.Name = "Widget"; + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(3)); + Assert.That(qs.CacheMissCount, Is.EqualTo(3)); + + Thread.Sleep(200); + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateQuery(queryString).SetCacheable(true).List(); + + var i = s.Get<AnotherItem>(savedId); + Assert.That(i.Name, Is.EqualTo("Widget")); + + s.Delete(i); + tx.Commit(); + } + + Assert.That(qs.CacheHitCount, Is.EqualTo(3)); + Assert.That(qs.CacheMissCount, Is.EqualTo(4)); + Assert.That(qs.CachePutCount, Is.EqualTo(4)); + Assert.That(qs.ExecutionCount, Is.EqualTo(4)); + Assert.That(es.FetchCount, Is.EqualTo(0)); //check that it was being cached + } + + public class CustomTrasformer: IResultTransformer + { + public object TransformTuple(object[] tuple, string[] aliases) + { + return new AnotherItem {Name = tuple[0].ToString(), Description = tuple[1].ToString()}; + } + + public IList TransformList(IList collection) + { + return collection; + } + } + } +} \ 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...> - 2009-04-01 19:03:01
|
Revision: 4172 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4172&view=rev Author: fabiomaulo Date: 2009-04-01 19:02:59 +0000 (Wed, 01 Apr 2009) Log Message: ----------- Fixed log message for query cache. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs Modified: trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2009-03-31 03:38:58 UTC (rev 4171) +++ trunk/nhibernate/src/NHibernate/Cache/StandardQueryCache.cs 2009-04-01 19:02:59 UTC (rev 4172) @@ -1,11 +1,13 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Text; using Iesi.Collections.Generic; using log4net; using NHibernate.Cfg; using NHibernate.Engine; using NHibernate.Type; +using NHibernate.Util; namespace NHibernate.Cache { @@ -104,7 +106,10 @@ return null; } long timestamp = (long)cacheable[0]; - log.DebugFormat("Checking query spaces for up-to-dateness [{0}]", spaces); + if (log.IsDebugEnabled) + { + log.DebugFormat("Checking query spaces for up-to-dateness [{0}]", StringHelper.CollectionToString((ICollection)spaces)); + } if (!isNaturalKeyLookup && !IsUpToDate(spaces, timestamp)) { log.DebugFormat("cached query results were not up to date for: {0}", key); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-31 03:39:03
|
Revision: 4171 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4171&view=rev Author: fabiomaulo Date: 2009-03-31 03:38:58 +0000 (Tue, 31 Mar 2009) Log Message: ----------- - Version Actualized to Alpha3 (waiting for new HQL parser) - Last available version of LinFu DynamicProxy Modified Paths: -------------- trunk/nhibernate/build-common/common.xml trunk/nhibernate/lib/net/2.0/LinFu.DynamicProxy.dll trunk/nhibernate/lib/net/3.5/LinFu.DynamicProxy.dll Modified: trunk/nhibernate/build-common/common.xml =================================================================== --- trunk/nhibernate/build-common/common.xml 2009-03-31 03:06:56 UTC (rev 4170) +++ trunk/nhibernate/build-common/common.xml 2009-03-31 03:38:58 UTC (rev 4171) @@ -76,7 +76,7 @@ effectively SP0). --> - <property name="project.version" value="2.1.0.Alpha2" overwrite="false" /> + <property name="project.version" value="2.1.0.Alpha3" overwrite="false" /> <!-- Compute short project version (major.minor) using a regex --> <regex input="${project.version}" pattern="^(?'shortversion'\d+\.\d+)" /> 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: <fab...@us...> - 2009-03-31 03:07:00
|
Revision: 4170 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4170&view=rev Author: fabiomaulo Date: 2009-03-31 03:06:56 +0000 (Tue, 31 Mar 2009) Log Message: ----------- Relax of CascadingAction Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs Modified: trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs 2009-03-29 16:21:04 UTC (rev 4169) +++ trunk/nhibernate/src/NHibernate/Engine/CascadingAction.cs 2009-03-31 03:06:56 UTC (rev 4170) @@ -18,10 +18,6 @@ #region The CascadingAction contract - internal CascadingAction() - { - } - /// <summary> Cascade the action to the child object. </summary> /// <param name="session">The session within which the cascade is occurring. </param> /// <param name="child">The child to which cascading should be performed. </param> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dar...@us...> - 2009-03-29 16:21:55
|
Revision: 4169 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4169&view=rev Author: darioquintana Date: 2009-03-29 16:21:04 +0000 (Sun, 29 Mar 2009) Log Message: ----------- passed test to verify NH-1716. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/ClassA.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Mappings.hbm.xml Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/ClassA.cs (from rev 4166, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/ClassA.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/ClassA.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/ClassA.cs 2009-03-29 16:21:04 UTC (rev 4169) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.NHSpecificTest.NH1716 +{ + public class ClassA + { + public virtual int Id { get; set; } + public virtual TimeSpan Time { get; set; } + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Fixture.cs (from rev 4166, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Fixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Fixture.cs 2009-03-29 16:21:04 UTC (rev 4169) @@ -0,0 +1,91 @@ +using System; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH1716 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete("from ClassA"); + tx.Commit(); + } + } + + [Test] + public void TimeSpanLargerThan24h() + { + var time = new TimeSpan(2, 2, 1, 0); + var entity = new ClassA {Time = time}; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + Assert.AreEqual(time, s.Get<ClassA>(entity.Id).Time); + } + } + + [Test] + public void TimeSpanLargerThan2h() + { + var time = new TimeSpan(0, 2, 1, 0); + var entity = new ClassA {Time = time}; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + Assert.AreEqual(time, s.Get<ClassA>(entity.Id).Time); + } + } + + [Test] + public void TimeSpanNegative() + { + TimeSpan time = TimeSpan.FromDays(-1); + var entity = new ClassA {Time = time}; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + Assert.AreEqual(time, s.Get<ClassA>(entity.Id).Time); + } + } + + [Test] + public void VerifyDaysShouldBeZeroInSmallTimeSpan() + { + var time = new TimeSpan(1, 0, 0); + var entity = new ClassA {Time = time}; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + using (ISession s = OpenSession()) + { + Assert.AreEqual(0, s.Get<ClassA>(entity.Id).Time.Days); + } + } + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Mappings.hbm.xml (from rev 4167, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1716/Mappings.hbm.xml 2009-03-29 16:21:04 UTC (rev 4169) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> + +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH1716" + assembly="NHibernate.Test"> + + <class name="ClassA"> + <id name="Id"> + <generator class="native"/> + </id> + <property name="Time"/> <!-- as default this should be mapped to TimeSpan --> + </class> + +</hibernate-mapping> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 16:08:46 UTC (rev 4168) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 16:21:04 UTC (rev 4169) @@ -316,6 +316,8 @@ </Compile> <Compile Include="NHSpecificTest\NH1715\Fixture.cs" /> <Compile Include="NHSpecificTest\NH1715\ClassA.cs" /> + <Compile Include="NHSpecificTest\NH1716\ClassA.cs" /> + <Compile Include="NHSpecificTest\NH1716\Fixture.cs" /> <Compile Include="NHSpecificTest\NH645\HQLFunctionFixture.cs" /> <Compile Include="HQL\HQLFunctions.cs" /> <Compile Include="HQL\Human.cs" /> @@ -1708,6 +1710,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH1716\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\Dates\Mappings\TimeAsTimeSpan.hbm.xml" /> <EmbeddedResource Include="TypesTest\CurrencyClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1635\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fab...@us...> - 2009-03-29 16:08:49
|
Revision: 4168 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4168&view=rev Author: fabiomaulo Date: 2009-03-29 16:08:46 +0000 (Sun, 29 Mar 2009) Log Message: ----------- Release notes before 2.1.0Alpha2 release Modified Paths: -------------- trunk/nhibernate/releasenotes.txt Modified: trunk/nhibernate/releasenotes.txt =================================================================== --- trunk/nhibernate/releasenotes.txt 2009-03-29 15:58:41 UTC (rev 4167) +++ trunk/nhibernate/releasenotes.txt 2009-03-29 16:08:46 UTC (rev 4168) @@ -19,8 +19,38 @@ ##### Breaking Changes ##### * see NH-1633 if you are using SQL native queries - * see NH-1657 if you are using 'TimeSpan' NH type. * CriteriaUtil is gone. NHibernate.Transform.Transformers now returns predefined IResultTransformer. + +Build 2.1.0.Alpha2 (rev4167) +======================== + +** Sub-task + * [NH-1688] - System.Boolean type incorrectly mapped to YesNoType when the criterion is created by using a projection instead of a property name + +** Bug + * [NH-1635] - <many-to-one formula="select id from..."> should not require a column + * [NH-1671] - SoftLimitMRUCache has a softReferenceCache which is NOT soft + * [NH-1693] - Wrong parameters order in query with subselect and filter + * [NH-1694] - SQL2005Dialect - Sorting fails on a Formula property containing a comma while using paging (MaxResults) + * [NH-1700] - union-subclass with same name as abstract superclass causes NHibernate.DuplicateMappingException. + * [NH-1706] - property-ref does not work for different data type than PK type + * [NH-1710] - Decimal fields are not create correctly in SQL Server 2005/2008 using SchemaExport + * [NH-1711] - Failure of DTC transaction with multiple durable enlistment will crash the process + * [NH-1715] - Timespan type doesn't work with SqlServer 2005 + +** Improvement + * [NH-1707] - MsSQL : prepare_sql should be true by-default + * [NH-1716] - By default map TimeSpan as int64 + +** New Feature + * [NH-1222] - <Join> elements: collections support + * [NH-1718] - CurrencyType + * [NH-1719] - Current TimeSpan moved to TimeAsTimeSpan and TimeSpanInt64 moved back to TimeSpan + +** Patch + * [NH-1708] - MS SQL CE Metadata implementation + * [NH-1712] - Release notes missing info about removal of CriteriaUtil + * [NH-1713] - NH-1707 results in buggy PrepareStatement behavior Build 2.1.0.Alpha1 ======================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dar...@us...> - 2009-03-29 15:59:29
|
Revision: 4167 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4167&view=rev Author: darioquintana Date: 2009-03-29 15:58:41 +0000 (Sun, 29 Mar 2009) Log Message: ----------- part of previous commit, the type was moved, this should be too. Modified Paths: -------------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH1715/Mappings.hbm.xml 2009-03-29 15:58:41 UTC (rev 4167) @@ -8,7 +8,7 @@ <id name="Id"> <generator class="native"/> </id> - <property name="Time" type="TimeSpan"/> + <property name="Time" type="TimeAsTimeSpan"/> </class> </hibernate-mapping> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dar...@us...> - 2009-03-29 15:37:07
|
Revision: 4166 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4166&view=rev Author: darioquintana Date: 2009-03-29 15:36:13 +0000 (Sun, 29 Mar 2009) Log Message: ----------- - the actual TimeSpan type moved to TimeAsTimeSpan. - TimeSpanInt64 type moved back to TimeSpan (related to NH-1617) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/NHibernateUtil.cs trunk/nhibernate/src/NHibernate/Type/TimeType.cs trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs Removed Paths: ------------- trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-03-29 15:36:13 UTC (rev 4166) @@ -395,7 +395,7 @@ <Compile Include="Type\StringClobType.cs" /> <Compile Include="Type\StringType.cs" /> <Compile Include="Type\TicksType.cs" /> - <Compile Include="Type\TimeSpanInt64Type.cs" /> + <Compile Include="Type\TimeSpanType.cs" /> <Compile Include="Type\TimestampType.cs" /> <Compile Include="Type\TimeType.cs" /> <Compile Include="Type\TrueFalseType.cs" /> @@ -1092,7 +1092,7 @@ <Compile Include="Type\AnyType.cs" /> <Compile Include="Type\AbstractCharType.cs" /> <Compile Include="Type\CurrencyType.cs" /> - <Compile Include="Type\TimeSpanType.cs" /> + <Compile Include="Type\TimeAsTimeSpanType.cs" /> <Compile Include="Type\DateTime2Type.cs" /> <Compile Include="Type\ClassMetaType.cs" /> <Compile Include="Type\CollectionType.cs" /> Modified: trunk/nhibernate/src/NHibernate/NHibernateUtil.cs =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/NHibernateUtil.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -213,12 +213,12 @@ /// <summary> /// NHibernate Ticks type /// </summary> - public static readonly NullableType TimeSpan = new TimeSpanType(); + public static readonly NullableType TimeAsTimeSpan = new TimeAsTimeSpanType(); /// <summary> /// NHibernate Ticks type /// </summary> - public static readonly NullableType TimeSpanInt64 = new TimeSpanInt64Type(); + public static readonly NullableType TimeSpan = new TimeSpanType(); /// <summary> /// NHibernate Timestamp type Copied: trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs (from rev 4165, trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/TimeAsTimeSpanType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,122 @@ +using System; +using System.Collections; +using System.Data; +using NHibernate.Engine; +using NHibernate.SqlTypes; +using System.Collections.Generic; + +namespace NHibernate.Type +{ + /// <summary> + /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Time" /> column + /// This is an extra way to map a <see cref="DbType.Time"/>. You already have <see cref="TimeType"/> + /// but mapping against a <see cref="DateTime"/>. + /// </summary> + [Serializable] + public class TimeAsTimeSpanType : PrimitiveType, IVersionType + { + private static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01); + + internal TimeAsTimeSpanType() + : base(SqlTypeFactory.Time) + { + } + + public override string Name + { + get { return "TimeAsTimeSpan"; } + } + + public override object Get(IDataReader rs, int index) + { + try + { + object value = rs[index]; + if(value is TimeSpan) + return (TimeSpan)value; + + return ((DateTime)value).Subtract(BaseDateValue); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); + } + } + + public override object Get(IDataReader rs, string name) + { + try + { + object value = rs[name]; + if (value is TimeSpan) //For those dialects where DbType.Time means TimeSpan. + return (TimeSpan)value; + + return ((DateTime)value).Subtract(BaseDateValue); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); + } + } + + public override void Set(IDbCommand st, object value, int index) + { + DateTime date = BaseDateValue.AddTicks(((TimeSpan)value).Ticks); + ((IDataParameter) st.Parameters[index]).Value = date; + } + + public override System.Type ReturnedClass + { + get { return typeof(TimeSpan); } + } + + public override string ToString(object val) + { + return ((TimeSpan)val).Ticks.ToString(); + } + + #region IVersionType Members + + public object Next(object current, ISessionImplementor session) + { + return Seed(session); + } + + public virtual object Seed(ISessionImplementor session) + { + return new TimeSpan(DateTime.Now.Ticks); + } + + public object StringToObject(string xml) + { + return TimeSpan.Parse(xml); + } + + public IComparer Comparator + { + get { return Comparer<TimeSpan>.Default; } + } + + #endregion + + public override object FromStringValue(string xml) + { + return TimeSpan.Parse(xml); + } + + public override System.Type PrimitiveClass + { + get { return typeof(TimeSpan); } + } + + public override object DefaultValue + { + get { return TimeSpan.Zero; } + } + + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) + { + return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; + } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,119 +0,0 @@ -using System; -using System.Collections; -using System.Data; -using NHibernate.Engine; -using NHibernate.SqlTypes; -using System.Collections.Generic; - -namespace NHibernate.Type -{ - /// <summary> - /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Int64" /> column - /// </summary> - [Serializable] - public class TimeSpanInt64Type : PrimitiveType, IVersionType, ILiteralType - { - /// <summary></summary> - internal TimeSpanInt64Type() - : base(SqlTypeFactory.Int64) - { - } - - /// <summary></summary> - public override string Name - { - get { return "TimeSpanInt64"; } - } - - public override object Get(IDataReader rs, int index) - { - try - { - return new TimeSpan(Convert.ToInt64(rs[index])); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); - } - } - - public override object Get(IDataReader rs, string name) - { - try - { - return new TimeSpan(Convert.ToInt64(rs[name])); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); - } - } - - /// <summary></summary> - public override System.Type ReturnedClass - { - get { return typeof(TimeSpan); } - } - - /// <summary> - /// - /// </summary> - /// <param name="st"></param> - /// <param name="value"></param> - /// <param name="index"></param> - public override void Set(IDbCommand st, object value, int index) - { - ((IDataParameter)st.Parameters[index]).Value = ((TimeSpan)value).Ticks; - } - - public override string ToString(object val) - { - return ((TimeSpan)val).Ticks.ToString(); - } - - #region IVersionType Members - - public object Next(object current, ISessionImplementor session) - { - return Seed(session); - } - - /// <summary></summary> - public virtual object Seed(ISessionImplementor session) - { - return new TimeSpan(DateTime.Now.Ticks); - } - - public object StringToObject(string xml) - { - return TimeSpan.Parse(xml); - } - - public IComparer Comparator - { - get { return Comparer<TimeSpan>.Default; } - } - - #endregion - - public override object FromStringValue(string xml) - { - return TimeSpan.Parse(xml); - } - - public override System.Type PrimitiveClass - { - get { return typeof(TimeSpan); } - } - - public override object DefaultValue - { - get { return TimeSpan.Zero; } - } - - public override string ObjectToSQLString(object value, Dialect.Dialect dialect) - { - return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; - } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,120 +0,0 @@ -using System; -using System.Collections; -using System.Data; -using NHibernate.Engine; -using NHibernate.SqlTypes; -using System.Collections.Generic; - -namespace NHibernate.Type -{ - /// <summary> - /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Time" /> column - /// </summary> - [Serializable] - public class TimeSpanType : PrimitiveType, IVersionType, ILiteralType - { - private static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01); - - internal TimeSpanType() - : base(SqlTypeFactory.Time) - { - } - - public override string Name - { - get { return "TimeSpan"; } - } - - public override object Get(IDataReader rs, int index) - { - try - { - object value = rs[index]; - if(value is TimeSpan) - return (TimeSpan)value; - - return ((DateTime)value).Subtract(BaseDateValue); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); - } - } - - public override object Get(IDataReader rs, string name) - { - try - { - object value = rs[name]; - if (value is TimeSpan) //For those dialects where DbType.Time means TimeSpan. - return (TimeSpan)value; - - return ((DateTime)value).Subtract(BaseDateValue); - } - catch (Exception ex) - { - throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); - } - } - - public override void Set(IDbCommand st, object value, int index) - { - DateTime date = BaseDateValue.AddTicks(((TimeSpan)value).Ticks); - ((IDataParameter) st.Parameters[index]).Value = date; - } - - public override System.Type ReturnedClass - { - get { return typeof(TimeSpan); } - } - - public override string ToString(object val) - { - return ((TimeSpan)val).Ticks.ToString(); - } - - #region IVersionType Members - - public object Next(object current, ISessionImplementor session) - { - return Seed(session); - } - - public virtual object Seed(ISessionImplementor session) - { - return new TimeSpan(DateTime.Now.Ticks); - } - - public object StringToObject(string xml) - { - return TimeSpan.Parse(xml); - } - - public IComparer Comparator - { - get { return Comparer<TimeSpan>.Default; } - } - - #endregion - - public override object FromStringValue(string xml) - { - return TimeSpan.Parse(xml); - } - - public override System.Type PrimitiveClass - { - get { return typeof(TimeSpan); } - } - - public override object DefaultValue - { - get { return TimeSpan.Zero; } - } - - public override string ObjectToSQLString(object value, Dialect.Dialect dialect) - { - return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; - } - } -} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs (from rev 4165, trunk/nhibernate/src/NHibernate/Type/TimeSpanInt64Type.cs) =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Type/TimeSpanType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,119 @@ +using System; +using System.Collections; +using System.Data; +using NHibernate.Engine; +using NHibernate.SqlTypes; +using System.Collections.Generic; + +namespace NHibernate.Type +{ + /// <summary> + /// Maps a <see cref="System.TimeSpan" /> Property to an <see cref="DbType.Int64" /> column + /// </summary> + [Serializable] + public class TimeSpanType : PrimitiveType, IVersionType, ILiteralType + { + /// <summary></summary> + internal TimeSpanType() + : base(SqlTypeFactory.Int64) + { + } + + /// <summary></summary> + public override string Name + { + get { return "TimeSpan"; } + } + + public override object Get(IDataReader rs, int index) + { + try + { + return new TimeSpan(Convert.ToInt64(rs[index])); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[index]), ex); + } + } + + public override object Get(IDataReader rs, string name) + { + try + { + return new TimeSpan(Convert.ToInt64(rs[name])); + } + catch (Exception ex) + { + throw new FormatException(string.Format("Input string '{0}' was not in the correct format.", rs[name]), ex); + } + } + + /// <summary></summary> + public override System.Type ReturnedClass + { + get { return typeof(TimeSpan); } + } + + /// <summary> + /// + /// </summary> + /// <param name="st"></param> + /// <param name="value"></param> + /// <param name="index"></param> + public override void Set(IDbCommand st, object value, int index) + { + ((IDataParameter)st.Parameters[index]).Value = ((TimeSpan)value).Ticks; + } + + public override string ToString(object val) + { + return ((TimeSpan)val).Ticks.ToString(); + } + + #region IVersionType Members + + public object Next(object current, ISessionImplementor session) + { + return Seed(session); + } + + /// <summary></summary> + public virtual object Seed(ISessionImplementor session) + { + return new TimeSpan(DateTime.Now.Ticks); + } + + public object StringToObject(string xml) + { + return TimeSpan.Parse(xml); + } + + public IComparer Comparator + { + get { return Comparer<TimeSpan>.Default; } + } + + #endregion + + public override object FromStringValue(string xml) + { + return TimeSpan.Parse(xml); + } + + public override System.Type PrimitiveClass + { + get { return typeof(TimeSpan); } + } + + public override object DefaultValue + { + get { return TimeSpan.Zero; } + } + + public override string ObjectToSQLString(object value, Dialect.Dialect dialect) + { + return '\'' + ((TimeSpan)value).Ticks.ToString() + '\''; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Type/TimeType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TimeType.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TimeType.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -7,6 +7,8 @@ /// <summary> /// Maps a <see cref="System.DateTime" /> Property to an DateTime column that only stores the /// Hours, Minutes, and Seconds of the DateTime as significant. + /// Also you have for <see cref="DbType.Time"/> handling, the NHibernate Type <see cref="TimeAsTimeSpanType"/>, + /// the which maps to a <see cref="TimeSpan"/>. /// </summary> /// <remarks> /// <para> @@ -14,7 +16,7 @@ /// using this Type indicates that you don't care about the Date portion of the DateTime. /// </para> /// <para> - /// A more appropriate choice to store the duration/time is the <see cref="TimeSpanInt64Type"/>. + /// A more appropriate choice to store the duration/time is the <see cref="TimeSpanType"/>. /// The underlying <see cref="DbType.Time"/> tends to be handled differently by different /// DataProviders. /// </para> Modified: trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate/Type/TypeFactory.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -120,8 +120,8 @@ RegisterType(typeof(SByte), NHibernateUtil.SByte, null); RegisterType(typeof(Single), NHibernateUtil.Single, "float"); RegisterType(typeof(String), NHibernateUtil.String, "string"); - RegisterType(typeof(TimeSpan), NHibernateUtil.TimeSpanInt64,null); - RegisterType(typeof(TimeSpan), NHibernateUtil.TimeSpan, null); + RegisterType(typeof(TimeSpan), NHibernateUtil.TimeAsTimeSpan, "TimeAsTimeSpan"); + RegisterType(typeof(TimeSpan), NHibernateUtil.TimeSpan,null); RegisterType(typeof(System.Type), NHibernateUtil.Class, "class"); RegisterType(typeof(UInt16), NHibernateUtil.UInt16, null); @@ -141,8 +141,8 @@ typeByTypeOfName[NHibernateUtil.TrueFalse.Name] = NHibernateUtil.TrueFalse; typeByTypeOfName[NHibernateUtil.YesNo.Name] = NHibernateUtil.YesNo; typeByTypeOfName[NHibernateUtil.Ticks.Name] = NHibernateUtil.Ticks; - typeByTypeOfName[NHibernateUtil.TimeSpanInt64.Name] = NHibernateUtil.TimeSpanInt64; typeByTypeOfName[NHibernateUtil.TimeSpan.Name] = NHibernateUtil.TimeSpan; + typeByTypeOfName[NHibernateUtil.TimeAsTimeSpan.Name] = NHibernateUtil.TimeAsTimeSpan; typeByTypeOfName[NHibernateUtil.Currency.Name] = NHibernateUtil.Currency; // need to do add the key "Serializable" because the hbm files will have a Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/AllDates.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -12,7 +12,9 @@ public DateTimeOffset Sql_datetimeoffset { get; set; } - public TimeSpan Sql_time { get; set; } + public TimeSpan Sql_TimeAsTimeSpan { get; set; } + + public DateTime Sql_time { get; set; } public DateTime Sql_date { get; set; } } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -9,7 +9,7 @@ <generator class="native"/> </id> - <property name="Sql_time" type="TimeSpan" /> + <property name="Sql_time" type="time" /> </class> Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml (from rev 4165, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/Time.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/Mappings/TimeAsTimeSpan.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.Dates" + assembly="NHibernate.Test"> + + <class name="AllDates" lazy="false"> + + <id name="Id"> + <generator class="native"/> + </id> + + <property name="Sql_TimeAsTimeSpan" type="TimeAsTimeSpan" /> + + </class> + +</hibernate-mapping> Copied: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeAsTimeSpanFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Dates +{ + [TestFixture] + public class TimeAsTimeSpanFixture : FixtureBase + { + protected override IList Mappings + { + get { return new[] {"NHSpecificTest.Dates.Mappings.TimeAsTimeSpan.hbm.xml"}; } + } + + [Test] + public void SavingAndRetrievingTest() + { + TimeSpan now = DateTime.Parse("23:59:59").TimeOfDay; + + SavingAndRetrievingAction(new AllDates { Sql_TimeAsTimeSpan = now }, + entity => + { + Assert.AreEqual(entity.Sql_TimeAsTimeSpan.Hours, now.Hours); + Assert.AreEqual(entity.Sql_TimeAsTimeSpan.Minutes, now.Minutes); + Assert.AreEqual(entity.Sql_TimeAsTimeSpan.Seconds, now.Seconds); + }); + } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,33 +0,0 @@ -using System; -using System.Collections; -using NHibernate.Dialect; -using NUnit.Framework; - -namespace NHibernate.Test.NHSpecificTest.Dates -{ - [TestFixture] - public class TimeFixture : FixtureBase - { - protected override IList Mappings - { - get { return new[] {"NHSpecificTest.Dates.Mappings.Time.hbm.xml"}; } - } - - [Test] - public void SavingAndRetrievingTest() - { - var now = DateTime.Parse("23:59:59").TimeOfDay; - - SavingAndRetrievingAction(new AllDates {Sql_time = now}, - entity => - { - Assert.AreEqual(entity.Sql_time.Hours, now.Hours); - Assert.AreEqual(entity.Sql_time.Minutes, now.Minutes); - Assert.AreEqual(entity.Sql_time.Seconds, now.Seconds); - }); - - if(Dialect is MsSql2008Dialect) - SavingAndRetrievingAction(new AllDates { Sql_time = now }, entity => Assert.AreEqual(entity.Sql_time, now)); - } - } -} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/Dates/TimeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.Dates +{ + [TestFixture] + public class TimeFixture : FixtureBase + { + protected override IList Mappings + { + get { return new[] {"NHSpecificTest.Dates.Mappings.Time.hbm.xml"}; } + } + + [Test] + public void SavingAndRetrievingTest() + { + DateTime now = DateTime.Parse("23:59:59"); + + SavingAndRetrievingAction(new AllDates {Sql_time = now}, + entity => + { + Assert.AreEqual(entity.Sql_time.Hour, now.Hour); + Assert.AreEqual(entity.Sql_time.Minute, now.Minute); + Assert.AreEqual(entity.Sql_time.Second, now.Second); + }); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-03-29 15:36:13 UTC (rev 4166) @@ -292,6 +292,7 @@ <Compile Include="GenericTest\SetGeneric\SetGenericFixture.cs" /> <Compile Include="HQL\Animal.cs" /> <Compile Include="HQL\BaseFunctionFixture.cs" /> + <Compile Include="NHSpecificTest\Dates\TimeFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\DtcFailuresFixture.cs" /> <Compile Include="NHSpecificTest\DtcFailures\Person.cs" /> <Compile Include="NHSpecificTest\NH1635\Fixture.cs" /> @@ -416,7 +417,7 @@ <Compile Include="NHSpecificTest\BasicTimeFixture.cs" /> <Compile Include="NHSpecificTest\BugTestCase.cs" /> <Compile Include="NHSpecificTest\CollectionFixture.cs" /> - <Compile Include="NHSpecificTest\Dates\TimeFixture.cs" /> + <Compile Include="NHSpecificTest\Dates\TimeAsTimeSpanFixture.cs" /> <Compile Include="NHSpecificTest\Dates\DateFixture.cs" /> <Compile Include="NHSpecificTest\Dates\FixtureBase.cs" /> <Compile Include="NHSpecificTest\Dates\DateTime2Fixture.cs" /> @@ -1061,9 +1062,9 @@ <Compile Include="TypesTest\ByteTypeFixture.cs" /> <Compile Include="TypesTest\CurrencyClass.cs" /> <Compile Include="TypesTest\CurrencyTypeFixture.cs" /> + <Compile Include="TypesTest\TimeAsTimeSpanClass.cs" /> + <Compile Include="TypesTest\TimeAsTimeSpanTypeFixture.cs" /> <Compile Include="TypesTest\TimeSpanClass.cs" /> - <Compile Include="TypesTest\TimeSpanTypeFixture.cs" /> - <Compile Include="TypesTest\TimeSpanInt64Class.cs" /> <Compile Include="TypesTest\Decima2lTypeFixture.cs" /> <Compile Include="TypesTest\DateTimeTypeFixture.cs" /> <Compile Include="TypesTest\DecimalClass.cs" /> @@ -1092,7 +1093,7 @@ <Compile Include="TypesTest\StringClobTypeFixture.cs" /> <Compile Include="TypesTest\StringTypeFixture.cs" /> <Compile Include="TypesTest\TicksTypeFixture.cs" /> - <Compile Include="TypesTest\TimeSpanInt64TypeFixture.cs" /> + <Compile Include="TypesTest\TimeSpanTypeFixture.cs" /> <Compile Include="TypesTest\TimestampTypeFixture.cs" /> <Compile Include="TypesTest\TypeFactoryFixture.cs" /> <Compile Include="TypesTest\TypeFixtureBase.cs" /> @@ -1707,6 +1708,7 @@ <EmbeddedResource Include="Cascade\JobBatch.hbm.xml" /> <EmbeddedResource Include="Deletetransient\Person.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\Dates\Mappings\TimeAsTimeSpan.hbm.xml" /> <EmbeddedResource Include="TypesTest\CurrencyClass.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1635\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1688\Mappings.hbm.xml" /> @@ -1742,8 +1744,8 @@ <EmbeddedResource Include="Generatedkeys\ByTrigger\MyEntity.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\Identity\MyEntityIdentity.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1289\Mappings.hbm.xml" /> + <EmbeddedResource Include="TypesTest\TimeAsTimeSpanClass.hbm.xml" /> <EmbeddedResource Include="TypesTest\TimeSpanClass.hbm.xml" /> - <EmbeddedResource Include="TypesTest\TimeSpanInt64Class.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\FileStreamSql2008\Mappings.hbm.xml" /> <EmbeddedResource Include="Generatedkeys\Seqidentity\MyEntity.hbm.xml" /> <EmbeddedResource Include="IdGen\NativeGuid\NativeGuidPoid.hbm.xml" /> Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.TypesTest +{ + public class TimeAsTimeSpanClass + { + public int Id { get; set; } + public TimeSpan TimeSpanValue { get; set; } + } +} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanClass.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -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.TimeAsTimeSpanClass, NHibernate.Test"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="TimeSpanValue" type="TimeAsTimeSpan" /> + </class> + +</hibernate-mapping> Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeAsTimeSpanTypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,79 @@ +using System; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + /// <summary> + /// Summary description for TimeAsTimeSpanTypeFixture. + /// </summary> + [TestFixture] + public class TimeAsTimeSpanTypeFixture + { + [Test] + public void Next() + { + var type = (TimeAsTimeSpanType) NHibernateUtil.TimeAsTimeSpan; + object current = new TimeSpan(DateTime.Now.Ticks - 5); + object next = type.Next(current, null); + + Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); + Assert.IsTrue((TimeSpan) next > (TimeSpan) current, + "next should be greater than current (could be equal depending on how quickly this occurs)"); + } + + [Test] + public void Seed() + { + var type = (TimeAsTimeSpanType) NHibernateUtil.TimeAsTimeSpan; + Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); + } + } + + [TestFixture] + public class TimeSpanFixture2 : TypeFixtureBase + { + protected override string TypeName + { + get { return "TimeAsTimeSpan"; } + } + + [Test] + public void SavingAndRetrieving() + { + var ticks = DateTime.Parse("23:59:59").TimeOfDay; + + var entity = new TimeAsTimeSpanClass + { + TimeSpanValue = ticks + }; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + TimeAsTimeSpanClass entityReturned; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + entityReturned = s.CreateQuery("from TimeAsTimeSpanClass").UniqueResult<TimeAsTimeSpanClass>(); + + Assert.AreEqual(ticks, entityReturned.TimeSpanValue); + Assert.AreEqual(entityReturned.TimeSpanValue.Hours,ticks.Hours); + Assert.AreEqual(entityReturned.TimeSpanValue.Minutes, ticks.Minutes); + Assert.AreEqual(entityReturned.TimeSpanValue.Seconds, ticks.Seconds); + } + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete(entityReturned); + tx.Commit(); + } + } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,10 +0,0 @@ -using System; - -namespace NHibernate.Test.TypesTest -{ - public class TimeSpanClass - { - public int Id { get; set; } - public TimeSpan TimeSpanValue { get; set; } - } -} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,10 @@ +using System; + +namespace NHibernate.Test.TypesTest +{ + public class TimeSpanClass + { + public int Id { get; set; } + public TimeSpan TimeSpanValue { get; set; } + } +} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> - - <class name="NHibernate.Test.TypesTest.TimeSpanClass, NHibernate.Test"> - <id name="Id"> - <generator class="native" /> - </id> - <property name="TimeSpanValue" type="TimeSpan" /> - </class> - -</hibernate-mapping> Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanClass.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -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.TimeSpanClass, NHibernate.Test"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="TimeSpanValue" type="TimeSpan" /> + </class> + +</hibernate-mapping> Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,10 +0,0 @@ -using System; - -namespace NHibernate.Test.TypesTest -{ - public class TimeSpanInt64Class - { - public int Id { get; set; } - public TimeSpan TimeSpanValue { get; set; } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64Class.hbm.xml 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> - - <class name="NHibernate.Test.TypesTest.TimeSpanInt64Class, NHibernate.Test"> - <id name="Id"> - <generator class="native" /> - </id> - <property name="TimeSpanValue" type="TimeSpanInt64" /> - </class> - -</hibernate-mapping> Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,75 +0,0 @@ -using System; -using NHibernate.Type; -using NUnit.Framework; - -namespace NHibernate.Test.TypesTest -{ - /// <summary> - /// Summary description for TimeSpanTypeFixture. - /// </summary> - [TestFixture] - public class TimeSpanInt64TypeFixture - { - [Test] - public void Next() - { - var type = (TimeSpanInt64Type) NHibernateUtil.TimeSpanInt64; - object current = new TimeSpan(DateTime.Now.Ticks - 5); - object next = type.Next(current, null); - - Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); - Assert.IsTrue((TimeSpan) next > (TimeSpan) current, - "next should be greater than current (could be equal depending on how quickly this occurs)"); - } - - [Test] - public void Seed() - { - var type = (TimeSpanInt64Type) NHibernateUtil.TimeSpanInt64; - Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); - } - } - - [TestFixture] - public class TimeSpanInt64Fixture2 : TypeFixtureBase - { - protected override string TypeName - { - get { return "TimeSpanInt64"; } - } - - [Test] - public void SavingAndRetrieving() - { - var ticks = new TimeSpan(1982); - - var entity = new TimeSpanInt64Class - { - TimeSpanValue = ticks - }; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Save(entity); - tx.Commit(); - } - - TimeSpanInt64Class entityReturned; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - entityReturned = s.CreateQuery("from TimeSpanInt64Class").UniqueResult<TimeSpanInt64Class>(); - Assert.AreEqual(ticks, entityReturned.TimeSpanValue); - } - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Delete(entityReturned); - tx.Commit(); - } - } - } -} \ No newline at end of file Deleted: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs 2009-03-29 06:27:12 UTC (rev 4165) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -1,82 +0,0 @@ -using System; -using NHibernate.Dialect; -using NHibernate.Type; -using NUnit.Framework; - -namespace NHibernate.Test.TypesTest -{ - /// <summary> - /// Summary description for TimeSpanTypeFixture. - /// </summary> - [TestFixture] - public class TimeSpanTypeFixture - { - [Test] - public void Next() - { - var type = (TimeSpanType) NHibernateUtil.TimeSpan; - object current = new TimeSpan(DateTime.Now.Ticks - 5); - object next = type.Next(current, null); - - Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); - Assert.IsTrue((TimeSpan) next > (TimeSpan) current, - "next should be greater than current (could be equal depending on how quickly this occurs)"); - } - - [Test] - public void Seed() - { - var type = (TimeSpanType) NHibernateUtil.TimeSpan; - Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); - } - } - - [TestFixture] - public class TimeSpanFixture2 : TypeFixtureBase - { - protected override string TypeName - { - get { return "TimeSpan"; } - } - - [Test] - public void SavingAndRetrieving() - { - var ticks = DateTime.Parse("23:59:59").TimeOfDay; - - var entity = new TimeSpanClass - { - TimeSpanValue = ticks - }; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Save(entity); - tx.Commit(); - } - - TimeSpanClass entityReturned; - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - entityReturned = s.CreateQuery("from TimeSpanClass").UniqueResult<TimeSpanClass>(); - - if(Dialect is MsSql2008Dialect) - Assert.AreEqual(ticks, entityReturned.TimeSpanValue); - - Assert.AreEqual(entityReturned.TimeSpanValue.Hours,ticks.Hours); - Assert.AreEqual(entityReturned.TimeSpanValue.Minutes, ticks.Minutes); - Assert.AreEqual(entityReturned.TimeSpanValue.Seconds, ticks.Seconds); - } - - using (ISession s = OpenSession()) - using (ITransaction tx = s.BeginTransaction()) - { - s.Delete(entityReturned); - tx.Commit(); - } - } - } -} \ No newline at end of file Copied: trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs (from rev 4165, trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanInt64TypeFixture.cs) =================================================================== --- trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/TypesTest/TimeSpanTypeFixture.cs 2009-03-29 15:36:13 UTC (rev 4166) @@ -0,0 +1,75 @@ +using System; +using NHibernate.Type; +using NUnit.Framework; + +namespace NHibernate.Test.TypesTest +{ + /// <summary> + /// Summary description for TimeSpanTypeFixture. + /// </summary> + [TestFixture] + public class TimeSpanTypeFixture + { + [Test] + public void Next() + { + var type = (TimeSpanType) NHibernateUtil.TimeSpan; + object current = new TimeSpan(DateTime.Now.Ticks - 5); + object next = type.Next(current, null); + + Assert.IsTrue(next is TimeSpan, "Next should be TimeSpan"); + Assert.IsTrue((TimeSpan) next > (TimeSpan) current, + "next should be greater than current (could be equal depending on how quickly this occurs)"); + } + + [Test] + public void Seed() + { + var type = (TimeSpanType) NHibernateUtil.TimeSpan; + Assert.IsTrue(type.Seed(null) is TimeSpan, "seed should be TimeSpan"); + } + } + + [TestFixture] + public class TimeSpanTypeFixture2 : TypeFixtureBase + { + protected override string TypeName + { + get { return "TimeSpan"; } + } + + [Test] + public void SavingAndRetrieving() + { + var ticks = new TimeSpan(1982); + + var entity = new TimeSpanClass + { + TimeSpanValue = ticks + }; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Save(entity); + tx.Commit(); + } + + TimeSpanClass entityReturned; + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + entityReturned = s.CreateQuery("from TimeSpanClass").UniqueResult<TimeSpanClass>(); + Assert.AreEqual(ticks, entityReturned.TimeSpanValue); + } + + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.Delete(entityReturned); + tx.Commit(); + } + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |