packages feed

pg-extras-0.0.1: src/PGExtras/Queries/Locks.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}

module PGExtras.Queries.Locks (locksSQL, displayLocks) where

import PGExtras.Helpers (maybeText, maybeInt, maybeBool, maybeZonedTime)
import Database.PostgreSQL.Simple
import Text.RawString.QQ
import qualified Data.Text as Text
import Data.Time (ZonedTime)
import Control.Monad (forM_)
import Data.List (intercalate)

locksSQL :: Query
locksSQL = [r|SELECT
  pg_stat_activity.pid,
  pg_class.relname,
  pg_locks.transactionid,
  pg_locks.granted,
  pg_locks.mode,
  pg_stat_activity.query AS query_snippet,
  pg_stat_activity.query_start
FROM pg_stat_activity,pg_locks left
OUTER JOIN pg_class
  ON (pg_locks.relation = pg_class.oid)
WHERE pg_stat_activity.query <> '<insufficient privilege>'
  AND pg_locks.pid = pg_stat_activity.pid
  AND pg_locks.mode IN ('ExclusiveLock', 'AccessExclusiveLock', 'RowExclusiveLock')
  AND pg_stat_activity.pid <> pg_backend_pid() order by query_start;|]

displayLocks :: [(Maybe Int, Maybe Text.Text, Maybe Text.Text, Maybe Bool, Maybe Text.Text, Maybe Text.Text, Maybe ZonedTime)] -> IO ()
displayLocks rows = do
  putStrLn $ description
  putStrLn $ intercalate " | " tableHeaders
  forM_ rows $ \(arg1, arg2, arg3, arg4, arg5, arg6, arg7) ->
    putStrLn $ maybeInt(arg1) ++ " | " ++ maybeText(arg2) ++ " | " ++ maybeText(arg3) ++ " | " ++ maybeBool(arg4) ++ " | " ++ maybeText(arg5) ++ " | " ++ maybeText(arg6) ++ " | " ++ maybeZonedTime(arg7)

description :: [Char]
description = "Queries with active exclusive locks"

tableHeaders :: [[Char]]
tableHeaders = ["procpid", "relname", "transactionid", "granted", "query_snippet", "mode", "query_start"]