#!/bin/sh
# This script can execute hive commands via JDBC against a remote hiveserver2
# A couple of examples how this script may be invoked:
#  $ HiveCmdLineUtil --hadoop.home /opt/infa/services/shared/hadoop/cloudera_cdh5u5 -u jdbc:hive2://cdhdevcluster:10000/default -n devbld -p devbld -e "DROP TABLE IF EXISTS INFA_HQL_STG_DEPT" 
#
while [ $# -gt 0 ]; do
  case "$1" in
    --debug)
      DEBUG=true
      shift
      ;;
    --hadoop.home)
      shift
      export INFA_HADOOP_DIST_DIR=$1
      shift
      ;;
    *)
      break
      ;;
  esac
done

# Uncomment out below line to enable performance tracing of HiveCmdLineUtil class.
# Don't do this in hive mode to avoid losing logs of HiveCmdLineUtil in hive session log.
#ENABLE_HIVECMDLINEUTIL_PERF_TRACING=true

if [ "$ENABLE_HIVECMDLINEUTIL_PERF_TRACING" ]; then
  export ENABLE_HIVECMDLINEUTIL_PERF_TRACING=true
  now=$(date +"%T.%3N")
  echo "$now: Beginning of HiveCmdLineUtil..." 
fi

if [ -z "${INFA_RESOURCES}" ]; then
    echo "The INFA_RESOURCES variable is not set.."
    exit 1;
fi

export INFA_HOME_BIN=${INFA_RESOURCES}

case `uname` in
          SunOS)
            LD_LIBRARY_PATH=${INFA_HOME_BIN}:${LD_LIBRARY_PATH}
                export LD_LIBRARY_PATH
                ;;
          Linux)
                LD_LIBRARY_PATH=${INFA_HOME_BIN}:${LD_LIBRARY_PATH}
                export LD_LIBRARY_PATH
                ;;
          AIX)
                LIBPATH=${INFA_HOME_BIN}:${LIBPATH}
                export LIBPATH
                ;;
          HP-UX)
                SHLIB_PATH=${INFA_HOME_BIN}:${SHLIB_PATH}
                export SHLIB_PATH
                ;;
esac

if [ -z "${INFA_HADOOP_DIST_DIR}" ]; then
  echo "Error: INFA_HADOOP_DIST_DIR variable is not set while invoking the script."
  exit 100;
fi

if [ -d ${INFA_HADOOP_DIST_DIR} ]; then
  for j in ${INFA_HADOOP_DIST_DIR}/lib/hadoop-*.jar; do
    HADOOP_CORE_JAR=$j:${HADOOP_CORE_JAR}
  done
fi

# Use JAVA_HOME if it is set to invoke java
JAVA=java
if [ "$JAVA_HOME" != "" ]; then
  JAVA=$JAVA_HOME/bin/java
fi

#set java.library.path for native-hadoop code; required for snappy compression
# This piece of code is copied from 'hadoop' script with slight modification.
setup_hadoop_java_library_path(){
  JAVA_LIBRARY_PATH=''
  if [ -d "${INFA_HADOOP_DIST_DIR}/build/native" -o -d "${INFA_HADOOP_DIST_DIR}/lib/native" -o -e "${HADOOP_PREFIX}/lib/libhadoop.a" ]; then
    JAVA_PLATFORM=`CLASSPATH=${HADOOP_CORE_JAR} ${JAVA} -Xmx32m ${HADOOP_JAVA_PLATFORM_OPTS} org.apache.hadoop.util.PlatformName | sed -e "s/ /_/g"`
  
    if [ "$JAVA_PLATFORM" = "Linux-amd64-64" ]; then
      JSVC_ARCH="amd64"
    else
      JSVC_ARCH="i386"
    fi
  
    if [ -d "$INFA_HADOOP_DIST_DIR/build/native" ]; then
      JAVA_LIBRARY_PATH=${INFA_HADOOP_DIST_DIR}/build/native/${JAVA_PLATFORM}/lib
    fi
  
    if [ -d "${INFA_HADOOP_DIST_DIR}/lib/native" ]; then
      if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then
        JAVA_LIBRARY_PATH=${JAVA_LIBRARY_PATH}:${INFA_HADOOP_DIST_DIR}/lib/native/
      else
        JAVA_LIBRARY_PATH=${INFA_HADOOP_DIST_DIR}/lib/native/
      fi
    fi
  
    if [ -e "${HADOOP_PREFIX}/lib/libhadoop.a" ]; then
      JAVA_LIBRARY_PATH=${HADOOP_PREFIX}/lib
    fi
  fi

}

setup_hadoop_java_library_path

if [ "$ENABLE_HIVECMDLINEUTIL_PERF_TRACING" ]; then
  now=$(date +"%T.%3N")
  echo "$now: Before calling infahadooputil to get HDP_CLASSPATH" 
fi

# run the script file to get the user specified classpath
HDP_CLASSPATH=`${INFA_HADOOP_DIST_DIR}/scripts/infahadooputil --getclasspath`
exitCode=$?

if [[ $exitCode != 0 ]] ; then
  echo "HDP_CLASSPATH = ${HDP_CLASSPATH}"
  exit $exitCode
fi

if [ "$ENABLE_HIVECMDLINEUTIL_PERF_TRACING" ]; then
  now=$(date +"%T.%3N")
  echo "$now: After calling infahadooputil to get HDP_CLASSPATH" 
fi

if [ "$DEBUG" ]; then
  echo "HDP_CLASSPATH = ${HDP_CLASSPATH}"
fi

CLASSPATH=${HADOOP_CLASSPATH}:${HDP_CLASSPATH}

#-Dhadoop.policy.file=hadoop-policy.xml
RUNCLASS=com.informatica.platform.dtm.executor.hive.cmdline.HiveCmdLineUtil

HADOOP_LOG_OPTION='-Dhadoop.root.logger=INFO,console'
LOG_OPTION="${HADOOP_LOG_OPTION} -Dlog4j.configuration=file:${INFA_HOME_BIN}/../hadoop/log4j.properties"

#JAVA_DEBUG_OPTS=-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=14000,suspend=n

COMMAND="${JAVA} -classpath $CLASSPATH -Dhadoop.home.dir=$INFA_HADOOP_DIST_DIR $LOG_OPTION -Djava.library.path=$JAVA_LIBRARY_PATH ${JAVA_OPTS} $RUNCLASS "

if [ "$ENABLE_HIVECMDLINEUTIL_PERF_TRACING" ]; then
  now=$(date +"%T.%3N")
  echo "$now: Ready to execute java HiveCmdLineUtil"
fi

if [ "$DEBUG" ]; then
  echo "Executing command: "${COMMAND} "$@"
  begin1=`date`
  echo $begin1
fi

# run the command and save the exit code
if [ "$DEBUG" ]; then
  ${COMMAND} "$@" --debug
else
  ${COMMAND} "$@"
fi
exitCode=$?

if [ "$DEBUG" ]; then
  end1=`date`
  echo $end1
  begin2=`date --date="$begin1" +%s`
  end2=`date --date="$end1" +%s`
  echo "Total elapsed time=" $(($end2 - $begin2)) "seconds"
fi

if [ "$ENABLE_HIVECMDLINEUTIL_PERF_TRACING" ]; then
  now=$(date +"%T.%3N")
  echo "$now: End of HiveCmdLineUtil script."
fi

exit ${exitCode}

