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