Skip to content

Commit 875f28d

Browse files
Minimal move of duplicated code.
1 parent 6ac5fa0 commit 875f28d

File tree

6 files changed

+95
-153
lines changed

6 files changed

+95
-153
lines changed

src/NHibernate/Async/Impl/AbstractSessionImpl.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System;
1212
using System.Collections;
1313
using System.Collections.Generic;
14+
using System.Data;
1415
using System.Data.Common;
1516
using System.Linq;
1617
using NHibernate.AdoNet;

src/NHibernate/Async/Impl/SessionImpl.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
using System;
1212
using System.Collections;
1313
using System.Collections.Generic;
14-
using System.Data;
1514
using System.Data.Common;
1615
using System.Linq.Expressions;
1716
using System.Runtime.Serialization;

src/NHibernate/Async/Impl/StatelessSessionImpl.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@
1111
using System;
1212
using System.Collections;
1313
using System.Collections.Generic;
14-
using System.Data;
1514
using System.Data.Common;
1615
using System.Linq.Expressions;
17-
using NHibernate.AdoNet;
1816
using NHibernate.Cache;
1917
using NHibernate.Collection;
2018
using NHibernate.Criterion;

src/NHibernate/Impl/AbstractSessionImpl.cs

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4+
using System.Data;
45
using System.Data.Common;
56
using System.Linq;
67
using NHibernate.AdoNet;
@@ -31,26 +32,51 @@ public abstract partial class AbstractSessionImpl : ISessionImplementor
3132

3233
private bool closed;
3334

35+
protected bool TransactionCoordinatorShared { get; }
36+
3437
public ITransactionContext TransactionContext
3538
{
3639
get; set;
3740
}
3841

3942
private bool isAlreadyDisposed;
4043

41-
private static readonly INHibernateLogger logger = NHibernateLogger.For(typeof(AbstractSessionImpl));
44+
private static readonly INHibernateLogger Log = NHibernateLogger.For(typeof(AbstractSessionImpl));
4245

4346
public Guid SessionId { get; }
4447

4548
internal AbstractSessionImpl() { }
4649

4750
protected internal AbstractSessionImpl(ISessionFactoryImplementor factory, ISessionCreationOptions options)
4851
{
49-
_factory = factory;
50-
Timestamp = factory.Settings.CacheProvider.NextTimestamp();
51-
_flushMode = options.InitialSessionFlushMode;
52-
Interceptor = options.SessionInterceptor ?? EmptyInterceptor.Instance;
5352
SessionId = factory.Settings.TrackSessionId ? Guid.NewGuid() : Guid.Empty;
53+
using (BeginContext())
54+
{
55+
_factory = factory;
56+
Timestamp = factory.Settings.CacheProvider.NextTimestamp();
57+
_flushMode = options.InitialSessionFlushMode;
58+
Interceptor = options.SessionInterceptor ?? EmptyInterceptor.Instance;
59+
60+
if (options is ISharedSessionCreationOptions sharedOptions && sharedOptions.IsTransactionCoordinatorShared)
61+
{
62+
// NH specific implementation: need to port Hibernate transaction management.
63+
TransactionCoordinatorShared = true;
64+
if (options.UserSuppliedConnection != null)
65+
throw new SessionException("Cannot simultaneously share transaction context and specify connection");
66+
var connectionManager = sharedOptions.ConnectionManager;
67+
connectionManager.AddDependentSession(this);
68+
ConnectionManager = connectionManager;
69+
}
70+
else
71+
{
72+
ConnectionManager = new ConnectionManager(
73+
this,
74+
options.UserSuppliedConnection,
75+
options.SessionConnectionReleaseMode,
76+
Interceptor,
77+
options.ShouldAutoJoinTransaction);
78+
}
79+
}
5480
}
5581

5682
#region ISessionImplementor Members
@@ -218,9 +244,11 @@ public virtual IQuery GetNamedSQLQuery(string name)
218244
}
219245
}
220246

247+
// 6.0 TODO: remove virtual.
248+
public virtual ConnectionManager ConnectionManager { get; protected set; }
249+
221250
public abstract IQueryTranslator[] GetQueries(IQueryExpression query, bool scalar);
222251
public abstract EventListeners Listeners { get; }
223-
public abstract ConnectionManager ConnectionManager { get; }
224252
public abstract bool IsEventSource { get; }
225253
public abstract object GetEntityUsingInterceptor(EntityKey key);
226254
public abstract IPersistenceContext PersistenceContext { get; }
@@ -471,6 +499,45 @@ protected void AfterOperation(bool success)
471499
}
472500
}
473501

