#!/bin/bash
BINPATH=/opt/bukdbase/bin
O_PATH0=/var/opt/bukdbase/backup
O_PATH=$O_PATH0/$(date +%y%m%d%H%M%S.%N)
LOGDIR=/var/opt/bukdbase/log
### значения по умолчанию (переопределяются ключами в командной строке)
DBNAME=ubuk
DBUSER=bukts
ZIPEXT="bz2"
DOCAT="no"
DOMD5="no"
MAIL=
MAILSUBJ="BUKDBASE"
SHIFT=
STARTSHIFT=
SHLIMIT="10"
DICT=
DTBL=
TALONONLY=
TANKONLY=
MINI=
# Default sed programm to use (is GNU /usr/bin/sed )
SED=

if [ ! -d $LOGDIR ]; then
  LOGDIR=$HOME
fi

## сформировать имя log-файла из имени программы
LOG=$LOGDIR/$(basename $0).$(date +%y%m%d).log
echo "" >> $LOG
echo "$(date +%H:%M:%S) start $@" >> $LOG

### обработать командную строку
i=$#;  # число параметров в командной строке
CMDL=
while [ $i -ge "0" ]; do
    is="no"
    case $1 in
    -db) # имя БД
        is="yes"; DBNAME=$2 ;;
    -user|-U) # пользователь БД
        is="yes"; DBUSER=$2 ;; 
    -sh|-shift) # номер смены (может быть "last" и "cur")
        is="yes"; SHIFTS=$2  ;;
    -atshift) # номер смены ( c которой начинать выгрузку )
        is="yes"; STARTSHIFT=$2  ;;
    -lim|-limit) # Максимальное количество загружаемых смен за проход  ( по умолчанию 10 )
        is="yes"; SHLIMIT=$2  ;;
    -idshop) # номер АЗС
        is="yes"; IDSHOP=$2  ;;
    -dict) 
        DICT="yes" ;;
    -tbl)
        is="yes"
        DICT="yes"  
        DTBL=$2
        ;;
    -sed)
        is="yes"
        SED=$2
        ;;
    -gz) # сжимать выходной файл gzip'ом
        ZIPEXT="gz" ;;
    -bz2) # сжимать выходной файл bzip2'ом
        ZIPEXT="bz2" ;;
    -debug) # не сжимать для теста
        ZIPEXT="debug" ;;
    -cat)
        DOCAT="yes" ;;
    -nocat)
        DOCAT="no" ;;
    -mail) # адрес эл. почты для отправки файла
        is="yes"; MAIL=$2 ;;
    -subj) # тема сообщения эл.почты
        is="yes"; MAILSUBJ=$2 ;;
#    -raw)
#        RAW="yes" ;;
    -md5)
        DOMD5="yes" ;;
    -talononly)
        TALONONLY="yes" ;;
    -tankonly)
        TANKONLY="yes" ;;
    -mini)
        MINI=" -mini" ;;
    esac
    shift
    if [ $is == "yes" ]; then
        shift
        i=`expr $i - 2`
    else
        i=`expr $i - 1`
    fi
done

#if [ -z "$SED" ]
#then
#  SED=sed
#fi

###очистка старых данных
find $O_PATH0 -type f -atime +2 -exec rm {} \; >/dev/null 2>/dev/null
find $O_PATH0 -type d -empty -exec rm -r {} \; >/dev/null 2>/dev/null

if [ -z "$IDSHOP" ]; then
  ### получить номер магазина (IDSHOP)
  SQL="SELECT id FROM sd_ident WHERE id_shop_type=0 ORDER BY ID LIMIT 1"
  IDSHOP=$(psql $DBNAME -U $DBUSER -Atq -c "$SQL")
  if [ -z "$IDSHOP" ]; then
    MSG="Ошибка при определении номера магазина"
    echo $MSG >& 2
    echo "$(date +%H:%M:%S) $MSG" >> $LOG
    exit 1
  fi
fi

