{-# LANGUAGE CPP #-}
module Effectful.PostgreSQL
( -- * Effect
WithConnection
, withConnection
-- ** Interpreters
, runWithConnection
#if POOL
, runWithConnectionPool
#endif
-- * Lifted versions of functions from Database.PostgreSQL.Simple
-- ** Queries that return results
, query
, query_
, queryWith
, queryWith_
-- ** Statements that do not return results
, execute
, execute_
, executeMany
-- ** Transaction handling
, withTransaction
, withSavepoint
, begin
, commit
, rollback
-- ** Queries that stream results
, fold
, foldWithOptions
, fold_
, foldWithOptions_
, forEach
, forEach_
, returning
, foldWith
, foldWithOptionsAndParser
, foldWith_
, foldWithOptionsAndParser_
, forEachWith
, forEachWith_
, returningWith
)
where
import Data.Int (Int64)
import qualified Database.PostgreSQL.Simple as PSQL
import qualified Database.PostgreSQL.Simple.FromRow as PSQL
import Effectful
import Effectful.PostgreSQL.Connection as Conn
import GHC.Stack
#if POOL
import Effectful.PostgreSQL.Connection.Pool as Pool
#endif
-- | Lifted 'PSQL.query'.
query ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow q, PSQL.FromRow r) =>
PSQL.Query ->
q ->
Eff es [r]
query q row = withConnection $ \conn -> liftIO (PSQL.query conn q row)
-- | Lifted 'PSQL.query_'.
query_ ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.FromRow r) =>
PSQL.Query ->
Eff es [r]
query_ row = withConnection $ \conn -> liftIO (PSQL.query_ conn row)
-- | Lifted 'PSQL.queryWith'.
queryWith ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow q) =>
PSQL.RowParser r ->
PSQL.Query ->
q ->
Eff es [r]
queryWith parser q row =
withConnection $ \conn -> liftIO (PSQL.queryWith parser conn q row)
-- | Lifted 'PSQL.queryWith_'.
queryWith_ ::
(HasCallStack, WithConnection :> es, IOE :> es) =>
PSQL.RowParser r ->
PSQL.Query ->
Eff es [r]
queryWith_ parser row =
withConnection $ \conn -> liftIO (PSQL.queryWith_ parser conn row)
-- | Lifted 'PSQL.execute'.
execute ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow q) =>
PSQL.Query ->
q ->
Eff es Int64
execute q row = withConnection $ \conn -> liftIO (PSQL.execute conn q row)
-- | Lifted 'PSQL.execute_'.
execute_ ::
(HasCallStack, WithConnection :> es, IOE :> es) =>
PSQL.Query ->
Eff es Int64
execute_ row = withConnection $ \conn -> liftIO (PSQL.execute_ conn row)
-- | Lifted 'PSQL.executeMany'.
executeMany ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow q) =>
PSQL.Query ->
[q] ->
Eff es Int64
executeMany q rows = withConnection $ \conn -> liftIO (PSQL.executeMany conn q rows)
-- | Lifted 'PSQL.withTransaction'.
withTransaction ::
(HasCallStack, WithConnection :> es, IOE :> es) => Eff es a -> Eff es a
withTransaction f =
unliftWithConn $ \conn unlift ->
PSQL.withTransaction conn (unlift f)
-- | Lifted 'PSQL.withSavepoint'.
withSavepoint :: (HasCallStack, WithConnection :> es, IOE :> es) => Eff es a -> Eff es a
withSavepoint f =
unliftWithConn $ \conn unlift ->
PSQL.withSavepoint conn (unlift f)
-- | Lifted 'PSQL.begin'.
begin :: (HasCallStack, WithConnection :> es, IOE :> es) => Eff es ()
begin = withConnection $ liftIO . PSQL.begin
-- | Lifted 'PSQL.commit'.
commit :: (HasCallStack, WithConnection :> es, IOE :> es) => Eff es ()
commit = withConnection $ liftIO . PSQL.commit
-- | Lifted 'PSQL.rollback'.
rollback :: (HasCallStack, WithConnection :> es, IOE :> es) => Eff es ()
rollback = withConnection $ liftIO . PSQL.rollback
(...) :: (a -> b) -> (t1 -> t2 -> a) -> t1 -> t2 -> b
unlift ... f = \a' row -> unlift $ f a' row
unliftWithConn ::
(HasCallStack, WithConnection :> es, IOE :> es) =>
(PSQL.Connection -> (forall b. Eff es b -> IO b) -> IO a) ->
Eff es a
unliftWithConn f =
withConnection $ \conn ->
withSeqEffToIO $ \unlift ->
liftIO $ f conn unlift
{-# INLINE unliftWithConn #-}
-- | Lifted 'PSQL.fold'.
fold ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.FromRow row, PSQL.ToRow params) =>
PSQL.Query ->
params ->
a ->
(a -> row -> Eff es a) ->
Eff es a
fold q params a f =
unliftWithConn $ \conn unlift ->
PSQL.fold conn q params a (unlift ... f)
-- | Lifted 'PSQL.foldWithOptions'.
foldWithOptions ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.FromRow row, PSQL.ToRow params) =>
PSQL.FoldOptions ->
PSQL.Query ->
params ->
a ->
(a -> row -> Eff es a) ->
Eff es a
foldWithOptions opts q params a f =
unliftWithConn $ \conn unlift ->
PSQL.foldWithOptions opts conn q params a (unlift ... f)
-- | Lifted 'PSQL.fold_'.
fold_ ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.FromRow row) =>
PSQL.Query ->
a ->
(a -> row -> Eff es a) ->
Eff es a
fold_ q a f =
unliftWithConn $ \conn unlift ->
PSQL.fold_ conn q a (unlift ... f)
-- | Lifted 'PSQL.foldWithOptions_'.
foldWithOptions_ ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.FromRow row) =>
PSQL.FoldOptions ->
PSQL.Query ->
a ->
(a -> row -> Eff es a) ->
Eff es a
foldWithOptions_ opts q a f =
unliftWithConn $ \conn unlift ->
PSQL.foldWithOptions_ opts conn q a (unlift ... f)
-- | Lifted 'PSQL.forEach'.
forEach ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.FromRow r, PSQL.ToRow q) =>
PSQL.Query ->
q ->
(r -> Eff es ()) ->
Eff es ()
forEach q row forR =
unliftWithConn $ \conn unlift ->
PSQL.forEach conn q row (unlift . forR)
-- | Lifted 'PSQL.forEach_'.
forEach_ ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.FromRow r) =>
PSQL.Query ->
(r -> Eff es ()) ->
Eff es ()
forEach_ q forR =
unliftWithConn $ \conn unlift ->
PSQL.forEach_ conn q (unlift . forR)
-- | Lifted 'PSQL.returning'.
returning ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow q, PSQL.FromRow r) =>
PSQL.Query ->
[q] ->
Eff es [r]
returning q rows = withConnection $ \conn -> liftIO $ PSQL.returning conn q rows
-- | Lifted 'PSQL.foldWith'.
foldWith ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow params) =>
PSQL.RowParser row ->
PSQL.Query ->
params ->
a ->
(a -> row -> Eff es a) ->
Eff es a
foldWith parser q params a f =
unliftWithConn $ \conn unlift ->
PSQL.foldWith parser conn q params a (unlift ... f)
-- | Lifted 'PSQL.foldWithOptionsAndParser'.
foldWithOptionsAndParser ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow params) =>
PSQL.FoldOptions ->
PSQL.RowParser row ->
PSQL.Query ->
params ->
a ->
(a -> row -> Eff es a) ->
Eff es a
foldWithOptionsAndParser opts parser q params a f =
unliftWithConn $ \conn unlift ->
PSQL.foldWithOptionsAndParser opts parser conn q params a (unlift ... f)
-- | Lifted 'PSQL.foldWith_'.
foldWith_ ::
(HasCallStack, WithConnection :> es, IOE :> es) =>
PSQL.RowParser row ->
PSQL.Query ->
a ->
(a -> row -> Eff es a) ->
Eff es a
foldWith_ parser q a f =
unliftWithConn $ \conn unlift ->
PSQL.foldWith_ parser conn q a (unlift ... f)
-- | Lifted 'PSQL.foldWithOptionsAndParser_'.
foldWithOptionsAndParser_ ::
(HasCallStack, WithConnection :> es, IOE :> es) =>
PSQL.FoldOptions ->
PSQL.RowParser row ->
PSQL.Query ->
a ->
(a -> row -> Eff es a) ->
Eff es a
foldWithOptionsAndParser_ opts parser q a f =
unliftWithConn $ \conn unlift ->
PSQL.foldWithOptionsAndParser_ opts parser conn q a (unlift ... f)
-- | Lifted 'PSQL.forEachWith'.
forEachWith ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow q) =>
PSQL.RowParser r ->
PSQL.Query ->
q ->
(r -> Eff es ()) ->
Eff es ()
forEachWith parser q row forR =
unliftWithConn $ \conn unlift ->
PSQL.forEachWith parser conn q row (unlift . forR)
-- | Lifted 'PSQL.forEachWith_'.
forEachWith_ ::
(HasCallStack, WithConnection :> es, IOE :> es) =>
PSQL.RowParser r ->
PSQL.Query ->
(r -> Eff es ()) ->
Eff es ()
forEachWith_ parser row forR =
unliftWithConn $ \conn unlift ->
PSQL.forEachWith_ parser conn row (unlift . forR)
-- | Lifted 'PSQL.returningWith'.
returningWith ::
(HasCallStack, WithConnection :> es, IOE :> es, PSQL.ToRow q) =>
PSQL.RowParser r ->
PSQL.Query ->
[q] ->
Eff es [r]
returningWith parser q rows =
withConnection $ \conn -> liftIO $ PSQL.returningWith parser conn q rows