1
  "   ˆl–Ðz¾”ªj"TÒ�nãNÜ”Å£Èƒ}Ð;ÂÊ %ë    #!/usr/bin/sh
# $Id: osql,v 1.12 2011-05-11 03:08:13 jklowden Exp $
#
# Check odbc.ini, odbcinst, and, optionally, freetds.conf, 
# then execute isql (assume it's unixODBC's isql).  
#

USAGE="Syntax: $(basename "$0") -S server -U user -P password"

while getopts I:S:U:P: OPTION
do
	case ${OPTION} in
		I)	OVER_DIR=${OPTARG}	# override
			;;
		S)	DSN=${OPTARG}
			;;
		U)	USERNAME=${OPTARG}
			;;
		P)	PASSWORD=${OPTARG}
			;;
		\?)     echo "$USAGE"
			exit 1
			;;
	esac
done

#cho ${DSN} ${USERNAME} ${PASSWORD}
if [ -z "${DSN}" ] || [ -z "${USERNAME}" ] || [ -z "${PASSWORD}" ]
then 
	echo "$USAGE"
	exit 1
fi

ISQL=$(command -v isql)
if [ -z "${ISQL}" ]
then
	echo "$(basename "$0"): error: no \"isql\" command found.  Is unixODBC installed?"
	exit 1
fi

# Establish ODBC prefix directory

ISQL_DIR=$(strings "${ISQL}" | grep ^/ | grep -v elf | grep -v '\.so\.' | head -1 | sed 's/lib$/etc/' )

INI_DIRNAME="/tmp/$(basename "$0").$$"
exec 3> "${INI_DIRNAME}"

# Check the libraries, too. 
if [ -z "${OVER_DIR}" ]
then 
	libcmd='ldd "${ISQL}" | awk "/libodbc\./ {print \$3}"'
	if ! command -V ldd >/dev/null 2>&1 && command -V otool >/dev/null 2>&1
	then
		libcmd='otool -L "${ISQL}" | awk "/libodbc\./ {print \$1}"'
	fi
	echo "checking shared odbc libraries linked to isql for default directories..."
	(echo ${ISQL_DIR}; eval "$libcmd") \
	| while read L
	  do 
		strings "$L" | grep '^/' | grep -v '/lib' \
		| while read D 
		  do 
			if [ ! -s "${INI_DIRNAME}" ]
			then
				printf "	trying %s ... " "$D"
				if [ -d "$D" ] && [ -r "${D}/odbc.ini" ]
				then
					echo "$D" >&3
					printf "OK"
				else
					printf "no"
				fi
				printf "\n"
			fi
		done
	done
fi
exec 3>&-

ODBC_DIR=$(cat "${INI_DIRNAME}") && rm "${INI_DIRNAME}"

if [ -z "${ODBC_DIR}" ] && [ -z "${OVER_DIR}" ]
then
	echo "$(basename "$0"): problem: no potential directory strings in \"$(command -v isql)\""
	echo "$(basename "$0"): advice: use \"osql -I DIR\" where DIR unixODBC\'s install prefix e.g. /usr/local"
	echo "isql strings are:"
	strings "${ISQL}" | grep ^/ | sed 's/^/+ /'
	#xit 1
fi

if [ "${OVER_DIR}" ]
then
	if [ -d "${ODBC_DIR}" ]
	then
		echo "\"${ODBC_DIR}\" is a directory, overridden by"
	else 
		echo "\"${ODBC_DIR}\" is NOT a directory, overridden by"
	fi
	echo "\"${OVER_DIR}\"."
	
	if [ -d "${OVER_DIR}" ]
	then
		ODBC_DIR=${OVER_DIR}
	else
		echo "$(basename "$0"): error: \"${OVER_DIR}\" is not a directory"
		exit 1
	fi
fi

# Look for server entry in odbc.ini 
echo 'checking odbc.ini files'
for F in "${HOME}/.odbc.ini" "${ODBC_DIR}/odbc.ini"
do
	if [ ! -d "$(dirname "$F")" ]
	then
		echo "warning: $(dirname "$F") is not a directory" 
		continue
	fi
	
	if [ -r "$F" ]
	then
		echo "	reading $F"
	else
		echo "	cannot read \"$F\""
		continue
	fi

	grep -F "[${DSN}]" "$F" > /dev/null

	if [ $? -eq 0 ]
	then
		echo "[${DSN}] found in $F"
		ODBC_INI=$F
		break
	else
		echo "[${DSN}] not found in $F"
	fi
done

if [ -z "${ODBC_INI}" ]
then
	echo "$(basename "$0"): error: unable to locate ${DSN} in any odbc.ini"
	exit 1
fi

# Report finding of server entry
echo found this section:
SED_CMD="/^\[${DSN}\]/,/^[[:space:]]*$/ { s/^/	/; p; }"
sed -ne "${SED_CMD}" "${ODBC_INI}"

#
# Examine server entry in odbc.ini 
#

# Find the driver in the servername or default section
for D in "${DSN}" 'default' 
do
	echo "looking for driver for DSN [$D] in ${ODBC_INI}"
	grep "$D" "${ODBC_INI}" > /dev/null
	if [ $? -eq 0 ]
	then
		CMD="/^\[$D\]/,/^[[:space:]]*$/ { s/^/	/; p; }"
		DRIVER_LINE=$(sed -ne "${CMD}" "${ODBC_INI}" \
				| grep -Ei '^[[:space:]]*driver[[:space:]]*=')
		if [ -z "${DRIVER_LINE}" ]
		then
			echo "  no driver mentioned for [$D] in $(basename "${ODBC_INI}")"
			continue
		fi

		echo "  found driver line: \"${DRIVER_LINE}\""
		DRIVER=$(echo "${DRIVER_LINE}" \
		    | awk -F ' *= *' '{print $2}' \
		    | sed 's/[[:space:]][[:space:]]*//g')
		if [ "${DRIVER}" ]
		then
			echo "  driver \"${DRIVER}\" found for [$D] in $(basename "${ODBC_INI}")"
			break
		else
			echo "  driver line for [$D] incomplete in $(basen