#!/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 The DBT-2 Authors
#

usage()
{
	echo "Usage:"
	echo "    dbt2-pgsql-build-db [OPTION]... [DBNAME]"
	echo "    dbt2-pgsql-build-db -h"
	echo ""
	echo "Options:"
	echo "    -i <sharedir>"
	echo "        Directory with plpgsql stored functions"
	echo "    -l <port>"
	echo "        PostgreSQL port"
	echo "    -p <database_parameters>"
	echo "        PostgreSQL database parameters."
	echo "    -r"
	echo "        Drop existing database before building a new database"
	echo "    -s <c | plpgsql>"
	echo "        User defined functions to install, default: plpgsql"
	echo "    -t"
	echo "        Use tablespaces."
	echo "    -u"
	echo "        Run as a privileged PostgreSQL user."
	echo "    -w <scale factor>"
	echo "        Number of warehouses to build, default: 1"
	echo "    -f"
	echo "        Perform vacuum operation in FULL mode."
}

WAREHOUSES=1
GENERATE_DATAFILE=0
PRIVILEGED=0
REBUILD_DB=0
UDF_TYPE="plpgsql"
VACUUM_FULL=0

while getopts "hi:l:p:rs:tuw:f" OPT; do
	case ${OPT} in
	h)
		usage
		exit 0
		;;
	i)
		SHAREDIRARG="-i ${OPTARG}"
		;;
	l)
		PORT=${OPTARG}
		;;
	p)
		PARAMETERS=$OPTARG
		;;
	r)
		REBUILD_DB=1
		;;
	s)
		UDF_TYPE=$OPTARG
		;;
	t)
		TABLESPACES_FLAG="-t"
		;;
	u)
		PRIVILEGED=1
		;;
	w)
		WAREHOUSES=${OPTARG}
		;;
	f)
		VACUUM_FULL=1
		;;
	esac
done

shift "$(( OPTIND - 1 ))"
if [ ! "$1" = "" ]; then
	export DBT2DBNAME="$1"
fi

if [ ! "x${PORT}" = "x" ]; then
	PORTARG="-l ${PORT}"
fi

if [ $REBUILD_DB -eq 1 ] && [ -d $DBT2PGDATA ]; then
	if [ $PRIVILEGED -eq 1 ]; then
		echo "Restarting the database to reset database parameters..."
		dbt2 pgsql-stop-db
		dbt2 pgsql-start-db -p "${PARAMETERS}" || exit 1
	fi
	dbt2 pgsql-drop-db "${PORTARG}"
fi

if [ $PRIVILEGED -eq 1 ]; then
	dbt2 pgsql-init-db "${PORTARG}" || exit 1
	dbt2 pgsql-start-db -p "$PARAMETERS" || exit 1
fi
dbt2 pgsql-create-db "${PORTARG}" || exit 1
eval "dbt2 pgsql-create-tables ${PORTARG} ${TABLESPACES_FLAG}" || exit 1

SEED=$(dbt2 rand 1 18446744073709551615 0)

# FIXME: Make datagen take argument instead of setting environment variables
# for psql.
export PGPORT="${PORT}"
export PGDATABASE="${DBT2DBNAME}"

eval "dbt2 pgsql-load-db ${PORTARG} -s ${SEED} -w ${WAREHOUSES}" || exit 1
eval "dbt2 pgsql-create-indexes ${PORTARG} ${TABLESPACES_FLAG}" || exit 1
eval "dbt2 pgsql-load-stored-procs ${SHAREDIRARG} ${PORTARG} -t ${UDF_TYPE}" \
		|| exit 1

if [ ! "x${PORT}" = "x" ]; then
	PORTARG="-p ${PORT}"
fi

SEED=$(dbt2 rand -1 1 15)
psql ${PORTARG} -e -d ${DBT2DBNAME} -c "SELECT setseed(${SEED});" || exit 1

# Set the number of vacuumdb jobs to 1 (no parallelism) and let see
# if the system can support a greater value.
VACUUM_JOBS=1
# Based on server version, enable vaccumdb parallelism if that version
# is greater than or equal to 9.5.
PG_VERSION_NUM=$(psql ${PORTARG} -At -d ${DBT2DBNAME} -c "SHOW server_version_num")
PG_VERSION_NUM=$(( $PG_VERSION_NUM + 0 ))
if [ $PG_VERSION_NUM -ge 95000 ]; then
	# Set default vacuum jobs to 9 because this is the number of tables
	# present in the database. Setting the number of job to a value
	# greater than 9 won't bring any additional benefit.
	VACUUM_JOBS=9
	# If the number of CPUs is less than 9, then we set the vacuum job
	# number to that number of CPUs.
	if [ -f "/proc/stat" ]; then
		CPUS=$(grep cpu /proc/stat | wc -l)
		CPUS=$(( $CPUS - 1 ))
		if [ $CPUS -lt $VACUUM_JOBS ]; then
			VACUUM_JOBS=$CPUS
		fi
	fi
fi

# VACUUM FULL ANALYZE: Build optimizer statistics for newly-created
# tables. The VACUUM FULL is probably unnecessary; we want to scan the
# heap and update the commit-hint bits on each new tuple, but a regular
# VACUUM ought to suffice for that.
# Note: by default, VACUUM FREEZE ANALYZE is performed. The -f option
# can be used to execute VACUUM in FULL mode.

# Perform VACUUM FREEZE ANALYZE by default
VACUUM_OPTS="-z -F"
if [ $VACUUM_FULL -eq 1 ]; then
	VACUUM_OPTS="-z -f"
fi

# Use vacuumdb's -j option only if VACUUM_JOBS is greater than 1.
if [ $VACUUM_JOBS -gt 1 ]; then
	VACUUM_OPTS="$VACUUM_OPTS -j $VACUUM_JOBS"
fi

vacuumdb ${PORTARG} ${VACUUM_OPTS} -d ${DBT2DBNAME} || exit 1

exit 0
