-----------------------------------------------------------
-- |
-- Module      :  Database.HaskellDB.Connect.HDBC.CatchIO
-- Copyright   :  Kei Hibino 2012
-- License     :  BSD-style
--
-- Maintainer  :  ex8k.hibino@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Bracketed HaskellDB session with 'MonadCatchIO'.
--
-----------------------------------------------------------
module Database.HaskellDB.Connect.HDBC.CatchIO (
  hdbcSession
  ) where

import Database.HDBC (IConnection)
import Database.HaskellDB.Database (Database)
import Database.HaskellDB.Sql.Generate (SqlGenerator)
import Database.HaskellDB.Connect.HDBC (makeHDBCSession)

import Control.Monad.IO.Class (liftIO)
import Control.Monad.CatchIO (MonadCatchIO, bracket)

-- | Run an action on a HDBC IConnection and close the connection.
--   'MonadCatchIO' version.
hdbcSession :: (MonadCatchIO m, IConnection conn)
            => SqlGenerator
            -> IO conn                   -- ^ Connect action
	    -> (conn -> Database -> m a) -- ^ Transaction body
            -> m a
hdbcSession gen =  makeHDBCSession bracket liftIO gen