Index: DataMapper.cs =================================================================== --- DataMapper.cs (revision 657385) +++ DataMapper.cs (working copy) @@ -61,7 +61,6 @@ #region IDataMapper Members - /// /// Executes a Sql INSERT statement. /// Insert is a bit different from other update methods, as it @@ -81,30 +80,11 @@ /// public object Insert(string statementId, object parameterObject) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - object generatedKey = null; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - generatedKey = statement.ExecuteInsert(session, parameterObject); + return statement.ExecuteInsert(sessionScope.Session, parameterObject); } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return generatedKey; } /// @@ -151,36 +131,16 @@ /// An Ilist object used to hold the objects. 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) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - statement.ExecuteQueryForList(session, parameterObject, resultObject); + statement.ExecuteQueryForList(sessionScope.Session, parameterObject, resultObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } } /// @@ -195,30 +155,11 @@ /// A List of result objects. public IList QueryForList(string statementId, object parameterObject) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IList list; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - list = statement.ExecuteQueryForList(session, parameterObject); + return statement.ExecuteQueryForList(sessionScope.Session, parameterObject); } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return list; } /// @@ -234,34 +175,11 @@ /// A List of result objects. public IList QueryForList(string statementId, object parameterObject, int skipResults, int maxResults) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IList list; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + return statement.ExecuteQueryForList(sessionScope.Session, parameterObject, skipResults, maxResults); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return list; } /// @@ -294,34 +212,11 @@ /// If a transaction is not in progress, or the database throws an 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) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - map = statement.ExecuteQueryForMap(session, parameterObject, keyProperty, valueProperty); + return statement.ExecuteQueryForMap(sessionScope.Session, parameterObject, keyProperty, valueProperty); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return map; } /// @@ -342,34 +237,11 @@ /// If a transaction is not in progress, or the database throws an 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) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { 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; } /// @@ -384,34 +256,11 @@ /// public object QueryForObject(string statementId, object parameterObject, object resultObject) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - object result = null; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - result = statement.ExecuteQueryForObject(session, parameterObject, resultObject); + return statement.ExecuteQueryForObject(sessionScope.Session, parameterObject, resultObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return result; } /// @@ -428,34 +277,11 @@ /// public object QueryForObject(string statementId, object parameterObject) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - object result; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - result = statement.ExecuteQueryForObject(session, parameterObject); + return statement.ExecuteQueryForObject(sessionScope.Session, parameterObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return result; } /// @@ -471,34 +297,11 @@ /// A List of result objects. public IList QueryWithRowDelegate(string statementId, object parameterObject, RowDelegate rowDelegate) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IList list = null; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + return statement.ExecuteQueryForRowDelegate(sessionScope.Session, parameterObject, rowDelegate); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return list; } /// @@ -515,34 +318,11 @@ /// The number of rows effected. 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) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - rows = statement.ExecuteUpdate(session, parameterObject); + return statement.ExecuteUpdate(sessionScope.Session, parameterObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return rows; } /// @@ -562,34 +342,11 @@ /// If a transaction is not in progress, or the database throws an exception. public IDictionary QueryForDictionary(string statementId, object parameterObject, string keyProperty, string valueProperty) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IDictionary map = null; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty); + return statement.ExecuteQueryForDictionary(sessionScope.Session, parameterObject, keyProperty, valueProperty); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return map; } /// @@ -629,34 +386,11 @@ /// If a transaction is not in progress, or the database throws an exception. public IDictionary QueryForDictionary(string statementId, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IDictionary map = null; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty, rowDelegate); + return statement.ExecuteQueryForDictionary(sessionScope.Session, parameterObject, keyProperty, valueProperty, rowDelegate); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return map; } /// @@ -672,34 +406,11 @@ /// public T QueryForObject(string statementId, object parameterObject, T instanceObject) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - T result = default(T); - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - result = statement.ExecuteQueryForObject(session, parameterObject, instanceObject); + return statement.ExecuteQueryForObject(sessionScope.Session, parameterObject, instanceObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return result; } /// @@ -717,34 +428,11 @@ /// public T QueryForObject(string statementId, object parameterObject) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - T result; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - result = statement.ExecuteQueryForObject(session, parameterObject); + return statement.ExecuteQueryForObject(sessionScope.Session, parameterObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return result; } /// @@ -760,34 +448,11 @@ /// A List of result objects. public IList QueryForList(string statementId, object parameterObject) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IList list; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - list = statement.ExecuteQueryForList(session, parameterObject); + return statement.ExecuteQueryForList(sessionScope.Session, parameterObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return list; } /// @@ -803,36 +468,16 @@ /// An Ilist object used to hold the objects. 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) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - statement.ExecuteQueryForList(session, parameterObject, resultObject); + statement.ExecuteQueryForList(sessionScope.Session, parameterObject, resultObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } } /// @@ -849,34 +494,11 @@ /// A List of result objects. public IList QueryForList(string statementId, object parameterObject, int skipResults, int maxResults) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IList list; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + return statement.ExecuteQueryForList(sessionScope.Session, parameterObject, skipResults, maxResults); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return list; } /// @@ -893,30 +515,11 @@ /// A List of result objects. public IList QueryWithRowDelegate(string statementId, object parameterObject, RowDelegate rowDelegate) { - bool isSessionLocal = false; - ISession session = sessionStore.CurrentSession; - IList list = null; - - if (session == null) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + return statement.ExecuteQueryForRowDelegate(sessionScope.Session, parameterObject, rowDelegate); } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return list; } /// @@ -928,34 +531,11 @@ /// The number of rows effected. 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) + using (DataMapperLocalSessionScope sessionScope = new DataMapperLocalSessionScope(this)) { - session = sessionFactory.OpenSession(); - isSessionLocal = true; - } - - try - { IMappedStatement statement = modelStore.GetMappedStatement(statementId); - rows = statement.ExecuteUpdate(session, parameterObject); + return statement.ExecuteUpdate(sessionScope.Session, parameterObject); } - catch - { - throw; - } - finally - { - if (isSessionLocal) - { - session.Close(); - } - } - - return rows; } #endregion @@ -972,5 +552,36 @@ } #endregion + + private class DataMapperLocalSessionScope : IDisposable + { + private readonly ISession session; + private readonly bool isSessionLocal = false; + + public DataMapperLocalSessionScope(DataMapper dataMapper) + { + isSessionLocal = false; + session = dataMapper.sessionStore.CurrentSession; + + if (session == null) + { + session = dataMapper.sessionFactory.OpenSession(); + isSessionLocal = true; + } + } + + public ISession Session + { + get { return session; } + } + + public void Dispose() + { + if (isSessionLocal) + { + session.Close(); + } + } + } } }