You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by gb...@apache.org on 2006/10/10 20:57:37 UTC

svn commit: r462499 - in /ibatis/trunk/cs/mapper: ./ IBatisNet.DataAccess/ IBatisNet.DataAccess/Configuration/ IBatisNet.DataAccess/SessionStore/ IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ IBatisNet.DataMapper/ IBatisNet.DataMapper/MappedStatements/ ...

Author: gbayon
Date: Tue Oct 10 11:57:36 2006
New Revision: 462499

URL: http://svn.apache.org/viewvc?view=rev&rev=462499
Log:
Fixed IBATISNET-185 

Added:
    ibatis/trunk/cs/mapper/IBatisNet.2003.sln
      - copied unchanged from r454428, ibatis/trunk/cs/mapper/IBatisNet.sln
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs   (with props)
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs   (with props)
Removed:
    ibatis/trunk/cs/mapper/IBatisNet.sln
Modified:
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/DaoManager.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IDaoManager.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.20005.csproj
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.csproj
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ISqlMapper.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/MappedStatement.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/CallContextSessionStore.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/WebSessionStore.cs
    ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SqlMapper.cs

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs Tue Oct 10 11:57:36 2006
@@ -482,9 +482,9 @@
 
 				// name
 				attribute = contextNode.Attributes["id"];
-				daoManager.Name = attribute.Value;
+                daoManager.Id = attribute.Value;
 
-				configurationScope.ErrorContext.Activity += daoManager.Name;
+                configurationScope.ErrorContext.Activity += daoManager.Id;
 
 				// default
 				attribute = contextNode.Attributes["default"];
@@ -586,9 +586,9 @@
 				#region Register DaoManager
 
 				configurationScope.ErrorContext.MoreInfo = "register DaoManager";
-				configurationScope.ErrorContext.ObjectId = daoManager.Name;
+                configurationScope.ErrorContext.ObjectId = daoManager.Id;
 
-				DaoManager.RegisterDaoManager(daoManager.Name, daoManager);
+                DaoManager.RegisterDaoManager(daoManager.Id, daoManager);
 
 				configurationScope.ErrorContext.Resource = string.Empty;
 				configurationScope.ErrorContext.MoreInfo = string.Empty;

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/DaoManager.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/DaoManager.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/DaoManager.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/DaoManager.cs Tue Oct 10 11:57:36 2006
@@ -122,14 +122,28 @@
 		/// <summary>
 		/// Container session unique for each 'thread'. 
 		/// </summary>
-		private ISessionStore _sessionHolder = null;
+		private ISessionStore _sessionStore = null;
 		#endregion
 
 		#region Properties
 
-		/// <summary>
-		/// 
-		/// </summary>
+        /// <summary>
+        /// Allow to set a custom session store like the <see cref="HybridWebThreadSessionStore"/>
+        /// </summary>
+        /// <remarks>Set it after the configuration and before use of the <see cref="IDaoManager"/></remarks>
+        /// <example>
+        /// daoManager.SessionStore = new HybridWebThreadSessionStore( daoManager.Id );
+        /// </example>
+        public ISessionStore SessionStore
+        {
+            set { _sessionStore = value; }
+        }
+
+
+        /// <summary>
+        /// Gets or sets the data source.
+        /// </summary>
+        /// <value>The data source.</value>
 		internal IDataSource DataSource
 		{
 			get { return _dataSource; }
@@ -155,9 +169,9 @@
 		}
 
 		/// <summary>
-		/// DaoManger name
+		/// DaoManager name
 		/// </summary>
