packages feed

postgresql-types-0.1: src/pq-procedures/PqProcedures/Procedures/RunRoundtripQuery.hs

module PqProcedures.Procedures.RunRoundtripQuery
  ( RunRoundtripQueryParams (..),
    RunRoundtripQueryResult,
  )
where

import qualified Data.ByteString as ByteString
import Data.Maybe
import qualified Data.Text as Text
import Data.Word
import qualified Database.PostgreSQL.LibPQ as Pq
import PqProcedures.Algebra
import PqProcedures.Procedures.RunStatement
import Prelude

data RunRoundtripQueryParams = RunRoundtripQueryParams
  { paramOid :: Word32,
    paramEncoding :: ByteString.ByteString,
    paramFormat :: Pq.Format,
    resultFormat :: Pq.Format,
    typeSignature :: Maybe Text.Text
  }

type RunRoundtripQueryResult = ByteString.ByteString

instance Procedure RunRoundtripQueryParams RunRoundtripQueryResult where
  run connection (RunRoundtripQueryParams {..}) = do
    let sql = case typeSignature of
          Nothing -> "SELECT $1"
          Just sig -> "SELECT $1::" <> sig
    pqResult <-
      run
        connection
        RunStatementParams
          { sql = sql,
            params =
              [ Just (paramOid, paramEncoding, paramFormat)
              ],
            resultFormat = resultFormat
          }
    bytes <- Pq.getvalue pqResult 0 0
    case bytes of
      Nothing -> fail "getvalue produced no bytes"
      Just bytes -> pure bytes