packages feed

haskell-pgmq-0.1.0.0: src/Database/PGMQ/Helpers.hs

{-|
Module      : Database.PGMQ.Helper
Description : Helper utilities around Database.PGMQ.Simple
Copyright   : (c) Gargantext, 2024-Present
License     : AGPL
Maintainer  : gargantext@iscpif.fr
Stability   : experimental
Portability : POSIX

-}

{-# LANGUAGE QuasiQuotes #-}


module Database.PGMQ.Helpers
  ( safeSendMessage )
where


import Database.PGMQ.Simple ( createQueue, sendMessage )
import Database.PostgreSQL.Simple qualified as PSQL
import Database.PostgreSQL.Simple.SqlQQ (sql)
import Database.PGMQ.Types (Delay, SerializableMessage, Queue)


-- | This is a wrapper around 'sendMessage' that makes sure the queue exists.
safeSendMessage :: (SerializableMessage a)
                => PSQL.Connection -> Queue -> a -> Delay -> IO Int
safeSendMessage conn queue msg delay = do
  PSQL.withTransaction conn $ do
    let magicLockId = 112233445566 :: Int
    _ <- PSQL.query conn [sql| SELECT pg_advisory_xact_lock(?) |] (PSQL.Only magicLockId) :: IO [PSQL.Only ()]
    createQueue conn queue
    sendMessage conn queue msg delay