-		internal string Name
+		public string Id
 		{
 			get { return _name; }
 			set { _name = value; }
@@ -198,11 +212,11 @@
 		{
 			get 
 			{ 
-				if (_sessionHolder.LocalSession == null) 
+				if (_sessionStore.LocalSession == null) 
 				{
 					throw new DataAccessException("DaoManager could not invoke LocalDaoSession. No DaoSession was started. Call OpenConnection() or BeginTransaction first.");
 				}
-				return _sessionHolder.LocalSession;
+				return _sessionStore.LocalSession;
 			}
 		}
 
@@ -215,7 +229,7 @@
 		/// </summary>
 		private DaoManager() 
 		{
-            _sessionHolder = SessionStoreFactory.GetSessionStore(this.Name);
+            _sessionStore = SessionStoreFactory.GetSessionStore(this.Id);
 		}
 		#endregion
 
@@ -393,7 +407,7 @@
         /// </returns>
 		public bool IsDaoSessionStarted()
 		{
-			return (_sessionHolder.LocalSession != null);
+			return (_sessionStore.LocalSession != null);
 		}
 
 		/// <summary>
@@ -406,12 +420,12 @@
 			{
 				throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
 			}
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataAccessException("DaoManager could not invoke OpenConnection(). A connection is already started. Call CloseConnection first.");
 			}
 			IDalSession session = _daoSessionHandler.GetDaoSession(this);
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.OpenConnection();
 			return session;
 		}
@@ -426,12 +440,12 @@
 			{
 				throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
 			}
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataAccessException("DaoManager could not invoke OpenConnection(). A connection is already started. Call CloseConnection first.");
 			}
 			IDalSession session = _daoSessionHandler.GetDaoSession(this);
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.OpenConnection(connectionString);
 			return session;	
 
@@ -442,13 +456,13 @@
 		/// </summary>
 		public void CloseConnection()
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataAccessException("DaoManager could not invoke CloseConnection(). No connection was started. Call OpenConnection() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.CloseConnection();	
 			} 
 			catch(Exception ex)
@@ -457,7 +471,7 @@
 			}
 			finally 
 			{
-				_sessionHolder.Dispose();
+				_sessionStore.Dispose();
 			}
 		}
 
@@ -471,12 +485,12 @@
 			{
 				throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
 			}
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataAccessException("DaoManager could not invoke BeginTransaction(). A DaoSession is already started. Call CommitTransaction() or RollbackTransaction first.");
 			}
 			IDalSession session = _daoSessionHandler.GetDaoSession(this);
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.BeginTransaction();
 			return session;
 		}
@@ -494,13 +508,13 @@
 			{
 				throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
 			}
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataAccessException("DaoManager could not invoke BeginTransaction(). A DaoSession is already started. Call CommitTransaction() or RollbackTransaction first.");
 			}
 
 			IDalSession session = _daoSessionHandler.GetDaoSession(this);
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.BeginTransaction(isolationLevel);
 			return session;
 		}
@@ -513,18 +527,18 @@
 		/// </remarks>
 		public void CommitTransaction()
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataAccessException("DaoManager could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.CommitTransaction();
 			} 
 			finally 
 			{
-				_sessionHolder.Dispose();
+				_sessionStore.Dispose();
 			}
 		}
 
@@ -536,18 +550,18 @@
 		/// </remarks>
 		public void RollBackTransaction()
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataAccessException("DaoManager could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.RollBackTransaction();	
 			} 
 			finally 
 			{
-				_sessionHolder.Dispose();
+				_sessionStore.Dispose();
 			}
 		}
 
@@ -557,7 +571,7 @@
 		/// <remarks>Use in SqlMapDaoSession</remarks>
 		internal void Dispose()
 		{
-			_sessionHolder.Dispose();
+			_sessionStore.Dispose();
 		}
 
 		#endregion

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj Tue Oct 10 11:57:36 2006
@@ -150,6 +150,7 @@
     </Compile>
     <Compile Include="SessionStore\AbstractSessionStore.cs" />
     <Compile Include="SessionStore\CallContextSessionStore.cs" />
+    <Compile Include="SessionStore\HybridWebThreadSessionStore.cs" />
     <Compile Include="SessionStore\ISessionStore.cs" />
     <Compile Include="SessionStore\SessionStoreFactory .cs" />
     <Compile Include="SessionStore\WebSessionStore.cs" />

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj Tue Oct 10 11:57:36 2006
@@ -245,6 +245,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "SessionStore\HybridWebThreadSessionStore.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "SessionStore\ISessionStore.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IDaoManager.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IDaoManager.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IDaoManager.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/IDaoManager.cs Tue Oct 10 11:57:36 2006
@@ -28,6 +28,7 @@
 
 using IBatisNet.Common;
 using IBatisNet.DataAccess.Interfaces;