502+
/// <summary>
503+
/// Begin a NHibernate transaction
504+
/// </summary>
505+
/// <returns>A NHibernate transaction</returns>
506+
public ITransaction BeginTransaction()
507+
{
508+
using (BeginProcess())
509+
{
510+
if (TransactionCoordinatorShared)
511+
{
512+
// Todo : should seriously consider not allowing a txn to begin from a child session
513+
// can always route the request to the root session...
514+
Log.Warn("Transaction started on non-root session");
515+
}
516+
517+
return ConnectionManager.BeginTransaction();
518+
}
519+
}
520+
521+
/// <summary>
522+
/// Begin a NHibernate transaction with the specified isolation level
523+
/// </summary>
524+
/// <param name="isolationLevel">The isolation level</param>
525+
/// <returns>A NHibernate transaction</returns>
526+
public ITransaction BeginTransaction(IsolationLevel isolationLevel)
527+
{
528+
using (BeginProcess())
529+
{
530+
if (TransactionCoordinatorShared)
531+
{
532+
// Todo : should seriously consider not allowing a txn to begin from a child session
533+
// can always route the request to the root session...
534+
Log.Warn("Transaction started on non-root session");
535+
}
536+
537+
return ConnectionManager.BeginTransaction(isolationLevel);
538+
}
539+
}
540+
474541
protected void EnlistInAmbientTransactionIfNeeded()
475542
{
476543
_factory.TransactionFactory.EnlistInSystemTransactionIfNeeded(this);

src/NHibernate/Impl/SessionImpl.cs

Lines changed: 14 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections;
33
using System.Collections.Generic;
4-
using System.Data;
54
using System.Data.Common;
65
using System.Linq.Expressions;
76
using System.Runtime.Serialization;
@@ -56,8 +55,6 @@ public sealed partial class SessionImpl : AbstractSessionImpl, IEventSource, ISe
5655
[NonSerialized]
5756
private int _suspendAutoFlushCount;
5857

59-
private readonly ConnectionManager connectionManager;
60-
6158
[NonSerialized]
6259
private readonly IDictionary<string, IFilter> enabledFilters = new Dictionary<string, IFilter>();
6360

@@ -71,8 +68,6 @@ public sealed partial class SessionImpl : AbstractSessionImpl, IEventSource, ISe
7168
private readonly bool autoCloseSessionEnabled;
7269
[NonSerialized]
7370
private readonly ConnectionReleaseMode connectionReleaseMode;
74-
[NonSerialized]
75-
private readonly bool _transactionCoordinatorShared;
7671

7772
#region System.Runtime.Serialization.ISerializable Members
7873

@@ -104,7 +99,7 @@ private SessionImpl(SerializationInfo info, StreamingContext context)
10499
enabledFilters = (IDictionary<string, IFilter>)info.GetValue("enabledFilters", typeof(Dictionary<string, IFilter>));
105100
enabledFilterNames = (List<string>)info.GetValue("enabledFilterNames", typeof(List<string>));
106101

107-
connectionManager = (ConnectionManager)info.GetValue("connectionManager", typeof(ConnectionManager));
102+
ConnectionManager = (ConnectionManager)info.GetValue("connectionManager", typeof(ConnectionManager));
108103
}
109104

110105
/// <summary>
@@ -122,11 +117,11 @@ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext contex
122117
{
123118
log.Debug("writting session to serializer");
124119

125-
if (!connectionManager.IsReadyForSerialization)
120+
if (!ConnectionManager.IsReadyForSerialization)
126121
{
127122
throw new InvalidOperationException("Cannot serialize a Session while connected");
128123
}
129-
if (_transactionCoordinatorShared)
124+
if (TransactionCoordinatorShared)
130125
{
131126
throw new InvalidOperationException("Cannot serialize a Session sharing its transaction coordinator");
132127
}
@@ -143,7 +138,7 @@ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext contex
143138
info.AddValue("enabledFilters", enabledFilters, typeof(IDictionary<string, IFilter>));
144139
info.AddValue("enabledFilterNames", enabledFilterNames, typeof(List<string>));
145140

146-
info.AddValue("connectionManager", connectionManager, typeof(ConnectionManager));
141+
info.AddValue("connectionManager", ConnectionManager, typeof(ConnectionManager));
147142
}
148143

