From d2ad716527d94195dfbbdacd9432fb1cf767800d Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Fri, 23 Dec 2011 16:14:28 +0000 Subject: [PATCH] Fix create_undef.pl script to generate correct uninstall script git-svn-id: http://svn.osgeo.org/postgis/trunk@8522 b70326c6-7e19-0410-871a-916f4a2858ee --- utils/create_undef.pl | 187 ++++++++++++++++++++++++++++-------------- 1 file changed, 124 insertions(+), 63 deletions(-) diff --git a/utils/create_undef.pl b/utils/create_undef.pl index e68ea6a8b..91b15dfb3 100755 --- a/utils/create_undef.pl +++ b/utils/create_undef.pl @@ -1,5 +1,20 @@ #!/usr/bin/perl +# +# PostGIS - Spatial Types for PostgreSQL +# http://postgis.refractions.net +# +# Copyright (C) 2011 OpenGeo.org +# Copyright (C) 2009-2010 Paul Ramsey +# Copyright (C) 2001-2005 Refractions Research Inc. +# +# This is free software; you can redistribute and/or modify it under +# the terms of the GNU General Public Licence. See the COPYING file. +# + +use warnings; +use strict; + eval "exec perl -w $0 $@" if (0); @@ -22,55 +37,101 @@ my @aggs = (); my @casts = (); my @funcs = (); my @types = (); +my %type_funcs = (); +my @type_funcs= (); # function to drop _after_ type drop my @ops = (); +my @opcs = (); +my @views = (); +my @tables = (); my $version = $ARGV[1]; print "BEGIN;\n"; -if ( $version ge "73" ) -{ - print "-- Drop index bindings from system tables\n"; - print "DROP OPERATOR CLASS gist_geometry_ops USING gist CASCADE;\n"; -} -else +open( INPUT, $ARGV[0] ) || die "Couldn't open file: $ARGV[0]\n"; + +while( my $line = ) { - print "-- Drop index bindings from system tables\n"; - print "DELETE FROM pg_amproc WHERE amopclaid = (SELECT oid FROM pg_opclass WHERE opcname = 'gist_geometry_ops');\n"; - print "DELETE FROM pg_amop WHERE amopclaid = (SELECT oid FROM pg_opclass WHERE opcname = 'gist_geometry_ops');\n"; - print "DELETE FROM pg_opclass WHERE opcname = 'gist_geometry_ops';\n"; + if ($line =~ /^create function/i) { + push (@funcs, $line); + } + elsif ($line =~ /^create or replace view\s*(\w+)/i) { + push (@views, $1); + } + elsif ($line =~ /^create table \s*(\w+)/i) { + push (@tables, $1); + } + elsif ($line =~ /^create or replace function/i) { + push (@funcs, $line); + } + elsif ( $line =~ /^create operator class (\w+)/i ) { + my $opcname = $1; + my $am = ''; + while( not $line =~ /;\s*$/ ) { + if ( $line =~ /( USING (\w+))/ ) { + $am = $1; + last; + } + $line .= ; + } + if ( $am eq '' ) { + die "Couldn't parse CREATE OPERATOR CLASS $opcname\n"; + } else { + $opcname .= $am; + } + push (@opcs, $opcname) + } + elsif ($line =~ /^create operator.*\(/i) { + my $defn = $line; + while( not $defn =~ /;\s*$/ ) { + $defn .= ; + } + push (@ops, $defn) + } + elsif ($line =~ /^create aggregate/i) { + my $defn = $line; + while( not $defn =~ /;\s*$/ ) { + $defn .= ; + } + push (@aggs, $defn) + } + elsif ($line =~ /^create type (\w+)/i) { + push (@types, $1); + while( not $line =~ /;\s*$/ ) { + $line = ; + if ( $line =~ /(input|output|send|receive|typmod_in|typmod_out|analyze)\s*=\s*(\w+)/ ) { + my $role = ${1}; + my $fname = ${2}; + $type_funcs{$fname} = $role; + } + } + } + elsif ($line =~ /^create cast/i) { + push (@casts, $line) + } } +close( INPUT ); -open( INPUT, $ARGV[0] ) || die "Couldn't open file: $ARGV[0]\n"; +print "-- Drop all views.\n"; +foreach my $view (@views) +{ + print "DROP VIEW $view;\n"; +} -while( my $line = ) +print "-- Drop all tables.\n"; +foreach my $table (@tables) { - $line =~ s/[\r\n]//g; - push (@funcs, $line) if ($line =~ /^create function/i); - push (@funcs, $line) if ($line =~ /^create or replace function/i); - push (@ops, $line) if ($line =~ /^create operator.*\(/i); - push (@aggs, $line) if ($line =~ /^create aggregate/i); - push (@types, $line) if ($line =~ /^create type/i); - push (@casts, $line) if ($line =~ /^create cast/i); + print "DROP TABLE $table;\n"; } -close( INPUT ); print "-- Drop all aggregates.\n"; - foreach my $agg (@aggs) { - if ( $agg =~ /create aggregate\s*(\w+)\s*\(/i ) + if ( $agg =~ /create aggregate\s*(\w+)\s*\(\s*.*basetype = (\w+)/ism ) { - if ( $version eq "71" ) - { - print "DROP AGGREGATE $1 geometry;\n"; - } - else - { - print "DROP AGGREGATE $1 ( geometry );\n"; - } + print "DROP AGGREGATE $1 ($2);\n"; } else { @@ -78,20 +139,19 @@ foreach my $agg (@aggs) } } -print "-- Drop all operators.\n"; +print "-- Drop all operators classes and families.\n"; +foreach my $opc (@opcs) +{ + print "DROP OPERATOR CLASS $opc;\n"; + print "DROP OPERATOR FAMILY $opc;\n"; +} +print "-- Drop all operators.\n"; foreach my $op (@ops) { - if ($op =~ /create operator ([^(]+)/i ) + if ($op =~ /create operator ([^(]+)\s*\(.*LEFTARG\s*=\s*(\w+),\s*RIGHTARG\s*=\s*(\w+).*/ism ) { - if ( $version ge "73" ) - { - print "DROP OPERATOR $1 (geometry,geometry) CASCADE;\n"; - } - else - { - print "DROP OPERATOR $1 (geometry,geometry);\n"; - } + print "DROP OPERATOR $1 ($2,$3) CASCADE;\n"; } else { @@ -101,7 +161,6 @@ foreach my $op (@ops) print "-- Drop all casts.\n"; - foreach my $cast (@casts) { if ($cast =~ /create cast\s*\((.+?)\)/i ) @@ -114,7 +173,7 @@ foreach my $cast (@casts) } } -print "-- Drop all functions.\n"; +print "-- Drop all functions except " . (keys %type_funcs) . " needed for type definition.\n"; foreach my $fn (@funcs) { @@ -123,16 +182,17 @@ foreach my $fn (@funcs) my $fn_nm = $1; my $fn_arg = $2; - if ( $version ge "73" ) + $fn_arg =~ s/DEFAULT [\w']+//ig; + + if ( ! exists($type_funcs{$fn_nm}) ) { - if ( ! ( $fn_nm =~ /_in/i || $fn_nm =~ /_out/i || $fn_nm =~ /_recv/i || $fn_nm =~ /_send/i || $fn_nm =~ /_analyze/i ) ) - { - print "DROP FUNCTION $fn_nm ($fn_arg) CASCADE;\n"; - } - } + print "DROP FUNCTION IF EXISTS $fn_nm ($fn_arg);\n"; + } else { - print "DROP FUNCTION $fn_nm ($fn_arg);\n"; + if ( $type_funcs{$fn_nm} =~ /(typmod|analyze)/ ) { + push(@type_funcs, $fn); + } } } else @@ -141,30 +201,31 @@ foreach my $fn (@funcs) } } -print "-- Drop all types.\n"; +print "-- Drop all types.\n"; foreach my $type (@types) { - if ($type =~ /create type (\w+)/i ) + print "DROP TYPE $type CASCADE;\n"; +} + +print "-- Drop all functions needed for types definition.\n"; +foreach my $fn (@type_funcs) +{ + if ($fn =~ /.* function ([^(]+)\((.*)\)/i ) { - if ( $version ge "73" ) - { - print "DROP TYPE $1 CASCADE;\n"; - } - else - { - print "DROP TYPE $1;\n"; - } + my $fn_nm = $1; + my $fn_arg = $2; + + $fn_arg =~ s/DEFAULT [\w']+//ig; + + print "DROP FUNCTION IF EXISTS $fn_nm ($fn_arg);\n"; } else { - die "Couldn't parse line: $type\n"; + die "Couldn't parse line: $fn\n"; } } -print "-- Drop all tables.\n"; -print "DROP TABLE spatial_ref_sys;\n"; -print "DROP TABLE geometry_columns;\n"; print "\n"; print "COMMIT;\n"; -- 2.40.0