+using IBatisNet.DataAccess.SessionStore;
 
 namespace IBatisNet.DataAccess
 {
@@ -36,6 +37,20 @@
     /// </summary>
     public interface IDaoManager
     {
+        /// <summary>
+        /// Name used to identify the the <see cref="IDaoManager"/>
+        /// </summary>
+        string Id { get;set; }
+
+        /// <summary>
+        /// Allow to set a custom session store like the <see cref="HybridWebThreadSessionStore"/>
+        /// </summary>
+        /// <remarks>Set it after the configuration and before use of the <see cref="IDaoManager"/></remarks>
+        /// <example>
+        /// daoManager.SessionStore = new HybridWebThreadSessionStore( daoManager.Id );
+        /// </example>
+        ISessionStore SessionStore { set; }
+        
         /// <summary>
         /// Begins a database transaction with the specified isolation level.
         /// </summary>

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs Tue Oct 10 11:57:36 2006
@@ -42,10 +42,10 @@
 		/// <summary>
 		/// Constructor
 		/// </summary>
-		/// <param name="daoManagerName">The DaoManager name.</param>
-		public AbstractSessionStore(string daoManagerName)
+        /// <param name="daoManagerId">The DaoManager name.</param>
+        public AbstractSessionStore(string daoManagerId)
 		{
-            sessionName = KEY + daoManagerName;
+            sessionName = KEY + daoManagerId;
 		}
 
 		/// <summary>

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs Tue Oct 10 11:57:36 2006
@@ -31,14 +31,16 @@
 	/// <summary>
 	/// Provides an implementation of <see cref="ISessionStore"/>
 	/// which relies on <c>CallContext</c>
+    /// This implementation will first get the current session from the current 
+    /// thread. Do NOT use on web scenario (web applications or web services).
 	/// </summary>
 	public class CallContextSessionStore : AbstractSessionStore
 	{
         /// <summary>
         /// Initializes a new instance of the <see cref="CallContextSessionStore"/> class.
         /// </summary>
-        /// <param name="daoManagerName">The DaoManager name.</param>
-		public CallContextSessionStore(string daoManagerName) : base(daoManagerName)
+        /// <param name="daoManagerId">The DaoManager name.</param>
+        public CallContextSessionStore(string daoManagerId) : base(daoManagerId)
 		{}
 
 		/// <summary>

Added: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs?view=auto&rev=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs (added)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs Tue Oct 10 11:57:36 2006
@@ -0,0 +1,102 @@
+
+#region Apache Notice
+/*****************************************************************************
+ * $Header: $
+ * $Revision: 378715 $
+ * $Date$
+ * 
+ * iBATIS.NET Data Mapper
+ * Copyright (C) 2006 - Apache Fondation
+ *  
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ ********************************************************************************/
+#endregion
+
+using System.Runtime.Remoting.Messaging;
+using System.Web;
+using IBatisNet.Common;
+
+namespace IBatisNet.DataAccess.SessionStore
+{
+    /// <summary>
+    /// This implementation of <see cref="ISessionStore"/>will first try 
+    /// to get the currentrequest, and if not found, will use a thread local.
+    /// </summary>
+    /// <remarks>
+    /// This is used for scenarios where most of the you need per request session, but you also does some work outside a 
+    /// request (in a thread pool thread, for instance).
+    /// </remarks>
+    public class HybridWebThreadSessionStore : AbstractSessionStore
+    {
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="WebSessionStore"/> class.
+        /// </summary>
+        /// <param name="daoManagerId">The DaoManager name.</param>
+        public HybridWebThreadSessionStore(string daoManagerId) : base(daoManagerId)
+        { }
+
+        /// <summary>
+        /// Get the local session
+        /// </summary>
+        public override IDalSession LocalSession
+        {
+            get
+            {
+                HttpContext currentContext = HttpContext.Current;
+                if (currentContext == null)
+                {
+                    return CallContext.GetData(sessionName) as IDalSession;
+                }
+                return currentContext.Items[sessionName] as IDalSession;
+            }
+        }
+
+        /// <summary>
+        /// Store the specified session.
+        /// </summary>
+        /// <param name="session">The session to store</param>
+        public override void Store(IDalSession session)
+        {
+            HttpContext currentContext = HttpContext.Current;
+            if (currentContext == null)
+            {
+                CallContext.SetData(sessionName, session);
+            }
+            else
+            {
+                currentContext.Items[sessionName] = session;
+            }
+        }
+
+        /// <summary>
+        /// Remove the local session.
+        /// </summary>
+        public override void Dispose()
+        {
+            HttpContext currentContext = HttpContext.Current;
+            if (currentContext == null)
+            {
+                CallContext.SetData(sessionName, null);
+            }
+            else
+            {
+                currentContext.Items[sessionName] = null;
+            }
+        }
+
+
+    }
+}

Propchange: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs
------------------------------------------------------------------------------
    svn:keywords = Id LastChangedDate LastChangedBy

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs Tue Oct 10 11:57:36 2006
@@ -39,8 +39,8 @@
         /// <summary>
         /// Initializes a new instance of the <see cref="WebSessionStore"/> class.
         /// </summary>
-        /// <param name="daoManagerName">The DaoManager name.</param>
-		public WebSessionStore(string daoManagerName):base(daoManagerName)
+        /// <param name="daoManagerId">The DaoManager name.</param>
+        public WebSessionStore(string daoManagerId) : base(daoManagerId)
 		{}
 
 		/// <summary>

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs Tue Oct 10 11:57:36 2006
@@ -6,6 +6,8 @@
 using IBatisNet.Common.Utilities;
 using IBatisNet.DataMapper; // SqlMap API
 using IBatisNet.DataMapper.Configuration;
+using IBatisNet.DataMapper.SessionStore;
+using IBatisNet.DataMapper.Test.Domain;
 using NUnit.Framework;
 using System.Collections.Specialized;
 
@@ -35,6 +37,19 @@
 
         }
 		#endregion 
+	    
+	    /// <summary>
+        /// Test HybridWebThreadSessionStore
+        /// </summary>
+        [Test]
+        public void HybridWebThreadSessionStoreTest()
+	    {
+            sqlMap.SessionStore = new HybridWebThreadSessionStore(sqlMap.Id);
+	        
+            Account account = sqlMap.QueryForObject("SelectWithProperty", null) as Account;
+            AssertAccount1(account);
+	    }
+	    
 
 		#region Relatives Path tests
 

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs Tue Oct 10 11:57:36 2006
@@ -164,12 +164,10 @@
 		}
 
         /// <summary>
-        /// Test resultMap with a result property using another resultMap and where
-        /// - the result property resultMap use a constructor
-        /// - all the constructor arguments are null.
+        /// Test a constructor argument with select tag.
         /// </remarks>
         [Test]
-        public void TestJIRAXXX()
+        public void TestJIRA186()
         {
             Order order = sqlMap.QueryForObject("GetOrderConstructor10", 5) as Order;
 

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ChangeLog.txt Tue Oct 10 11:57:36 2006
@@ -8,6 +8,7 @@
  - IBATISNET-184 : Invalid support for public/protected field in result property
 
 Improvements/Changes
+- IBATISNET-185  : Allow custom ISessionStore
 - IBATISNET-180 : Extends use of ISqlMapper in DataMapper + allow use of a custom ISqlMapper
 
 ------------------------------

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.20005.csproj
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.20005.csproj?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.20005.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.20005.csproj Tue Oct 10 11:57:36 2006
@@ -548,6 +548,7 @@
     </Compile>
     <Compile Include="SessionStore\AbstractSessionStore.cs" />
     <Compile Include="SessionStore\CallContextSessionStore.cs" />
+    <Compile Include="SessionStore\HybridWebThreadSessionStore.cs" />
     <Compile Include="SessionStore\ISessionStore.cs" />
     <Compile Include="SessionStore\SessionStoreFactory .cs" />
     <Compile Include="SessionStore\WebSessionStore.cs" />

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.csproj
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.csproj?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.csproj (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/IBatisNet.DataMapper.csproj Tue Oct 10 11:57:36 2006
@@ -1103,6 +1103,11 @@
                     BuildAction = "Compile"
                 />
                 <File
+                    RelPath = "SessionStore\HybridWebThreadSessionStore.cs"
+                    SubType = "Code"
+                    BuildAction = "Compile"
+                />
+                <File
                     RelPath = "SessionStore\ISessionStore.cs"
                     SubType = "Code"
                     BuildAction = "Compile"

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ISqlMapper.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ISqlMapper.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ISqlMapper.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/ISqlMapper.cs Tue Oct 10 11:57:36 2006
@@ -39,6 +39,7 @@
 using IBatisNet.DataMapper.DataExchange;
 using IBatisNet.DataMapper.Exceptions;
 using IBatisNet.DataMapper.MappedStatements;
+using IBatisNet.DataMapper.SessionStore;
 using IBatisNet.DataMapper.TypeHandlers;
 
 namespace IBatisNet.DataMapper
@@ -49,6 +50,20 @@
     public interface ISqlMapper
     {
 
+        /// <summary>
+        /// Name used to identify the the <see cref="SqlMapper"/>
+        /// </summary>
+        string Id { get; }
+        
+         /// <summary>
+        /// Allow to set a custom session store like the <see cref="HybridWebThreadSessionStore"/>
+        /// </summary>
+        /// <remarks>Set it after the configuration and before use of the <see cref="SqlMapper"/></remarks>
+        /// <example>
+        /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id );
+        /// </example>
+        ISessionStore SessionStore { set; }
+        
         /// <summary>
         /// Gets a value indicating whether this instance is session started.
         /// </summary>

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/MappedStatement.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/MappedStatement.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/MappedStatement.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/MappedStatements/MappedStatement.cs Tue Oct 10 11:57:36 2006
@@ -550,13 +550,17 @@
 			{
 				IDataReader reader = command.ExecuteReader();
                 try 
-                {			
-					while ( reader.Read() )
-					{
-                        object obj = _resultStrategy.Process(request, ref reader, null);
-				
-						resultObject.Add( obj );
-					}
+                {
+                    do
+                    {
+                        while (reader.Read())
+                        {
+                            object obj = _resultStrategy.Process(request, ref reader, null);
+
+                            resultObject.Add(obj);
+                        }
+                    }
+                    while (reader.NextResult());
 			    }
                 catch
                 {

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/CallContextSessionStore.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/CallContextSessionStore.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/CallContextSessionStore.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/CallContextSessionStore.cs Tue Oct 10 11:57:36 2006
@@ -30,7 +30,9 @@
 {
 	/// <summary>
 	/// Provides an implementation of <see cref="ISessionStore"/>
-	/// which relies on <c>CallContext</c>
+	/// which relies on <c>CallContext</c>.
+    /// This implementation will first get the current session from the current 
+    /// thread. Do NOT use on web scenario (web applications or web services).
 	/// </summary>
 	public class CallContextSessionStore : AbstractSessionStore
 	{

Added: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs?view=auto&rev=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs (added)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs Tue Oct 10 11:57:36 2006
@@ -0,0 +1,103 @@
+using System;
+#region Apache Notice
+/*****************************************************************************
+ * $Header: $
+ * $Revision: 378715 $
+ * $Date$
+ * 
+ * iBATIS.NET Data Mapper
+ * Copyright (C) 2006 - Apache Fondation
+ *  
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ ********************************************************************************/
+#endregion
+
+using System.Runtime.Remoting.Messaging;
+using System.Web;
+using IBatisNet.Common;
+using IBatisNet.Common.Exceptions;
+
+namespace IBatisNet.DataMapper.SessionStore
+{
+    /// <summary>
+    /// This implementation of <see cref="ISessionStore"/>will first try 
+    /// to get the currentrequest, and if not found, will use a thread local.
+    /// </summary>
+    /// <remarks>
+    /// This is used for scenarios where most of the you need per request session, but you also does some work outside a 
+    /// request (in a thread pool thread, for instance).
+    /// </remarks>
+    public class HybridWebThreadSessionStore : AbstractSessionStore
+	{
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="WebSessionStore"/> class.
+        /// </summary>
+        /// <param name="sqlMapperId">The SQL mapper id.</param>
+        public HybridWebThreadSessionStore(string sqlMapperId): base(sqlMapperId)
+		{}
+
+		/// <summary>
+		/// Get the local session
+		/// </summary>
+        public override IDalSession LocalSession
+		{
+			get
+			{
+                HttpContext currentContext = HttpContext.Current;
+                if (currentContext == null)
+                {
+                    return CallContext.GetData(sessionName) as IDalSession; 
+                }
+                return currentContext.Items[sessionName] as IDalSession;
+			}
+		}
+
+		/// <summary>
+		/// Store the specified session.
+		/// </summary>
+		/// <param name="session">The session to store</param>
+        public override void Store(IDalSession session)
+		{
+            HttpContext currentContext = HttpContext.Current;
+            if (currentContext == null)
+            {
+                CallContext.SetData(sessionName, session);
+            }
+		    else
+            {
+                currentContext.Items[sessionName] = session;
+            }
+		}
+
+		/// <summary>
+		/// Remove the local session.
+		/// </summary>
+		public override void Dispose()
+		{
+            HttpContext currentContext = HttpContext.Current;
+            if (currentContext == null)
+            {
+                CallContext.SetData(sessionName, null);
+            }
+		    else
+            {
+ 			    currentContext.Items[sessionName] = null;
+            }
+		}
+
+
+	}
+}

Propchange: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs
------------------------------------------------------------------------------
    svn:keywords = Id LastChangedDate LastChangedBy

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/WebSessionStore.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/WebSessionStore.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/WebSessionStore.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SessionStore/WebSessionStore.cs Tue Oct 10 11:57:36 2006
@@ -33,6 +33,8 @@
 	/// <summary>
 	/// Provides an implementation of <see cref="ISessionStore"/>
 	/// which relies on <c>HttpContext</c>. Suitable for web projects.
+    /// This implementation will get the current session from the current 
+    /// request.
 	/// </summary>
 	public class WebSessionStore : AbstractSessionStore
 	{

Modified: ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SqlMapper.cs
URL: http://svn.apache.org/viewvc/ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SqlMapper.cs?view=diff&rev=462499&r1=462498&r2=462499
==============================================================================
--- ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SqlMapper.cs (original)
+++ ibatis/trunk/cs/mapper/IBatisNet.DataMapper/SqlMapper.cs Tue Oct 10 11:57:36 2006
@@ -79,7 +79,7 @@
 		/// <summary>
 		/// Container session unique for each thread. 
 		/// </summary>
-        private ISessionStore _sessionHolder = null;
+        private ISessionStore _sessionStore = null;
         private IObjectFactory _objectFactory = null;
         private AccessorFactory _accessorFactory = null;
         private DataExchangeFactory _dataExchangeFactory = null;
@@ -87,13 +87,33 @@
 
 		#region Properties
 
+        /// <summary>
+        /// Name used to identify the the <see cref="SqlMapper"/>
+        /// </summary>
+        public string Id
+        {
+            get { return _id; }
+        }
+	    
+        /// <summary>
+        /// Allow to set a custom session store like the <see cref="HybridWebThreadSessionStore"/>
+        /// </summary>
+        /// <remarks>Set it after the configuration and before use of the <see cref="SqlMapper"/></remarks>
+        /// <example>
+        /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id );
+        /// </example>
+        public ISessionStore SessionStore
+        {
+            set { _sessionStore = value; }
+        }
+	    
 		/// <summary>
 		///  Returns the DalSession instance 
 		///  currently being used by the SqlMap.
 		/// </summary>
 		public IDalSession LocalSession
 		{
-			get { return _sessionHolder.LocalSession; }
+			get { return _sessionStore.LocalSession; }
 		}
 
         /// <summary>
@@ -104,7 +124,7 @@
         /// </value>
 		public bool IsSessionStarted
 		{
-			get { return (_sessionHolder.LocalSession != null); }
+			get { return (_sessionStore.LocalSession != null); }
 		}
 
 		/// <summary>
@@ -168,7 +188,7 @@
 
             _dataExchangeFactory = new DataExchangeFactory(_typeHandlerFactory, _objectFactory, accessorFactory);
 			_id = HashCodeProvider.GetIdentityHashCode(this).ToString();
-            _sessionHolder = SessionStoreFactory.GetSessionStore(_id);
+            _sessionStore = SessionStoreFactory.GetSessionStore(_id);
 		}
 		#endregion
 
@@ -285,12 +305,12 @@
 		/// <returns></returns>
 		public IDalSession OpenConnection() 
 		{
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first.");
 			}
             IDalSession session = CreateSqlMapSession();
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.OpenConnection();
 			return session;
 		}
@@ -301,12 +321,12 @@
 		/// <param name="connectionString">The connection string</param>
 		public IDalSession OpenConnection(string connectionString)
 		{
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first.");
 			}
             IDalSession session = CreateSqlMapSession();
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.OpenConnection(connectionString);
 			return session;
 		}
@@ -316,13 +336,13 @@
 		/// </summary>
 		public void CloseConnection()
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke CloseConnection(). No connection was started. Call OpenConnection() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.CloseConnection();			
 			} 
 			catch(Exception ex)
@@ -331,7 +351,7 @@
 			}
 			finally 
 			{
-				_sessionHolder.Dispose();
+				_sessionStore.Dispose();
 			}
 		}
 
@@ -341,12 +361,12 @@
 		/// </summary>
 		public IDalSession BeginTransaction() 
 		{
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first.");
 			}
             IDalSession session = CreateSqlMapSession();
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.BeginTransaction();
 			return session ;
 		}
@@ -357,12 +377,12 @@
 		/// <param name="connectionString">The connection string</param>
 		public IDalSession BeginTransaction(string connectionString)
 		{
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first.");
 			}
             IDalSession session = CreateSqlMapSession();
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.BeginTransaction( connectionString );
 			return session ;
 		}
