module Hasql.Core.Batch where
import Hasql.Prelude
import Hasql.Core.Model
import qualified Hasql.Core.Statement as A
import qualified Hasql.Core.Request as C
import qualified Hasql.Core.PreparedStatementRegistry as D
import qualified ByteString.StrictBuilder as E
import qualified Hasql.Core.DecodeResult as F
import qualified VectorBuilder.Vector as O
import qualified Data.Vector as G
newtype Batch result =
Batch (Bool -> D.Registry -> (C.Request result, D.Registry))
deriving instance Functor Batch
instance Applicative Batch where
pure x =
Batch (\_ psr -> (pure x, psr))
(<*>) (Batch left) (Batch right) =
Batch (\(!idt) (!psr) -> case left idt psr of
(leftRequest, leftPsr) -> case right idt leftPsr of
(rightRequest, rightPsr) -> (leftRequest <*> rightRequest, rightPsr))
statement :: A.Statement params result -> params -> Batch result
statement (A.Statement template paramOIDs paramBytesBuilder1 paramBytesBuilder2 interpretResponses1 interpretResponses2 prepared) params =
Batch $ \(!idt) (!psr) ->
if prepared
then case D.lookupOrRegister template paramOIDs psr of
(!newOrOldName, !newPsr) ->
let
request =
case newOrOldName of
Left name ->
C.unparsedStatement name template paramOIDs
(bool paramBytesBuilder2 paramBytesBuilder1 idt params)
(bool interpretResponses2 interpretResponses1 idt)
Right name ->
C.parsedStatement name template (G.length paramOIDs)
(bool paramBytesBuilder2 paramBytesBuilder1 idt params)
(bool interpretResponses2 interpretResponses1 idt)
in (request, newPsr)
else
let
request =
C.unparsedStatement "" template paramOIDs
(bool paramBytesBuilder2 paramBytesBuilder1 idt params)
(bool interpretResponses2 interpretResponses1 idt)
in (request, psr)