@@ -1,8 +1,8 @@
11{-# LANGUAGE DeriveDataTypeable #-}
22{-# LANGUAGE OverloadedStrings #-}
33
4−-- | Module for parsing errors from posgresql error messages.
5−-- Currently in only parses integrity violation errors (class 23).
4+-- | Module for parsing errors from postgresql error messages.
5+-- Currently only parses integrity violation errors (class 23).
66--
77-- /Note: Success of parsing may depend on language settings./
88----------------------------------------------------------
@@ -11,6 +11,9 @@ module Database.PostgreSQL.Simple.Errors
1111 , constraintViolation
1212 , constraintViolationE
1313 , catchViolation
14+ , isSerializationError
15+ , isNoActiveTransactionError
16+ , isFailedTransactionError
1417 )
1518 where
1619
@@ -106,3 +109,20 @@ parseQ2 = (,) <$> parseQ1 <*> parseQ1
106109
107110parseMaybe :: Parser a -> ByteString -> Maybe a
108111parseMaybe p b = either (const Nothing) Just $ parseOnly p b
112+
113+------------------------------------------------------------------------
114+-- Error predicates
115+--
116+-- http://www.postgresql.org/docs/current/static/errcodes-appendix.html
117+
118+isSerializationError :: SqlError -> Bool
119+isSerializationError = isSqlState "40001"
120+
121+isNoActiveTransactionError :: SqlError -> Bool
122+isNoActiveTransactionError = isSqlState "25P01"
123+
124+isFailedTransactionError :: SqlError -> Bool
125+isFailedTransactionError = isSqlState "25P02"
126+
127+isSqlState :: ByteString -> SqlError -> Bool
128+isSqlState s SqlError{..} = sqlState == s