@@ -381,7 +401,7 @@
 			}
 			else
 			{
-				session = _sessionHolder.LocalSession;
+				session = _sessionStore.LocalSession;
 				if (session == null) 
 				{
 					throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first.");
@@ -400,12 +420,12 @@
 		/// </param>
 		public IDalSession BeginTransaction(IsolationLevel isolationLevel)
 		{
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first.");
 			}
             IDalSession session = CreateSqlMapSession();
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.BeginTransaction(isolationLevel);
 			return session;
 		}
@@ -417,12 +437,12 @@
 		/// <param name="isolationLevel">The transaction isolation level for this connection.</param>
 		public IDalSession BeginTransaction(string connectionString, IsolationLevel isolationLevel)
 		{
-			if (_sessionHolder.LocalSession != null) 
+			if (_sessionStore.LocalSession != null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first.");
 			}
             IDalSession session = CreateSqlMapSession();
-			_sessionHolder.Store(session);
+			_sessionStore.Store(session);
 			session.BeginTransaction( connectionString, isolationLevel);
 			return session;
 		}
@@ -445,7 +465,7 @@
 			}
 			else
 			{
-				session = _sessionHolder.LocalSession;
+				session = _sessionStore.LocalSession;
 				if (session == null) 
 				{
 					throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first.");
@@ -472,7 +492,7 @@
 			}
 			else
 			{
-				session = _sessionHolder.LocalSession;
+				session = _sessionStore.LocalSession;
 				if (session == null) 
 				{
 					throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first.");
@@ -490,18 +510,18 @@
 		/// </remarks>
 		public void CommitTransaction()
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.CommitTransaction();
 			} 
 			finally 
 			{
-				_sessionHolder.Dispose();
+				_sessionStore.Dispose();
 			}
 		}
 
@@ -511,20 +531,20 @@
 		/// <param name="closeConnection">Close the connection</param>
 		public void CommitTransaction(bool closeConnection)
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.CommitTransaction(closeConnection);
 			} 
 			finally 
 			{
 				if (closeConnection)
 				{
-					_sessionHolder.Dispose();
+					_sessionStore.Dispose();
 				}
 			}
 		}
