#!/bin/bash # This script upgrades the PostGIS extension. It should only be called # from upgrade_postgres_database.sh and not by itself. # # Author: tgurney here=$1 source "$here/settings.sh" || exit 1 if [[ "${default_db}" == "openfire" ]] ; then echo "$0: This is an Openfire database. Exiting" exit 0 fi databases=$("${psql}" --db $default_db -U $db_admin_user -Atc " select datname from pg_database where datistemplate = false and datname not in ('awips', 'postgres'); ") required=(metadata maps ncep) postgis_exists() { "${psql}" --db "$1" -U $db_admin_user -Atc " select exists(select 1 from pg_proc where proname = 'postgis_version'); " } raster_exists() { "${psql}" --db "$1" -U $db_admin_user -Atc " select exists( select postgis_full_version from (select postgis_full_version()) t where postgis_full_version ~ 'RASTER' ); " } topology_exists() { "${psql}" --db "$1" -U $db_admin_user -Atc " select exists( select postgis_full_version from (select postgis_full_version()) t where postgis_full_version ~ 'TOPOLOGY' ); " } get_postgis_ver () { "${psql}" --db "$1" -U $db_admin_user -Atc " select substring(extversion from 1 for 3) s from pg_extension where extname = 'postgis'; " } alter_extensions () { "${psql}" --db "$1" -U $db_admin_user -Atc " begin transaction; alter extension postgis update to '${new_postgis_ver_long}'; alter extension postgis_topology update to '${new_postgis_ver_long}'; commit; " } create_postgis () { "${psql}" --db "$1" -U $db_admin_user -Atc " begin transaction; create extension postgis; create extension postgis_topology; commit; " } create_postgis_from_unpackaged () { "${psql}" --db "$1" -U $db_admin_user -Atc " begin transaction; create extension postgis from unpackaged; create extension postgis_topology from unpackaged; commit; " } get_legacy_error_count () { "${psql}" --db "$1" -U $db_admin_user -Atc " select count(*) c from pg_proc where probin like '%postgis%' and probin not like '%${new_postgis_ver}%'; " } create_legacy () { echo "INFO: Creating legacy functions for $1" "${psql}" --db "$1" -U $db_admin_user -f "${postgis_scripts_dir}"/uninstall_legacy.sql >/dev/null 2>&1 "${psql}" --db "$1" -U $db_admin_user -f "${postgis_scripts_dir}"/legacy.sql 2>&1 \ | grep -Ev "CREATE (FUNCTION|AGGREGATE)" \ | grep -v "already exists with same argument types" echo "INFO: Done creating legacy functions for "$1"" error_count=$(get_legacy_error_count "$1") if [[ "${error_count}" -ne 0 ]]; then echo ERROR: Found "${error_count}" remaining references to old postgis in "$1". Check the PostgreSQL logs for details. fi } alternate_upgrade() { "${psql}" --db "$1" -U $db_admin_user -f "${postgis_scripts_dir}"/postgis_upgrade.sql >/dev/null if [[ "$(raster_exists "$1")" == "t" ]]; then echo "INFO: Upgrading raster" "${psql}" --db "$1" -U $db_admin_user -f "${postgis_scripts_dir}"/rtpostgis_upgrade.sql >/dev/null echo "INFO: Done upgrading raster" else echo "INFO: raster is not installed. Installing" "${psql}" --db "$1" -U $db_admin_user -f "${postgis_scripts_dir}"/rtpostgis.sql >/dev/null echo "INFO: Done installing raster" fi if [[ "$(topology_exists "$1")" == "t" ]]; then echo "INFO: Upgrading topology" "${psql}" --db "$1" -U $db_admin_user -f "${postgis_scripts_dir}"/topology_upgrade.sql >/dev/null echo "INFO: Done upgrading topology" else echo "INFO: topology is not installed. Installing" "${psql}" --db "$1" -U $db_admin_user -f "${postgis_scripts_dir}"/topology.sql >/dev/null echo "INFO: Done installing topology" fi } echo INFO: Starting PostGIS upgrade. if [[ -z "${databases}" ]]; then echo "ERROR: Failed to get a list of databases. Make sure postgres is running and pg_hba.conf is allowing connections." exit 1 fi echo INFO: Found databases: ${databases} found=false for required_db in "${required[@]}"; do found=false for db in ${databases}; do if [[ "${db}" == "${required_db}" ]]; then found=true fi done if [[ "${found}" != "true" ]]; then echo WARN: Required database "${required_db}" was not found! Continuing without it... fi done for db in ${databases} ; do echo -n " ${db}... " has_extension=$("${psql}" --db ${db} -U $db_admin_user -Atc " select 'y' from pg_extension where extname like 'postgis%' limit 1; ") if [[ "$?" -ne 0 ]]; then echo "ERROR: Failed to query the ${db} database. Make sure postgres is running and pg_hba.conf is allowing connections." continue fi if [[ "${has_extension}" == "y" ]]; then ver=$(get_postgis_ver "${db}") echo "found PostGIS version ${ver}" if [[ "${ver}" != "${new_postgis_ver}" ]]; then echo "Upgrading ${db}" alter_extensions "${db}" ver=$(get_postgis_ver "${db}") if [[ "${ver}" != "${new_postgis_ver}" ]]; then echo "ERROR: 'alter extension' failed for ${db}. Check the PostgreSQL logs for details" fi else echo "${db} has already been upgraded." fi create_legacy "${db}" else echo -n "no PostGIS extension found. Checking for PostGIS installed via script..." if [[ "$(postgis_exists "${db}")" == "t" ]]; then echo "found." echo "INFO: PostGIS on ${db} was installed via script. Using alternate upgrade procedure" alternate_upgrade "${db}" echo "INFO: Creating extensions for ${db}" create_postgis_from_unpackaged "${db}" echo "INFO: Done creating extensions for ${db}" if [[ "${ver}" != "${new_postgis_ver}" ]]; then echo "ERROR: 'create extension' failed for ${db}. Check the PostgreSQL logs for details" fi create_legacy "${db}" else echo "not found." for required_db in "${required[@]}"; do if [[ "${db}" == "${required_db}" ]]; then echo "WARN: "${db}" should have PostGIS but doesn't. Installing it now." create_postgis "${db}" ver=$(get_postgis_ver ${db}) if [[ "${ver}" != "${new_postgis_ver}" ]]; then echo "ERROR: 'create extension' failed for ${db}. Check the PostgreSQL logs for details" fi create_legacy "${db}" fi done fi fi done echo INFO: Finished PostGIS upgrade.