#!/bin/sh
#
# BAREOS® - Backup Archiving REcovery Open Sourced
#
# Copyright (C) 2000-2011 Free Software Foundation Europe e.V.
# Copyright (C) 2013-2020 Bareos GmbH & Co. KG
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of version three of the GNU Affero General Public
# License as published by the Free Software Foundation and included
# in the file LICENSE.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# This routine makes the appropriately configured
# Bareos database for PostgreSQL, Ingres, MySQL, or SQLite.
#

#
# Source the Bareos config functions.
#

# change to root dir
cd /


. /usr/pkg/lib/bareos/scripts/bareos-config-lib.sh

db_name="${db_name:-`get_database_name bareos`}"
db_user="${db_user:-`get_database_user bareos`}"
dir_user=`get_user_dir`
dir_group=`get_group_dir`
default_db_type=`get_database_driver_default`
working_dir=`get_working_dir`


#
# See if the first argument is a valid backend name.
# If so the user overrides the default database backend.
#
if [ $# -gt 0 ]; then
   case $1 in
      sqlite3)
         db_type=$1
         shift
         ;;
      mysql)
         db_type=$1
         shift
         ;;
      postgresql)
         db_type=$1
         shift
         ;;
      *)
         ;;
   esac
fi

#
# If no new db_type is gives use the default db_type.
#
if [ -z "${db_type}" ]; then
   db_type="${default_db_type}"
fi

echo "Creating ${db_type} database"

bindir=`get_database_utility_path ${db_type}`
if [ ! -z "${bindir}" ]; then
   PATH="$bindir:$PATH"
fi

case ${db_type} in
   sqlite3)
      if [ -n "$BAREOS_TEST_RUNNING" ]; then
         sqlite3 $* ${working_dir}/${db_name}.db ".tables"
         # Allow non root access
         chown ${dir_user}:${dir_group} ${working_dir}/${db_name}.db
         chmod 0640 ${working_dir}/${db_name}.db
         retval=0
      else
         echo "The SQLite database backend is deprecated. Please use PostgreSQL instead."
         retval=1
      fi
      ;;
   mysql)
      if [ -n "$BAREOS_TEST_RUNNING" ]; then
         mysql $* -e "CREATE DATABASE ${db_name};"
         retval=$?
      else
         echo "The MySQL database backend is deprecated. Please use PostgreSQL instead."
         retval=1
      fi
      ;;
   postgresql)
      #
      # use SQL_ASCII to be able to put any filename into
      # the database even those created with unusual character sets
      PSQLVERSION=`PGOPTIONS='--client-min-messages=warning' psql -d template1 -c 'SELECT version()' $* 2>/dev/null | \
                   awk '/PostgreSQL/ { print $2 }' | \
                   cut -d '.' -f 1,2`

      if [ -z "${PSQLVERSION}" ]; then
         echo "Unable to determine PostgreSQL version."
         exit 1
      fi

      #
      # Note, LC_COLLATE and LC_TYPE are needed on 8.4 and beyond, but are not implemented in 8.3 or below.
      # This must be updated for future versions of PostgreSQL
      #
      case ${PSQLVERSION} in
         9.*|10.*|11.*|12.*)
	    ENCODING="ENCODING 'SQL_ASCII' LC_COLLATE 'C' LC_CTYPE 'C'"
            ;;
         8.[456789])
	    ENCODING="ENCODING 'SQL_ASCII' LC_COLLATE 'C' LC_CTYPE 'C'"
            ;;
         *)
	    ENCODING="ENCODING 'SQL_ASCII'"
            ;;
      esac

      PGOPTIONS='--client-min-messages=warning' psql -f - -d template1 $* << END-OF-DATA
\set ON_ERROR_STOP on
CREATE DATABASE ${db_name} $ENCODING TEMPLATE template0;
ALTER DATABASE ${db_name} SET datestyle TO 'ISO, YMD';
END-OF-DATA
      retval=$?

      if PGOPTIONS='--client-min-messages=warning' psql -l ${dbname} $* | grep " ${db_name}.*SQL_ASCII" >/dev/null; then
         echo "Database encoding OK"
      else
         echo " "
         echo "Database encoding bad. Do not use this database"
         echo " "
      fi
      ;;
   *)
      echo "Unknown database type $1"
      exit 1
      ;;
esac

if [ "${retval}" = 0 ]; then
   echo "Creating of ${db_name} database succeeded."
else
   echo "Creating of ${db_name} database failed."
fi

exit ${retval}
