#!/bin/bash

INSTALL=~/install/postgres
PGDATA1=~/junk/pgdata1
PGDATA2=~/junk/pgdata2
ARCHIVE=~/junk/archive

rm -fr $PGDATA1
rm -fr $PGDATA2
rm -fr $ARCHIVE
mkdir -m 700 $PGDATA2
mkdir $ARCHIVE

$INSTALL/bin/initdb -D $PGDATA1
cat << EOF >> $PGDATA1/postgresql.conf
  wal_level = archive
  max_prepared_transactions = 1
  archive_mode = on
  archive_command = 'test ! -f $ARCHIVE/%f  && cp %p $ARCHIVE/%f'
EOF
$INSTALL/bin/pg_ctl -D $PGDATA1 -w start
$INSTALL/bin/psql postgres << EOF
  ALTER DATABASE template0 ALLOW_CONNECTIONS TRUE;
  CREATE TABLE foo AS SELECT 42 AS id;
EOF

# create one multixact so oldest and next are not equal, and
# checkpoint to get this information into pg_control, and create
# backup label which points to this checkpoint
$INSTALL/bin/psql postgres << EOF > /dev/null
  BEGIN;
  SELECT * FROM foo FOR SHARE;
  PREPARE TRANSACTION 'tx0';
  SELECT * FROM foo FOR SHARE;
  COMMIT PREPARED 'tx0';
  CHECKPOINT;
  SELECT pg_start_backup('foo', true);
EOF

# copy all data files.  $PGDATA2 gets only 0000
cp -R $PGDATA1/* $PGDATA2/

# make enough multixacts to create pg_multixact/offsets/0001
$INSTALL/bin/psql postgres << EOF
  BEGIN;
  SELECT * FROM foo FOR SHARE;
  PREPARE TRANSACTION 'tx1';
EOF
( for ((i=0;i<65536;i++)) ; do echo "SELECT * FROM foo FOR SHARE;" ; done ) | $INSTALL/bin/psql postgres > /dev/null
$INSTALL/bin/psql postgres << EOF
  COMMIT PREPARED 'tx1';
EOF

# advance the system oldest multixact ID to delete pg_multixact/offsets/0000
$INSTALL/bin/vacuumdb --freeze --all
$INSTALL/bin/psql postgres -c "CHECKPOINT"

# create one more multixact so oldest and next are not equal, and checkpoint
$INSTALL/bin/psql postgres << EOF > /dev/null
  BEGIN;
  SELECT * FROM foo FOR SHARE;
  PREPARE TRANSACTION 'tx2';
  SELECT * FROM foo FOR SHARE;
  COMMIT PREPARED 'tx2';
  CHECKPOINT;
EOF

# now copy control file (like baseback which does that last)
cp $PGDATA1/global/pg_control $PGDATA2/global/

$INSTALL/bin/psql postgres -c "SELECT pg_stop_backup()"

$INSTALL/bin/pg_ctl -D $PGDATA1 -w stop

cat > $PGDATA2/recovery.conf << EOF
  restore_command = 'cp $ARCHIVE/%f %p'
EOF

echo "---------------------------------------------------"
echo $PGDATA1
$INSTALL/bin/pg_controldata -D $PGDATA1 | grep MultiX
ls $PGDATA1/pg_multixact/offsets
echo "---------------------------------------------------"
echo $PGDATA2
$INSTALL/bin/pg_controldata -D $PGDATA2 | grep MultiX
ls $PGDATA2/pg_multixact/offsets
echo "---------------------------------------------------"

# ... and now try to start up with -D $PGDATA2...


