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

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

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

register_database postgresql

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 || is_suse; 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
    else
        PG_DIR=`find /etc/postgresql -name pg_hba.conf|xargs dirname`
        PG_HBA=$PG_DIR/pg_hba.conf
        PG_CONF=$PG_DIR/postgresql.conf
    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
    start_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 output=$1
    local db=$2
    eval "$output=$BASE_SQL_CONN/$db?client_encoding=utf8"
}

# Restore xtrace
$XTRACE
