From: <ric...@us...> - 2009-09-30 09:40:15
|
Revision: 4732 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4732&view=rev Author: ricbrown Date: 2009-09-30 09:40:08 +0000 (Wed, 30 Sep 2009) Log Message: ----------- Added IQueryOver.Lock(...) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs trunk/nhibernate/src/NHibernate/IQueryOver.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Criterion/QueryOverLockBuilder.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-09-28 17:04:14 UTC (rev 4731) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-09-30 09:40:08 UTC (rev 4732) @@ -128,6 +128,16 @@ return new QueryOverFetchBuilder<T>(this, path); } + public QueryOverLockBuilder<T> Lock() + { + return new QueryOverLockBuilder<T>(this, null); + } + + public QueryOverLockBuilder<T> Lock(Expression<Func<object>> alias) + { + return new QueryOverLockBuilder<T>(this, alias); + } + public QueryOver<U> JoinQueryOver<U>(Expression<Func<T, U>> path) { return new QueryOver<U>(_impl, @@ -314,6 +324,12 @@ IQueryOverFetchBuilder<T> IQueryOver<T>.Fetch(Expression<Func<T, object>> path) { return new IQueryOverFetchBuilder<T>(this, path); } + IQueryOverLockBuilder<T> IQueryOver<T>.Lock() + { return new IQueryOverLockBuilder<T>(this, null); } + + IQueryOverLockBuilder<T> IQueryOver<T>.Lock(Expression<Func<object>> alias) + { return new IQueryOverLockBuilder<T>(this, alias); } + IQueryOver<U> IQueryOver<T>.JoinQueryOver<U>(Expression<Func<T, U>> path) { return JoinQueryOver(path); } Added: trunk/nhibernate/src/NHibernate/Criterion/QueryOverLockBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOverLockBuilder.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOverLockBuilder.cs 2009-09-30 09:40:08 UTC (rev 4732) @@ -0,0 +1,106 @@ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +using NHibernate.Impl; +using NHibernate.SqlCommand; + +namespace NHibernate.Criterion +{ + + public class QueryOverLockBuilder<T> : QueryOverLockBuilderBase<QueryOver<T>, T> + { + + public QueryOverLockBuilder(QueryOver<T> root, Expression<Func<object>> alias) + : base(root, alias) { } + + } + + public class IQueryOverLockBuilder<T> : QueryOverLockBuilderBase<IQueryOver<T>, T> + { + + public IQueryOverLockBuilder(IQueryOver<T> root, Expression<Func<object>> alias) + : base(root, alias) { } + + } + + public class QueryOverLockBuilderBase<R, T> where R : IQueryOver<T> + { + + protected R root; + protected string alias; + + protected QueryOverLockBuilderBase(R root, Expression<Func<object>> alias) + { + this.root = root; + + if (alias != null) + this.alias = ExpressionProcessor.FindMemberExpression(alias.Body); + } + + private void SetLockMode(LockMode lockMode) + { + if (alias != null) + root.UnderlyingCriteria.SetLockMode(alias, lockMode); + else + root.UnderlyingCriteria.SetLockMode(lockMode); + } + + public R Force + { + get + { + SetLockMode(LockMode.Force); + return this.root; + } + } + + public R None + { + get + { + SetLockMode(LockMode.None); + return this.root; + } + } + + public R Read + { + get + { + SetLockMode(LockMode.Read); + return this.root; + } + } + + public R Upgrade + { + get + { + SetLockMode(LockMode.Upgrade); + return this.root; + } + } + + public R UpgradeNoWait + { + get + { + SetLockMode(LockMode.UpgradeNoWait); + return this.root; + } + } + + public R Write + { + get + { + SetLockMode(LockMode.Write); + return this.root; + } + } + + } + +} Modified: trunk/nhibernate/src/NHibernate/IQueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-09-28 17:04:14 UTC (rev 4731) +++ trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-09-30 09:40:08 UTC (rev 4732) @@ -130,6 +130,16 @@ IQueryOverFetchBuilder<T> Fetch(Expression<Func<T, object>> path); /// <summary> + /// Set the lock mode of the current entity + /// </summary> + IQueryOverLockBuilder<T> Lock(); + + /// <summary> + /// Set the lock mode of the aliased entity + /// </summary> + IQueryOverLockBuilder<T> Lock(Expression<Func<object>> alias); + + /// <summary> /// Creates a new NHibernate.ICriteria<T>, "rooted" at the associated entity /// </summary> /// <typeparam name="U">Type of sub-criteria</typeparam> Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-09-28 17:04:14 UTC (rev 4731) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-09-30 09:40:08 UTC (rev 4732) @@ -507,6 +507,7 @@ <Compile Include="Criterion\IPropertyProjection.cs" /> <Compile Include="Criterion\QueryOverFetchBuilder.cs" /> <Compile Include="Criterion\QueryOverJoinBuilder.cs" /> + <Compile Include="Criterion\QueryOverLockBuilder.cs" /> <Compile Include="Criterion\QueryOverOrderBuilder.cs" /> <Compile Include="Dialect\MsSql2008Dialect.cs" /> <Compile Include="Dialect\InformixDialect0940.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-09-28 17:04:14 UTC (rev 4731) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-09-30 09:40:08 UTC (rev 4732) @@ -347,6 +347,35 @@ AssertCriteriaAreEqual(expected, actual); } + [Test] + public void LockAll() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .SetLockMode(LockMode.UpgradeNoWait); + + IQueryOver<Person> actual = + CreateTestQueryOver<Person>() + .Lock().UpgradeNoWait; + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] + public void LockAlias() + { + ICriteria expected = + CreateTestCriteria(typeof(Person), "personAlias") + .SetLockMode("personAlias", LockMode.UpgradeNoWait); + + Person personAlias = null; + IQueryOver<Person> actual = + CreateTestQueryOver<Person>(() => personAlias) + .Lock(() => personAlias).UpgradeNoWait; + + AssertCriteriaAreEqual(expected, actual); + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |