{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeFamilies #-} -- | -- Module : Database.Persist.Relational -- Copyright : (C) 2016 Takahiro Himura -- License : BSD3 -- Maintainer : Takahiro Himura -- Stability : experimental -- Portability : unknown -- -- This module works as a bridge between -- and . -- It uses the persistent entities definition instead of obtaining schema from DB at compilation time. -- -- See: 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 -- | Execute a HRR 'Query' and return the stream of its results. runQuery :: ( MonadResource m , MonadReader env m , HasPersistBackend env , BaseBackend env ~ SqlBackend , FromSql PersistValue a , ToSql PersistValue p ) => Query p a -- ^ Query to get record type a requires parameter p -> p -- ^ Parameter type -> 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