packages feed

hasql-pool-1.5.0.0: src/integration-tests/Helpers/Sessions.hs

module Helpers.Sessions
  ( selectOne,
    badQuery,
    closeConn,
    setSetting,
    getSetting,
    countConnections,
    sleep,
  )
where

import Data.Tuple.All
import Hasql.Decoders qualified as Decoders
import Hasql.Encoders qualified as Encoders
import Hasql.Session qualified as Session
import Hasql.Statement qualified as Statement
import Pqi qualified
import Prelude

selectOne :: Session.Session Int64
selectOne =
  Session.statement () statement
  where
    statement = Statement.preparable "SELECT 1::int8" Encoders.noParams decoder
    decoder = Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.int8))

badQuery :: Session.Session ()
badQuery =
  Session.statement () statement
  where
    statement =
      Statement.preparable "zzz" Encoders.noParams Decoders.noResult

closeConn :: Session.Session ()
closeConn =
  Session.onLibpqConnection \conn -> do
    Pqi.finish conn
    pure (Right (), conn)

setSetting :: Text -> Text -> Session.Session ()
setSetting name value = do
  Session.statement (name, value) statement
  where
    statement =
      Statement.preparable "SELECT set_config($1, $2, false)" encoder Decoders.noResult
    encoder =
      mconcat
        [ sel1 >$< Encoders.param (Encoders.nonNullable Encoders.text),
          sel2 >$< Encoders.param (Encoders.nonNullable Encoders.text)
        ]

getSetting :: Text -> Session.Session (Maybe Text)
getSetting name = do
  Session.statement name statement
  where
    statement = Statement.preparable "SELECT current_setting($1, true)" encoder decoder
    encoder = Encoders.param (Encoders.nonNullable Encoders.text)
    decoder = Decoders.singleRow (Decoders.column (Decoders.nullable Decoders.text))

countConnections :: Text -> Session.Session Int64
countConnections appName = do
  Session.statement appName statement
  where
    statement = Statement.preparable "SELECT count(*) FROM pg_stat_activity WHERE application_name = $1" encoder decoder
    encoder = Encoders.param (Encoders.nonNullable Encoders.text)
    decoder = Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.int8))

sleep :: Double -> Session.Session ()
sleep seconds =
  Session.statement seconds statement
  where
    statement = Statement.preparable "SELECT pg_sleep($1)" encoder Decoders.noResult
    encoder = Encoders.param (Encoders.nonNullable Encoders.float8)