#!/bin/sh

#
# This file is released under the terms of the Artistic License.
# Please see the file LICENSE, included in this package, for details.
#
# Copyright (C) 2006 Mark Wong & Open Source Development Labs, Inc.
#

clean_up()
{
	COMMAND=""
	HOST=${1}
	if [ -n "${HOST}" ]; then
		COMMAND="ssh ${HOST}"
	fi
	# FIXME Running blindly on all systems.
	${COMMAND} ${DB_COMMAND} ${PGDIR}/destroy-installation -f
	if [ ${SAVE} -eq 0 ]; then
		${COMMAND} rm -rf ${WORKING_DIR}/${MODULE} || exit 1
	fi
	${COMMAND} rm -rf ${INSTALL_DIR} || exit 1
}

install_src()
{
	COMMAND=""
	HOST=${1}
	if [ -n "${HOST}" ]; then
		COMMAND="ssh ${HOST}"
	fi
	${COMMAND} ${PGDIR}/install-source ${DATE} ${WORKING_DIR} ${INSTALL_DIR} \
			${J_FLAG} ${FORCE} || exit 1
}

MODULE="pgsql"
INSTALL_DIR="/tmp/pgsql-tmp"
WORKING_DIR="/tmp"

DATE=`date +%Y-%m-%d --date="yesterday"`
FORCE=0
GENERATE_DATA=0
REBOOT=0
SCALE_FACTOR=1
SAVE=0

DBCON=20
DB_HOSTNAME="localhost"
DURATION=120

while getopts "b:C:c:D:d:fgh:j:nop:rw:" OPT; do
	case ${OPT} in
	b)
		LOAD_PARAMETERS=${OPTARG}
		;;
	C)
		COMMENT=${OPTARG}
		;;
	c)
		DBCON=`echo ${OPTARG} | egrep "^[0-9]+$"`
		;;
	D)
		DATE=${OPTARG}
		if [ -d ${DATE} ]; then
			SAVE=1
		fi
		;;
	d)
		DURATION=`echo ${OPTARG} | egrep "^[0-9]+$"`
		;;
	f)
		FORCE=1
		;;
	g)
		GENERATE_DATA=1
		;;
	h)
		DB_HOSTNAME="${OPTARG}"
		DB_COMMAND="ssh ${DB_HOSTNAME}"
		;;
	j)
		J_FLAG="-j${OPTARG}"
		;;
	n)
		NO_THINK="-n"
		;;
	o)
		OPROFILE_FLAG="-o"
		;;
	p)
		TEST_PARAMETERS=${OPTARG}
		;;
	r)
		REBOOT=1
		;;
	w)
		SCALE_FACTOR=${OPTARG}
		;;
	esac
done
DEFAULT_COMMENT="autotesting ${DATE} ${SCALE_FACTOR}"
if [ "x${COMMENT}" == "x" ]; then
	COMMENT="${DEFAULT_COMMENT}"
fi

#
# Export and install PostgreSQL from CVS.
#
install_src &
if [ ! "${DB_HOSTNAME}" == "localhost" ]; then
	install_src ${DB_HOSTNAME} &
fi
wait

#
# Need to figure out why 'make distclean' doesn't clean out stored funcs.
#
${DB_COMMAND} rm -f ${TOPDIR}/storedproc/pgsql/c/funcs.o
${DB_COMMAND} rm -f ${TOPDIR}/storedproc/pgsql/c/funcs.so
#
# Configure kit and rebuild stored functions.
#
(cd ${TOPDIR} && make distclean > /dev/null 2>&1)
(cd ${TOPDIR} && ./configure --with-postgresql=${INSTALL_DIR} > /dev/null 2>&1 && make > /dev/null 2>&1) || exit 1
if [ ! "${DB_HOSTNAME}" == "localhost" ]; then
	${DB_COMMAND} "(cd ${TOPDIR} && make distclean > /dev/null 2>&1)"
	${DB_COMMAND} "(cd ${TOPDIR} && ./configure --with-postgresql=${INSTALL_DIR} > /dev/null 2>&1 && make > /dev/null 2>&1)" || exit 1
fi
#
# Source pgsql environment.
#
source ${TOPDIR}/bin/dbt2_profile || exit 1

if [ ${FORCE} -eq 1 ]; then
	${DB_COMMAND} ${PGDIR}/destroy-installation -f
fi

#
# Generate database data.
#
if [ ${GENERATE_DATA} -eq 1 ]; then
	${DB_COMMAND} mkdir -p ${DBDATA}/${SCALE_FACTOR} || exit 1
	${DB_COMMAND} ${TOPDIR}/src/datagen --pgsql -d ${DBDATA}/${SCALE_FACTOR} \
			-w ${SCALE_FACTOR}
fi
#
# Build the database.
#
if [ -n "${DB_COMMAND}" ]; then
	${DB_COMMAND} "${PGDIR}/build_db.sh -d ${DBDATA}/${SCALE_FACTOR} -t -b \
			-p \"${LOAD_PARAMETERS}\"" > /dev/null 2>&1 || exit 1
else
	${PGDIR}/build_db.sh -d ${DBDATA}/${SCALE_FACTOR} -t -b \
			-p "${LOAD_PARAMETERS}" > /dev/null 2>&1 || exit 1
fi
#
# Start the test.
#
if [ -n "${TEST_PARAMETERS}" ]; then
	${TOPDIR}/bin/run_workload.sh -w ${SCALE_FACTOR} -d ${DURATION} \
			-c ${DBCON} -s 100 -p "${TEST_PARAMETERS}" ${OPROFILE_FLAG} \
			-z "${COMMENT}" -h ${DB_HOSTNAME} ${NO_THINK} || exit 1
else
	${TOPDIR}/bin/run_workload.sh -w ${SCALE_FACTOR} -d ${DURATION} \
			-c ${DBCON} -s 100 ${OPROFILE_FLAG} \
			-z "${COMMENT}" -h ${DB_HOSTNAME} ${NO_THINK} || exit 1
fi

if [ ${FORCE} -eq 1 ]; then
	#
	# If you don't know why the postmaster isn't shutting down sometimes,
	# so kill it.
	#
	${DB_COMMAND} killall -9 postmaster
	${DB_COMMAND} rm -f /tmp/.s.PGSQL.5432
	${DB_COMMAND} rm -f /tmp/.s.PGSQL.5432.lock
fi

#
# Cleaning up.
#
clean_up &
if [ ! "${DB_HOSTNAME}" == "localhost" ]; then
	clean_up ${DB_HOSTNAME} &
fi
wait

exit 0
