#!/usr/bin/perl use charnames ':full'; # only necessary before v5.16 use strict; use v5.10; use warnings; use DBIx::SimpleConnect; use Encode qw(:fallbacks encode); my $db = shift // "default"; my $dbh = DBIx::SimpleConnect->connect($db, {RaiseError => 1}); my $sth = $dbh->prepare(" select locks_blocking.pid as blocking_pid, query_blocking.query as blocking_query, query_blocking.usename as blocking_username, locks_blocked.pid as blocked_pid, query_blocked.query as blocked_query, query_blocked.usename as blocked_username from pg_locks locks_blocked join pg_locks locks_blocking on (locks_blocked.locktype='relation' and locks_blocking.locktype='relation' and locks_blocked.database=locks_blocking.database and locks_blocked.relation=locks_blocking.relation or locks_blocked.locktype='transactionid' and locks_blocking.locktype='transactionid' and locks_blocked.transactionid=locks_blocking.transactionid -- don't know how to handle virtualxid ) join pg_stat_activity query_blocked on (locks_blocked.pid=query_blocked.pid) join pg_stat_activity query_blocking on (locks_blocking.pid = query_blocking.pid) where locks_blocking.granted and not locks_blocked.granted " ); $sth->execute(); my $locks = $sth->fetchall_arrayref(); binmode STDOUT, ":encoding(UTF-8)"; say ""; say ""; say ""; say ""; say ""; say ""; say ""; if (@$locks) { say ""; say ""; say map { "" } @{$sth->{NAME}}; say ""; for my $lk (@$locks) { say ""; say map { "" } @$lk; say ""; } say "
" . xmlencode($_) . "
" . (defined($_) ? xmlencode($_) : 'NULL') . "
"; } else { say "

No locks \N{WHITE SMILING FACE}

"; } say ""; say ""; exit(0); sub xmlencode { my ($s) = @_; return encode("us-ascii", $s, FB_XMLCREF); } sub format_pretty { my ($s) = @_; if (!defined $s) { return 'NULL' } $s = xmlencode($s); my @s = split(/\n/, $s); while (@s && $s[0] eq "") { shift @s } while (@s && $s[-1] eq "") { pop @s } my $leading_space = "+Inf"; for (@s) { my $sp = /^(\s+)/; if (length($sp) < $leading_space) { $leading_space = length($sp); } } for (@s) { $_ = substr($_, $leading_space); } $s = join("\n", @s); return $s; }