#!/bin/sh

LOG_FILE=$1
MAX_DURATION=$2
FROM_DATE="24 hours ago"

usage()
{
	echo -n "Error: "
	echo $*
	echo "Usage: $0 LOG-FILE MAX-DURATION FROM-DATE"
	echo
	echo "Example Usage: $0 /var/lib/pgsql/data/pg_log/postgresql-200705.log 5000 \"24 hours ago\""
	echo "               $0 /var/lib/pgsql/data/pg_log/postgresql-200705.log 10000 \"1 week ago\""
	exit 1
}

[ -z "$1" ] && usage "You must specify a LOG-FILE."
[ -z "$2" ] && usage "You must specify a MAX-DURATION."
[ -z "$3" ] && usage "You must specify a FROM-DATE."

[ ! -e "$LOG_FILE" -o ! -f "$LOG_FILE" -o ! -r "$LOG_FILE" ] \
&& usage "Specified log file must be a readable existing regular file."

test "$MAX_DURATION" -gt 0 1>/dev/null 2>&1
[ $? -ne 0 ] && usage "You must specify a positive integer as MAX-DURATION."
MAX_DURATION="`echo \"$MAX_DURATION * 1000\" | bc | sed -r 's/^([0-9]{1,})+\..*$/\1/g'`"

FROM_EPOCH="`date -d \"$FROM_DATE\" +\"%s\" 2>/dev/null`"
[ $? -ne 0 ] && usage "You must specify a valid FROM-DATE."

TMP=`mktemp`
grep "duration: " $LOG_FILE >$TMP

N=0
while read LINE
do
	EPOCH="`date -d \"$(echo \"$LINE\" | sed -r 's/^\[(.*)+\].*$/\1/g')\" +'%s'`"
	FLOAT_DURATION="`echo \"$LINE\" | sed -r 's/^.*duration: ([0-9]{1,}\.[0-9]{1,})+ ms .*$/\1/g'`"
	INT_DURATION="`echo \"$FLOAT_DURATION * 1000\" | bc | sed -r 's/^([0-9]{1,})+\..*$/\1/g'`"

	test "$INT_DURATION" -ge "$MAX_DURATION" -a "$EPOCH" -ge "$FROM_EPOCH" 1>/dev/null 2>&1
	if [ $? -eq 0 ]
	then
		let N+=1
		printf -- "-------[ No.: %3d, Duration: %9s ]---------------------------------------------\n" $N $FLOAT_DURATION
		echo "$LINE" | sed -r 's/^.* statement: (.*)+$/\1/g'
		echo
	fi
done <$TMP
rm -f $TMP

