Author: gbayon
Date: Sun May 18 00:15:23 2008
New Revision: 657499

URL: http://svn.apache.org/viewvc?rev=657499&view=rev
Log:
fix IBATISNET-262

Modified:
    ibatis/trunk/cs/V2/src/Apache.Ibatis.DataMapper/DataMapper.cs

Modified: ibatis/trunk/cs/V2/src/Apache.Ibatis.DataMapper/DataMapper.cs
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/cs/V2/src/Apache.Ibatis.DataMapper/DataMapper.cs?rev=657499&r1=657498&r2=657499&view=diff
==============================================================================
--- ibatis/trunk/cs/V2/src/Apache.Ibatis.DataMapper/DataMapper.cs (original)
+++ ibatis/trunk/cs/V2/src/Apache.Ibatis.DataMapper/DataMapper.cs Sun May 18 
00:15:23 2008
@@ -61,7 +61,6 @@
 
         #region IDataMapper Members
 
-
         /// <summary>
         /// Executes a Sql INSERT statement.
         /// Insert is a bit different from other update methods, as it
@@ -81,30 +80,11 @@
         /// </returns>
         public object Insert(string statementId, object parameterObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            object generatedKey = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                generatedKey = statement.ExecuteInsert(session, 
parameterObject);
+                return statement.ExecuteInsert(sessionScope.Session, 
parameterObject);
             }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
-            }
-
-            return generatedKey;
         }
 
         /// <summary>
@@ -151,35 +131,15 @@
         /// <param name="resultObject">An Ilist object used to hold the 
objects.</param>
         public void QueryForList(string statementId, object parameterObject, 
IList resultObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-
             if (resultObject == null)
             {
                 throw new DataMapperException("resultObject parameter must be 
instantiated before being passed to SqlMapper.QueryForList");
             }
 
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                statement.ExecuteQueryForList(session, parameterObject, 
resultObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                statement.ExecuteQueryForList(sessionScope.Session, 
parameterObject, resultObject);
             }
         }
 
@@ -195,30 +155,11 @@
         /// <returns>A List of result objects.</returns>
         public IList QueryForList(string statementId, object parameterObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IList list;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                list = statement.ExecuteQueryForList(session, parameterObject);
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return statement.ExecuteQueryForList(sessionScope.Session, 
parameterObject);
             }
-
-            return list;
         }
 
         /// <summary>
@@ -234,34 +175,11 @@
         /// <returns>A List of result objects.</returns>
         public IList QueryForList(string statementId, object parameterObject, 
int skipResults, int maxResults)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IList list;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                list = statement.ExecuteQueryForList(session, parameterObject, 
skipResults, maxResults);
-            }
-            catch
-            {
-                throw;
+                return statement.ExecuteQueryForList(sessionScope.Session, 
parameterObject, skipResults, maxResults);
             }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
-            }
-
-            return list;
         }
 
         /// <summary>
@@ -294,34 +212,11 @@
         /// <exception cref="DataMapperException">If a transaction is not in 
progress, or the database throws an exception.</exception>
         public IDictionary QueryForMap(string statementId, object 
parameterObject, string keyProperty, string valueProperty)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IDictionary map = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                map = statement.ExecuteQueryForMap(session, parameterObject, 
keyProperty, valueProperty);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return statement.ExecuteQueryForMap(sessionScope.Session, 
parameterObject, keyProperty, valueProperty);
             }
-
-            return map;
         }
 
         /// <summary>
@@ -342,34 +237,11 @@
         /// <exception cref="DataMapperException">If a transaction is not in 
progress, or the database throws an exception.</exception>
         public IDictionary QueryForMapWithRowDelegate(string statementId, 
object parameterObject, string keyProperty, string valueProperty, 
DictionaryRowDelegate rowDelegate)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IDictionary map = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                map = statement.ExecuteQueryForMapWithRowDelegate(session, 
parameterObject, keyProperty, valueProperty, rowDelegate);
+                return 
statement.ExecuteQueryForMapWithRowDelegate(sessionScope.Session, 
parameterObject, keyProperty, valueProperty, rowDelegate);
             }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
-            }
-
-            return map;
         }
 
         /// <summary>
