PG164_PGDATA="/c/data164"
PG166_PGDATA="/c/data166"
PG170_PGDATA="/c/data170"
TMPDIR="/c/tmp"
TMPDIR_WIN="C:\tmp"
PG164_BIN="/c/Progra~1/PostgreSQL/16.4/bin"
PG166_BIN="/c/Progra~1/PostgreSQL/16/bin"
PG170_BIN="/c/Progra~1/PostgreSQL/17/bin"

ROWS=$((1000 * 1000 * 1000))
CLIENTS="1 2 4 8 16 32 64 128 256"

${PG164_BIN}/pg_ctl stop -D ${PG164_PGDATA} -mi
${PG166_BIN}/pg_ctl stop -D ${PG166_PGDATA} -mi
${PG170_BIN}/pg_ctl stop -D ${PG170_PGDATA} -mi
rm -rf $PG164_PGDATA $PG166_PGDATA $PG170_PGDATA

echo "initializing clusters ..."
${PG164_BIN}/initdb -D $PG164_PGDATA -E UTF8 --no-locale
${PG166_BIN}/initdb -D $PG166_PGDATA -E UTF8 --no-locale
${PG170_BIN}/initdb -D $PG170_PGDATA -E UTF8 --no-locale

cat <<EOF >> ${PG164_PGDATA}/postgresql.conf
port = 5515
max_wal_size = 50GB
shared_buffers = 20GB
max_connections = 500
EOF
cat <<EOF >> ${PG166_PGDATA}/postgresql.conf
port = 5516
max_wal_size = 50GB
shared_buffers = 20GB
max_connections = 500
EOF
cat <<EOF >> ${PG170_PGDATA}/postgresql.conf
port = 5517
max_wal_size = 50GB
shared_buffers = 20GB
max_connections = 500
EOF

if [ "$1" != "skip_file_init" ]; then
    echo "prepare load files..."
    ${PG166_BIN}/pg_ctl start -D ${PG166_PGDATA}
    for c in $CLIENTS
    do
	rm -f ${TMPDIR}/tmp_${c}.data
	${PG166_BIN}/psql -d postgres -p 5516 -X -c "copy (select generate_series(1, $ROWS / $c)) to '${TMPDIR_WIN}\tmp_${c}.data'"
    done
    ${PG166_BIN}/pg_ctl stop -D ${PG166_PGDATA}
fi

echo "start benchmark ..."
for version in PG170 PG166 PG164
do
    PSQL=""
    if [ "$version" == "PG164" ]; then
	PSQL="${PG164_BIN}/psql -p 5515 -d postgres"
	${PG164_BIN}/pg_ctl start -D ${PG164_PGDATA}
    elif [ "$version" == "PG170" ]; then
	PSQL="${PG170_BIN}/psql -p 5517 -d postgres"
	${PG170_BIN}/pg_ctl start -D ${PG170_PGDATA}
    else
	PSQL="${PG166_BIN}/psql -p 5516 -d postgres"
	${PG166_BIN}/pg_ctl start -D ${PG166_PGDATA}
    fi

    ${PSQL} -c "create unlogged table test (c int) with (autovacuum_enabled = off)"

    for c in $CLIENTS
    do
	${PSQL} -c "truncate test" > /dev/null 2>&1

	chileren=()
	start=`date +%s`
	for i in `seq 1 $c`
	do
	    ${PSQL} -c "copy test from '${TMPDIR_WIN}/tmp_${c}.data'" > /dev/null 2>&1 &
	    children+=($!)
	done
	wait ${children[@]}
	end=`date +%s`

	echo "$version: nclients = $c, time  = $(( $end - $start ))"
    done

    if [ "$version" == "PG164" ]; then
	${PG164_BIN}/pg_ctl stop -D ${PG164_PGDATA} -mi
    elif [ "$version" == "PG170" ]; then
	${PG170_BIN}/pg_ctl stop -D ${PG170_PGDATA} -mi
    else
	${PG166_BIN}/pg_ctl stop -D ${PG166_PGDATA} -mi
    fi
done