if [ ! -z "$STARTSHIFT" ]; then

  SHIFT1=$STARTSHIFT;
  SQL="SELECT max(t.shift) FROM (SELECT shift FROM utranz.sj_shifts WHERE id_shop=$IDSHOP and shift >= $STARTSHIFT order by timebeg asc LIMIT $SHLIMIT) t"
  SHIFT2=$(psql  $DBNAME -U $DBUSER -Atq -c "$SQL")

  if [ -z "$SHIFT2" ]; then SHIFT2=$SHIFT1; fi

else
  SHIFT1=$(echo "$SHIFTS" | cut -d'-' -f1)
  SHIFT2=$(echo "$SHIFTS" | cut -d'-' -f2)
  if [ -z "$SHIFT2" ]; then SHIFT2=$SHIFT1; fi

  if [ "$SHIFT1" == "cur" ]; then
      SQL="SELECT max(shift) FROM utranz.sj_shifts WHERE id_shop=$IDSHOP"
      SHIFT1=$(psql  $DBNAME -U $DBUSER -Atq -c "$SQL")
      SHIFT2=$SHIFT1
  elif [ "$SHIFT1" == "last" ]; then
      SQL="SELECT max(shift) FROM utranz.sj_shifts WHERE id_shop=$IDSHOP and timeend is not null"
      SHIFT1=$(psql  $DBNAME -U $DBUSER -Atq -c "$SQL")
      SHIFT2=$SHIFT1
  fi

  if [ "$SHIFT2" == "cur" ]; then
    SQL="SELECT max(shift) FROM utranz.sj_shifts WHERE id_shop=$IDSHOP"
    SHIFT2=$(psql  $DBNAME -U $DBUSER -Atq -c "$SQL")
  elif [ "$SHIFT2" == "last" ]; then
    SQL="SELECT max(shift) FROM utranz.sj_shifts WHERE id_shop=$IDSHOP and timeend is not null"
    SHIFT2=$(psql  $DBNAME -U $DBUSER -Atq -c "$SQL")
  elif [[ ${SHIFT2:0:1} == "+" ]]; then
    SQL="SELECT max(shift) FROM utranz.sj_shifts WHERE id_shop=$IDSHOP AND shift<=($SHIFT1 $SHIFT2)"
    SHIFT2=$(psql  $DBNAME -U $DBUSER -Atq -c "$SQL")
  fi

fi

if [ $SHIFT2 -le $SHIFT1 ]; then
  SHIFT2=$SHIFT1
fi

TARFILE=$IDSHOP.tar.$ZIPEXT
mkdir -p $O_PATH
cd $O_PATH
if [ -f $TARFILE ]; then
  rm $TARFILE 2>> $LOG
fi

CMDL="-db $DBNAME -user $DBUSER -shop $IDSHOP -op $O_PATH "
#if [ "$RAW" == "yes" ]; then
#  CMDL=$CMDL"-raw "
#fi

if [ ! -z "$SED" ]; then
  CMDL=$CMDL"-sed $SED "
fi

FILELIST=

if [ -z "$TALONONLY" -a -z "$TANKONLY" ]; then
  if [ ! -z "$SHIFT1" ]; then
    SHIFT=$SHIFT1
    while [ $SHIFT -le $SHIFT2 ]; do
      CMDL1=$CMDL"-sh $SHIFT"
      OUT=$($BINPATH/bukdbsvj $CMDL1 $MINI 2>>$LOG)
      Err=$?
      if [ $Err -ne 0 ]; then
        if [ $SHIFT -ne 0 ]; then
          rm -r $O_PATH
          exit $Err
        fi
      fi
      if [ -z "$FILELIST" ]; then
        FILELIST=$OUT
      else
        FILELIST=${FILELIST}" "${OUT}
      fi
      SHIFT=$(expr $SHIFT + 1)
    done
  fi
fi

