module Hasql.CursorTransaction.Private.Statements where

import qualified ByteString.TreeBuilder as D
import Hasql.CursorTransaction.Private.Prelude
import qualified Hasql.CursorTransaction.Private.Specs as F
import qualified Hasql.Decoders as C
import qualified Hasql.Encoders as B
import Hasql.Statement

declareCursor :: ByteString -> ByteString -> B.Params a -> Statement a ()
declareCursor :: forall a. ByteString -> ByteString -> Params a -> Statement a ()
declareCursor ByteString
name ByteString
sql Params a
encoder =
  ByteString -> Params a -> Result () -> Bool -> Statement a ()
forall params result.
ByteString
-> Params params
-> Result result
-> Bool
-> Statement params result
Statement ByteString
sql' Params a
encoder Result ()
C.noResult Bool
False
  where
    sql' :: ByteString
sql' =
      Builder -> ByteString
D.toByteString
        (Builder -> ByteString) -> Builder -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder
"DECLARE "
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
D.byteString ByteString
name
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
" NO SCROLL CURSOR FOR "
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
D.byteString ByteString
sql

closeCursor :: ByteString -> Statement () ()
closeCursor :: ByteString -> Statement () ()
closeCursor ByteString
name =
  ByteString -> Params () -> Result () -> Bool -> Statement () ()
forall params result.
ByteString
-> Params params
-> Result result
-> Bool
-> Statement params result
Statement ByteString
sql Params ()
B.noParams Result ()
C.noResult Bool
True
  where
    sql :: ByteString
sql =
      ByteString
"CLOSE " ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString
name

fetchFromCursor :: ByteString -> F.BatchSize -> C.Result result -> Statement () result
fetchFromCursor :: forall result.
ByteString -> BatchSize -> Result result -> Statement () result
fetchFromCursor ByteString
name (F.BatchSize Int64
batchSize) Result result
decoder =
  ByteString
-> Params () -> Result result -> Bool -> Statement () result
forall params result.
ByteString
-> Params params
-> Result result
-> Bool
-> Statement params result
Statement ByteString
sql Params ()
encoder Result result
decoder Bool
True
  where
    sql :: ByteString
sql =
      Builder -> ByteString
D.toByteString
        (Builder -> ByteString) -> Builder -> ByteString
forall a b. (a -> b) -> a -> b
$ Builder
"FETCH FORWARD "
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int64 -> Builder
forall a. Integral a => a -> Builder
D.asciiIntegral Int64
batchSize
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
" FROM "
        Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> ByteString -> Builder
D.byteString ByteString
name
    encoder :: Params ()
encoder =
      Params ()
B.noParams