#!/bin/bash
# ================================================================================
#
# LOCALDUMP :: POSTGRES
# create gzipped plain text backups from each scheme
#
# --------------------------------------------------------------------------------
# ah - Axel Hahn <axel.hahn@iml.unibe.ch>
# ds - Daniel Schueler <daniel.schueler@iml.unibe.ch>
#
# 2016-11-10  ah,ds  v1.0
# 2017-03-29  .....  v1.1  added restore
# 2022-01-20         v1.2  fixes with shellcheck
# 2022-03-17         v1.3  WIP: add lines with prefix __DB__
# ================================================================================

if [ -z "$BACKUP_TARGETDIR" ]; then
  echo "ERROR: you cannot start $(basename $0) directly"
  rc=$rc+1
  exit 1
fi

# --------------------------------------------------------------------------------
# CONFIG
# --------------------------------------------------------------------------------

  SERVICEFOUND=0
  # unix user of postgres database
  PGUSER=postgres


# --------------------------------------------------------------------------------
# FUNCTION
# --------------------------------------------------------------------------------

function checkRequirements(){
  j_requireBinary "pg_dump"   1
  j_requireProcess "postgres" 1

  # set flag and reset return code
  test $rc -eq 0 && SERVICEFOUND=1
  rc=0
}

function doPgsqlBackup(){

  create_targetdir

  # ----- change owner of directory because of su command
  chown ${PGUSER}. "${BACKUP_TARGETDIR}"

  # ----- GO

  sSqlGetDblist="select datname from pg_database where not datistemplate and datallowconn order by datname;"
  for DATABASE in $(su ${PGUSER} -c "psql -At -c '$sSqlGetDblist' postgres" 2>/dev/null)
  do
    echo -n "__DB__${SERVICENAME} backup $_dbname ... "
    OUTFILE="${BACKUP_TARGETDIR}/$(get_outfile ${DATABASE}).sql"
    su ${PGUSER} -c "pg_dump -Fp ${DATABASE} >$OUTFILE"
    fetchrc >/dev/null

    db._compressDumpfile "$OUTFILE"

    # if [ $myrc -eq 0 ]; then
    #   echo -n "compress ... "
    #   compress_file "$OUTFILE"
    # else
    #   color error
    #   echo "ERROR occured - no gzip"
    #   color reset
    #   # mv $OUTFILE $OUTFILE
    #   echo "__DB__$SERVICENAME INFO: backed up ${DATABASE}"
    # fi
    # ls -l "$OUTFILE"*
  echo
  done
}


# restore database dump file into database
# param  string  database dump file (gzipped)
# param  string  optional: database to import; default: database is parsed from file
function restoreByFile(){
  sMyfile=$1
  sMyDb=$2

  if [ -z "$sMyDb" ]; then
    h2 "analyze dump $sMyfile"
    sMyDb="$(guessDB "$sMyfile" )"
    echo "detected db schema from file: [${sMyDb}]"
  else
    echo "db schema from param 2: [${sMyDb}]"
  fi

  echo

  echo import to "$sMyDb"...

  h2 "deleting database [$sMyDb] ..."
  color cmd
  su ${PGUSER} -c "dropdb ${sMyDb}"
  color reset

  h2 "ensure that database exists ..."
  color cmd
  su ${PGUSER} -c "psql -c \"CREATE DATABASE ${sMyDb};\""
  fetchrc
  color reset

  h2 "import ..."
  ls -l "${sMyfile}"
  echo "import to database [${sMyDb}]"
  color cmd
  zcat "${sMyfile}" | su ${PGUSER} -c "psql -d ${sMyDb}"
  fetchrc
  color reset

}


# --------------------------------------------------------------------------------
# MAIN
# --------------------------------------------------------------------------------

  # ----- requirements
checkRequirements >/dev/null 2>&1
if [ $SERVICEFOUND -eq 0 ]; then
  echo "__DB__$SERVICENAME INFO: service [$SERVICENAME] is not avilable on this machine."
fi

case $1 in
  check)
    # repeat check ... but show output
    echo
    echo Details:
    checkRequirements
    echo
    ;;
  backup)    
    test $SERVICEFOUND -eq 1 && doPgsqlBackup
    ;;
  restore)
    shift 1
    test $SERVICEFOUND -eq 1 && restoreByFile $*
    ;;
  *)
    echo ERROR: wrong syntax: 
    echo $0 $*
    exit 1
  esac

echo "__DB__$SERVICENAME INFO: $0 $* [$SERVICENAME] final returncode rc=$rc"

# --------------------------------------------------------------------------------