if [ ! -z "$TALONONLY" -o ! -z "$TANKONLY" ]; then
  if [ ! -z "$SHIFT1" ]; then
    SHIFT=$SHIFT1
    while [ $SHIFT -le $SHIFT2 ]; do
      CMDL1=$CMDL"-sh $SHIFT"
      if [ ! -z "$TALONONLY" ]; then
        OUT=$($BINPATH/bukdbsvt $CMDL1 2>>$LOG)
      else
        OUT=$($BINPATH/bukdbsvp $CMDL1 2>>$LOG)
      fi
      Err=$?
      if [ $Err -ne 0 ]; then
        if [ $SHIFT -ne 0 ]; then
          rm -r $O_PATH
          exit $Err
        fi
      fi
      if [ -z "$FILELIST" ]; then
        FILELIST=$OUT
      else
        FILELIST=${FILELIST}" "${OUT}
      fi
      SHIFT=$(expr $SHIFT + 1)
    done
  fi
fi
    
if [ "$DICT" == "yes" ]; then
  if [ ! -z "$DTBL" ]; then
    $CMDL=$CMDL"-tbl $DTBL"
  fi
  OUT=$($BINPATH/bukdbsvd $CMDL 2>>$LOG)
  if [ -z "$FILELIST" ]; then
    FILELIST=$OUT
  else
    FILELIST=${FILELIST}" "${OUT}
  fi
  Err=$?
  if [ $Err -ne 0 ]; then 
    rm -r $O_PATH
    exit $Err
  fi
fi

if [ -z "$FILELIST" ]; then
  MSG="Нет выходных данных"
  echo $MSG >& 2
  echo "$(date +%H:%M:%S) $MSG" >> $LOG
  rm -r $O_PATH
  exit 1
fi    

if [ "$ZIPEXT" == "gz" ]; then
  tar czf $TARFILE $FILELIST >> $LOG 2>>$LOG
elif [ "$ZIPEXT" == "bz2" ]; then
  tar cjf $TARFILE $FILELIST >> $LOG 2>>$LOG
elif [ "$ZIPEXT" == "debug" ]; then
  tar cf $TARFILE $FILELIST >> $LOG 2>>$LOG
else
  MSG="Не задан архиватор"
  echo $MSG >& 2
  echo "$(date +%H:%M:%S) $MSG" >> $LOG
  rm -r $O_PATH 2>>$LOG
  exit 1
fi
rm $FILELIST 2>>$LOG

if [ ! -f "$TARFILE" ]; then
  MSG="Ошибка при создани архива $TARFILE"
  echo $MSG >& 2
  echo "$(date +%H:%M:%S) $MSG" >> $LOG
  rm -r $O_PATH 2>>$LOG
  exit 1
fi

# размер архива не должен быть нулевым
SIZE=$(ls -s $TARFILE 2>/dev/null | awk '{print $1}')
if [ -z "$SIZE" -o "$SIZE" == "0" ]; then
  rm $TARFILE 2>/dev/null
  MSG="exit; ошибка при создании архива: SIZE=\"$SIZE\""
  echo $MSG >& 2
  echo "$(date +%H:%M:%S) $MSG" >> $LOG
  rm -r $O_PATH 2>>$LOG
  exit 1
fi

if [ "$DOMD5" == "yes" ]; then
  echo $(md5sum $TARFILE) $O_PATH
fi

if [ "$DOCAT" == "yes" ]; then
  cat $TARFILE
fi


if [ ! -z "$MAIL" ]; then
  echo "$(date +%H:%M:%S) mailing file \"$TARFILE\" to $MAIL" >> $LOG
  (echo "$(basename $TARFILE)" | mutt -s "$MAILSUBJ $(basename $TARFILE)" -a $O_PATH/$TARFILE $MAIL) &
  echo "$(date +%H:%M:%S) ret=$?" >> $LOG
fi

#mv $TARFILE $O_PATH0/
#rm -r $O_PATH
cp $O_PATH/$TARFILE $O_PATH0

echo "$(date +%H:%M:%S) end" >> $LOG
exit 0
