#!/bin/bash
#

# set -x

WD=./test
declare -A VERS=(
#  ['9.2']=~/"inst/pg9.2/bin"
  ['9.4']=~/"inst/pg9.4/bin"
  ['9.5']=~/"inst/pg9.5/bin"
  ['9.6']=~/"inst/pg9.6/bin"
  ['master']=~/"inst/pg-master/bin"
)

export LC_ALL=C
export PGDATABASE=test

cd "$WD" || exit 1

run ()
{
    local ver=$1 bin=$2 oldbin=~/"inst/pg9.2/bin"

    echo "init"

    "$oldbin"/initdb -A trust -E UTF-8 --locale=C src || exit 1

    "$bin"/initdb -A trust -E UTF-8 --locale=C "$ver" || exit 1

    cat <<EOF > "$ver"/postgresql.conf
port = 5430
shared_buffers = 32MB
wal_level = hot_standby
#archive_mode = on
#archive_command = 'test ! -f "$ARH/%f" && ( echo "arch %p"; cp %p "$ARH/%f"; )'
max_wal_senders = 5
hot_standby = on
log_line_prefix = '%t '
#log_checkpoints = on
lc_messages = C
EOF

    cp "$ver"/postgresql.conf src/

    echo "wal level for '$ver'"

    "$bin"/pg_ctl -w -D "$ver" -l logfile."$ver" start || exit 1
    "$bin"/psql -X -q -p 5430 -d postgres -c 'show wal_level'
    "$bin"/pg_ctl -w -D "$ver" stop || exit 1

    echo "start 9.2"

    "$oldbin"/pg_ctl -w -D src -l logfile.92 start || exit 1

    echo "wal level for 9.2"
    "$oldbin"/psql -X -q -p 5430 -d postgres -c 'show wal_level'

    echo "generate some WALs ..."

    "$oldbin"/psql -X -q -p 5430 -d postgres -c 'create database test'
    "$oldbin"/psql -X -q -p 5430 -f- <<EOF
create table test (id int primary key, v text);
insert into test select n, 'this is long line for fill table, line number ' || n from generate_series(1, 10000) n;
-- vacuum analyze test;
-- select pg_current_xlog_insert_location();
EOF

    echo "stop 9.2"

    "$oldbin"/pg_ctl -w -D src stop || exit 1

    echo "run upgrade from 9.2 to '$ver'"

    "$bin"/pg_upgrade -b "$oldbin" -B "$bin" -d src -D "$ver" -k -c || exit 1

    strace -f -s 256 -e trace=process -o strace."$ver" "$bin"/pg_upgrade -b "$oldbin" -B "$bin" -d src -D "$ver" -k || exit 1

    # compare wal_level
    echo -n "9.2 -> $ver: " >> result
    "$bin"/pg_controldata "$ver" | grep wal_level >> result
}

for ver in "${!VERS[@]}"; do
    bin=${VERS[$ver]}
    echo "ver: '$ver'"

    if [[ -d "$ver" ]]; then
        echo "cleanup cluster dir '$ver' ..."
        rm -r "$ver"
    fi

    run "$ver" "$bin"
    rm -r src
done

