module Pipes.SQLite (
query,
query_,
queryNamed,
eachRow,
execute,
executeNamed
) where
import Pipes as P
import Pipes.Safe as PS
import qualified Database.SQLite.Simple as SQL
import Control.Monad (forever)
query_ :: (MonadSafe m, SQL.FromRow a)
=> SQL.Connection
-> SQL.Query
-> Producer' a m ()
query_ conn q = bracketIO (SQL.openStatement conn q) SQL.closeStatement eachRow
query :: (MonadSafe m, SQL.FromRow a, SQL.ToRow params)
=> SQL.Connection
-> SQL.Query
-> params
-> Producer' a m ()
query conn q p = bracketIO open' SQL.closeStatement eachRow
where open' = do s <- SQL.openStatement conn q
SQL.bind s p
return s
queryNamed :: (MonadSafe m, SQL.FromRow a)
=> SQL.Connection
-> SQL.Query
-> [SQL.NamedParam]
-> Producer' a m ()
queryNamed conn q ns = bracketIO open' SQL.closeStatement eachRow
where open' = do s <- SQL.openStatement conn q
SQL.bindNamed s ns
return s
execute :: (MonadIO m, SQL.ToRow q) => SQL.Connection -> SQL.Query -> Consumer' q m b
execute conn q = writeEach
where writeEach = forever $ do
v <- await
liftIO $ SQL.execute conn q v
executeNamed :: MonadIO m => SQL.Connection -> SQL.Query -> Consumer' [SQL.NamedParam] m b
executeNamed conn q = forever $ do
v <- await
liftIO $ SQL.executeNamed conn q v
eachRow :: (MonadIO m, SQL.FromRow a) => SQL.Statement -> Producer' a m ()
eachRow s = do
v <- liftIO (SQL.nextRow s)
case v of
Just z -> yield z >> eachRow s
Nothing -> return ()
bracketIO :: MonadSafe m => IO a -> (a -> IO a1) -> (a -> m c) -> m c
bracketIO a b = PS.bracket (liftIO a) (liftIO . b)