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