hasql-transaction 1 → 1.0.0.1
raw patch · 2 files changed
+33/−24 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
hasql-transaction.cabal view
@@ -1,7 +1,7 @@ name: hasql-transaction-version: 1+version: 1.0.0.1 category: Hasql, Database, PostgreSQL-synopsis: A composable abstraction over the retryable transactions for Hasql+synopsis: Composable abstraction over retryable transactions for Hasql homepage: https://github.com/nikita-volkov/hasql-transaction bug-reports: https://github.com/nikita-volkov/hasql-transaction/issues author: Nikita Volkov <nikita.y.volkov@mail.ru>
library/Hasql/Transaction/Private/Sessions.hs view
@@ -3,8 +3,8 @@ import Hasql.Transaction.Private.Prelude import Hasql.Transaction.Private.Model-import qualified Hasql.Session as A-import qualified Hasql.Transaction.Private.Statements as B+import Hasql.Session+import qualified Hasql.Transaction.Private.Statements as Statements {-@@ -12,23 +12,32 @@ do one transaction retry in case of the 23505 error, and fail if an identical error is seen. -}-inRetryingTransaction :: IsolationLevel -> Mode -> A.Session (a, Bool) -> A.Session a-inRetryingTransaction isolation mode session =- fix $ \recur -> catchError normal (onError recur)- where- normal =- do- A.statement () (B.beginTransaction isolation mode)- (result, commit) <- session- if commit- then A.statement () B.commitTransaction- else A.statement () B.abortTransaction- return result- onError continue error =- do- A.statement () B.abortTransaction- case error of- A.QueryError _ _ (A.ResultError (A.ServerError "40001" _ _ _)) ->- continue- _ ->- throwError error+inRetryingTransaction :: IsolationLevel -> Mode -> Session (a, Bool) -> Session a+inRetryingTransaction level mode session =+ fix $ \ retry -> do+ attemptRes <- tryTransaction level mode session+ case attemptRes of+ Just a -> return a+ Nothing -> retry++tryTransaction :: IsolationLevel -> Mode -> Session (a, Bool) -> Session (Maybe a)+tryTransaction level mode body = do++ statement () (Statements.beginTransaction level mode)++ bodyRes <- catchError (fmap Just body) $ \ error -> do+ statement () Statements.abortTransaction+ handleTransactionError error $ return Nothing++ case bodyRes of+ Just (res, commit) -> catchError (commitOrAbort commit $> Just res) $ \ error -> do+ handleTransactionError error $ return Nothing+ Nothing -> return Nothing++commitOrAbort commit = if commit+ then statement () Statements.commitTransaction+ else statement () Statements.abortTransaction++handleTransactionError error onTransactionError = case error of+ QueryError _ _ (ResultError (ServerError "40001" _ _ _)) -> onTransactionError+ error -> throwError error