@@ -384,34 +256,11 @@
         /// </returns>
         public object QueryForObject(string statementId, object 
parameterObject, object resultObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            object result = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                result = statement.ExecuteQueryForObject(session, 
parameterObject, resultObject);
-            }
-            catch
-            {
-                throw;
+                return statement.ExecuteQueryForObject(sessionScope.Session, 
parameterObject, resultObject);
             }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
-            }
-
-            return result;
         }
 
         /// <summary>
@@ -428,34 +277,11 @@
         /// </returns>
         public object QueryForObject(string statementId, object 
parameterObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            object result;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                result = statement.ExecuteQueryForObject(session, 
parameterObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return statement.ExecuteQueryForObject(sessionScope.Session, 
parameterObject);
             }
-
-            return result;
         }
 
         /// <summary>
@@ -471,34 +297,11 @@
         /// <returns>A List of result objects.</returns>
         public IList QueryWithRowDelegate(string statementId, object 
parameterObject, RowDelegate rowDelegate)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IList list = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                list = statement.ExecuteQueryForRowDelegate(session, 
parameterObject, rowDelegate);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return 
statement.ExecuteQueryForRowDelegate(sessionScope.Session, parameterObject, 
rowDelegate);
             }
-
-            return list;
         }
 
         /// <summary>
@@ -515,34 +318,11 @@
         /// <returns>The number of rows effected.</returns>
         public int Update(string statementId, object parameterObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            int rows = 0; // the number of rows affected
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                rows = statement.ExecuteUpdate(session, parameterObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return statement.ExecuteUpdate(sessionScope.Session, 
parameterObject);
             }
-
-            return rows;
         }
 
         /// <summary>
@@ -562,34 +342,11 @@
         /// <exception cref="DataMapperException">If a transaction is not in 
progress, or the database throws an exception.</exception>
         public IDictionary<K, V> QueryForDictionary<K, V>(string statementId, 
object parameterObject, string keyProperty, string valueProperty)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IDictionary<K, V> map = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                map = statement.ExecuteQueryForDictionary<K, V>(session, 
parameterObject, keyProperty, valueProperty);
+                return statement.ExecuteQueryForDictionary<K, 
V>(sessionScope.Session, parameterObject, keyProperty, valueProperty);
             }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
-            }
-
-            return map;
         }
 
         /// <summary>
@@ -629,34 +386,11 @@
         /// <exception cref="DataMapperException">If a transaction is not in 
progress, or the database throws an exception.</exception>
         public IDictionary<K, V> QueryForDictionary<K, V>(string statementId, 
object parameterObject, string keyProperty, string valueProperty, 
DictionaryRowDelegate<K, V> rowDelegate)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IDictionary<K, V> map = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                map = statement.ExecuteQueryForDictionary<K, V>(session, 
parameterObject, keyProperty, valueProperty, rowDelegate);
-            }
-            catch
-            {
-                throw;
+                return 
statement.ExecuteQueryForDictionary(sessionScope.Session, parameterObject, 
keyProperty, valueProperty, rowDelegate);
             }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
-            }
-
-            return map;
         }
 
         /// <summary>
@@ -672,34 +406,11 @@
         /// </returns>
         public T QueryForObject<T>(string statementId, object parameterObject, 
T instanceObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            T result = default(T);
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                result = statement.ExecuteQueryForObject<T>(session, 
parameterObject, instanceObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return statement.ExecuteQueryForObject(sessionScope.Session, 
parameterObject, instanceObject);
             }
-
-            return result;
         }
 
         /// <summary>
@@ -717,34 +428,11 @@
         /// </returns>
         public T QueryForObject<T>(string statementId, object parameterObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            T result;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                result = statement.ExecuteQueryForObject<T>(session, 
parameterObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return 
statement.ExecuteQueryForObject<T>(sessionScope.Session, parameterObject);
             }
-
-            return result;
         }
 
         /// <summary>
@@ -760,34 +448,11 @@
         /// <returns>A List of result objects.</returns>
         public IList<T> QueryForList<T>(string statementId, object 
parameterObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IList<T> list;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                list = statement.ExecuteQueryForList<T>(session, 
parameterObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return statement.ExecuteQueryForList<T>(sessionScope.Session, 
parameterObject);
             }
-
-            return list;
         }
 
         /// <summary>
