packages feed

postgresql-tx-query-0.1.0.0: src/Database/PostgreSQL/Tx/Query.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Database.PostgreSQL.Tx.Query
  ( module Database.PostgreSQL.Tx.Query
  , module Database.PostgreSQL.Tx.Query.Internal.Reexport
  ) where

import Control.Monad.Logger (LoggingT, runLoggingT)
import Control.Monad.Trans (MonadTrans(lift))
import Data.Int (Int64)
import Database.PostgreSQL.Tx (Tx(TxEnv, tx), UnsafeTx(unsafeIOTx), TxM, unsafeRunTxM)
import Database.PostgreSQL.Tx.Query.Internal.Reexport
import qualified Database.PostgreSQL.Query as Query
import qualified Database.PostgreSQL.Simple as Simple
import qualified Database.PostgreSQL.Simple.Transaction as Simple
import qualified Database.PostgreSQL.Tx.MonadLogger

type PgQueryM = PgMonadT (LoggingT TxM)

type Logger = Database.PostgreSQL.Tx.MonadLogger.Logger

pgWithTransaction :: (Simple.Connection, Logger) -> TxM a -> IO a
pgWithTransaction = unsafeRunPgQueryTransaction Query.pgWithTransaction

pgWithTransactionMode :: Simple.TransactionMode -> (Simple.Connection, Logger) -> TxM a -> IO a
pgWithTransactionMode m = unsafeRunPgQueryTransaction (Query.pgWithTransactionMode m)

-- Re-export of 'Query.pgQuery'
pgQuery :: (ToSqlBuilder q, FromRow r) => q -> PgQueryM [r]
pgQuery = unsafeIOTx . Query.pgQuery

-- Re-export of 'Query.pgExecute'
pgExecute :: (ToSqlBuilder q) => q -> PgQueryM Int64
pgExecute = unsafeIOTx . Query.pgExecute

unsafePgQueryIOTx :: PgMonadT (LoggingT IO) a -> PgQueryM a
unsafePgQueryIOTx = unsafeIOTx

unsafeRunPgQueryTransaction
  :: (PgMonadT (LoggingT IO) a -> PgMonadT (LoggingT IO) a)
  -> (Simple.Connection, Logger)
  -> TxM a
  -> IO a
unsafeRunPgQueryTransaction f (c, logger) x =
  unsafeRunTxM
    $ tx (c, logger)
    $ unsafePgQueryIOTx
    $ f
    $ lift . lift
    $ unsafeRunTxM x

instance Tx PgQueryM where
  type TxEnv PgQueryM = (Simple.Connection, Logger)
  tx (conn, logger) x = runLoggingT (runPgMonadT conn x) logger

instance (UnsafeTx io t) => UnsafeTx (PgMonadT io) (PgMonadT t) where
  unsafeIOTx (PgMonadT x) = PgMonadT $ unsafeIOTx x