# lib/databases/postgresql
# Functions to control the configuration and operation of the **PostgreSQL** database backend

# Dependencies:
# DATABASE_{HOST,USER,PASSWORD} must be defined

# Save trace setting
PG_XTRACE=$(set +o | grep xtrace)
set +o xtrace


register_database postgresql


# Functions
# ---------

# Get rid of everything enough to cleanly change database backends
function cleanup_database_postgresql {
    stop_service postgresql
    if is_ubuntu; then
        # Get ruthless with mysql
        sudo aptitude purge -y  ~npostgresql
        return
    elif is_fedora; then
        uninstall_package postgresql-server
    else
        return
    fi
}

function recreate_database_postgresql {
    local db=$1
    local charset=$2
    # Avoid unsightly error when calling dropdb when the database doesn't exist
    psql -h$DATABASE_HOST -U$DATABASE_USER -dtemplate1 -c "DROP DATABASE IF EXISTS $db"
    createdb -h $DATABASE_HOST -U$DATABASE_USER -l C -T template0 -E $charset $db
}

function configure_database_postgresql {
    echo_summary "Configuring and starting PostgreSQL"
    if is_fedora; then
        PG_HBA=/var/lib/pgsql/data/pg_hba.conf
        PG_CONF=/var/lib/pgsql/data/postgresql.conf
        sudo [ -e $PG_HBA ] || sudo postgresql-setup initdb
    elif is_ubuntu; then
        PG_DIR=`find /etc/postgresql -name pg_hba.conf|xargs dirname`
        PG_HBA=$PG_DIR/pg_hba.conf
        PG_CONF=$PG_DIR/postgresql.conf
    elif is_suse; then
        PG_HBA=/var/lib/pgsql/data/pg_hba.conf
        PG_CONF=/var/lib/pgsql/data/postgresql.conf
        # initdb is called when postgresql is first started
        sudo [ -e $PG_HBA ] || start_service postgresql
    else
        exit_distro_not_supported "postgresql configuration"
    fi
    # Listen on all addresses
    sudo sed -i "/listen_addresses/s/.*/listen_addresses = '*'/" $PG_CONF
    # Do password auth from all IPv4 clients
    sudo sed -i "/^host/s/all\s\+127.0.0.1\/32\s\+ident/$DATABASE_USER\t0.0.0.0\/0\tpassword/" $PG_HBA
    # Do password auth for all IPv6 clients
    sudo sed -i "/^host/s/all\s\+::1\/128\s\+ident/$DATABASE_USER\t::0\/0\tpassword/" $PG_HBA
    restart_service postgresql

    # If creating the role fails, chances are it already existed. Try to alter it.
    sudo -u root sudo -u postgres -i psql -c "CREATE ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" || \
    sudo -u root sudo -u postgres -i psql -c "ALTER ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'"
}

function install_database_postgresql {
    echo_summary "Installing postgresql"
    PGPASS=$HOME/.pgpass
    if [[ ! -e $PGPASS ]]; then
        cat <<EOF > $PGPASS
*:*:*:$DATABASE_USER:$DATABASE_PASSWORD
EOF
        chmod 0600 $PGPASS
    else
        sed -i "s/:root:\w\+/:root:$DATABASE_PASSWORD/" $PGPASS
    fi
    if is_ubuntu; then
        install_package postgresql
    elif is_fedora || is_suse; then
        install_package postgresql-server
    else
        exit_distro_not_supported "postgresql installation"
    fi
}

function database_connection_url_postgresql {
    local db=$1
    echo "$BASE_SQL_CONN/$db?client_encoding=utf8"
}


# Restore xtrace
$PG_XTRACE

# Local variables:
# mode: shell-script
# End:
