# 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

# 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: