hasql-transaction 0.6.0.1 → 0.7
raw patch · 10 files changed
+134/−134 lines, 10 filesdep ~hasqlPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hasql
API changes (from Hackage documentation)
- Hasql.Transaction: query :: a -> Query a b -> Transaction b
+ Hasql.Transaction: statement :: a -> Statement a b -> Transaction b
Files
- conflicts-test/Main.hs +15/−15
- conflicts-test/Main/Queries.hs +0/−47
- conflicts-test/Main/Statements.hs +47/−0
- conflicts-test/Main/Transactions.hs +5/−5
- hasql-transaction.cabal +4/−4
- library/Hasql/Transaction.hs +1/−1
- library/Hasql/Transaction/Private/Queries.hs +0/−50
- library/Hasql/Transaction/Private/Sessions.hs +6/−6
- library/Hasql/Transaction/Private/Statements.hs +50/−0
- library/Hasql/Transaction/Private/Transaction.hs +6/−6
conflicts-test/Main.hs view
@@ -5,7 +5,7 @@ import qualified Hasql.Session as B import qualified Hasql.Transaction as C import qualified Hasql.Transaction.Sessions as G-import qualified Main.Queries as D+import qualified Main.Statements as D import qualified Main.Transactions as E import qualified Control.Concurrent.Async as F @@ -57,14 +57,14 @@ transactionsTest :: Test transactionsTest connection1 connection2 = do- id1 <- session connection1 (B.query 0 D.createAccount)- id2 <- session connection1 (B.query 0 D.createAccount)+ id1 <- session connection1 (B.statement 0 D.createAccount)+ id2 <- session connection1 (B.statement 0 D.createAccount) async1 <- F.async (replicateM_ 1000 (transaction connection1 (E.transfer id1 id2 1))) async2 <- F.async (replicateM_ 1000 (transaction connection2 (E.transfer id1 id2 1))) F.wait async1 F.wait async2- balance1 <- session connection1 (B.query id1 D.getBalance)- balance2 <- session connection1 (B.query id2 D.getBalance)+ balance1 <- session connection1 (B.statement id1 D.getBalance)+ balance2 <- session connection1 (B.statement id2 D.getBalance) traceShowM balance1 traceShowM balance2 return (balance1 == Just 2000 && balance2 == Just (-2000))@@ -72,14 +72,14 @@ readAndWriteTransactionsTest :: Test readAndWriteTransactionsTest connection1 connection2 = do- id1 <- session connection1 (B.query 0 D.createAccount)- id2 <- session connection1 (B.query 0 D.createAccount)+ id1 <- session connection1 (B.statement 0 D.createAccount)+ id2 <- session connection1 (B.statement 0 D.createAccount) async1 <- F.async (replicateM_ 1000 (transaction connection1 (E.transfer id1 id2 1)))- async2 <- F.async (replicateM_ 1000 (transaction connection2 (C.query id1 D.getBalance)))+ async2 <- F.async (replicateM_ 1000 (transaction connection2 (C.statement id1 D.getBalance))) F.wait async1 F.wait async2- balance1 <- session connection1 (B.query id1 D.getBalance)- balance2 <- session connection1 (B.query id2 D.getBalance)+ balance1 <- session connection1 (B.statement id1 D.getBalance)+ balance2 <- session connection1 (B.statement id2 D.getBalance) traceShowM balance1 traceShowM balance2 return (balance1 == Just 1000 && balance2 == Just (-1000))@@ -87,14 +87,14 @@ transactionAndQueryTest :: Test transactionAndQueryTest connection1 connection2 = do- id1 <- session connection1 (B.query 0 D.createAccount)- id2 <- session connection1 (B.query 0 D.createAccount)+ id1 <- session connection1 (B.statement 0 D.createAccount)+ id2 <- session connection1 (B.statement 0 D.createAccount) async1 <- F.async (transaction connection1 (E.transferTimes 200 id1 id2 1))- async2 <- F.async (session connection2 (replicateM_ 200 (B.query (id1, 1) D.modifyBalance)))+ async2 <- F.async (session connection2 (replicateM_ 200 (B.statement (id1, 1) D.modifyBalance))) F.wait async1 F.wait async2- balance1 <- session connection1 (B.query id1 D.getBalance)- balance2 <- session connection1 (B.query id2 D.getBalance)+ balance1 <- session connection1 (B.statement id1 D.getBalance)+ balance2 <- session connection1 (B.statement id2 D.getBalance) traceShowM balance1 traceShowM balance2 return (balance1 == Just 400 && balance2 == Just (-200))
− conflicts-test/Main/Queries.hs
@@ -1,47 +0,0 @@-module Main.Queries where--import Rebase.Prelude-import Hasql.Query-import qualified Hasql.Encoders as E-import qualified Hasql.Decoders as D---createAccountTable :: Query () ()-createAccountTable =- statement sql E.unit D.unit False- where- sql =- "create table account (id serial not null, balance numeric not null, primary key (id))"--dropAccountTable :: Query () ()-dropAccountTable =- statement- "drop table account"- E.unit- D.unit- False--createAccount :: Query Scientific Int64-createAccount =- statement- "insert into account (balance) values ($1) returning id"- (E.value E.numeric)- (D.singleRow (D.value D.int8))- True--modifyBalance :: Query (Int64, Scientific) Bool-modifyBalance =- statement- "update account set balance = balance + $2 where id = $1"- (contrazip2 (E.value E.int8) (E.value E.numeric))- (fmap (> 0) D.rowsAffected)- True--getBalance :: Query Int64 (Maybe Scientific)-getBalance =- statement- "select balance from account where id = $1"- (E.value E.int8)- (D.maybeRow (D.value D.numeric))- True-
+ conflicts-test/Main/Statements.hs view
@@ -0,0 +1,47 @@+module Main.Statements where++import Rebase.Prelude+import Hasql.Statement+import qualified Hasql.Encoders as E+import qualified Hasql.Decoders as D+++createAccountTable :: Statement () ()+createAccountTable =+ Statement sql E.unit D.unit False+ where+ sql =+ "create table account (id serial not null, balance numeric not null, primary key (id))"++dropAccountTable :: Statement () ()+dropAccountTable =+ Statement+ "drop table account"+ E.unit+ D.unit+ False++createAccount :: Statement Scientific Int64+createAccount =+ Statement+ "insert into account (balance) values ($1) returning id"+ (E.param E.numeric)+ (D.singleRow (D.column D.int8))+ True++modifyBalance :: Statement (Int64, Scientific) Bool+modifyBalance =+ Statement+ "update account set balance = balance + $2 where id = $1"+ (contrazip2 (E.param E.int8) (E.param E.numeric))+ (fmap (> 0) D.rowsAffected)+ True++getBalance :: Statement Int64 (Maybe Scientific)+getBalance =+ Statement+ "select balance from account where id = $1"+ (E.param E.int8)+ (D.rowMaybe (D.column D.numeric))+ True+
conflicts-test/Main/Transactions.hs view
@@ -2,26 +2,26 @@ import Rebase.Prelude import Hasql.Transaction-import qualified Main.Queries as A+import qualified Main.Statements as A createSchema :: Transaction () createSchema = do- query () A.createAccountTable+ statement () A.createAccountTable dropSchema :: Transaction () dropSchema = do- query () A.dropAccountTable+ statement () A.dropAccountTable transfer :: Int64 -> Int64 -> Scientific -> Transaction Bool transfer id1 id2 amount = do- success <- query (id1, amount) A.modifyBalance+ success <- statement (id1, amount) A.modifyBalance if success then- query (id2, negate amount) A.modifyBalance+ statement (id2, negate amount) A.modifyBalance else return False
hasql-transaction.cabal view
@@ -1,7 +1,7 @@ name: hasql-transaction version:- 0.6.0.1+ 0.7 category: Hasql, Database, PostgreSQL synopsis:@@ -45,7 +45,7 @@ Hasql.Transaction.Private.Prelude Hasql.Transaction.Private.Model Hasql.Transaction.Private.SQL- Hasql.Transaction.Private.Queries+ Hasql.Transaction.Private.Statements Hasql.Transaction.Private.Sessions Hasql.Transaction.Private.Transaction exposed-modules:@@ -53,7 +53,7 @@ Hasql.Transaction.Sessions build-depends: -- database:- hasql >= 0.19 && < 0.20 || >= 1 && < 1.2,+ hasql >= 1.3 && < 1.4, -- data: bytestring-tree-builder >= 0.1 && < 0.3, bytestring >= 0.10 && < 0.11,@@ -75,7 +75,7 @@ main-is: Main.hs other-modules:- Main.Queries+ Main.Statements Main.Transactions ghc-options: -O2
library/Hasql/Transaction.hs view
@@ -6,7 +6,7 @@ Transaction, condemn, sql,- query,+ statement, ) where
− library/Hasql/Transaction/Private/Queries.hs
@@ -1,50 +0,0 @@-module Hasql.Transaction.Private.Queries-where--import Hasql.Transaction.Private.Prelude-import Hasql.Transaction.Private.Model-import qualified Hasql.Query as A-import qualified Hasql.Encoders as B-import qualified Hasql.Decoders as C-import qualified Hasql.Transaction.Private.SQL as D----- * Transactions----------------------------beginTransaction :: IsolationLevel -> Mode -> A.Query () ()-beginTransaction isolation mode =- A.statement (D.beginTransaction isolation mode) B.unit C.unit True--commitTransaction :: A.Query () ()-commitTransaction =- A.statement "COMMIT" B.unit C.unit True--abortTransaction :: A.Query () ()-abortTransaction =- A.statement "ABORT" B.unit C.unit True----- * Streaming----------------------------declareCursor :: ByteString -> ByteString -> B.Params a -> A.Query a ()-declareCursor name sql encoder =- A.statement (D.declareCursor name sql) encoder C.unit False--closeCursor :: A.Query ByteString ()-closeCursor =- A.statement "CLOSE $1" (B.value B.bytea) C.unit True--fetchFromCursor :: (b -> a -> b) -> b -> C.Row a -> A.Query (Int64, ByteString) b-fetchFromCursor step init rowDec =- A.statement sql encoder decoder True- where- sql =- "FETCH FORWARD $1 FROM $2"- encoder =- contrazip2- (B.value B.int8)- (B.value B.bytea)- decoder =- C.foldlRows step init rowDec
library/Hasql/Transaction/Private/Sessions.hs view
@@ -4,7 +4,7 @@ import Hasql.Transaction.Private.Prelude import Hasql.Transaction.Private.Model import qualified Hasql.Session as A-import qualified Hasql.Transaction.Private.Queries as B+import qualified Hasql.Transaction.Private.Statements as B {-@@ -18,17 +18,17 @@ where normal = do- A.query () (B.beginTransaction isolation mode)+ A.statement () (B.beginTransaction isolation mode) (result, commit) <- session if commit- then A.query () B.commitTransaction- else A.query () B.abortTransaction+ then A.statement () B.commitTransaction+ else A.statement () B.abortTransaction return result onError continue error = do- A.query () B.abortTransaction+ A.statement () B.abortTransaction case error of- A.ResultError (A.ServerError "40001" _ _ _) ->+ A.QueryError _ _ (A.ResultError (A.ServerError "40001" _ _ _)) -> continue _ -> throwError error
+ library/Hasql/Transaction/Private/Statements.hs view
@@ -0,0 +1,50 @@+module Hasql.Transaction.Private.Statements+where++import Hasql.Transaction.Private.Prelude+import Hasql.Transaction.Private.Model+import qualified Hasql.Statement as A+import qualified Hasql.Encoders as B+import qualified Hasql.Decoders as C+import qualified Hasql.Transaction.Private.SQL as D+++-- * Transactions+-------------------------++beginTransaction :: IsolationLevel -> Mode -> A.Statement () ()+beginTransaction isolation mode =+ A.Statement (D.beginTransaction isolation mode) B.unit C.unit True++commitTransaction :: A.Statement () ()+commitTransaction =+ A.Statement "COMMIT" B.unit C.unit True++abortTransaction :: A.Statement () ()+abortTransaction =+ A.Statement "ABORT" B.unit C.unit True+++-- * Streaming+-------------------------++declareCursor :: ByteString -> ByteString -> B.Params a -> A.Statement a ()+declareCursor name sql encoder =+ A.Statement (D.declareCursor name sql) encoder C.unit False++closeCursor :: A.Statement ByteString ()+closeCursor =+ A.Statement "CLOSE $1" (B.param B.bytea) C.unit True++fetchFromCursor :: (b -> a -> b) -> b -> C.Row a -> A.Statement (Int64, ByteString) b+fetchFromCursor step init rowDec =+ A.Statement sql encoder decoder True+ where+ sql =+ "FETCH FORWARD $1 FROM $2"+ encoder =+ contrazip2+ (B.param B.int8)+ (B.param B.bytea)+ decoder =+ C.foldlRows step init rowDec
library/Hasql/Transaction/Private/Transaction.hs view
@@ -3,9 +3,9 @@ import Hasql.Transaction.Private.Prelude import Hasql.Transaction.Private.Model-import qualified Hasql.Query as A+import qualified Hasql.Statement as A import qualified Hasql.Session as B-import qualified Hasql.Transaction.Private.Queries as C+import qualified Hasql.Transaction.Private.Statements as C import qualified Hasql.Transaction.Private.Sessions as D @@ -37,10 +37,10 @@ -- | -- Parameters and a specification of the parametric query to apply them to.-{-# INLINE query #-}-query :: a -> A.Query a b -> Transaction b-query params query =- Transaction . lift $ B.query params query+{-# INLINE statement #-}+statement :: a -> A.Statement a b -> Transaction b+statement params statement =+ Transaction . lift $ B.statement params statement -- | -- Cause transaction to eventually roll back.