Skip to content

Commit c48b4fd

Browse files
committed
Add timeouts support to MultiCriteria
Fixes #1403
1 parent 906c692 commit c48b4fd

File tree

5 files changed

+40
-6
lines changed

5 files changed

+40
-6
lines changed

src/NHibernate/Async/Impl/MultiCriteriaImpl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ private async Task GetResultsFromDatabaseAsync(IList results, CancellationToken
151151

152152
try
153153
{
154-
using (var reader = await (resultSetsCommand.GetReaderAsync(null, cancellationToken)).ConfigureAwait(false))
154+
using (var reader = await (resultSetsCommand.GetReaderAsync(_timeout, cancellationToken)).ConfigureAwait(false))
155155
{
156156
var hydratedObjects = new List<object>[loaders.Count];
157157
List<EntityKey[]>[] subselectResultKeys = new List<EntityKey[]>[loaders.Count];

src/NHibernate/Async/Impl/MultiQueryImpl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ protected async Task<List<object>> DoListAsync(CancellationToken cancellationTok
8484

8585
try
8686
{
87-
using (var reader = await (resultSetsCommand.GetReaderAsync(commandTimeout != RowSelection.NoValue ? commandTimeout : (int?)null, cancellationToken)).ConfigureAwait(false))
87+
using (var reader = await (resultSetsCommand.GetReaderAsync(_timeout, cancellationToken)).ConfigureAwait(false))
8888
{
8989
if (log.IsDebugEnabled())
9090
{

src/NHibernate/IMultiCriteria.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
using System;
12
using System.Collections;
23
using NHibernate.Criterion;
4+
using NHibernate.Impl;
35
using NHibernate.Transform;
46

57
namespace NHibernate
@@ -154,4 +156,26 @@ public partial interface IMultiCriteria
154156
/// <returns></returns>
155157
object GetResult(string key);
156158
}
159+
160+
public static class MultiCriteriaExtensions
161+
{
162+
//6.0 TODO: Convert to interface method
163+
/// <summary>
164+
/// Set a timeout for the underlying ADO.NET query
165+
/// </summary>
166+
public static IMultiCriteria SetTimeout(this IMultiCriteria multiCriteria, int timeout)
167+
{
168+
if (multiCriteria == null)
169+
{
170+
throw new ArgumentNullException(nameof(multiCriteria));
171+
}
172+
173+
if (multiCriteria is MultiCriteriaImpl impl)
174+
{
175+
return impl.SetTimeout(timeout);
176+
}
177+
178+
throw new NotSupportedException(multiCriteria.GetType() + " does not support SetTimeout");
179+
}
180+
}
157181
}

src/NHibernate/Impl/MultiCriteriaImpl.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public partial class MultiCriteriaImpl : IMultiCriteria
3535
private string cacheRegion;
3636
private IResultTransformer resultTransformer;
3737
private readonly IResultSetsCommand resultSetsCommand;
38+
private int? _timeout;
3839

3940
/// <summary>
4041
/// Initializes a new instance of the <see cref="MultiCriteriaImpl"/> class.
@@ -221,7 +222,7 @@ private void GetResultsFromDatabase(IList results)
221222

222223
try
223224
{
224-
using (var reader = resultSetsCommand.GetReader(null))
225+
using (var reader = resultSetsCommand.GetReader(_timeout))
225226
{
226227
var hydratedObjects = new List<object>[loaders.Count];
227228
List<EntityKey[]>[] subselectResultKeys = new List<EntityKey[]>[loaders.Count];
@@ -474,5 +475,14 @@ private void ThrowIfKeyAlreadyExists(string key)
474475
if (criteriaResultPositions.ContainsKey(key))
475476
throw new InvalidOperationException(String.Format("The key '{0}' already exists", key));
476477
}
478+
479+
/// <summary>
480+
/// Set a timeout for the underlying ADO.NET query
481+
/// </summary>
482+
public IMultiCriteria SetTimeout(int timeout)
483+
{
484+
_timeout = timeout == RowSelection.NoValue ? (int?) null : timeout;
485+
return this;
486+
}
477487
}
478488
}

src/NHibernate/Impl/MultiQueryImpl.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public partial class MultiQueryImpl : IMultiQuery
2929
private IList queryResults;
3030
private readonly Dictionary<string, int> queryResultPositions = new Dictionary<string, int>();
3131
private string cacheRegion;
32-
private int commandTimeout = RowSelection.NoValue;
32+
private int? _timeout;
3333
private bool isCacheable;
3434
private readonly ISessionImplementor session;
3535
private IResultTransformer resultTransformer;
@@ -64,7 +64,7 @@ public IMultiQuery SetForceCacheRefresh(bool cacheRefresh)
6464

6565
public IMultiQuery SetTimeout(int timeout)
6666
{
67-
commandTimeout = timeout;
67+
_timeout = timeout == RowSelection.NoValue ? (int?) null : timeout;
6868
return this;
6969
}
7070

@@ -526,7 +526,7 @@ protected List<object> DoList()
526526

527527
try
528528
{
529-
using (var reader = resultSetsCommand.GetReader(commandTimeout != RowSelection.NoValue ? commandTimeout : (int?)null))
529+
using (var reader = resultSetsCommand.GetReader(_timeout))
530530
{
531531
if (log.IsDebugEnabled())
532532
{

0 commit comments

Comments
 (0)