1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#!/bin/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
|