#!/bin/sh
# (c) Copyright 1996 James H. Lowe, Jr.
#
#$Id: shak_query_v 1.16 1997/03/23 16:11:59 jhl Exp $
#

# Command line switches
#  Field			long option	short option	argument

# : Prog name                 
# : ascii date                --date 			-d	'date string'
# : least calendar time       --timel			-l	calendar time
# : greatest calendar time    --timeg			-g	calender time
# : host                      --exechost		-x
# : type                      --type			-t
# : backhost                  --backhost		-h
# : rcsfile                   --rcsfile			-f
# : rev                       --rev			-v
# : tape                      --tape			-i
# : headeruse                 --headeruse		-m
# : inactive                  --inactive		-o
# : user                      --user			-u
# : exit status               --exitstatus
# : state description         --state
# : backup-set search mode 				-s	
# : filter list mode 					-r
# : least filter time         --filtertimel
# : greatest filter time      --filtertimeg


shak_setmode=0
shak_filtermode=0
shak_outputformat=1

if [ "$shak_debug" -ge "2" ]; then
	set -vx
fi

SHAK_date_per_user=no

shak_qusage ()  {
echo "Usage: shak [ options ] query {-s|-r} [args ...]" 1>&2
echo "    shak [ options ] query -s 'Tape_NO:File_label:fsf_count'" 1>&2
echo "    shak [ options ] query -r [-a] [-p] [ --long_option 'arg' ... ]" 1>&2
echo "         long options: date, timel, timeg, type, exechost, backhost, rcsfile" 1>&2
echo "                       rev, tape, headeruse, inactive, exitstatus, state" 1>&2
echo "                       filtertimel filtertimeg" 1>&2
echo "         arg: is a awk(1) regular expression." 1>&2
exit 1
}

r_date=""
r_timel=""
r_timeg=""
r_host=""
r_type=""
r_backhost=""
r_rcsfile=""
r_rev=""
r_tape=""
r_headeruse=""
r_inactive=""
r_user=""
r_state=""
r_exitstatus=""
r_filtertimel=""
r_filtertimeg=""


allheaders=0

while [ $# -ge "1" ]
do
 case $1 in
  -a)
      shift;
      allheaders=1
      ;;
  -d|--date)
      shift;
      r_date="$1"
      shift;
      ;; 
  -l|--timel)
      shift;
      r_timel="$1"
      shift
      ;;
  -g|--timeg)
      shift;
      r_timeg="$1"
      shift
      ;;
  -x|--exechost)
      shift;
      r_host="$1"
      shift
      ;;
  -t|--type)
      shift;
      r_type="$1"
      shift
      ;;
  -h|--backhost)
      shift;
      r_backhost="$1"
      shift
      ;;
  -f|--rcsfile)
      shift;
      r_rcsfile="$1"
      shift
      ;;
  -v|--rev)
      shift;
      r_rev="$1"
      shift
      ;;
  -i|--tape)
      shift;
      r_tape="$1"
      shift
      ;;
  -m|--headeruse)
      shift;
      r_headeruse="$1"
      shift
      ;;
  -o|--inactive)
      shift;
      r_inactive="$1"
      shift
      ;;
  -p)
      shift;
      shak_outputformat=0
      ;;
  --state)
      shift;
      r_state="$1"
      shift
      ;;
  -u|--user)
      shift;
      r_user="$1"
      shift
      ;;
  --exitstatus)
      shift;
      r_exitstatus="$1"
      shift
      ;;
  --filtertimel)
      shift;
      r_filtertimel="$1"
      shift
      ;;
  --filtertimeg)
      shift;
      r_filtertimeg="$1"
      shift
      ;;
  -r)
      shift;
      shak_filtermode=1
      ;;
  -s)
      shift;
      if [ $# -eq 0 ]; then
      	shak_qusage
      fi
      shak_setmode=1
      filespec=$1
      shift;
      ;;

   *)
      shift;
      shak_qusage
      exit 1
      break;
      ;;
  esac
done


if [ $shak_setmode = 1 -a $shak_filtermode = 1 ]; then
	shak_qusage
	exit 1
fi

if [ $shak_setmode = 0 -a $shak_filtermode = 0 ]; then
	shak_qusage
	exit 1
fi