@@ -803,35 +468,15 @@
         /// <param name="resultObject">An Ilist object used to hold the 
objects.</param>
         public void QueryForList<T>(string statementId, object 
parameterObject, IList<T> resultObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-
             if (resultObject == null)
             {
                 throw new DataMapperException("resultObject parameter must be 
instantiated before being passed to SqlMapper.QueryForList");
             }
 
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                statement.ExecuteQueryForList(session, parameterObject, 
resultObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                statement.ExecuteQueryForList(sessionScope.Session, 
parameterObject, resultObject);
             }
         }
 
@@ -849,34 +494,11 @@
         /// <returns>A List of result objects.</returns>
         public IList<T> QueryForList<T>(string statementId, object 
parameterObject, int skipResults, int maxResults)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IList<T> list;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                list = statement.ExecuteQueryForList<T>(session, 
parameterObject, skipResults, maxResults);
-            }
-            catch
-            {
-                throw;
+                return statement.ExecuteQueryForList<T>(sessionScope.Session, 
parameterObject, skipResults, maxResults);
             }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
-            }
-
-            return list;
         }
 
         /// <summary>
@@ -893,30 +515,11 @@
         /// <returns>A List of result objects.</returns>
         public IList<T> QueryWithRowDelegate<T>(string statementId, object 
parameterObject, RowDelegate<T> rowDelegate)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            IList<T> list = null;
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                list = statement.ExecuteQueryForRowDelegate<T>(session, 
parameterObject, rowDelegate);
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return 
statement.ExecuteQueryForRowDelegate(sessionScope.Session, parameterObject, 
rowDelegate);
             }
-
-            return list;
         }
 
         /// <summary>
@@ -928,34 +531,11 @@
         /// <returns>The number of rows effected.</returns>
         public int Delete(string statementId, object parameterObject)
         {
-            bool isSessionLocal = false;
-            ISession session = sessionStore.CurrentSession;
-            int rows = 0; // the number of rows affected
-
-            if (session == null)
-            {
-                session = sessionFactory.OpenSession();
-                isSessionLocal = true;
-            }
-
-            try
+            using (DataMapperLocalSessionScope sessionScope = new 
DataMapperLocalSessionScope(sessionStore, sessionFactory))
             {
                 IMappedStatement statement = 
modelStore.GetMappedStatement(statementId);
-                rows = statement.ExecuteUpdate(session, parameterObject);
-            }
-            catch
-            {
-                throw;
-            }
-            finally
-            {
-                if (isSessionLocal)
-                {
-                    session.Close();
-                }
+                return statement.ExecuteUpdate(sessionScope.Session, 
parameterObject);
             }
-
-            return rows;
         }
 
         #endregion
@@ -972,5 +552,52 @@
         }
 
         #endregion
+
+        /// <summary>
+        /// Local SessionScope management
+        /// </summary>
+        private class DataMapperLocalSessionScope : IDisposable
+        {
+            private readonly bool isSessionLocal = false;
+            private readonly ISessionStore sessionStore =null;
+            private readonly ISession session = null;
+
+            /// <summary>
+            /// Initializes a new instance of the <see 
cref="DataMapperLocalSessionScope"/> class.
+            /// </summary>
+            /// <param name="sessionStore">The session store.</param>
+            /// <param name="sessionFactory">The session factory.</param>
+            public DataMapperLocalSessionScope(ISessionStore sessionStore, 
ISessionFactory sessionFactory)
+            {
+                isSessionLocal = false;
+                session = sessionStore.CurrentSession;
+
+                if (session == null)
+                {
+                    session = sessionFactory.OpenSession();
+                    isSessionLocal = true;
+                }
+            }
+
+            /// <summary>
+            /// Gets the session.
+            /// </summary>
+            /// <value>The session.</value>
+            public ISession Session
+            {
+                get { return session; }
+            }
+
+            /// <summary>
+            /// Performs application-defined tasks associated with freeing, 
releasing, or resetting unmanaged resources.
+            /// </summary>
+            public void Dispose()
+            {
+                if (isSessionLocal)
+                {
+                    session.Close();
+                }
+            }
+        }
     }
 }


Reply via email to