#!/bin/ksh
# 
# Usage: dcafix [-i datapath] [-v] [-q] [dca/hdr.dca [dca/body.dca] ... ]
#

set -eu

datapath="."
datapath_opt=""
verbose=0
verbose_opt=""
quiet_opt=""

while getopts i:qv  option
do
  case $option in
    i) datapath="$OPTARG";;
    v) quiet_opt=""  ; verbose=1; verbose_opt="-v";;
    q) quiet_opt="-q"; verbose=0; verbose_opt=""  ;;
  esac
done

if [[ -f $datapath/dca/.dcafixed ]] ; then
#-- Already dcafix'ed --> do nothing
  exit 0
fi

datapath_opt="-i $datapath $verbose_opt $quiet_opt"

shift $(expr $OPTIND - 1)

if [[ $# -gt 0 ]] ; then
  args=$*
  all=0
else
  args="dca/*.dca"
  all=1
fi

\cd $datapath || exit 1

for f in $args
do
  if [[ -f $f ]] ; then
    begin_hash=$(dd bs=1 if=$f count=1 2>/dev/null || :)
    if [[ "$begin_hash" = '#' ]] ; then
      line=$(egrep '^#DCA:' $f 2>/dev/null | head -1)
    else
      line="" # the file is presumably a binary DCA-file --> no need for dcafix'ing
    fi
    if [[ ! -z "$line" ]] ; then
      [[ $verbose -eq 0 ]] || echo "Fixing DCA for file $f ..."
      check=$(echo "$line" | sed 's/^.*\(is_little\).*/\1/') # a further check; a 28R1-bug
      [[ $verbose -eq 0 ]] || echo "line='$line'"
      [[ $verbose -eq 0 ]] || echo "check='$check'"
      if [[ "$check" = "is_little" ]] ; then
        env DATAPATH=$datapath perl -w $ODB_BINPATH/dcafix.pl < $f > $f.new
        mv $f $f.old
        mv $f.new $f
      elif [[ $all -eq 1 ]] ; then
        all=2
        break # for f in $args
      else # Re-generate quickly ...
        table=$(basename $f | sed 's/\..*//')
        dcagen -z -F -n -t $table $datapath_opt 
      fi
    fi
  fi
done

if [[ $all -ge 1 ]] ; then
  if [[ $all -eq 2 ]] ; then
    #-- Uses multiple processes 
    dcagen -z -F -n $datapath_opt
  fi
  cat /dev/null > dca/.dcafixed
fi

