#!/bin/bash

get_db_config(){
  if test -f "/var/gerrit/etc/secure.config"; then
    export DB_USER=$(git config --file /var/gerrit/etc/secure.config --get database.username)
    export DB_PASSWORD=$(git config --file /var/gerrit/etc/secure.config --get database.password)
  fi

  if test -f "/var/gerrit/etc/gerrit.config"; then
    export DB_TYPE=$(git config --file /var/gerrit/etc/gerrit.config --get database.type)
    export DB_NAME=$(git config --file /var/gerrit/etc/gerrit.config --get database.database | cut -d'?' -f1)
    export DB_HOST=$(git config --file /var/gerrit/etc/gerrit.config --get database.hostname)
    export DB_PORT=$(git config --file /var/gerrit/etc/gerrit.config --get database.port)
  fi

  if test -z "${DB_USER}"; then
    echo "Missing database username in Gerrit config."
    exit 1
  fi

  if test -z "${DB_PASSWORD}"; then
    echo "Missing database password in Gerrit config."
    exit 1
  fi

  if test -z "${DB_NAME}"; then
    export DB_NAME="reviewdb"
  fi

  if test -z "${DB_HOST}"; then
    echo "Missing database host in Gerrit config."
    exit 1
  fi

  if test -z "${DB_PORT}"; then
    echo "Missing database port in Gerrit config."
    exit 1
  fi

  return 0
}

test_mysql_db(){
  local EXIT_CODE=0
  mysql -h ${DB_HOST} -P${DB_PORT} -u ${DB_USER} -p${DB_PASSWORD} ${DB_NAME} >/dev/null 2>&1 </dev/null || EXIT_CODE=1
  # Check existence of some tables
  for table in changes patch_sets; do    # tables expected in Gerrit 2.12 - 2.16
    SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "${table}")
    if [[ $(mysql -h ${DB_HOST} -P${DB_PORT} -u ${DB_USER} -p${DB_PASSWORD} -e "${SQL_EXISTS}" ${DB_NAME}) ]]; then
      echo "Table ${table} was found."
    else
      echo "Table ${table} was NOT found. Continuing to wait..."
      local EXIT_CODE=1
      break
    fi
  done
  return ${EXIT_CODE}
}

wait_for_db_schema(){
  echo "Waiting for database to be ready."

  case "${DB_TYPE^^}" in
    MYSQL)
      while [ true ]; do
        test_mysql_db && break
        sleep 10
      done
      ;;

    *)
      echo "Database type ${DB_TYPE} not supported."
      exit 1
      ;;
  esac
  echo "Database was found."
}

wait_for_db_connection(){
  echo "Waiting for database connection..."

  case "${DB_TYPE^^}" in
    MYSQL)
      while ! mysqladmin ping -h "${DB_HOST}" -P"${DB_PORT}" --silent; do
          sleep 1
      done
      ;;

    *)
      echo "Database type ${DB_TYPE} not supported."
      exit 1
      ;;
  esac
}

# cleanup from last start
rm -f /var/gerrit/logs/gerrit.pid

# read db configuration from gerrit.config
get_db_config || exit 1

# wait for db to start
wait_for_db_connection

if [[ "$TEST_MODE" == "true" ]]; then
  java -jar /var/war/gerrit.war init \
    --batch \
    --no-auto-start \
    --install-plugin singleusergroup \
    -d /var/gerrit
fi

# wait for db schema to arrive via replication from master
wait_for_db_schema

echo "Gerrit site appears to be initialized. Gerrit slave can be startet."
