module Database.GP.Conn ( Conn (..), connect, Database (..), ) where import Control.Monad ((>=>)) import Database.HDBC hiding (withWConn) {-- This module defines a wrapper around an HDBC IConnection. Using this wrapper `Conn` simplifies the signature of the functions in the `Database.GP` module. It allows to use any HDBC connection without having to define a new function for each connection type. It also provides additional attributes to the connection, like the database type and the implicit commit flag. These attributes can be used to implement database specific functionality, modify transaction behaviour, etc. This code has been inspired by the HDBC ConnectionWrapper and some parts have been copied from the HDBC Database.HDBC.Types module. --} -- | A wrapper around an HDBC IConnection. data Conn = forall conn. IConnection conn => Conn { -- | The database type db :: Database, -- | If True, the GenericPersistence functions will commit the transaction after each operation. implicitCommit :: Bool, -- | The wrapped connection connection :: conn } -- | An enumeration of the supported database types. data Database = Postgres | MySQL | SQLite | Oracle | MSSQL deriving (Show, Eq, Enum) -- | a smart constructor for the Conn type. connect :: forall conn. IConnection conn => Database -> conn -> Conn connect db = Conn db True -- | allows to execute a function that requires an `IConnection` argument on a `Conn`. withWConn :: forall b. Conn -> (forall conn. IConnection conn => conn -> b) -> b withWConn (Conn _db _ic conn) f = f conn -- | manually implement the IConnection type class for the Conn type. instance IConnection Conn where disconnect w = withWConn w disconnect commit w = withWConn w commit rollback w = withWConn w rollback runRaw w = withWConn w runRaw run w = withWConn w run prepare w = withWConn w prepare clone w@(Conn db ic _) = withWConn w (clone >=> return . Conn db ic) hdbcDriverName w = withWConn w hdbcDriverName hdbcClientVer w = withWConn w hdbcClientVer proxiedClientName w = withWConn w proxiedClientName proxiedClientVer w = withWConn w proxiedClientVer dbServerVer w = withWConn w dbServerVer dbTransactionSupport w = withWConn w dbTransactionSupport getTables w = withWConn w getTables describeTable w = withWConn w describeTable