From 3bd5c8506ac16399ec85f26ffdc27ea1ff45460b Mon Sep 17 00:00:00 2001 From: Felipe Lessa Date: Wed, 23 Apr 2014 11:42:07 -0300 Subject: [PATCH] Allow esqueleto's functions to be used on top of transformers. Instead of using SqlPersistT, now it uses MonadSqlPersist. --- src/Database/Esqueleto/Internal/Sql.hs | 88 +++++++++++++------------- 1 file changed, 43 insertions(+), 45 deletions(-) diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index 1c4fa1e..04f3e90 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -50,15 +50,13 @@ import Control.Arrow ((***), first) import Control.Exception (throw, throwIO) import Control.Monad ((>=>), ap, void, MonadPlus(..)) import Control.Monad.IO.Class (MonadIO(..)) -import Control.Monad.Logger (MonadLogger) import Control.Monad.Trans.Class (lift) -import Control.Monad.Trans.Resource (runResourceT, ResourceT, MonadResourceBase) +import Control.Monad.Trans.Resource (MonadResource) import Data.Int (Int64) import Data.List (intersperse) import Data.Monoid (Monoid(..), (<>)) import Data.Proxy (Proxy(..)) import Database.Esqueleto.Internal.PersistentImport -import qualified Control.Monad.Trans.Reader as R import qualified Control.Monad.Trans.State as S import qualified Control.Monad.Trans.Writer as W import qualified Data.Conduit as C @@ -543,15 +541,15 @@ veryUnsafeCoerceSqlExprValueList EEmptyList = -- | (Internal) Execute an @esqueleto@ @SELECT@ 'SqlQuery' inside -- @persistent@'s 'SqlPersistT' monad. rawSelectSource :: ( SqlSelect a r - , MonadLogger m - , MonadResourceBase m ) + , MonadResource m + , MonadSqlPersist m ) => Mode -> SqlQuery a - -> SqlPersistT m (C.Source (ResourceT (SqlPersistT m)) r) + -> m (C.Source m r) rawSelectSource mode query = src where src = do - conn <- SqlPersistT R.ask + conn <- askSqlConn return $ run conn C.$= massage run conn = @@ -572,10 +570,10 @@ rawSelectSource mode query = src -- | Execute an @esqueleto@ @SELECT@ query inside @persistent@'s -- 'SqlPersistT' monad and return a 'C.Source' of rows. selectSource :: ( SqlSelect a r - , MonadLogger m - , MonadResourceBase m ) + , MonadResource m + , MonadSqlPersist m ) => SqlQuery a - -> SqlPersistT m (C.Source (ResourceT (SqlPersistT m)) r) + -> m (C.Source m r) selectSource = rawSelectSource SELECT @@ -621,9 +619,9 @@ selectSource = rawSelectSource SELECT -- function composition that the @p@ inside the query is of type -- @SqlExpr (Entity Person)@. select :: ( SqlSelect a r - , MonadLogger m - , MonadResourceBase m ) - => SqlQuery a -> SqlPersistT m [r] + , MonadResource m + , MonadSqlPersist m ) + => SqlQuery a -> m [r] select = selectSource >=> runSource @@ -632,27 +630,27 @@ select = selectSource >=> runSource -- rows. selectDistinctSource :: ( SqlSelect a r - , MonadLogger m - , MonadResourceBase m ) + , MonadResource m + , MonadSqlPersist m ) => SqlQuery a - -> SqlPersistT m (C.Source (ResourceT (SqlPersistT m)) r) + -> m (C.Source m r) selectDistinctSource = rawSelectSource SELECT_DISTINCT -- | Execute an @esqueleto@ @SELECT DISTINCT@ query inside -- @persistent@'s 'SqlPersistT' monad and return a list of rows. selectDistinct :: ( SqlSelect a r - , MonadLogger m - , MonadResourceBase m ) - => SqlQuery a -> SqlPersistT m [r] + , MonadResource m + , MonadSqlPersist m ) + => SqlQuery a -> m [r] selectDistinct = selectDistinctSource >=> runSource -- | (Internal) Run a 'C.Source' of rows. -runSource :: MonadResourceBase m => - C.Source (ResourceT (SqlPersistT m)) r - -> SqlPersistT m [r] -runSource src = runResourceT $ src C.$$ CL.consume +runSource :: MonadResource m => + C.Source m r + -> m [r] +runSource src = src C.$$ CL.consume ---------------------------------------------------------------------- @@ -660,14 +658,14 @@ runSource src = runResourceT $ src C.$$ CL.consume -- | (Internal) Execute an @esqueleto@ statement inside -- @persistent@'s 'SqlPersistT' monad. -rawEsqueleto :: ( MonadLogger m - , MonadResourceBase m +rawEsqueleto :: ( MonadResource m + , MonadSqlPersist m , SqlSelect a r ) => Mode -> SqlQuery a - -> SqlPersistT m Int64 + -> m Int64 rawEsqueleto mode query = do - conn <- SqlPersistT R.ask + conn <- askSqlConn uncurry rawExecuteCount $ first builderToText $ toRawSql mode (conn, initialIdentState) query @@ -695,18 +693,18 @@ rawEsqueleto mode query = do -- from $ \\(appointment :: SqlExpr (Entity Appointment)) -> -- return () -- @ -delete :: ( MonadLogger m - , MonadResourceBase m ) +delete :: ( MonadResource m + , MonadSqlPersist m ) => SqlQuery () - -> SqlPersistT m () + -> m () delete = void . deleteCount -- | Same as 'delete', but returns the number of rows affected. -deleteCount :: ( MonadLogger m - , MonadResourceBase m ) +deleteCount :: ( MonadResource m + , MonadSqlPersist m ) => SqlQuery () - -> SqlPersistT m Int64 + -> m Int64 deleteCount = rawEsqueleto DELETE @@ -722,38 +720,38 @@ deleteCount = rawEsqueleto DELETE -- set p [ PersonAge =. just (val thisYear) -. p ^. PersonBorn ] -- where_ $ isNull (p ^. PersonAge) -- @ -update :: ( MonadLogger m - , MonadResourceBase m +update :: ( MonadResource m + , MonadSqlPersist m , SqlEntity val ) => (SqlExpr (Entity val) -> SqlQuery ()) - -> SqlPersistT m () + -> m () update = void . updateCount -- | Same as 'update', but returns the number of rows affected. -updateCount :: ( MonadLogger m - , MonadResourceBase m +updateCount :: ( MonadResource m + , MonadSqlPersist m , SqlEntity val ) => (SqlExpr (Entity val) -> SqlQuery ()) - -> SqlPersistT m Int64 + -> m Int64 updateCount = rawEsqueleto UPDATE . from -- | Insert a 'PersistField' for every selected value. -insertSelect :: ( MonadLogger m - , MonadResourceBase m +insertSelect :: ( MonadResource m + , MonadSqlPersist m , PersistEntity a ) - => SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m () + => SqlQuery (SqlExpr (Insertion a)) -> m () insertSelect = void . rawEsqueleto (INSERT_INTO SELECT) . fmap EInsertFinal -- | Insert a 'PersistField' for every unique selected value. insertSelectDistinct - :: ( MonadLogger m - , MonadResourceBase m + :: ( MonadResource m + , MonadSqlPersist m , PersistEntity a ) - => SqlQuery (SqlExpr (Insertion a)) -> SqlPersistT m () + => SqlQuery (SqlExpr (Insertion a)) -> m () insertSelectDistinct = void . rawEsqueleto (INSERT_INTO SELECT_DISTINCT) . fmap EInsertFinal