149144
#endregion
@@ -194,21 +189,6 @@ internal SessionImpl(SessionFactoryImpl factory, ISessionCreationOptions options
194189
listeners = factory.EventListeners;
195190
connectionReleaseMode = options.SessionConnectionReleaseMode;
196191

197-
if (options is ISharedSessionCreationOptions sharedOptions && sharedOptions.IsTransactionCoordinatorShared)
198-
{
199-
// NH specific implementation: need to port Hibernate transaction management.
200-
_transactionCoordinatorShared = true;
201-
if (options.UserSuppliedConnection != null)
202-
throw new SessionException("Cannot simultaneously share transaction context and specify connection");
203-
connectionManager = sharedOptions.ConnectionManager;
204-
connectionManager.AddDependentSession(this);
205-
}
206-
else
207-
{
208-
connectionManager = new ConnectionManager(
209-
this, options.UserSuppliedConnection, connectionReleaseMode, Interceptor, options.ShouldAutoJoinTransaction);
210-
}
211-
212192
if (factory.Statistics.IsStatisticsEnabled)
213193
{
214194
factory.StatisticsImplementor.OpenSession();
@@ -255,7 +235,7 @@ public override IBatcher Batcher
255235
get
256236
{
257237
CheckAndUpdateSessionStatus();
258-
return connectionManager.Batcher;
238+
return ConnectionManager.Batcher;
259239
}
260240
}
261241

@@ -298,9 +278,9 @@ public DbConnection Close()
298278

299279
try
300280
{
301-
if (!_transactionCoordinatorShared)
302-
return connectionManager.Close();
303-
connectionManager.RemoveDependentSession(this);
281+
if (!TransactionCoordinatorShared)
282+
return ConnectionManager.Close();
283+
ConnectionManager.RemoveDependentSession(this);
304284
return null;
305285
}
306286
finally
@@ -1319,39 +1299,9 @@ public void Refresh(object obj, LockMode lockMode)
13191299
}
13201300
}
13211301

1322-
public ITransaction BeginTransaction(IsolationLevel isolationLevel)
1323-
{
1324-
using (BeginProcess())
1325-
{
1326-
if (_transactionCoordinatorShared)
1327-
{
1328-
// Todo : should seriously consider not allowing a txn to begin from a child session
1329-
// can always route the request to the root session...
1330-
log.Warn("Transaction started on non-root session");
1331-
}
1332-
1333-
return connectionManager.BeginTransaction(isolationLevel);
1334-
}
1335-
}
1336-
1337-
public ITransaction BeginTransaction()
1338-
{
1339-
using (BeginProcess())
1340-
{
1341-
if (_transactionCoordinatorShared)
1342-
{
1343-
// Todo : should seriously consider not allowing a txn to begin from a child session
1344-
// can always route the request to the root session...
1345-
log.Warn("Transaction started on non-root session");
1346-
}
1347-
1348-
return connectionManager.BeginTransaction();
1349-
}
1350-
}
1351-
13521302
public ITransaction Transaction
13531303
{
1354-
get { return connectionManager.Transaction; }
1304+
get { return ConnectionManager.Transaction; }
13551305
}
13561306

13571307
/// <summary>
@@ -1507,7 +1457,7 @@ public override void InitializeCollection(IPersistentCollection collection, bool
15071457

15081458
public override DbConnection Connection
15091459
{
1510-
get { return connectionManager.GetConnection(); }
1460+
get { return ConnectionManager.GetConnection(); }
15111461
}
15121462

15131463
/// <summary>
@@ -1523,7 +1473,7 @@ public override DbConnection Connection
15231473
/// </remarks>
15241474
public override bool IsConnected
15251475
{
1526-
get { return connectionManager.IsConnected; }
1476+
get { return ConnectionManager.IsConnected; }
15271477
}
15281478

15291479
/// <summary></summary>
@@ -1532,7 +1482,7 @@ public DbConnection Disconnect()
15321482
using (BeginProcess())
15331483
{
15341484
log.Debug("disconnecting session");
1535-
return connectionManager.Disconnect();
1485+
return ConnectionManager.Disconnect();
15361486
}
15371487
}
15381488

@@ -1541,7 +1491,7 @@ public void Reconnect()
15411491
using (BeginProcess())
15421492
{
15431493
log.Debug("reconnecting session");
1544-
connectionManager.Reconnect();
1494+
ConnectionManager.Reconnect();
15451495
}
15461496
}
15471497

@@ -1550,7 +1500,7 @@ public void Reconnect(DbConnection conn)
15501500
using (BeginProcess())
15511501
{
15521502
log.Debug("reconnecting session");
1553-
connectionManager.Reconnect(conn);
1503+
ConnectionManager.Reconnect(conn);
15541504
}
15551505
}
15561506

@@ -2038,11 +1988,6 @@ private string[] ParseFilterParameterName(string filterParameterName)
20381988
return new[] { filterName, parameterName };
20391989
}
20401990

2041-
public override ConnectionManager ConnectionManager
2042-
{
2043-
get { return connectionManager; }
2044-
}
2045-
20461991
public IMultiQuery CreateMultiQuery()
20471992
{
20481993
using (BeginProcess())

0 commit comments

Comments
 (0)