{-# LANGUAGE
OverloadedStrings
, PatternSynonyms
#-}
module Squeal.PostgreSQL.Session.Exception
( SquealException (..)
, pattern UniqueViolation
, pattern CheckViolation
, pattern SerializationFailure
, SQLState (..)
, LibPQ.ExecStatus (..)
, catchSqueal
, handleSqueal
, trySqueal
, throwSqueal
) where
import Control.Exception (Exception)
import Data.ByteString (ByteString)
import Data.Text (Text)
import UnliftIO (MonadUnliftIO (..), catch, handle, try, throwIO)
import qualified Database.PostgreSQL.LibPQ as LibPQ
data SQLState = SQLState
{ sqlExecStatus :: LibPQ.ExecStatus
, sqlStateCode :: ByteString
, sqlErrorMessage :: ByteString
} deriving (Eq, Show)
data SquealException
= SQLException SQLState
| ConnectionException Text
| DecodingException Text Text
| ColumnsException Text LibPQ.Column
| RowsException Text LibPQ.Row LibPQ.Row
deriving (Eq, Show)
instance Exception SquealException
pattern UniqueViolation :: ByteString -> SquealException
pattern UniqueViolation msg =
SQLException (SQLState LibPQ.FatalError "23505" msg)
pattern CheckViolation :: ByteString -> SquealException
pattern CheckViolation msg =
SQLException (SQLState LibPQ.FatalError "23514" msg)
pattern SerializationFailure :: ByteString -> SquealException
pattern SerializationFailure msg =
SQLException (SQLState LibPQ.FatalError "40001" msg)
catchSqueal
:: MonadUnliftIO io
=> io a
-> (SquealException -> io a)
-> io a
catchSqueal = catch
handleSqueal
:: MonadUnliftIO io
=> (SquealException -> io a)
-> io a -> io a
handleSqueal = handle
trySqueal :: MonadUnliftIO io => io a -> io (Either SquealException a)
trySqueal = try
throwSqueal :: MonadUnliftIO io => SquealException -> io a
throwSqueal = throwIO