129 lines
2.7 KiB
Bash
Executable File
129 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# this script will change it's current working directory to utils
|
|
|
|
DB=postgis_uninstall
|
|
|
|
PGPATH=../postgis/
|
|
RTPATH=../raster/rt_pg/
|
|
|
|
PGFILE=uninstall_postgis.sql
|
|
RTFILE=uninstall_rtpostgis.sql
|
|
|
|
if [ "raster" == "$1" ]; then
|
|
OUTFILE=$RTFILE
|
|
else
|
|
OUTFILE=$PGFILE
|
|
fi
|
|
INFILE=$OUTFILE.in.$RANDOM
|
|
RAND1=$RANDOM
|
|
RAND2=$RANDOM
|
|
|
|
RTN=0
|
|
|
|
cleanup () {
|
|
rm -f $INFILE $OUTFILE.$RAND1 $OUTFILE.$RAND2
|
|
}
|
|
|
|
# get reference uninstall of postgis.sql only
|
|
if [ "$1" == "raster" ]; then
|
|
$0
|
|
fi
|
|
|
|
SOURCE="${BASH_SOURCE[0]}"
|
|
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
|
|
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
|
|
|
# use utils as our working directory
|
|
cd $DIR
|
|
|
|
# create database
|
|
createdb $DB
|
|
|
|
# load postgis.sql
|
|
psql -q -d $DB -f ${PGPATH}postgis.sql
|
|
|
|
# raster requested, load rtpostgis.sql
|
|
if [ "$1" == "raster" ]; then
|
|
psql -q -d $DB -f ${RTPATH}rtpostgis.sql
|
|
fi
|
|
|
|
# dump database loaded with postgis.sql and rtpostgis.sql and strip for only one-line DROP and SET statements
|
|
pg_dump --format=p --clean --schema-only --no-owner --no-acl --no-tablespaces $DB | grep -E "^(DROP|SET).*;$" | grep -v -E "^DROP (SCHEMA|PROCEDURAL) .*;$" > $INFILE
|
|
|
|
# drop database
|
|
dropdb $DB
|
|
|
|
# first search_path is parsed
|
|
schema=`grep -m 1 "SET search_path = " < $INFILE | sed -e 's/SET search_path = //' -e 's/\(,\|;\)//g' -e 's/ /\n/'`
|
|
|
|
# sed arguments
|
|
sedarg="\-e 's/^DROP \(TABLE\|VIEW\|CAST\|OPERATOR CLASS\|OPERATOR\|AGGREGATE\|FUNCTION\|TYPE\)/& IF EXISTS/' "
|
|
for x in $schema; do
|
|
sedarg="\-e 's/${x}.//g' "${sedarg}
|
|
done
|
|
|
|
# remove SET statements, remove schema names from DROP statements and add IF EXISTS for DROP statements
|
|
grep -v -E "^SET" < $INFILE | eval "sed ${sedarg}" > $OUTFILE.$RAND1
|
|
RTN=$?
|
|
|
|
if [ "$RTN" != "0" ]; then
|
|
cleanup
|
|
exit $RTN
|
|
fi
|
|
|
|
kw=""
|
|
OIFS=$IFS
|
|
IFS=$'\n'
|
|
echo -n '' > $OUTFILE.$RAND2
|
|
for x in `cat $OUTFILE.$RAND1`; do
|
|
y=`echo "$x" | grep "CASCADE;\$"`
|
|
# CASCADE found, get keyword
|
|
if [ "x$y" != "x" ]; then
|
|
kw=`echo "$x" | sed -e 's/^DROP TYPE IF EXISTS //' -e 's/ CASCADE;//'`
|
|
echo "$x" >> $OUTFILE.$RAND2
|
|
continue
|
|
fi
|
|
|
|
# no keyword, continue
|
|
if [ "x$kw" == "x" ]; then
|
|
echo "$x" >> $OUTFILE.$RAND2
|
|
continue
|
|
fi
|
|
|
|
y=`echo "$x" | grep "($kw)"`
|
|
if [ "x$y" == "x" ]; then
|
|
echo "$x" >> $OUTFILE.$RAND2
|
|
continue
|
|
fi
|
|
done
|
|
IFS=$OIFS
|
|
|
|
# if raster, separate raster from postgis items
|
|
if [ "raster" == "$1" ]; then
|
|
OIFS=$IFS
|
|
IFS=$'\n'
|
|
|
|
echo -n '' > ${RTPATH}$OUTFILE
|
|
|
|
# see if line found in uninstall_postgis.sql
|
|
for x in `cat $OUTFILE.$RAND2`; do
|
|
y=`echo $x | sed -e 's/\(\[\|\]\)/\\\&/g'`
|
|
y=`grep "^${y}$" < ${PGPATH}$PGFILE`
|
|
|
|
# not postgis item
|
|
if [ "x$y" == "x" ]; then
|
|
echo $x >> ${RTPATH}${OUTFILE}
|
|
fi
|
|
done
|
|
|
|
IFS=$OIFS
|
|
else
|
|
mv $OUTFILE.$RAND2 ${PGPATH}${OUTFILE}
|
|
fi
|
|
|
|
# cleanup
|
|
cleanup
|
|
|
|
# return error
|
|
exit $RTN
|