#!/bin/bash


OPTIONS=$(getopt -o o:h -l output:,help,forced,e3g-progress -- "$@")

# Verifica se getopt ha avuto successo
if [ $? -ne 0 ]; then
    echo "Uso: $0 --output <file> [--help]"
    exit 1
fi

# Applica le opzioni
eval set -- "$OPTIONS"


while true; do
  case "$1" in
    --help)
      echo "Usage: restore_db [options] <file> [table]"
      echo "Options:"
      echo "  --help           Show this help message"
      echo "  --forced         Skip version check"
      echo "  --e3g-progress   Enable e3g progress mode"
      exit 0
      ;;
    --forced)
      EXCLUDE_VERSION_CHECK="YES"
      shift
      ;;
    --e3g-progress)
      E3G_PROGRESS="--e3g-progress"
      shift
      ;;
    --)
      shift
      break
      ;;
    *)
      echo "Invalid option: $1"
      exit 1
      ;;
  esac
done


DIR=`dirname $0`
DBNAME=`basename $1 .sql.gz`
INFILE="$1"
TABLE="$2"
if [[ "$INFILE" != /* ]]; then
  INFILE="$DIR/$INFILE"
fi

 
MYSQL="mysql -peuro3g -ueuro3g $DBNAME"
VERSION='UPDATE *db_version *SET *version'
MODIFICHE_PATH="db_update/install*"
MODIFICHE_COMPLETE="/opt/euro-beta/systools/distr/modifiche.sql"


function get_db_version
{
  echo "SELECT version FROM db_version;" | $MYSQL | tail -1
}

function get_prog_version
{
  cat /opt/euro-beta/last_update.info | sed 's#</.*##' | cut -d' ' -f3  | tr -d '.-'
}

function get_archive_version
{
  grep 'db_version' "$1" | grep 'INSERT INTO' |  sed 's/.*VALUES//' | cut -d, -f2 | sed 's/[^0-9]//g'
}


function patch_sql
{
  /opt/euro-beta/systools/patch_sql
}

DATA_VERSION=""
PROG_VERSION=""

function verify_version # unzipped_db_filename
{
  DATA_VERSION=`get_archive_version "$1"`
  PROG_VERSION=`get_prog_version`

  if [ ! "$EXCLUDE_VERSION_CHECK" -a "$DATA_VERSION" -gt "$PROG_VERSION" ]
  then
  
    echo $DATA_VERSION > /tmp/rest_db_ver
    exit 9
  fi
}

function patch_db 
{

  echo patching from $DATA_VERSION to $PROG_VERSION
  if [ "$DATA_VERSION" = "$PROG_VERSION" ]
  then
    echo no patch
    return
  fi
  MODIFICHE=`search_modifiche $DATA_VERSION $PROG_VERSION`
  if [ ! -e "$MODIFICHE"  ]
  then
    echo no patch file found
    return
  fi
  echo patching db using $MODIFICHE

  cat $MODIFICHE | \
    egrep -A1000000 "$VERSION=$DATA_VERSION" | \
    egrep -B1000000 "$VERSION=$PROG_VERSION" | \
    patch_sql | \
    $MYSQL -f 2>/dev/null
}

function search_modifiche
{
  V1=$1
  V2=$2

#  echo searching modifiche from $1 to $2 >/dev/stderr
  (echo $MODIFICHE_COMPLETE; find $MODIFICHE_PATH -iname "*.sql") | \
    while read FILE; do
#      echo checking file $FILE >/dev/stderr
      if egrep -q "$VERSION=$V1" $FILE && egrep -q "$VERSION=$V2" $FILE
      then
        echo $FILE
        break
      fi
    done
}

function cat_progress() # file from% to% 
{
  LEN=$(stat -c%s "$1")
  cat $1 | /opt/euro-beta/systools/progress --bytes $LEN --from $2 --to $3 $E3G_PROGRESS
}
   

rm -f $DBNAME.sql 2>/dev/null
#gunzip $DBNAME.sql.gz
cat_progress $DBNAME.sql.gz 0 30 | gunzip | patch_sql >$DBNAME.sql
if [ $2"." == "." ]
then
  verify_version $DBNAME.sql
  ( echo "drop database $DBNAME;"; echo "create database $DBNAME;"; echo "use $DBNAME"; cat_progress $DBNAME.sql 31 95 ) | $MYSQL -f 
  patch_db
  cat_progress /dev/null 96 100 
else
  echo "use $DBNAME" > tmp_table_update.sql
  echo "drop table $2;" >> tmp_table_update.sql
  FILELINES=`wc -l $DBNAME.sql | awk '{ print $1 }'` 
  CREATELINE=`egrep -n 'CREATE TABLE \`?'"$2"'[\` ]' $DBNAME.sql | awk -F: '{ print $1 }'` 
  LINES=$(($FILELINES-$CREATELINE+1))
  tail -$LINES $DBNAME.sql > $DBNAME.sql.tmp
  head -`grep -En '\) (TYPE|ENGINE)=' $DBNAME.sql.tmp | head -1 | awk -F: '{ print $1 }'` $DBNAME.sql.tmp >> tmp_table_update.sql
  cat $DBNAME.sql | egrep 'INSERT INTO `?'"$2"'[` ]' >> tmp_table_update.sql
  rm $DBNAME.sql.tmp
  cat_progress tmp_table_update.sql 31 100 $MYSQL -f 
fi
