From 3f6299df6c7d905bdef44eb3a4b19f248ebc14dc Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 11 Apr 2002 19:23:36 +0000 Subject: [PATCH] Fix pg_upgrade to handle dbnames, user/group names with spaces. --- src/bin/pg_dump/pg_dumpall.sh | 36 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/bin/pg_dump/pg_dumpall.sh b/src/bin/pg_dump/pg_dumpall.sh index 65702fe94e..6fe8df8a90 100644 --- a/src/bin/pg_dump/pg_dumpall.sh +++ b/src/bin/pg_dump/pg_dumpall.sh @@ -6,7 +6,7 @@ # and "pg_group" tables, which belong to the whole installation rather # than any one individual database. # -# $Header: /cvsroot/pgsql/src/bin/pg_dump/Attic/pg_dumpall.sh,v 1.17 2002/04/11 04:56:21 momjian Exp $ +# $Header: /cvsroot/pgsql/src/bin/pg_dump/Attic/pg_dumpall.sh,v 1.18 2002/04/11 19:23:36 momjian Exp $ CMDNAME="`basename $0`" @@ -24,7 +24,8 @@ if echo "$0" | grep '/' > /dev/null 2>&1 ; then PGPATH=`echo "$0" | sed 's,/[^/]*$,,'` # (dirname command is not portable) else # look for it in PATH ('which' command is not portable) - for dir in `echo "$PATH" | sed 's/:/ /g'` ; do + echo "$PATH" | sed 's/:/\ +/g' | while read dir; do # empty entry in path means current dir [ x"$dir" = x ] && dir='.' if [ -f "$dir/$CMDNAME" ] ; then @@ -193,18 +194,20 @@ echo echo "DELETE FROM pg_group;" echo -$PSQL -d template1 -At -F ' ' \ --c 'SELECT groname,grosysid,grolist FROM pg_group;' | \ -while read GRONAME GROSYSID GROLIST ; do + +$PSQL -d template1 -At -F ' +' -c 'SELECT groname,grosysid,grolist FROM pg_group;' | \ +while read GRONAME ; do + read GROSYSID + read GROLIST echo "CREATE GROUP \"$GRONAME\" WITH SYSID ${GROSYSID};" - raw_grolist=`echo "$GROLIST" | sed 's/^{\(.*\)}$/\1/' | tr ',' ' '` - for userid in $raw_grolist ; do - username=`$PSQL -d template1 -At -c "SELECT usename FROM pg_shadow WHERE usesysid = ${userid};"` + echo "$GROLIST" | sed 's/^{\(.*\)}$/\1/' | tr ',' '\n' | + while read userid; do + username="`$PSQL -d template1 -At -c \"SELECT usename FROM pg_shadow WHERE usesysid = ${userid};\"`" echo " ALTER GROUP \"$GRONAME\" ADD USER \"$username\";" done done - test "$globals_only" = yes && exit 0 @@ -218,10 +221,13 @@ exec 4<&0 # We skip databases marked not datallowconn, since we'd be unable to # connect to them anyway (and besides, we don't want to dump template0). -$PSQL -d template1 -At -F ' ' \ - -c "SELECT datname, coalesce(usename, (select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), pg_encoding_to_char(d.encoding), datistemplate, datpath FROM pg_database d LEFT JOIN pg_shadow u ON (datdba = usesysid) WHERE datallowconn ORDER BY 1;" | \ -while read DATABASE DBOWNER ENCODING ISTEMPLATE DBPATH; do - +$PSQL -d template1 -At -F ' +' -c "SELECT datname, coalesce(usename, (select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), pg_encoding_to_char(d.encoding), datistemplate, datpath FROM pg_database d LEFT JOIN pg_shadow u ON (datdba = usesysid) WHERE datallowconn ORDER BY 1;" | \ +while read DATABASE ; do + read DBOWNER + read ENCODING + read ISTEMPLATE + read DBPATH if [ "$DATABASE" != template1 ] ; then echo @@ -243,8 +249,8 @@ while read DATABASE DBOWNER ENCODING ISTEMPLATE DBPATH; do fi done -$PSQL -d template1 -At -F ' ' \ - -c "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;" | \ +$PSQL -d template1 -At -F ' +' -c "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;" | \ while read DATABASE; do echo "dumping database \"$DATABASE\"..." 1>&2 echo