if [ "$shak_filtermode" = 1 ]; then
	if [ "$r_timel" ]; then
		r_timel="`${SHAK_LIBPATH}/shak_mkstrtime "$r_timel"`"
	fi
	if [ "$r_timel" = "-1" ]; then
		echo "shak_query: timel: $r_timel parse error." 1>&2
		exit 1
	fi
	if [ "$r_timeg" ]; then
		r_timeg="`${SHAK_LIBPATH}/shak_mkstrtime "$r_timeg"`"
	fi
	if [ "$r_timeg" = "-1" ]; then
		echo "shak_query: timeg: $r_timeg parse error." 1>&2
		exit 1
	fi

	if [ "$r_filtertimeg" ]; then
		r_filtertimeg="`${SHAK_LIBPATH}/shak_mkstrtime "$r_filtertimeg"`"
	fi
	if [ "$r_filtertimeg" = "-1" ]; then
		echo "shak_query: filtertimeg: $r_filtertimeg parse error." 1>&2
		exit 1
	fi
	if [ "$r_filtertimel" ]; then
		r_filtertimel="`${SHAK_LIBPATH}/shak_mkstrtime "$r_filtertimel"`"
	fi
	if [ "$r_filtertimel" = "-1" ]; then
		echo "shak_query: filtertimel: $r_filtertimel parse error." 1>&2
		exit 1
	fi

	if [ ! "$r_inactive" ]; then
		r_inactive='.'
	fi

	${SHAK_LIBPATH}/shak0_listheaders </dev/null |
	awk -f ${SHAK_LIBPATH}/shak0_qfilter $shak_outputformat "$allheaders" "$r_date" "$r_timel" "$r_timeg" "$r_host" "$r_type" "$r_backhost" "$r_rcsfile" "$r_rev" "$r_tape" "$r_headeruse" "$r_inactive" "$r_user" "" "" "$r_exitstatus" "$r_state" "no" "$r_filtertimel" "$r_filtertimeg"

	exit $?
else
# setmode : Determine which backups to restore

	tapenumber="`echo "$filespec" | sed -e 's/:.*$//'`"
	filelabel="`echo "$filespec" | sed -e 's/^[^:]*://' -e 's/:.*//'`"
        tapenumber="`echo "$tapenumber" | awk '{ printf ("%04s\n",$1) }'`"


case $SHAK_date_per_user in
        yes)
                dateperuser=$SHAK_USERLOGIN
                ;;
        *)
                dateperuser=""
                ;;
esac
	
# produces null header	header="`${SHAK_LIBPATH}/shak0_listheaders | grep -v '^File 0' | awk -f ${SHAK_LIBPATH}/shak0_qfilter 1 "0" "" "" "" "" "" "" "" "" "^${tapenumber}\$" "" "" "^${dateperuser}\$" "^${filelabel}\$" "" "" "" "no" `"
#quoting problem with ^   header="`${SHAK_LIBPATH}/shak0_listheaders | grep -v '^File 0' | awk -f ${SHAK_LIBPATH}/shak0_qfilter 1 "0" "" "" "" "" "" "" "" "" "^${tapenumber}\$" "" "" "" "^${filelabel}\$" "" "" "" "no" `"
      header="`${SHAK_LIBPATH}/shak0_listheaders </dev/null | grep -v '^File 0' | awk -f ${SHAK_LIBPATH}/shak0_qfilter 1 "0" "" "" "" "" "" "" "" "" '^'"${tapenumber}"'$' "" "" "" '^'"${filelabel}"'$' "" "" "" "no" "" ""`"

	case "$header" in
		"")
		   echo "shak_query: error, null header" 1>&2
		   exit 1
		   ;;
	esac

	time="`echo "$header" | cut -d ' ' -f 2`"
	type="`echo "$header" | cut -d ' ' -f 7`"
	backhost="`echo "$header" | cut -d ' ' -f 6`"
	rcsfile="`echo "$header" | cut -d ' ' -f 8`"
	trunkrev="`echo "$header" | cut -d ' ' -f 9 | sed -e 's/\.[^\. ]*\.[^\. ]*$//'`"
	
	type0="${type}"	
	case $type0 in
		full|fullu) 	type="incrs|diffs" ;;
		diffs)		type="diffs" ;;
		diff)		type="diff" ;;
		incrs)		type="incrs" ;;
		incr)		type="incr$" ;;
		0)		type='9|8|7|6|5|4|3|2|1' ;;
		1)		type='9|8|7|6|5|4|3|2' ;;
		2)		type='9|8|7|6|5|4|3' ;;
		3)		type='9|8|7|6|5|4' ;;
		4)		type='9|8|7|6|5' ;;
		5)		type='9|8|7|6' ;;
		6)		type='9|8|7' ;;
		7)		type='9|8' ;;
		8)		type='9' ;;
		*)		
				echo "shak_query: internal error, incorrect type" 1>&2
				;;
	esac


#        echo $time $type $backhost $rcsfile $trunkrev
	echo "$header" 
	${SHAK_LIBPATH}/shak0_listheaders </dev/null | grep -v '^File 0' |
	awk -f ${SHAK_LIBPATH}/shak0_qfilter 1 "" "" "$time" "" "" "$type" "$backhost" "$rcsfile" "^$trunkrev" "" "" "0" "" "" "" "0|256" "" "no" "" "" |
(
	case $type in
		9*)     :
			sort -t' ' -k 7.1,8.1n  -k 2.1,3.1n  |
			#  For each backup of a certain dumplevel echo only the last one.
			awk -f ${SHAK_LIBPATH}/shak_restset |
			sort -t' ' -k 2.1,3.1n
			;;
		*)
 			sort -n -k2.1
			;;
	esac
)
	exit $?
fi


