{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
module Database.PostgreSQL.Tx.Squeal
  ( SquealEnv
  , SquealM
  , SquealTxM'(SquealTxM, fromSquealTxM)
  , SquealTxM
  , SquealConnection
  , mkSquealConnection
  , module Database.PostgreSQL.Tx.Squeal
  , module Database.PostgreSQL.Tx.Squeal.Internal.Reexport
  ) where

import Control.Exception (Exception)
import Data.ByteString (ByteString)
import Database.PostgreSQL.Tx (TxM, shouldRetryTx)
import Database.PostgreSQL.Tx.Squeal.Internal
import Database.PostgreSQL.Tx.Squeal.Internal.Reexport
import qualified Database.PostgreSQL.LibPQ as LibPQ
import qualified Generics.SOP as SOP
import qualified Generics.SOP.Record as SOP
import qualified Squeal.PostgreSQL as Squeal

-- | Analogue of 'Squeal.getRow'.
--
-- @since 0.1.0.0
getRow :: LibPQ.Row -> Result y -> SquealTxM db y
getRow :: Row -> Result y -> SquealTxM db y
getRow = (Row -> Result y -> PQ db db IO y)
-> Row -> Result y -> SquealTxM db y
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Row -> Result y -> PQ db db IO y
forall (io :: * -> *) y. MonadIO io => Row -> Result y -> io y
Squeal.getRow

-- | Analogue of 'Squeal.firstRow'.
--
-- @since 0.1.0.0
firstRow :: Result y -> SquealTxM db (Maybe y)
firstRow :: Result y -> SquealTxM db (Maybe y)
firstRow = (Result y -> PQ db db IO (Maybe y))
-> Result y -> SquealTxM db (Maybe y)
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO (Maybe y)
forall (io :: * -> *) y. MonadIO io => Result y -> io (Maybe y)
Squeal.firstRow

-- | Analogue of 'Squeal.getRows'.
--
-- @since 0.1.0.0
getRows :: Result y -> SquealTxM db [y]
getRows :: Result y -> SquealTxM db [y]
getRows = (Result y -> PQ db db IO [y]) -> Result y -> SquealTxM db [y]
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO [y]
forall (io :: * -> *) y. MonadIO io => Result y -> io [y]
Squeal.getRows

-- | Analogue of 'Squeal.nextRow'.
--
-- @since 0.1.0.0
nextRow :: LibPQ.Row -> Result y -> LibPQ.Row -> SquealTxM db (Maybe (LibPQ.Row, y))
nextRow :: Row -> Result y -> Row -> SquealTxM db (Maybe (Row, y))
nextRow = (Row -> Result y -> Row -> PQ db db IO (Maybe (Row, y)))
-> Row -> Result y -> Row -> SquealTxM db (Maybe (Row, y))
forall x1 x2 x3 (db :: SchemasType) a.
(x1 -> x2 -> x3 -> PQ db db IO a)
-> x1 -> x2 -> x3 -> SquealTxM db a
unsafeSquealIOTxM3 Row -> Result y -> Row -> PQ db db IO (Maybe (Row, y))
forall (io :: * -> *) y.
MonadIO io =>
Row -> Result y -> Row -> io (Maybe (Row, y))
Squeal.nextRow

-- | Analogue of 'Squeal.ntuples'.
--
-- @since 0.1.0.0
ntuples :: Result y -> SquealTxM db LibPQ.Row
ntuples :: Result y -> SquealTxM db Row
ntuples = (Result y -> PQ db db IO Row) -> Result y -> SquealTxM db Row
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO Row
forall (io :: * -> *) y. MonadIO io => Result y -> io Row
Squeal.ntuples

-- | Analogue of 'Squeal.nfields'.
--
-- @since 0.1.0.0
nfields :: Result y -> SquealTxM db LibPQ.Column
nfields :: Result y -> SquealTxM db Column
nfields = (Result y -> PQ db db IO Column) -> Result y -> SquealTxM db Column
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO Column
forall (io :: * -> *) y. MonadIO io => Result y -> io Column
Squeal.nfields

-- | Analogue of 'Squeal.resultStatus'.
--
-- @since 0.1.0.0
resultStatus :: Result y -> SquealTxM db ExecStatus
resultStatus :: Result y -> SquealTxM db ExecStatus
resultStatus = (Result y -> PQ db db IO ExecStatus)
-> Result y -> SquealTxM db ExecStatus
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO ExecStatus
forall (io :: * -> *) y. MonadIO io => Result y -> io ExecStatus
Squeal.resultStatus

-- | Analogue of 'Squeal.okResult'.
--
-- @since 0.2.0.0
okResult :: Result y -> SquealTxM db ()
okResult :: Result y -> SquealTxM db ()
okResult = (Result y -> PQ db db IO ()) -> Result y -> SquealTxM db ()
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO ()
forall (io :: * -> *) y. MonadIO io => Result y -> io ()
Squeal.okResult

-- | Analogue of 'Squeal.resultErrorMessage'.
--
-- @since 0.1.0.0
resultErrorMessage :: Result y -> SquealTxM db (Maybe ByteString)
resultErrorMessage :: Result y -> SquealTxM db (Maybe ByteString)
resultErrorMessage = (Result y -> PQ db db IO (Maybe ByteString))
-> Result y -> SquealTxM db (Maybe ByteString)
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO (Maybe ByteString)
forall (io :: * -> *) y.
MonadIO io =>
Result y -> io (Maybe ByteString)
Squeal.resultErrorMessage

-- | Analogue of 'Squeal.resultErrorCode'.
--
-- @since 0.1.0.0
resultErrorCode :: Result y -> SquealTxM db (Maybe ByteString)
resultErrorCode :: Result y -> SquealTxM db (Maybe ByteString)
resultErrorCode = (Result y -> PQ db db IO (Maybe ByteString))
-> Result y -> SquealTxM db (Maybe ByteString)
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Result y -> PQ db db IO (Maybe ByteString)
forall (io :: * -> *) y.
MonadIO io =>
Result y -> io (Maybe ByteString)
Squeal.resultErrorCode

-- | Analogue of 'Squeal.executeParams'.
--
-- @since 0.1.0.0
executeParams :: Statement db x y -> x -> SquealTxM db (Result y)
executeParams :: Statement db x y -> x -> SquealTxM db (Result y)
executeParams = (Statement db x y -> x -> PQ db db IO (Result y))
-> Statement db x y -> x -> SquealTxM db (Result y)
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Statement db x y -> x -> PQ db db IO (Result y)
forall (db :: SchemasType) (pq :: * -> *) x y.
MonadPQ db pq =>
Statement db x y -> x -> pq (Result y)
Squeal.executeParams

-- | Analogue of 'Squeal.executeParams_'.
--
-- @since 0.1.0.0
executeParams_ :: Statement db x () -> x -> SquealTxM db ()
executeParams_ :: Statement db x () -> x -> SquealTxM db ()
executeParams_ = (Statement db x () -> x -> PQ db db IO ())
-> Statement db x () -> x -> SquealTxM db ()
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Statement db x () -> x -> PQ db db IO ()
forall (db :: SchemasType) (pq :: * -> *) x.
MonadPQ db pq =>
Statement db x () -> x -> pq ()
Squeal.executeParams_

-- | Analogue of 'Squeal.execute'.
--
-- @since 0.1.0.0
execute :: Statement db () y -> SquealTxM db (Result y)
execute :: Statement db () y -> SquealTxM db (Result y)
execute = (Statement db () y -> PQ db db IO (Result y))
-> Statement db () y -> SquealTxM db (Result y)
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Statement db () y -> PQ db db IO (Result y)
forall (db :: SchemasType) (pq :: * -> *) y.
MonadPQ db pq =>
Statement db () y -> pq (Result y)
Squeal.execute

-- | Analogue of 'Squeal.execute_'.
--
-- @since 0.1.0.0
execute_ :: Statement db () () -> SquealTxM db ()
execute_ :: Statement db () () -> SquealTxM db ()
execute_ = (Statement db () () -> PQ db db IO ())
-> Statement db () () -> SquealTxM db ()
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Statement db () () -> PQ db db IO ()
forall (db :: SchemasType) (pq :: * -> *).
MonadPQ db pq =>
Statement db () () -> pq ()
Squeal.execute_

-- | Analogue of 'Squeal.executePrepared'.
--
-- @since 0.1.0.0
executePrepared
  :: (Traversable list)
  => Statement db x y -> list x -> SquealTxM db (list (Result y))
executePrepared :: Statement db x y -> list x -> SquealTxM db (list (Result y))
executePrepared = (Statement db x y -> list x -> PQ db db IO (list (Result y)))
-> Statement db x y -> list x -> SquealTxM db (list (Result y))
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Statement db x y -> list x -> PQ db db IO (list (Result y))
forall (db :: SchemasType) (pq :: * -> *) (list :: * -> *) x y.
(MonadPQ db pq, Traversable list) =>
Statement db x y -> list x -> pq (list (Result y))
Squeal.executePrepared

-- | Analogue of 'Squeal.executePrepared_'.
--
-- @since 0.1.0.0
executePrepared_
  :: (Foldable list)
  => Statement db x () -> list x -> SquealTxM db ()
executePrepared_ :: Statement db x () -> list x -> SquealTxM db ()
executePrepared_ = (Statement db x () -> list x -> PQ db db IO ())
-> Statement db x () -> list x -> SquealTxM db ()
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Statement db x () -> list x -> PQ db db IO ()
forall (db :: SchemasType) (pq :: * -> *) (list :: * -> *) x.
(MonadPQ db pq, Foldable list) =>
Statement db x () -> list x -> pq ()
Squeal.executePrepared_

-- | Analogue of 'Squeal.manipulateParams'.
--
-- @since 0.1.0.0
manipulateParams
  :: ( GenericParams db params x xs
     , Squeal.GenericRow row y ys
     )
  => Manipulation '[] db params row
  -> x
  -> SquealTxM db (Result y)
manipulateParams :: Manipulation '[] db params row -> x -> SquealTxM db (Result y)
manipulateParams = (Manipulation '[] db params row -> x -> PQ db db IO (Result y))
-> Manipulation '[] db params row -> x -> SquealTxM db (Result y)
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Manipulation '[] db params row -> x -> PQ db db IO (Result y)
forall (db :: SchemasType) (pq :: * -> *) (params :: [NullType]) x
       (xs :: [*]) (row :: RowType) y (ys :: RecordCode).
(MonadPQ db pq, GenericParams db params x xs,
 GenericRow row y ys) =>
Manipulation '[] db params row -> x -> pq (Result y)
Squeal.manipulateParams

-- | Analogue of 'Squeal.manipulateParams_'.
--
-- @since 0.1.0.0
manipulateParams_
  :: (GenericParams db params x xs)
  => Manipulation '[] db params '[] -> x -> SquealTxM db ()
manipulateParams_ :: Manipulation '[] db params '[] -> x -> SquealTxM db ()
manipulateParams_ = (Manipulation '[] db params '[] -> x -> PQ db db IO ())
-> Manipulation '[] db params '[] -> x -> SquealTxM db ()
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Manipulation '[] db params '[] -> x -> PQ db db IO ()
forall (db :: SchemasType) (pq :: * -> *) (params :: [NullType]) x
       (xs :: [*]).
(MonadPQ db pq, GenericParams db params x xs) =>
Manipulation '[] db params '[] -> x -> pq ()
Squeal.manipulateParams_

-- | Analogue of 'Squeal.manipulate'.
--
-- @since 0.1.0.0
manipulate
  :: (Squeal.GenericRow row y ys)
  => Manipulation '[] db '[] row -> SquealTxM db (Result y)
manipulate :: Manipulation '[] db '[] row -> SquealTxM db (Result y)
manipulate = (Manipulation '[] db '[] row -> PQ db db IO (Result y))
-> Manipulation '[] db '[] row -> SquealTxM db (Result y)
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Manipulation '[] db '[] row -> PQ db db IO (Result y)
forall (db :: SchemasType) (pq :: * -> *) (row :: RowType) y
       (ys :: RecordCode).
(MonadPQ db pq, GenericRow row y ys) =>
Manipulation '[] db '[] row -> pq (Result y)
Squeal.manipulate

-- | Analogue of 'Squeal.manipulate_'.
--
-- @since 0.1.0.0
manipulate_
  :: Manipulation '[] db '[] '[] -> SquealTxM db ()
manipulate_ :: Manipulation '[] db '[] '[] -> SquealTxM db ()
manipulate_ = (Manipulation '[] db '[] '[] -> PQ db db IO ())
-> Manipulation '[] db '[] '[] -> SquealTxM db ()
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Manipulation '[] db '[] '[] -> PQ db db IO ()
forall (db :: SchemasType) (pq :: * -> *).
MonadPQ db pq =>
Manipulation '[] db '[] '[] -> pq ()
Squeal.manipulate_

-- | Analogue of 'Squeal.runQueryParams'.
--
-- @since 0.1.0.0
runQueryParams
  :: ( GenericParams db params x xs
     , SOP.IsRecord y ys
     , SOP.AllZip Squeal.FromField row ys
     )
  => Squeal.Query '[] '[] db params row -> x -> SquealTxM db (Result y)
runQueryParams :: Query '[] '[] db params row -> x -> SquealTxM db (Result y)
runQueryParams = (Query '[] '[] db params row -> x -> PQ db db IO (Result y))
-> Query '[] '[] db params row -> x -> SquealTxM db (Result y)
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Query '[] '[] db params row -> x -> PQ db db IO (Result y)
forall (db :: SchemasType) (pq :: * -> *) (params :: [NullType]) x
       (xs :: [*]) y (ys :: RecordCode) (row :: RowType).
(MonadPQ db pq, GenericParams db params x xs, IsRecord y ys,
 AllZip FromField row ys) =>
Query '[] '[] db params row -> x -> pq (Result y)
Squeal.runQueryParams

-- | Analogue of 'Squeal.runQuery'.
--
-- @since 0.1.0.0
runQuery
  :: ( SOP.IsRecord y ys
     , SOP.AllZip Squeal.FromField row ys
     )
  => Squeal.Query '[] '[] db '[] row -> SquealTxM db (Result y)
runQuery :: Query '[] '[] db '[] row -> SquealTxM db (Result y)
runQuery = (Query '[] '[] db '[] row -> PQ db db IO (Result y))
-> Query '[] '[] db '[] row -> SquealTxM db (Result y)
forall x1 (db :: SchemasType) a.
(x1 -> PQ db db IO a) -> x1 -> SquealTxM db a
unsafeSquealIOTxM1 Query '[] '[] db '[] row -> PQ db db IO (Result y)
forall (db :: SchemasType) (pq :: * -> *) y (ys :: RecordCode)
       (row :: RowType).
(MonadPQ db pq, IsRecord y ys, AllZip FromField row ys) =>
Query '[] '[] db '[] row -> pq (Result y)
Squeal.runQuery

-- | Analogue of 'Squeal.traversePrepared'.
--
-- @since 0.1.0.0
traversePrepared
  :: ( GenericParams db params x xs
     , Traversable list
     , SOP.IsRecord y ys
     , SOP.AllZip Squeal.FromField row ys
     )
  => Manipulation '[] db params row
  -> list x
  -> SquealTxM db (list (Result y))
traversePrepared :: Manipulation '[] db params row
-> list x -> SquealTxM db (list (Result y))
traversePrepared = (Manipulation '[] db params row
 -> list x -> PQ db db IO (list (Result y)))
-> Manipulation '[] db params row
-> list x
-> SquealTxM db (list (Result y))
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Manipulation '[] db params row
-> list x -> PQ db db IO (list (Result y))
forall (db :: SchemasType) (pq :: * -> *) (params :: [NullType]) x
       (xs :: [*]) (list :: * -> *) y (ys :: RecordCode) (row :: RowType).
(MonadPQ db pq, GenericParams db params x xs, Traversable list,
 IsRecord y ys, AllZip FromField row ys) =>
Manipulation '[] db params row -> list x -> pq (list (Result y))
Squeal.traversePrepared

-- | Analogue of 'Squeal.forPrepared'.
--
-- @since 0.1.0.0
forPrepared
  :: ( GenericParams db params x xs
     , Traversable list
     , SOP.IsRecord y ys
     , SOP.AllZip Squeal.FromField row ys
     )
  => list x
  -> Manipulation '[] db params row
  -> SquealTxM db (list (Result y))
forPrepared :: list x
-> Manipulation '[] db params row -> SquealTxM db (list (Result y))
forPrepared = (list x
 -> Manipulation '[] db params row -> PQ db db IO (list (Result y)))
-> list x
-> Manipulation '[] db params row
-> SquealTxM db (list (Result y))
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 list x
-> Manipulation '[] db params row -> PQ db db IO (list (Result y))
forall (db :: SchemasType) (pq :: * -> *) (params :: [NullType]) x
       (xs :: [*]) (list :: * -> *) y (ys :: RecordCode) (row :: RowType).
(MonadPQ db pq, GenericParams db params x xs, Traversable list,
 IsRecord y ys, AllZip FromField row ys) =>
list x -> Manipulation '[] db params row -> pq (list (Result y))
Squeal.forPrepared

-- | Analogue of 'Squeal.traversePrepared_'.
--
-- @since 0.1.0.0
traversePrepared_
  :: ( GenericParams db params x xs
     , Foldable list
     )
  => Manipulation '[] db params '[]
  -> list x
  -> SquealTxM db ()
traversePrepared_ :: Manipulation '[] db params '[] -> list x -> SquealTxM db ()
traversePrepared_ = (Manipulation '[] db params '[] -> list x -> PQ db db IO ())
-> Manipulation '[] db params '[] -> list x -> SquealTxM db ()
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 Manipulation '[] db params '[] -> list x -> PQ db db IO ()
forall (db :: SchemasType) (pq :: * -> *) (params :: [NullType]) x
       (xs :: [*]) (list :: * -> *).
(MonadPQ db pq, GenericParams db params x xs, Foldable list) =>
Manipulation '[] db params '[] -> list x -> pq ()
Squeal.traversePrepared_

-- | Analogue of 'Squeal.forPrepared_'.
--
-- @since 0.1.0.0
forPrepared_
  :: ( GenericParams db params x xs
     , Foldable list
     )
  => list x
  -> Manipulation '[] db params '[]
  -> SquealTxM db ()
forPrepared_ :: list x -> Manipulation '[] db params '[] -> SquealTxM db ()
forPrepared_ = (list x -> Manipulation '[] db params '[] -> PQ db db IO ())
-> list x -> Manipulation '[] db params '[] -> SquealTxM db ()
forall x1 x2 (db :: SchemasType) a.
(x1 -> x2 -> PQ db db IO a) -> x1 -> x2 -> SquealTxM db a
unsafeSquealIOTxM2 list x -> Manipulation '[] db params '[] -> PQ db db IO ()
forall (db :: SchemasType) (pq :: * -> *) (params :: [NullType]) x
       (xs :: [*]) (list :: * -> *).
(MonadPQ db pq, GenericParams db params x xs, Foldable list) =>
list x -> Manipulation '[] db params '[] -> pq ()
Squeal.forPrepared_

-- | Analogue of 'Squeal.transactionally'.
--
-- @since 0.1.0.0
transactionally :: (SquealEnv r) => TransactionMode -> r -> TxM r a -> IO a
transactionally :: TransactionMode -> r -> TxM r a -> IO a
transactionally TransactionMode
m = (forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
forall r a.
SquealEnv r =>
(forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
unsafeRunSquealTransaction (TransactionMode -> PQ db db IO a -> PQ db db IO a
forall (tx :: * -> *) (db :: SchemasType) x.
(MonadUnliftIO tx, MonadPQ db tx) =>
TransactionMode -> tx x -> tx x
Squeal.transactionally TransactionMode
m)

-- | Analogue of 'Squeal.transactionally_'.
--
-- @since 0.1.0.0
transactionally_ :: (SquealEnv r) => r -> TxM r a -> IO a
transactionally_ :: r -> TxM r a -> IO a
transactionally_ = (forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
forall r a.
SquealEnv r =>
(forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
unsafeRunSquealTransaction forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a
forall (tx :: * -> *) (db :: SchemasType) x.
(MonadUnliftIO tx, MonadPQ db tx) =>
tx x -> tx x
Squeal.transactionally_

-- | Specialization of 'transactionallyRetry' which uses 'Serializable'
-- and 'shouldRetryTx' to automatically retry the transaction on
-- @serialization_failure@ or @deadlock_detected@.
--
-- Note that any 'IO' that occurs inside the 'TxM' may be executed multiple times.
--
-- @since 0.2.0.0
transactionallySerializable :: (SquealEnv r) => r -> TxM r a -> IO a
transactionallySerializable :: r -> TxM r a -> IO a
transactionallySerializable =
  TransactionMode -> (TxException -> Bool) -> r -> TxM r a -> IO a
forall r e a.
(SquealEnv r, Exception e) =>
TransactionMode -> (e -> Bool) -> r -> TxM r a -> IO a
transactionallyRetry TransactionMode
mode TxException -> Bool
shouldRetryTx
  where
  mode :: TransactionMode
mode =
    IsolationLevel -> AccessMode -> DeferrableMode -> TransactionMode
TransactionMode
      IsolationLevel
Serializable
      AccessMode
ReadWrite
      DeferrableMode
NotDeferrable

-- | Analogue of 'Squeal.transactionallyRetry'.
--
-- Note that any 'IO' that occurs inside the 'TxM' may be executed multiple times.
--
-- @since 0.2.0.0
transactionallyRetry
  :: (SquealEnv r, Exception e)
  => TransactionMode -> (e -> Bool) -> r -> TxM r a -> IO a
transactionallyRetry :: TransactionMode -> (e -> Bool) -> r -> TxM r a -> IO a
transactionallyRetry TransactionMode
m e -> Bool
shouldRetry =
  (forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
forall r a.
SquealEnv r =>
(forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
unsafeRunSquealTransaction (TransactionMode -> (e -> Bool) -> PQ db db IO a -> PQ db db IO a
forall (m :: * -> *) (db :: SchemasType) e a.
(MonadUnliftIO m, MonadPQ db m, Exception e) =>
TransactionMode -> (e -> Bool) -> m a -> m a
transactionallyRetry' TransactionMode
m e -> Bool
shouldRetry)

-- | Analogue of 'Squeal.ephemerally'.
--
-- @since 0.1.0.0
ephemerally :: (SquealEnv r) => TransactionMode -> r -> TxM r a -> IO a
ephemerally :: TransactionMode -> r -> TxM r a -> IO a
ephemerally TransactionMode
m = (forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
forall r a.
SquealEnv r =>
(forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
unsafeRunSquealTransaction (TransactionMode -> PQ db db IO a -> PQ db db IO a
forall (tx :: * -> *) (db :: SchemasType) x.
(MonadUnliftIO tx, MonadPQ db tx) =>
TransactionMode -> tx x -> tx x
Squeal.ephemerally TransactionMode
m)

-- | Analogue of 'Squeal.ephemerally_'.
--
-- @since 0.1.0.0
ephemerally_ :: (SquealEnv r) => r -> TxM r a -> IO a
ephemerally_ :: r -> TxM r a -> IO a
ephemerally_ = (forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
forall r a.
SquealEnv r =>
(forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a)
-> r -> TxM r a -> IO a
unsafeRunSquealTransaction forall (db :: SchemasType). PQ db db IO a -> PQ db db IO a
forall (tx :: * -> *) (db :: SchemasType) x.
(MonadUnliftIO tx, MonadPQ db tx) =>
tx x -> tx x
Squeal.ephemerally_