@@ -537,18 +557,18 @@
 		/// </remarks>
 		public void RollBackTransaction()
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.RollBackTransaction();			
 			} 
 			finally 
 			{
-				_sessionHolder.Dispose();
+				_sessionStore.Dispose();
 			}
 		}
 
@@ -558,20 +578,20 @@
 		/// <param name="closeConnection">Close the connection</param>
 		public void RollBackTransaction(bool closeConnection)
 		{
-			if (_sessionHolder.LocalSession == null) 
+			if (_sessionStore.LocalSession == null) 
 			{
 				throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first.");
 			}
 			try
 			{
-				IDalSession session = _sessionHolder.LocalSession;
+				IDalSession session = _sessionStore.LocalSession;
 				session.RollBackTransaction(closeConnection);			
 			} 
 			finally 
 			{
 				if (closeConnection)
 				{
-					_sessionHolder.Dispose();
+					_sessionStore.Dispose();
 				}
 			}
 		}
@@ -593,7 +613,7 @@
 		public object QueryForObject(string statementName, object parameterObject)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			object result;
  
 			if (session == null) 
@@ -634,7 +654,7 @@
 		public object QueryForObject(string statementName, object parameterObject, object resultObject)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			object result = null;
  
 			if (session == null) 
@@ -681,7 +701,7 @@
         public T QueryForObject<T>(string statementName, object parameterObject)
         {
             bool isSessionLocal = false;
-            IDalSession session = _sessionHolder.LocalSession;
+            IDalSession session = _sessionStore.LocalSession;
             T result;
 
             if (session == null)
@@ -722,7 +742,7 @@
         public T QueryForObject<T>(string statementName, object parameterObject, T instanceObject)
         {
             bool isSessionLocal = false;
-            IDalSession session = _sessionHolder.LocalSession;
+            IDalSession session = _sessionStore.LocalSession;
             T result = default(T);
 
             if (session == null)
@@ -811,7 +831,7 @@
 		public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			IDictionary map = null;
  
 			if (session == null) 
@@ -858,7 +878,7 @@
 		public IList QueryForList(string statementName, object parameterObject)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			IList list;
  
 			if (session == null) 
@@ -902,7 +922,7 @@
 		public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults)	
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			IList list;
  
 			if (session == null) 
@@ -947,7 +967,7 @@
 		public void QueryForList(string statementName, object parameterObject, IList resultObject)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
  
 			if (resultObject == null)
 			{
@@ -996,7 +1016,7 @@
         public IList<T> QueryForList<T>(string statementName, object parameterObject)
         {
             bool isSessionLocal = false;
-            IDalSession session = _sessionHolder.LocalSession;
+            IDalSession session = _sessionStore.LocalSession;
             IList<T> list;
 
             if (session == null)
@@ -1040,7 +1060,7 @@
         public IList<T> QueryForList<T>(string statementName, object parameterObject, int skipResults, int maxResults)
         {
             bool isSessionLocal = false;
-            IDalSession session = _sessionHolder.LocalSession;
+            IDalSession session = _sessionStore.LocalSession;
             IList<T> list;
 
             if (session == null)
@@ -1084,7 +1104,7 @@
         public void QueryForList<T>(string statementName, object parameterObject, IList<T> resultObject)
         {
             bool isSessionLocal = false;
-            IDalSession session = _sessionHolder.LocalSession;
+            IDalSession session = _sessionStore.LocalSession;
 
             if (resultObject == null)
             {
@@ -1150,7 +1170,7 @@
 		public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			IList list = null;
  
 			if (session == null) 
@@ -1195,7 +1215,7 @@
         public IList<T> QueryWithRowDelegate<T>(string statementName, object parameterObject, RowDelegate<T> rowDelegate)
         {
             bool isSessionLocal = false;
-            IDalSession session = _sessionHolder.LocalSession;
+            IDalSession session = _sessionStore.LocalSession;
             IList<T> list = null;
 
             if (session == null)
@@ -1243,7 +1263,7 @@
 		public IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			IDictionary map = null;
  
 			if (session == null) 
@@ -1296,7 +1316,7 @@
 		public object Insert(string statementName, object parameterObject)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			object generatedKey = null;
  
 			if (session == null) 
@@ -1341,7 +1361,7 @@
 		public int Update(string statementName, object parameterObject)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			int rows = 0; // the number of rows affected
 
 			if (session == null) 
@@ -1381,7 +1401,7 @@
 		public int Delete(string statementName, object parameterObject)
 		{
 			bool isSessionLocal = false;
-			IDalSession session = _sessionHolder.LocalSession;
+			IDalSession session = _sessionStore.LocalSession;
 			int rows = 0; // the number of rows affected
 
 			if (session == null)