packages feed

stakhanov-0.1.1.0: src/Database/PostgreSQL/Stakhanov/FIFO/Statements.hs

module Database.PostgreSQL.Stakhanov.FIFO.Statements where

import           Data.Aeson
import           Data.Int
import qualified Data.List                              as L
import qualified Data.Text                              as T
import           Data.Time
import qualified Data.Vector                            as V
import           Database.PostgreSQL.Stakhanov.Internal
import qualified Hasql.DynamicStatements.Snippet        as S
import           Hasql.Statement
import qualified Hasql.TH                               as TH
import           Prelude                                hiding (pi)

readGroupedMessages :: Statement (T.Text,Int32,Int32) (V.Vector (Int64, Int32, UTCTime, Maybe UTCTime, UTCTime, Value, Maybe Value))
readGroupedMessages =
  preparable sql readTupleEncoder tupleMessageDecoder
  where
    sql = "select " <> columnsMessage <> " from pgmq.read_grouped($1,$2,$3)"

readGroupedHeadMessages :: Statement (T.Text,Int32,Int32) (V.Vector (Int64, Int32, UTCTime, Maybe UTCTime, UTCTime, Value, Maybe Value))
readGroupedHeadMessages =
  preparable sql readTupleEncoder tupleMessageDecoder
  where
    sql = "select "<> columnsMessage <> " from pgmq.read_grouped_head($1,$2,$3)"

readGroupedMessagesWithPoll
  :: T.Text
  -> Int32
  -> Int32
  -> Maybe Int32
  -> Maybe Int32
  -> Statement () (V.Vector (Int64, Int32, UTCTime, Maybe UTCTime, UTCTime, Value, Maybe Value))
readGroupedMessagesWithPoll q vt qty mmp mpi =
  let mp = maybe 5 id mmp
      pi = maybe 100 id mpi
      snippet = "select " <> S.sql columnsMessage <> " from pgmq.read_grouped_with_poll(" <>
                mconcat (L.intersperse "," [S.param q, S.param vt, S.param qty, S.param mp, S.param pi]) <> ")"
  in S.toStatement snippet tupleMessageDecoder

readGroupedRRMessages :: Statement (T.Text,Int32,Int32) (V.Vector (Int64, Int32, UTCTime, Maybe UTCTime, UTCTime, Value, Maybe Value))
readGroupedRRMessages =
  preparable sql readTupleEncoder tupleMessageDecoder
  where
    sql = "select " <> columnsMessage <> " from pgmq.read_grouped_rr($1,$2,$3)"

readGroupedRRMessagesWithPoll
  :: T.Text
  -> Int32
  -> Int32
  -> Maybe Int32
  -> Maybe Int32
  -> Statement () (V.Vector (Int64, Int32, UTCTime, Maybe UTCTime, UTCTime, Value, Maybe Value))
readGroupedRRMessagesWithPoll q vt qty mmp mpi =
  let mp = maybe 5 id mmp
      pi = maybe 100 id mpi
      snippet = "select " <> S.sql columnsMessage <> " from pgmq.read_grouped_rr_with_poll(" <>
                mconcat (L.intersperse "," [S.param q, S.param vt, S.param qty, S.param mp, S.param pi]) <> ")"
  in S.toStatement snippet tupleMessageDecoder

createFIFOIndexQueue :: Statement T.Text ()
createFIFOIndexQueue = [TH.resultlessStatement|select from pgmq.create_fifo_index($1::text)|]

createFIFOIndexesAllQueues :: Statement () ()
createFIFOIndexesAllQueues = [TH.resultlessStatement|select from pgmq.create_fifo_indexes_all()|]