#!/usr/bin/perl

$#ARGV == 0 or die "Usage: pgtrace <pid>";
$pid = $ARGV[0];

open(PGTRACE,"strace -p $pid -e trace=read,write 2>&1 |") 
    or die "Can't start strace: $!";

while($line = <PGTRACE>)
{
  #print $line;
  if ($line =~ /(read|write)\((\d+), .*, (\d+)\) = (\d+)/)
  {
    $operation = $1;
    $handle = $2;
    $size = $3;
    $result = $4;
    $filename = readlink "/proc/$pid/fd/$handle";
    $database = "";
    $relation = "";
    if ($filename =~ /\/home\/postgres\/data\/base\/(\d+)\/(\d+)/)
    {
      $dboid = $1;
      $reloid = $2;
      if ($databases{$dboid})
      {
        #print "DBHIT\n";
        $database = $databases{$dboid};
      }
      else
      {
        #print "DBMISS\n";
        my $output = `/usr/lib/postgresql/bin/oid2name -q | grep $dboid`;
        if ($output =~ /(\w+)\s*=\s*(\w+)/)
        {
          $database = $2;
          $databases{$dboid} = $database;
        }
      }
      if ($relations{$reloid})
      {
        #print "RELHIT\n";
        $relation = $relations{$reloid};
      }
      else
      {
        #print "RELMISS\n";
        my $output = `/usr/lib/postgresql/bin/oid2name -q -d $database -o $reloid`;
        if ($output =~ /(\w+)\s*=\s*(\w+)/)
        {
          $relation = $2;
          $relations{$reloid} = $relation;
        }
      }
    }
    $now = localtime;
    if ($database && $relation)
    {
      print "$now $operation($database.$relation, $size) = $result\n";
    }
    else
    {
      print "$now $operation($filename, $size) = $result\n";
    }
  }
}

close(PGTRACE);
