module Opaleye.SQLite.RunQuery (module Opaleye.SQLite.RunQuery,
QueryRunner,
IRQ.QueryRunnerColumn,
IRQ.fieldQueryRunnerColumn) where
import qualified Database.SQLite.Simple as PGS
import qualified Database.SQLite.Simple.FromRow as FR
import qualified Data.String as String
import Opaleye.SQLite.Column (Column)
import qualified Opaleye.SQLite.Sql as S
import Opaleye.SQLite.QueryArr (Query)
import Opaleye.SQLite.Internal.RunQuery (QueryRunner(QueryRunner))
import qualified Opaleye.SQLite.Internal.RunQuery as IRQ
import qualified Opaleye.SQLite.Internal.QueryArr as Q
import qualified Data.Profunctor as P
import qualified Data.Profunctor.Product.Default as D
import Control.Applicative ((*>))
runQuery :: D.Default QueryRunner columns haskells
=> PGS.Connection
-> Query columns
-> IO [haskells]
runQuery = runQueryExplicit D.def
runQueryExplicit :: QueryRunner columns haskells
-> PGS.Connection
-> Query columns
-> IO [haskells]
runQueryExplicit (QueryRunner u rowParser nonZeroColumns) conn q =
PGS.queryWith_ parser conn sql
where sql :: PGS.Query
sql = String.fromString (S.showSqlForPostgresExplicit u q)
(b, _, _) = Q.runSimpleQueryArrStart q ()
parser = if nonZeroColumns b
then rowParser b
else (FR.fromRow :: FR.RowParser (PGS.Only Int)) *> rowParser b
queryRunnerColumn :: (Column a' -> Column a) -> (b -> b')
-> IRQ.QueryRunnerColumn a b -> IRQ.QueryRunnerColumn a' b'
queryRunnerColumn colF haskellF qrc = IRQ.QueryRunnerColumn (P.lmap colF u)
(fmapFP haskellF fp)
where IRQ.QueryRunnerColumn u fp = qrc
fmapFP = fmap . fmap