1#!/usr/bin/env bash 2# this script will change it's current working directory to utils 3 4DB=postgis_uninstall 5 6PGPATH=../postgis/ 7RTPATH=../raster/rt_pg/ 8 9PGFILE=uninstall_postgis.sql 10RTFILE=uninstall_rtpostgis.sql 11 12if [ "raster" == "$1" ]; then 13 OUTFILE=$RTFILE 14else 15 OUTFILE=$PGFILE 16fi 17INFILE=$OUTFILE.in.$RANDOM 18RAND1=$RANDOM 19RAND2=$RANDOM 20 21RTN=0 22 23cleanup () { 24 rm -f $INFILE $OUTFILE.$RAND1 $OUTFILE.$RAND2 25} 26 27# get reference uninstall of postgis.sql only 28if [ "$1" == "raster" ]; then 29 $0 30fi 31 32SOURCE="${BASH_SOURCE[0]}" 33while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done 34DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" 35 36# use utils as our working directory 37cd $DIR 38 39# create database 40createdb $DB 41 42# load postgis.sql 43psql -q -d $DB -f ${PGPATH}postgis.sql 44 45# raster requested, load rtpostgis.sql 46if [ "$1" == "raster" ]; then 47 psql -q -d $DB -f ${RTPATH}rtpostgis.sql 48fi 49 50# dump database loaded with postgis.sql and rtpostgis.sql and strip for only one-line DROP and SET statements 51pg_dump --format=p --clean --schema-only --no-owner --no-acl --no-tablespaces $DB | grep -E "^(DROP|SET).*;$" | grep -v -E "^DROP (SCHEMA|PROCEDURAL) .*;$" > $INFILE 52 53# drop database 54dropdb $DB 55 56# first search_path is parsed 57schema=`grep -m 1 "SET search_path = " < $INFILE | sed -e 's/SET search_path = //' -e 's/\(,\|;\)//g' -e 's/ /\n/'` 58 59# sed arguments 60sedarg="\-e 's/^DROP \(TABLE\|VIEW\|CAST\|OPERATOR CLASS\|OPERATOR\|AGGREGATE\|FUNCTION\|TYPE\)/& IF EXISTS/' " 61for x in $schema; do 62 sedarg="\-e 's/${x}.//g' "${sedarg} 63done 64 65# remove SET statements, remove schema names from DROP statements and add IF EXISTS for DROP statements 66grep -v -E "^SET" < $INFILE | eval "sed ${sedarg}" > $OUTFILE.$RAND1 67RTN=$? 68 69if [ "$RTN" != "0" ]; then 70 cleanup 71 exit $RTN 72fi 73 74kw="" 75OIFS=$IFS 76IFS=$'\n' 77echo -n '' > $OUTFILE.$RAND2 78for x in `cat $OUTFILE.$RAND1`; do 79 y=`echo "$x" | grep "CASCADE;\$"` 80 # CASCADE found, get keyword 81 if [ "x$y" != "x" ]; then 82 kw=`echo "$x" | sed -e 's/^DROP TYPE IF EXISTS //' -e 's/ CASCADE;//'` 83 echo "$x" >> $OUTFILE.$RAND2 84 continue 85 fi 86 87 # no keyword, continue 88 if [ "x$kw" == "x" ]; then 89 echo "$x" >> $OUTFILE.$RAND2 90 continue 91 fi 92 93 y=`echo "$x" | grep "($kw)"` 94 if [ "x$y" == "x" ]; then 95 echo "$x" >> $OUTFILE.$RAND2 96 continue 97 fi 98done 99IFS=$OIFS 100 101# if raster, separate raster from postgis items 102if [ "raster" == "$1" ]; then 103 OIFS=$IFS 104 IFS=$'\n' 105 106 echo -n '' > ${RTPATH}$OUTFILE 107 108 # see if line found in uninstall_postgis.sql 109 for x in `cat $OUTFILE.$RAND2`; do 110 y=`echo $x | sed -e 's/\(\[\|\]\)/\\\&/g'` 111 y=`grep "^${y}$" < ${PGPATH}$PGFILE` 112 113 # not postgis item 114 if [ "x$y" == "x" ]; then 115 echo $x >> ${RTPATH}${OUTFILE} 116 fi 117 done 118 119 IFS=$OIFS 120else 121 mv $OUTFILE.$RAND2 ${PGPATH}${OUTFILE} 122fi 123 124# cleanup 125cleanup 126 127# return error 128exit $RTN 129