{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Database.Persist.Relational
( runQuery
, rawQuery
, mkHrr
, mkHrrWithConfig
, deriveGenericForEntityId
, defineFromToSqlPersistValue
, module Database.Persist.Relational.Config
) where
import Control.Monad.Reader (MonadReader)
import Control.Monad.Trans.Resource (MonadResource)
import Data.Conduit (ConduitT, (.|))
import qualified Data.Conduit.List as CL
import qualified Data.Text as T
import Database.Persist
import Database.Persist.Relational.Config
import Database.Persist.Relational.Instances ()
import Database.Persist.Relational.TH
import Database.Persist.Sql (SqlBackend)
import qualified Database.Persist.Sql as PersistSql
import Database.Record.FromSql (FromSql (..), runToRecord)
import Database.Record.ToSql (ToSql, recordToSql, runFromRecord)
import Database.Relational
runQuery :: ( MonadResource m
, MonadReader env m
, HasPersistBackend env
, BaseBackend env ~ SqlBackend
, FromSql PersistValue a
, ToSql PersistValue p
)
=> Query p a
-> p
-> ConduitT () a m ()
runQuery q vals = rawQuery q vals .| CL.map (runToRecord recordFromSql)
rawQuery :: ( MonadResource m
, MonadReader env m
, HasPersistBackend env
, BaseBackend env ~ SqlBackend
, ToSql PersistValue p
)
=> Query p a
-> p
-> ConduitT () [PersistValue] m ()
rawQuery q vals = PersistSql.rawQuery queryTxt params
where
queryTxt = T.pack . untypeQuery $ q
params = runFromRecord recordToSql vals