+DL_LIBRARY=
+for ac_func in dlopen
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:4304: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4309 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:4332: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ cat >> confdefs.h <<\EOF
+#define HAVE_LIBDL 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
+echo "configure:4357: checking for dlopen in -ldl" >&5
+ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4365 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen();
+
+int main() {
+dlopen()
+; return 0; }
+EOF
+if { (eval echo configure:4376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_LIBDL 1
+EOF
+ DL_LIBRARY="-ldl"
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6
+echo "configure:4398: checking for dld_link in -ldld" >&5
+ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldld $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4406 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link();
+
+int main() {
+dld_link()
+; return 0; }
+EOF
+if { (eval echo configure:4417: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_DLD 1
+EOF
+ DL_LIBRARY="-ldld"
+else
+ echo "$ac_t""no" 1>&6
+for ac_func in shl_load
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:4441: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4446 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:4469: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ cat >> confdefs.h <<\EOF
+#define HAVE_SHL_LOAD 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+fi
+
+
+fi
+
+
+fi
+done
+
+
+
+echo $ac_n "checking for underscore before symbols""... $ac_c" 1>&6
+echo "configure:4509: checking for underscore before symbols" >&5
+if eval "test \"`echo '$''{'libltdl_cv_uscore'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ echo "main(){int i=1;} fnord(){int i=23; int ltuae=42;}" > conftest.c
+ ${CC} -c conftest.c > /dev/null
+ if (nm conftest.o | grep _fnord) > /dev/null; then
+ libltdl_cv_uscore=yes
+ else
+ libltdl_cv_uscore=no
+ fi
+ rm -f conftest*
+
+fi
+
+echo "$ac_t""$libltdl_cv_uscore" 1>&6
+
+if test x"$libltdl_cv_uscore" = xyes; then
+ if test x"$ac_cv_func_dlopen" = xyes ||
+ test x"$ac_cv_lib_dl_dlopen" = xyes ; then
+ echo $ac_n "checking whether we have to add an underscore for dlsym""... $ac_c" 1>&6
+echo "configure:4531: checking whether we have to add an underscore for dlsym" >&5
+if eval "test \"`echo '$''{'libltdl_cv_need_uscore'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ libltdl_cv_need_uscore=no
+
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4540 "configure"
+#include "confdefs.h"
+
+#include <dlfcn.h>
+#include <stdio.h>
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(NULL,RTLD_LAZY);
+ if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+ if(ptr1 && !ptr2) exit(0); } exit(1); }
+
+EOF
+if { (eval echo configure:4551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ libltdl_cv_need_uscore=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ libltdl_cv_need_uscore=yes
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$libltdl_cv_need_uscore" 1>&6
+ fi
+fi
+
+if test x"$libltdl_cv_need_uscore" = xyes; then
+ cat >> confdefs.h <<\EOF
+#define NEED_USCORE 1
+EOF
+
+fi
+
+
+for ac_func in strerror
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:4580: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4585 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:4608: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
CHECK_INCLUDE="-I/usr/include $X_CFLAGS"
CHECK_LIB="-L/lib -L/usr/lib $X_LIBS"
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:4311: checking host system type" >&5
+echo "configure:4645: checking host system type" >&5
host_alias=$host
case "$host_alias" in
echo $ac_n "checking "for gtk"""... $ac_c" 1>&6
-echo "configure:4554: checking "for gtk"" >&5
+echo "configure:4888: checking "for gtk"" >&5
# Check whether --with-gtk or --without-gtk was given.
if test "${with_gtk+set}" = set; then
withval="$with_gtk"
echo $ac_n "checking "for qt"""... $ac_c" 1>&6
-echo "configure:4584: checking "for qt"" >&5
+echo "configure:4918: checking "for qt"" >&5
# Check whether --with-qt or --without-qt was given.
if test "${with_qt+set}" = set; then
withval="$with_qt"
echo $ac_n "checking "for motif"""... $ac_c" 1>&6
-echo "configure:4614: checking "for motif"" >&5
+echo "configure:4948: checking "for motif"" >&5
# Check whether --with-motif or --without-motif was given.
if test "${with_motif+set}" = set; then
withval="$with_motif"
echo $ac_n "checking "for shared"""... $ac_c" 1>&6
-echo "configure:4645: checking "for shared"" >&5
+echo "configure:4979: checking "for shared"" >&5
# Check whether --with-shared or --without-shared was given.
if test "${with_shared+set}" = set; then
withval="$with_shared"
echo $ac_n "checking "for optimise"""... $ac_c" 1>&6
-echo "configure:4675: checking "for optimise"" >&5
+echo "configure:5009: checking "for optimise"" >&5
# Check whether --with-optimise or --without-optimise was given.
if test "${with_optimise+set}" = set; then
withval="$with_optimise"
echo $ac_n "checking "for debug_flag"""... $ac_c" 1>&6
-echo "configure:4705: checking "for debug_flag"" >&5
+echo "configure:5039: checking "for debug_flag"" >&5
# Check whether --with-debug_flag or --without-debug_flag was given.
if test "${with_debug_flag+set}" = set; then
withval="$with_debug_flag"
echo $ac_n "checking "for debug_info"""... $ac_c" 1>&6
-echo "configure:4735: checking "for debug_info"" >&5
+echo "configure:5069: checking "for debug_info"" >&5
# Check whether --with-debug_info or --without-debug_info was given.
if test "${with_debug_info+set}" = set; then
withval="$with_debug_info"
echo $ac_n "checking "for debug_gdb"""... $ac_c" 1>&6
-echo "configure:4765: checking "for debug_gdb"" >&5
+echo "configure:5099: checking "for debug_gdb"" >&5
# Check whether --with-debug_gdb or --without-debug_gdb was given.
if test "${with_debug_gdb+set}" = set; then
withval="$with_debug_gdb"
echo $ac_n "checking "for mem_tracing"""... $ac_c" 1>&6
-echo "configure:4795: checking "for mem_tracing"" >&5
+echo "configure:5129: checking "for mem_tracing"" >&5
# Check whether --with-mem_tracing or --without-mem_tracing was given.
if test "${with_mem_tracing+set}" = set; then
withval="$with_mem_tracing"
echo $ac_n "checking "for dmalloc"""... $ac_c" 1>&6
-echo "configure:4825: checking "for dmalloc"" >&5
+echo "configure:5159: checking "for dmalloc"" >&5
# Check whether --with-dmalloc or --without-dmalloc was given.
if test "${with_dmalloc+set}" = set; then
withval="$with_dmalloc"
echo $ac_n "checking "for profile"""... $ac_c" 1>&6
-echo "configure:4855: checking "for profile"" >&5
+echo "configure:5189: checking "for profile"" >&5
# Check whether --with-profile or --without-profile was given.
if test "${with_profile+set}" = set; then
withval="$with_profile"
echo $ac_n "checking "for apple_ieee"""... $ac_c" 1>&6
-echo "configure:4885: checking "for apple_ieee"" >&5
+echo "configure:5219: checking "for apple_ieee"" >&5
# Check whether --with-apple_ieee or --without-apple_ieee was given.
if test "${with_apple_ieee+set}" = set; then
withval="$with_apple_ieee"
echo $ac_n "checking "for threads"""... $ac_c" 1>&6
-echo "configure:4915: checking "for threads"" >&5
+echo "configure:5249: checking "for threads"" >&5
# Check whether --with-threads or --without-threads was given.
if test "${with_threads+set}" = set; then
withval="$with_threads"
echo $ac_n "checking "for zlib"""... $ac_c" 1>&6
-echo "configure:4946: checking "for zlib"" >&5
+echo "configure:5280: checking "for zlib"" >&5
# Check whether --with-zlib or --without-zlib was given.
if test "${with_zlib+set}" = set; then
withval="$with_zlib"
echo $ac_n "checking "for libpng"""... $ac_c" 1>&6
-echo "configure:4976: checking "for libpng"" >&5
+echo "configure:5310: checking "for libpng"" >&5
# Check whether --with-libpng or --without-libpng was given.
if test "${with_libpng+set}" = set; then
withval="$with_libpng"
echo $ac_n "checking "for odbc"""... $ac_c" 1>&6
-echo "configure:5006: checking "for odbc"" >&5
+echo "configure:5340: checking "for odbc"" >&5
# Check whether --with-odbc or --without-odbc was given.
if test "${with_odbc+set}" = set; then
withval="$with_odbc"
echo $ac_n "checking "for timedate"""... $ac_c" 1>&6
-echo "configure:5037: checking "for timedate"" >&5
+echo "configure:5371: checking "for timedate"" >&5
# Check whether --with-timedate or --without-timedate was given.
if test "${with_timedate+set}" = set; then
withval="$with_timedate"
echo $ac_n "checking "for intl"""... $ac_c" 1>&6
-echo "configure:5067: checking "for intl"" >&5
+echo "configure:5401: checking "for intl"" >&5
# Check whether --with-intl or --without-intl was given.
if test "${with_intl+set}" = set; then
withval="$with_intl"
echo $ac_n "checking "for config"""... $ac_c" 1>&6
-echo "configure:5097: checking "for config"" >&5
+echo "configure:5431: checking "for config"" >&5
# Check whether --with-config or --without-config was given.
if test "${with_config+set}" = set; then
withval="$with_config"
echo $ac_n "checking "for streams"""... $ac_c" 1>&6
-echo "configure:5127: checking "for streams"" >&5
+echo "configure:5461: checking "for streams"" >&5
# Check whether --with-streams or --without-streams was given.
if test "${with_streams+set}" = set; then
withval="$with_streams"
echo $ac_n "checking "for serial"""... $ac_c" 1>&6
-echo "configure:5157: checking "for serial"" >&5
+echo "configure:5491: checking "for serial"" >&5
# Check whether --with-serial or --without-serial was given.
if test "${with_serial+set}" = set; then
withval="$with_serial"
echo $ac_n "checking "for afmfonts"""... $ac_c" 1>&6
-echo "configure:5188: checking "for afmfonts"" >&5
+echo "configure:5522: checking "for afmfonts"" >&5
# Check whether --with-afmfonts or --without-afmfonts was given.
if test "${with_afmfonts+set}" = set; then
withval="$with_afmfonts"
echo $ac_n "checking "for normalized"""... $ac_c" 1>&6
-echo "configure:5218: checking "for normalized"" >&5
+echo "configure:5552: checking "for normalized"" >&5
# Check whether --with-normalized or --without-normalized was given.
if test "${with_normalized+set}" = set; then
withval="$with_normalized"
echo $ac_n "checking "for postscript"""... $ac_c" 1>&6
-echo "configure:5248: checking "for postscript"" >&5
+echo "configure:5582: checking "for postscript"" >&5
# Check whether --with-postscript or --without-postscript was given.
if test "${with_postscript+set}" = set; then
withval="$with_postscript"
echo $ac_n "checking "for unicode"""... $ac_c" 1>&6
-echo "configure:5279: checking "for unicode"" >&5
+echo "configure:5613: checking "for unicode"" >&5
# Check whether --with-unicode or --without-unicode was given.
if test "${with_unicode+set}" = set; then
withval="$with_unicode"
echo $ac_n "checking "for wcsrtombs"""... $ac_c" 1>&6
-echo "configure:5309: checking "for wcsrtombs"" >&5
+echo "configure:5643: checking "for wcsrtombs"" >&5
# Check whether --with-wcsrtombs or --without-wcsrtombs was given.
if test "${with_wcsrtombs+set}" = set; then
withval="$with_wcsrtombs"
echo $ac_n "checking "for wxresources"""... $ac_c" 1>&6
-echo "configure:5340: checking "for wxresources"" >&5
+echo "configure:5674: checking "for wxresources"" >&5
# Check whether --with-wxresources or --without-wxresources was given.
if test "${with_wxresources+set}" = set; then
withval="$with_wxresources"
echo $ac_n "checking "for prologio"""... $ac_c" 1>&6
-echo "configure:5370: checking "for prologio"" >&5
+echo "configure:5704: checking "for prologio"" >&5
# Check whether --with-prologio or --without-prologio was given.
if test "${with_prologio+set}" = set; then
withval="$with_prologio"
echo $ac_n "checking "for RPC"""... $ac_c" 1>&6
-echo "configure:5400: checking "for RPC"" >&5
+echo "configure:5734: checking "for RPC"" >&5
# Check whether --with-rpc or --without-rpc was given.
if test "${with_rpc+set}" = set; then
withval="$with_rpc"
echo $ac_n "checking "for IPC"""... $ac_c" 1>&6
-echo "configure:5431: checking "for IPC"" >&5
+echo "configure:5765: checking "for IPC"" >&5
# Check whether --with-ipc or --without-ipc was given.
if test "${with_ipc+set}" = set; then
withval="$with_ipc"
echo $ac_n "checking "for resources"""... $ac_c" 1>&6
-echo "configure:5461: checking "for resources"" >&5
+echo "configure:5795: checking "for resources"" >&5
# Check whether --with-resources or --without-resources was given.
if test "${with_resources+set}" = set; then
withval="$with_resources"
echo $ac_n "checking "for clipboard"""... $ac_c" 1>&6
-echo "configure:5491: checking "for clipboard"" >&5
+echo "configure:5825: checking "for clipboard"" >&5
# Check whether --with-clipboard or --without-clipboard was given.
if test "${with_clipboard+set}" = set; then
withval="$with_clipboard"
echo $ac_n "checking "for dnd"""... $ac_c" 1>&6
-echo "configure:5521: checking "for dnd"" >&5
+echo "configure:5855: checking "for dnd"" >&5
# Check whether --with-dnd or --without-dnd was given.
if test "${with_dnd+set}" = set; then
withval="$with_dnd"
echo $ac_n "checking "for mdi"""... $ac_c" 1>&6
-echo "configure:5552: checking "for mdi"" >&5
+echo "configure:5886: checking "for mdi"" >&5
# Check whether --with-mdi or --without-mdi was given.
if test "${with_mdi+set}" = set; then
withval="$with_mdi"
echo $ac_n "checking "for docview"""... $ac_c" 1>&6
-echo "configure:5582: checking "for docview"" >&5
+echo "configure:5916: checking "for docview"" >&5
# Check whether --with-docview or --without-docview was given.
if test "${with_docview+set}" = set; then
withval="$with_docview"
echo $ac_n "checking "for printarch"""... $ac_c" 1>&6
-echo "configure:5612: checking "for printarch"" >&5
+echo "configure:5946: checking "for printarch"" >&5
# Check whether --with-printarch or --without-printarch was given.
if test "${with_printarch+set}" = set; then
withval="$with_printarch"
echo $ac_n "checking "for help"""... $ac_c" 1>&6
-echo "configure:5642: checking "for help"" >&5
+echo "configure:5976: checking "for help"" >&5
# Check whether --with-help or --without-help was given.
if test "${with_help+set}" = set; then
withval="$with_help"
if test "$USE_LINUX" = 1; then
echo $ac_n "checking for gettext in -lc""... $ac_c" 1>&6
-echo "configure:5680: checking for gettext in -lc" >&5
+echo "configure:6014: checking for gettext in -lc" >&5
ac_lib_var=`echo c'_'gettext | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 5688 "configure"
+#line 6022 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
gettext()
; return 0; }
EOF
-if { (eval echo configure:5699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
# Extract the first word of "gtk-config", so it can be a program name with args.
set dummy gtk-config; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5770: checking for $ac_word" >&5
+echo "configure:6104: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
min_gtk_version=1.0.4
echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
-echo "configure:5801: checking for GTK - version >= $min_gtk_version" >&5
+echo "configure:6135: checking for GTK - version >= $min_gtk_version" >&5
no_gtk=""
if test "$GTK_CONFIG" != "no" ; then
GTK_CFLAGS=`$GTK_CONFIG --cflags`
echo $ac_n "cross compiling; assumed OK... $ac_c"
else
cat > conftest.$ac_ext <<EOF
-#line 5814 "configure"
+#line 6148 "configure"
#include "confdefs.h"
#include <gtk/gtk.h>
}
EOF
-if { (eval echo configure:5838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
then
:
else
if test "$wxUSE_QT" = 1; then
echo $ac_n "checking for Qt includes""... $ac_c" 1>&6
-echo "configure:5878: checking for Qt includes" >&5
+echo "configure:6212: checking for Qt includes" >&5
ac_find_includes=
for ac_dir in $SEARCH_INCLUDE;
if test "$ac_find_includes" != "" ; then
echo "$ac_t""found $ac_find_includes" 1>&6
echo $ac_n "checking for Qt library""... $ac_c" 1>&6
-echo "configure:5892: checking for Qt library" >&5
+echo "configure:6226: checking for Qt library" >&5
ac_find_libraries=
for ac_dir in $SEARCH_LIB;
if test "$wxUSE_MOTIF" = 1; then
echo $ac_n "checking for Motif/Lesstif includes""... $ac_c" 1>&6
-echo "configure:5943: checking for Motif/Lesstif includes" >&5
+echo "configure:6277: checking for Motif/Lesstif includes" >&5
ac_find_includes=
for ac_dir in $SEARCH_INCLUDE;
if test "$ac_find_includes" != "" ; then
echo "$ac_t""found $ac_find_includes" 1>&6
echo $ac_n "checking for Motif/Lesstif library""... $ac_c" 1>&6
-echo "configure:5957: checking for Motif/Lesstif library" >&5
+echo "configure:6291: checking for Motif/Lesstif library" >&5
ac_find_libraries=
for ac_dir in $SEARCH_LIB;
CHECK_INCLUDE="$CHECK_INCLUDE $ac_path_to_include"
echo "$ac_t""found at $ac_find_libraries" 1>&6
echo $ac_n "checking for Xt library""... $ac_c" 1>&6
-echo "configure:5994: checking for Xt library" >&5
+echo "configure:6328: checking for Xt library" >&5
ac_find_libraries=
for ac_dir in $SEARCH_LIB;
CHECK_LINK="$CHECK_LIB $ac_path_to_link"
echo "$ac_t""found at $ac_find_libraries" 1>&6
echo $ac_n "checking for Xpm library""... $ac_c" 1>&6
-echo "configure:6020: checking for Xpm library" >&5
+echo "configure:6354: checking for Xpm library" >&5
ac_find_libraries=
for ac_dir in $SEARCH_LIB;
-echo $ac_n "checking for main in -ldl""... $ac_c" 1>&6
-echo "configure:6350: checking for main in -ldl" >&5
-ac_lib_var=`echo dl'_'main | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-ldl $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 6358 "configure"
-#include "confdefs.h"
-
-int main() {
-main()
-; return 0; }
-EOF
-if { (eval echo configure:6365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- DL_LIBRARY=-ldl
-else
- echo "$ac_t""no" 1>&6
-DL_LIBRARY=
-fi
-
-
-
-
THREADS_LINK=""
UNIX_THREAD=""
echo $ac_n "checking for pthread_create in -lpthread-0.7""... $ac_c" 1>&6
-echo "configure:6396: checking for pthread_create in -lpthread-0.7" >&5
+echo "configure:6690: checking for pthread_create in -lpthread-0.7" >&5
ac_lib_var=`echo pthread-0.7'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lpthread-0.7 $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6404 "configure"
+#line 6698 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_create()
; return 0; }
EOF
-if { (eval echo configure:6415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
ac_safe=`echo "sys/prctl.h" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for sys/prctl.h""... $ac_c" 1>&6
-echo "configure:6439: checking for sys/prctl.h" >&5
+echo "configure:6733: checking for sys/prctl.h" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 6444 "configure"
+#line 6738 "configure"
#include "confdefs.h"
#include <sys/prctl.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6449: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6743: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
echo $ac_n "checking for pthread_setcanceltype in -lpthread""... $ac_c" 1>&6
-echo "configure:6475: checking for pthread_setcanceltype in -lpthread" >&5
+echo "configure:6769: checking for pthread_setcanceltype in -lpthread" >&5
ac_lib_var=`echo pthread'_'pthread_setcanceltype | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lpthread $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6483 "configure"
+#line 6777 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
pthread_setcanceltype()
; return 0; }
EOF
-if { (eval echo configure:6494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6788: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo $ac_n "checking for printf in -lposix4""... $ac_c" 1>&6
-echo "configure:6530: checking for printf in -lposix4" >&5
+echo "configure:6824: checking for printf in -lposix4" >&5
ac_lib_var=`echo posix4'_'printf | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
ac_save_LIBS="$LIBS"
LIBS="-lposix4 $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 6538 "configure"
+#line 6832 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
printf()
; return 0; }
EOF
-if { (eval echo configure:6549: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:6843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
esac
if test "x$GCC" = xyes; then
- CFLAGS="${CFLAGS} -Wall -Wno-unused -Wno-uninitialized -D_REENTRANT -DLEX_SCANNER"
+ CFLAGS="${CFLAGS} -Wall -Wno-unused -Wno-uninitialized -D_REENTRANT -DLEX_SCANNER -DHAVE_LIBDL"
fi
if test "x$GXX" = xyes; then
s%@LEX@%$LEX%g
s%@LEXLIB@%$LEXLIB%g
s%@LEX_OUTPUT_ROOT@%$LEX_OUTPUT_ROOT%g
+s%@DL_LIBRARY@%$DL_LIBRARY%g
s%@host@%$host%g
s%@host_alias@%$host_alias%g
s%@host_cpu@%$host_cpu%g
s%@PNG_C_SRC@%$PNG_C_SRC%g
s%@IODBC_C_SRC@%$IODBC_C_SRC%g
s%@HELP@%$HELP%g
-s%@DL_LIBRARY@%$DL_LIBRARY%g
s%@UNIX_THREAD@%$UNIX_THREAD%g
s%@THREADS_LINK@%$THREADS_LINK%g
s%@OS@%$OS%g
dnl defines LEX_OUTPUT_ROOT as to the base of the
dnl filename output by the lexer
+dnl ###################################
+dnl ## Check for dynamic load module #
+dnl ###################################
+
+DL_LIBRARY=
+AC_CHECK_FUNCS(dlopen, AC_DEFINE(HAVE_LIBDL),
+[AC_CHECK_LIB(dl, dlopen, [AC_DEFINE(HAVE_LIBDL) DL_LIBRARY="-ldl"],
+ [AC_CHECK_LIB(dld, dld_link, [AC_DEFINE(HAVE_DLD) DL_LIBRARY="-ldld"],
+ [AC_CHECK_FUNCS(shl_load, AC_DEFINE(HAVE_SHL_LOAD) )]
+ )]
+ )]
+)
+AC_SUBST(DL_LIBRARY)
+
+AC_CACHE_CHECK([for underscore before symbols], libltdl_cv_uscore, [
+ echo "main(){int i=1;} fnord(){int i=23; int ltuae=42;}" > conftest.c
+ ${CC} -c conftest.c > /dev/null
+ if (nm conftest.o | grep _fnord) > /dev/null; then
+ libltdl_cv_uscore=yes
+ else
+ libltdl_cv_uscore=no
+ fi
+ rm -f conftest*
+])
+
+if test x"$libltdl_cv_uscore" = xyes; then
+ if test x"$ac_cv_func_dlopen" = xyes ||
+ test x"$ac_cv_lib_dl_dlopen" = xyes ; then
+ AC_CACHE_CHECK([whether we have to add an underscore for dlsym],
+ libltdl_cv_need_uscore, [dnl
+ AC_TRY_RUN([
+#include <dlfcn.h>
+#include <stdio.h>
+fnord() { int i=42;}
+main() { void *self, *ptr1, *ptr2; self=dlopen(NULL,RTLD_LAZY);
+ if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord");
+ if(ptr1 && !ptr2) exit(0); } exit(1); }
+], libltdl_cv_need_uscore=no, libltdl_cv_need_uscore=yes,
+ libltdl_cv_need_uscore=no
+)])
+ fi
+fi
+
+if test x"$libltdl_cv_need_uscore" = xyes; then
+ AC_DEFINE(NEED_USCORE)
+fi
+
+dnl ##########################################
+dnl ## Check for specific library functions #
+dnl ##########################################
+
+dnl Checks for library functions.
+AC_CHECK_FUNCS(strerror)
+
dnl ------------------------------------------------------------------------
dnl main includes
dnl ------------------------------------------------------------------------
fi
AC_SUBST(HELP)
-dnl ----------------------------------------------------------------
-dnl select dynamic loader (used by iODBC to load drivers)
-dnl ----------------------------------------------------------------
-
-AC_CHECK_LIB(dl,main,[DL_LIBRARY=-ldl],[DL_LIBRARY=])
-AC_SUBST(DL_LIBRARY)
-
dnl ----------------------------------------------------------------
dnl thread support
dnl ----------------------------------------------------------------
esac
if test "x$GCC" = xyes; then
- CFLAGS="${CFLAGS} -Wall -Wno-unused -Wno-uninitialized -D_REENTRANT -DLEX_SCANNER"
+ CFLAGS="${CFLAGS} -Wall -Wno-unused -Wno-uninitialized -D_REENTRANT -DLEX_SCANNER -DHAVE_LIBDL"
fi
if test "x$GXX" = xyes; then
extern "C" {
#include <../iodbc/isql.h>
#include <../iodbc/isqlext.h>
-#include <../iodbc/odbc_funcs.h>
-#include <../iodbc/odbc_types.h>
-
-typedef float SFLOAT;
-typedef double SDOUBLE;
+typedef float SFLOAT;
+typedef double SDOUBLE;
+typedef unsigned int UINT;
#define ULONG UDWORD
}
public:
+ wxDataFormat();
wxDataFormat( wxDataType type );
wxDataFormat( const wxString &id );
wxDataFormat( wxDataFormat &format );
wxDataFormat( const GdkAtom atom );
-
- int GetType() const;
+
+ void SetType( wxDataType type );
+ wxDataType GetType() const;
+
wxString GetId() const;
void SetId( const wxString &id );
+
GdkAtom GetAtom();
private:
- int m_type;
- wxString m_id;
- bool m_hasAtom;
- GdkAtom m_atom;
+ wxDataType m_type;
+ wxString m_id;
+ bool m_hasAtom;
+ GdkAtom m_atom;
};
//-------------------------------------------------------------------------
/* implementation */
- virtual wxDataFormat &GetFormat() const;
+ wxDataFormat &GetFormat();
+
+ wxDataType GetFormatType() const;
+ wxString GetFormatId() const;
+ GdkAtom GetFormatAtom() const;
- wxDataFormat *m_format;
+ wxDataFormat m_format;
};
//----------------------------------------------------------------------------
public:
+ wxDataFormat();
wxDataFormat( wxDataType type );
wxDataFormat( const wxString &id );
wxDataFormat( wxDataFormat &format );
wxDataFormat( const GdkAtom atom );
-
- int GetType() const;
+
+ void SetType( wxDataType type );
+ wxDataType GetType() const;
+
wxString GetId() const;
void SetId( const wxString &id );
+
GdkAtom GetAtom();
private:
- int m_type;
- wxString m_id;
- bool m_hasAtom;
- GdkAtom m_atom;
+ wxDataType m_type;
+ wxString m_id;
+ bool m_hasAtom;
+ GdkAtom m_atom;
};
//-------------------------------------------------------------------------
/* implementation */
- virtual wxDataFormat &GetFormat() const;
+ wxDataFormat &GetFormat();
+
+ wxDataType GetFormatType() const;
+ wxString GetFormatId() const;
+ GdkAtom GetFormatAtom() const;
- wxDataFormat *m_format;
+ wxDataFormat m_format;
};
//----------------------------------------------------------------------------
iodbc/hstmt.c \
iodbc/info.c \
iodbc/itrace.c \
- iodbc/main.c \
iodbc/misc.c \
iodbc/prepare.c \
iodbc/result.c
IMPLEMENT_CLASS(wxDataFormat, wxObject)
-wxDataFormat::wxDataFormat( wxDataType type )
+wxDataFormat::wxDataFormat()
{
- m_type = type;
-
- if (m_type == wxDF_TEXT)
- {
- m_id = "STRING";
- }
- else
- if (m_type == wxDF_BITMAP)
- {
- m_id = "BITMAP";
- }
- else
- if (m_type == wxDF_FILENAME)
- {
- m_id = "file:ALL";
- }
- else
- {
- wxFAIL_MSG( "invalid dataformat" );
- }
-
+ m_type = wxDF_INVALID;
m_hasAtom = FALSE;
+ m_atom = (GdkAtom) 0;
+}
+
+wxDataFormat::wxDataFormat( wxDataType type )
+{
+ SetType( type );
}
wxDataFormat::wxDataFormat( const wxString &id )
{
- m_type = wxDF_PRIVATE;
- m_id = id;
- m_hasAtom = FALSE;
+ SetId( id );
}
wxDataFormat::wxDataFormat( wxDataFormat &format )
}
}
-int wxDataFormat::GetType() const
+void wxDataFormat::SetType( wxDataType type )
+{
+ m_type = type;
+
+ if (m_type == wxDF_TEXT)
+ {
+ m_id = "STRING";
+ }
+ else
+ if (m_type == wxDF_BITMAP)
+ {
+ m_id = "BITMAP";
+ }
+ else
+ if (m_type == wxDF_FILENAME)
+ {
+ m_id = "file:ALL";
+ }
+ else
+ {
+ wxFAIL_MSG( "invalid dataformat" );
+ }
+
+ m_hasAtom = FALSE;
+}
+
+wxDataType wxDataFormat::GetType() const
{
return m_type;
}
wxDataObject::wxDataObject()
{
- m_format = (wxDataFormat*) NULL;
}
wxDataObject::~wxDataObject()
{
- if (m_format) delete m_format;
}
-wxDataFormat &wxDataObject::GetFormat() const
+wxDataFormat &wxDataObject::GetFormat()
{
- wxASSERT( m_format );
+ return m_format;
+}
- return (*m_format);
+wxDataType wxDataObject::GetFormatType() const
+{
+ return m_format.GetType();
+}
+
+wxString wxDataObject::GetFormatId() const
+{
+ return m_format.GetId();
}
+GdkAtom wxDataObject::GetFormatAtom() const
+{
+ GdkAtom ret = m_format.GetAtom();
+ return ret;
+}
+
// ----------------------------------------------------------------------------
// wxTextDataObject
// ----------------------------------------------------------------------------
wxTextDataObject::wxTextDataObject()
{
- m_format = new wxDataFormat( wxDF_TEXT );
+ m_format.SetType( wxDF_TEXT );
}
wxTextDataObject::wxTextDataObject( const wxString& data )
{
- m_format = new wxDataFormat( wxDF_TEXT );
+ m_format.SetType( wxDF_TEXT );
m_data = data;
}
IMPLEMENT_DYNAMIC_CLASS( wxFileDataObject, wxDataObject )
-wxFileDataObject::wxFileDataObject(void)
+wxFileDataObject::wxFileDataObject()
{
- m_format = new wxDataFormat( wxDF_FILENAME );
+ m_format.SetType( wxDF_FILENAME );
}
void wxFileDataObject::AddFile( const wxString &file )
wxBitmapDataObject::wxBitmapDataObject()
{
- m_format = new wxDataFormat( wxDF_BITMAP );
+ m_format.SetType( wxDF_BITMAP );
}
wxBitmapDataObject::wxBitmapDataObject( const wxBitmap& bitmap )
{
- m_format = new wxDataFormat( wxDF_BITMAP );
+ m_format.SetType( wxDF_BITMAP );
m_bitmap = bitmap;
}
m_id = "application/";
m_id += wxTheApp->GetAppName();
- m_format = new wxDataFormat( m_id );
+ m_format.SetId( m_id );
m_size = 0;
m_data = (char*) NULL;
void wxPrivateDataObject::SetId( const wxString& id )
{
m_id = id;
- m_format->SetId( m_id );
+ m_format.SetId( m_id );
}
wxString wxPrivateDataObject::GetId() const
IMPLEMENT_CLASS(wxDataFormat, wxObject)
-wxDataFormat::wxDataFormat( wxDataType type )
+wxDataFormat::wxDataFormat()
{
- m_type = type;
-
- if (m_type == wxDF_TEXT)
- {
- m_id = "STRING";
- }
- else
- if (m_type == wxDF_BITMAP)
- {
- m_id = "BITMAP";
- }
- else
- if (m_type == wxDF_FILENAME)
- {
- m_id = "file:ALL";
- }
- else
- {
- wxFAIL_MSG( "invalid dataformat" );
- }
-
+ m_type = wxDF_INVALID;
m_hasAtom = FALSE;
+ m_atom = (GdkAtom) 0;
+}
+
+wxDataFormat::wxDataFormat( wxDataType type )
+{
+ SetType( type );
}
wxDataFormat::wxDataFormat( const wxString &id )
{
- m_type = wxDF_PRIVATE;
- m_id = id;
- m_hasAtom = FALSE;
+ SetId( id );
}
wxDataFormat::wxDataFormat( wxDataFormat &format )
}
}
-int wxDataFormat::GetType() const
+void wxDataFormat::SetType( wxDataType type )
+{
+ m_type = type;
+
+ if (m_type == wxDF_TEXT)
+ {
+ m_id = "STRING";
+ }
+ else
+ if (m_type == wxDF_BITMAP)
+ {
+ m_id = "BITMAP";
+ }
+ else
+ if (m_type == wxDF_FILENAME)
+ {
+ m_id = "file:ALL";
+ }
+ else
+ {
+ wxFAIL_MSG( "invalid dataformat" );
+ }
+
+ m_hasAtom = FALSE;
+}
+
+wxDataType wxDataFormat::GetType() const
{
return m_type;
}
wxDataObject::wxDataObject()
{
- m_format = (wxDataFormat*) NULL;
}
wxDataObject::~wxDataObject()
{
- if (m_format) delete m_format;
}
-wxDataFormat &wxDataObject::GetFormat() const
+wxDataFormat &wxDataObject::GetFormat()
{
- wxASSERT( m_format );
+ return m_format;
+}
- return (*m_format);
+wxDataType wxDataObject::GetFormatType() const
+{
+ return m_format.GetType();
+}
+
+wxString wxDataObject::GetFormatId() const
+{
+ return m_format.GetId();
}
+GdkAtom wxDataObject::GetFormatAtom() const
+{
+ GdkAtom ret = m_format.GetAtom();
+ return ret;
+}
+
// ----------------------------------------------------------------------------
// wxTextDataObject
// ----------------------------------------------------------------------------
wxTextDataObject::wxTextDataObject()
{
- m_format = new wxDataFormat( wxDF_TEXT );
+ m_format.SetType( wxDF_TEXT );
}
wxTextDataObject::wxTextDataObject( const wxString& data )
{
- m_format = new wxDataFormat( wxDF_TEXT );
+ m_format.SetType( wxDF_TEXT );
m_data = data;
}
IMPLEMENT_DYNAMIC_CLASS( wxFileDataObject, wxDataObject )
-wxFileDataObject::wxFileDataObject(void)
+wxFileDataObject::wxFileDataObject()
{
- m_format = new wxDataFormat( wxDF_FILENAME );
+ m_format.SetType( wxDF_FILENAME );
}
void wxFileDataObject::AddFile( const wxString &file )
wxBitmapDataObject::wxBitmapDataObject()
{
- m_format = new wxDataFormat( wxDF_BITMAP );
+ m_format.SetType( wxDF_BITMAP );
}
wxBitmapDataObject::wxBitmapDataObject( const wxBitmap& bitmap )
{
- m_format = new wxDataFormat( wxDF_BITMAP );
+ m_format.SetType( wxDF_BITMAP );
m_bitmap = bitmap;
}
m_id = "application/";
m_id += wxTheApp->GetAppName();
- m_format = new wxDataFormat( m_id );
+ m_format.SetId( m_id );
m_size = 0;
m_data = (char*) NULL;
void wxPrivateDataObject::SetId( const wxString& id )
{
m_id = id;
- m_format->SetId( m_id );
+ m_format.SetId( m_id );
}
wxString wxPrivateDataObject::GetId() const
--- /dev/null
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+\f
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+\f
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+\f
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+\f
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ Appendix: How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
-July 30, 1995, v2.00.beta:
- 0. the first release and beta version.
+January 18, 1999, V2.50:
+ * Added autoconf/automake/libtool support
+ * Licensing moved to LGPL
+ * Added OpenLink code enhancements and bug fixes
+
+------------------------------------------------------------------------
+Original Changelog from Ke Jin
+------------------------------------------------------------------------
+July 30, 1995, v2.00.beta:
+ 0. the first release and beta version.
Sep. 11, 1995, v2.10:
- 1. Porting to AIX 3.x and 4.x, by writing dlopen(),
- dlsym(), dlclose() interface.
- 2. Tested on SCO OpenServer 5.x
- 3. Awared of that, unlike s700/s800, exported function
- symbols on HP9000 s300/s400 will be prepended with
- a '_' prefix by compiler(and this '_' prefix is not
- automatically handled by shl_findsym()). Now, it works
- fine on s300/s400.
- 4. Support driver ODBC call tracing.
+ 1. Porting to AIX 3.x and 4.x, by writing dlopen(),
+ dlsym(), dlclose() interface.
+ 2. Tested on SCO OpenServer 5.x
+ 3. Awared of that, unlike s700/s800, exported function
+ symbols on HP9000 s300/s400 will be prepended with
+ a '_' prefix by compiler(and this '_' prefix is not
+ automatically handled by shl_findsym()). Now, it works
+ fine on s300/s400.
+ 4. Support driver ODBC call tracing.
Oct. 12, 1995, v2.11:
- 5. Driver's SQLNumResultCols() will automatically be
- invoked in driver manager's SQLExecute(),
- SQLExecDirect() and SQLParamData() after successfully
- (i.e. return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO )
- calling of their correspondent driver functions. This
- simplifies the state tracing/checking of the driver
- manager a lot and allows store procedures to return
- result set and also make iODBC driver manager work
- properly with SELECT INTO statements which actually
- don't return result sets.
- 6. Memory leaks are cleared.
- 7. Two bugs in dld.c for AIX are fixed
- 8. A bug of setting tracing option is fixed.
- 9. The driver will not be unloaded by SQLDisconnect()
- but by SQLFreeConnect() or next SQLConnect()/
- SQLDriverConnect()/SQLBrowsConnect() on a different
- driver. This will save driver's loading time if it
- has been used by a previous connection(even there
- is no active connection on this driver).
- 10.Another three platforms are supported:
- FreeBSD 2.x
- Concurrent Max/OS SVR4 1.x
- DG/UX 5.x
- 11.autoconfig and build -- shell scripts to help modifying
- Config.mk and building iodbc driver manager
+ 5. Driver's SQLNumResultCols() will automatically be
+ invoked in driver manager's SQLExecute(),
+ SQLExecDirect() and SQLParamData() after successfully
+ (i.e. return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO )
+ calling of their correspondent driver functions. This
+ simplifies the state tracing/checking of the driver
+ manager a lot and allows store procedures to return
+ result set and also make iODBC driver manager work
+ properly with SELECT INTO statements which actually
+ don't return result sets.
+ 6. Memory leaks are cleared.
+ 7. Two bugs in dld.c for AIX are fixed
+ 8. A bug of setting tracing option is fixed.
+ 9. The driver will not be unloaded by SQLDisconnect()
+ but by SQLFreeConnect() or next SQLConnect()/
+ SQLDriverConnect()/SQLBrowsConnect() on a different
+ driver. This will save driver's loading time if it
+ has been used by a previous connection(even there
+ is no active connection on this driver).
+ 10.Another three platforms are supported:
+ FreeBSD 2.x
+ Concurrent Max/OS SVR4 1.x
+ DG/UX 5.x
+ 11.autoconfig and build -- shell scripts to help modifying
+ Config.mk and building iodbc driver manager
Nov. 12, 1995, v2.12
- 12.I realized that a driver manager doesn't aware of
- difference between a C5 (i.e. hstmt) and a C6
- (i.e. transaction) states.
- 13.The link flags "-lc" has been droped from Linux ELF
- section of Config.mk to fix a segment fault problem.
- Now, it works fine on Slackware 2.3 and Red Hat 2.0
- (kernel version are 1.2.xx and 1.3.xx respectively).
- 14.On FreeBSD 2.x, dlsym() doesn't handle the '_' prefix
- prepended to an exportting function symbol by compiler.
- So, CLI_NAME_PREFIX needs to be defined as "_SQL" for
- FreeBSD 2.x.
- 15.Some files are renamed
- dld.c -> dlf.c
- dld.h -> dlf.h
- confg.h -> config.h
- 16. Fix a bug on setting tracing options.
+ 12.I realized that a driver manager doesn't aware of
+ difference between a C5 (i.e. hstmt) and a C6
+ (i.e. transaction) states.
+ 13.The link flags "-lc" has been droped from Linux ELF
+ section of Config.mk to fix a segment fault problem.
+ Now, it works fine on Slackware 2.3 and Red Hat 2.0
+ (kernel version are 1.2.xx and 1.3.xx respectively).
+ 14.On FreeBSD 2.x, dlsym() doesn't handle the '_' prefix
+ prepended to an exportting function symbol by compiler.
+ So, CLI_NAME_PREFIX needs to be defined as "_SQL" for
+ FreeBSD 2.x.
+ 15.Some files are renamed
+ dld.c -> dlf.c
+ dld.h -> dlf.h
+ confg.h -> config.h
+ 16. Fix a bug on setting tracing options.
+
+++ /dev/null
-#
-# Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-#
-
-#============ Default for all system ==============
-SHELL =
-SHELL = /bin/sh
-DLDAPI = DLDAPI_SVR4_DLFCN
-DLSUFFIX= so
-OUTFILE = iodbc
-OBJX =
-
-#============= Linux ELF =========================
-# Slackware 2.x,(kernel 1.3.x) on i386
-# Red Hat 2.x (kernel 1.2.x) on i486
-#
-ANSI = -ansi
-CC = gcc
-PIC = -fPIC
-LDFLAGS = -shared
-LIBS = -ldl
-Title: iODBC Driver Manager for Unix
+Title: iODBC Driver Manager
-Version: 2.12.0
+Version: 2.50
Description: iODBC (intrinsic Open Database Connectivity) driver manager
- is compatible with ODBC 2.0 specification and performs exactly
- same jobs of ODBC 2.0 driver manager(i.e driver loading,
- parameters and function sequence checking, driver's function
- invoking, etc.). Any ODBC driver works with ODBC 2.0 driver
- manager will also work with iODBC driver manager and vice versa.
- Applications(which using ODBC function calls) linked with
+ is compatible with ODBC 2.x specification and performs exactly
+ same jobs of ODBC 2.x driver manager(i.e. driver loading,
+ Parameters and function sequence checking, driver's function
+ Invoking, etc.). Any ODBC driver works with ODBC 2.0 driver
+ Manager will also work with iODBC driver manager and vice versa.
+ Applications (using ODBC function calls) linked with
iODBC driver manager will be able to simultaneously access
different type of data sources within one process through
- suitable ODBC drivers.
+ suitable iODBC drivers.
-Author: Jin, Ke <kejin@empress.com>
+Original Author: Jin, Ke
+Source Code Enhancement Contributors: OpenLink Software
+Maintainers: OpenLink Software
+Web Site: http://www.openlinksw.com
Platforms: SunOS (Sparc) 4.1.x
HP/UX (s700/s800) 9.x, 10.x
- HP/UX (s300/s400) 9.x
+ HP/UX (s300/s400) 9.x
IBM AIX 3.x, 4.x
Solaris (Sparc) 2.x
Solaris (PCx86) 2.x
Concurrent MAX/OS 1.x
DG/UX 5.x
-Copying-Policy: Freely Redistributable under GNU General Public License
+License Policy: Freely Redistributable under GNU Library General Public License (LGPL)
-Keywords: ODBC, database, SQL
+Keywords: ODBC, database, SQL, OpenLink
--- /dev/null
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+++ /dev/null
-include ../Version.mk
-include ../Config.mk
-
-
-
-
-
-INCDIR = .
-OUTFILE = iodbc
-
-CFLAGS = -O $(PIC) $(ANSI) -I$(INCDIR) -D$(DLDAPI) $(CFLAGSX)\
- -DVERSION=\"$(VERSION)$(EXTVER)\"
-
-# ODBC adminiatator is statically linked on BSDI 3.1
-# On this one can comment the following line:
-#
-ODBCDM = $(ODBC_LIBPATH)/$(OUTFILE).$(DLSUFFIX)
-
-OBJS = dlf.o dlproc.o herr.o henv.o hdbc.o hstmt.o connect.o prepare.o\
- execute.o result.o fetch.o info.o catalog.o misc.o itrace.o $(OBJX)
-
-all: $(OBJS) $(ODBCDM) $(ODBC_LIBPATH)/lib$(OUTFILE).a
- @rm -f $(ODBC_INCLUDE)/isql.h
- @rm -f $(ODBC_INCLUDE)/isqlext.h
- @rm -f $(ODBC_INCLUDE)/odbc_types.h
- @rm -f $(ODBC_INCLUDE)/odbc_funcs.h
- cp isql.h $(ODBC_INCLUDE)/
- cp isqlext.h $(ODBC_INCLUDE)/
- cp odbc_types.h $(ODBC_INCLUDE)/
- cp odbc_funcs.h $(ODBC_INCLUDE)/
- @echo
- @echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- @echo
- @echo Don\'t forget tu update $(ODBC_LIBPATH)/iodbc.ini with your conf
- @echo
- @echo %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- @echo
-
-clean:
- \rm -f $(OBJS)
-
-delete: clean
-
-delete_all: delete
-
-misc.o: misc.c
- $(CC) $(CFLAGS) -DFIX_INI_FILE -DDIR_INI_FILE=\"$(ODBC_LIBPATH)\" -c $<
-
-$(ODBC_LIBPATH)/lib$(OUTFILE).a: $(OBJS)
- $(AR) $(ODBC_LIBPATH)/lib$(OUTFILE).a $(OBJS)
- $(RANLIB) $(ODBC_LIBPATH)/lib$(OUTFILE).a
-
-$(ODBCDM): $(OBJS)
- @echo "Generating iODBC driver manager -->" $(ODBCDM)
- @rm -f $(ODBCDM)
- $(LD) $(LDFLAGS) -L$(ODBC_LIBPATH) $(OBJS) -o $(ODBCDM) $(LIBS)
- if [ ! -f $(ODBC_LIBPATH)/iodbc.ini ]; then cp iodbc.$(OS) $(ODBC_LIBPATH)/iodbc.ini; fi
-
--- /dev/null
+Version: 2.5
+-------------
+Added OpenLink enhancements
+
+
+Version: 2.12
+-------------
+Original version of Ke Jin
0. Changes
- a. I realized that a driver manager doesn't aware of
- difference between a C5 (i.e. hstmt) and a C6
- (i.e. transaction) states.
-
- b. The link flags "-lc" has been removed from Linux ELF
- section of Config.mk to fix a segment fault problem.
- Now, it works fine on Slackware 2.3 and Red Hat 2.0
- (kernel version are 1.2.xx and 1.3.xx respectively).
-
- c. On FreeBSD 2.x, dlsym() doesn't handle the '_'
- prepended before a exporting function symbol. So,
- CLI_NAME_PREFIX needs to be defined as "_SQL" for
- FreeBSD.
-
- d. Some files are renamed
- dld.c -> dlf.c
- dld.h -> dlf.h
- confg.h -> config.h
+ a. I realized that a driver manager doesn't aware of
+ difference between a C5 (i.e. hstmt) and a C6
+ (i.e. transaction) states.
+
+ b. The link flags "-lc" has been removed from Linux ELF
+ section of Config.mk to fix a segment fault problem.
+ Now, it works fine on Slackware 2.3 and Red Hat 2.0
+ (kernel version are 1.2.xx and 1.3.xx respectively).
+
+ c. On FreeBSD 2.x, dlsym() doesn't handle the '_'
+ prepended before a exporting function symbol. So,
+ CLI_NAME_PREFIX needs to be defined as "_SQL" for
+ FreeBSD.
+
+ d. Some files are renamed
+ dld.c -> dlf.c
+ dld.h -> dlf.h
+ confg.h -> config.h
1. iODBC driver manager platform availability
- iODBC driver manager has been ported to following Unix platforms:
-
- SunOS 4.1.x Sun Sparc
- HP/UX 9.x, 10.x HP9000 s700/s800
- HP/UX 9.x HP9000 s300/s400
- IBM AIX 3.x, 4.x IBM RS6000, PowerPC
- Sun Solaris 2.x Sun Sparc, PCx86
- SGI Irix SVR4 5.x, 6.x IP12 MIPS, IP22 MIPS
- NCR SVR4 3.x NCR 3435
- UnixWare SVR4.2 1.x, 2.x x86
- DEC Unix(OSF/1) 3.x, 4.x DEC Alpha
- FreeBSD 2.x x86
- BSDI BSD/OS 2.x ?
- Linux ELF 1.2.x, 1.3.x x86
- SCO OpenServer 5.x x86
- Max/OS SVR4 1.x Concurrent Maxion 9200 MP
- DG/UX 5.x Aviion
+ iODBC driver manager has been ported to following Unix platforms:
+
+ SunOS 4.1.x Sun Sparc
+ HP/UX 9.x, 10.x HP9000 s700/s800
+ HP/UX 9.x HP9000 s300/s400
+ IBM AIX 3.x, 4.x IBM RS6000, PowerPC
+ Sun Solaris 2.x Sun Sparc, PCx86
+ SGI Irix SVR4 5.x, 6.x IP12 MIPS, IP22 MIPS
+ NCR SVR4 3.x NCR 3435
+ UnixWare SVR4.2 1.x, 2.x x86
+ DEC Unix(OSF/1) 3.x, 4.x DEC Alpha
+ FreeBSD 2.x x86
+ BSDI BSD/OS 2.x ?
+ Linux ELF 1.2.x, 1.3.x x86
+ SCO OpenServer 5.x x86
+ Max/OS SVR4 1.x Concurrent Maxion 9200 MP
+ DG/UX 5.x Aviion
Porting of iODBC driver manager to some non-unix operating systems
- such as Windows family(3.x, 95, NT), OS/2 and Mac is supported but
- has never compiled and tested yet :). Of cause, you need to supply
+ such as Windows family(3.x, 95, NT), OS/2 and Mac is supported but
+ has never compiled and tested yet :). Of cause, you need to supply
a make/build file and a short LibMain for creating the iodbc.dll.
2. How to build iODBC driver manager:
- step 1. Identify your system
- step 2. Run build with a suitable option
-
+ step 1. Identify your system
+ step 2. Run build with a suitable option
+
Here is an example:
- %[1]: sh iodbc-2.12.shar
- ....
- %[2]: cd iodbc-2.12
- %[3]: uname -s -v -r -m
- HP-UX B.10.01 A 9000/710
- %[4]: ./build hp700
- autoconfig hp700
- make
- ....
- Generating iODBC driver manager --> /home/kejin/iodbc-2.12.sl
+ %[1]: sh iodbc-2.12.shar
+ ....
+ %[2]: cd iodbc-2.12
+ %[3]: uname -s -v -r -m
+ HP-UX B.10.01 A 9000/710
+ %[4]: ./build hp700
+ autoconfig hp700
+ make
+ ....
+ Generating iODBC driver manager --> /home/kejin/iodbc-2.12.sl
3. odbc.ini( ~/.odbc.ini )
- Driver manager and drivers use odbc.ini(or ~/.odbc.ini on Unix) file
+ Driver manager and drivers use odbc.ini(or ~/.odbc.ini on Unix) file
or connection string when establishing a data source connection. On
- Windows, odbc.ini is located in Windows directory. On unix, iODBC driver
- manager(and all other ODBC drivers and driver managers I awared) looks
- .odbc.ini file in real user's home directory (it could be a softlink to
- the file located somewhere else). Make sure your driver will look into
- the same file (or a file which is a symbolic link to the same file).
+ Windows, odbc.ini is located in Windows directory. On unix, iODBC driver
+ manager(and all other ODBC drivers and driver managers I awared) looks
+ .odbc.ini file in real user's home directory (it could be a softlink to
+ the file located somewhere else). Make sure your driver will look into
+ the same file (or a file which is a symbolic link to the same file).
The format of odbc.ini( or ~/.odbc.ini ) is defined as:
- odbc.ini(or .odbc.ini) ::= data_source_list
+ odbc.ini(or .odbc.ini) ::= data_source_list
- data_source_list ::= /* empty */
- | data_source '\n' data_source_list
+ data_source_list ::= /* empty */
+ | data_source '\n' data_source_list
- data_source ::= '[' data_source_name ']' '\n' data_source_desc
+ data_source ::= '[' data_source_name ']' '\n' data_source_desc
- data_source_name ::= 'default' | [A-Za-z]*[A-Za-z0-9_]*
+ data_source_name ::= 'default' | [A-Za-z]*[A-Za-z0-9_]*
- data_source_desc ::= /* empty */
- | attrib_desc '\n' data_source_desc
+ data_source_desc ::= /* empty */
+ | attrib_desc '\n' data_source_desc
- addrib_desc ::= Attrib '=' attrib_value
+ addrib_desc ::= Attrib '=' attrib_value
- Attrib ::= 'Driver' | 'PID' | 'UID' | driver_def_attrib
+ Attrib ::= 'Driver' | 'PID' | 'UID' | driver_def_attrib
- driver_def_attrib ::= [A-Za-z]*[A-Za-z0-9_]*
+ driver_def_attrib ::= [A-Za-z]*[A-Za-z0-9_]*
An example of .odbc.ini file:
- [toronto_yp]
- # yellow page of metro Toronto
- Driver = /usr/lib/odbc/oracle.so
- <....>
+ [toronto_yp]
+ # yellow page of metro Toronto
+ Driver = /usr/lib/odbc/oracle.so
+ <....>
- [toronto_wp]
- # white page of metro Toronto
- Driver = /usr/lib/odbc/oracle.so
- <....>
+ [toronto_wp]
+ # white page of metro Toronto
+ Driver = /usr/lib/odbc/oracle.so
+ <....>
- [contract]
- # all contract documents
- Driver = /usr/lib/odbc/informix.so
- <....>
+ [contract]
+ # all contract documents
+ Driver = /usr/lib/odbc/informix.so
+ <....>
- [netnews]
- # NNTP netnews group
- Driver = /usr/lib/odbc/nnodbc.so
- Server = news.empress.com
+ [netnews]
+ # NNTP netnews group
+ Driver = /usr/lib/odbc/nnodbc.so
+ Server = news.empress.com
- [rnd_test]
- # data source for R&D test
- Driver = /home/r_d/odbc/empodbc.so
- URL = empodbc://rnd.empress.com:6322/rnd_test/testdb
+ [rnd_test]
+ # data source for R&D test
+ Driver = /home/r_d/odbc/empodbc.so
+ URL = empodbc://rnd.empress.com:6322/rnd_test/testdb
- [default]
- # default to odbc gateway
- Driver = /usr/lib/odbc/gateway.so
+ [default]
+ # default to odbc gateway
+ Driver = /usr/lib/odbc/gateway.so
4. Tracing
- iODBC driver manager traces driver's ODBC call invoked by the driver
- manager. Default tracing file is ./odbc.log. Tracing option (i.e.
- on/off or optional tracing file name) can be set in ~/.odbc.ini
+ iODBC driver manager traces driver's ODBC call invoked by the driver
+ manager. Default tracing file is ./odbc.log. Tracing option (i.e.
+ on/off or optional tracing file name) can be set in ~/.odbc.ini
file (under a data source section) as:
- TraceFile = <optional_trace_file>
- Trace = ON | On | on | 1 | OFF | Off | off | 0
+ TraceFile = <optional_trace_file>
+ Trace = ON | On | on | 1 | OFF | Off | off | 0
If <optional_trace_file> is stderr or stdout, i.e.
-
- TraceFile = stderr
-
+
+ TraceFile = stderr
+
or
- TraceFile = stdout
+ TraceFile = stdout
the tracing message will go to the terminal screen(if it is available).
iODBC driver manager allows one to tune on/off tracing on selected
- connection(s). Different connections can share one or use different
+ connection(s). Different connections can share one or use different
tracing file(s). ODBC calls on connections without tuning tracing on
- will not be traced.
-
+ will not be traced.
+
5. File list:
- README This file
- IAFA-PACKAGE Version and copyright information
- Changes.log Source changes log
- Version.mk Version make include file
- Config.mk Config make include file
- Makefile make file
- config.h system config include file
- isql.h ODBC 1.0 macro
- isqlext.h ODBC 2.0 macro
- dlf.h general dynamic loader module interface
- dlf.c general dynamic loader module (mapping to svr4)
- dlproc.h simple dynamic loader module interface
- dlproc.c simple dynamic loader on top of dlf module
- herr.h error handling module interface
- herr.c error handling module
- herr.ci error handling source include
- henv.h environment handle interface
- henv.c environment handle module
- henv.ci environment handle source include
- hdbc.h connection handle interface
- hdbc.c connection handle module
- hstmt.h statement handle interface
- hstmt.c statement handle module
- connect.c connect functions
- prepare.c query prepare functions
- execute.c query executing functions
- result.c query result property functions
- fetch.c query result fetch functions
- info.c driver information functions
- catalog.c catalog functions
- misc.c miscellaneous functions
- itrace.h macro
- itrace.c trace function
- main.c entry function used to build a share library on AIX
- shrsub.exp export symbol list used on AIX
- autoconfig shell script for creating Config.mk
- build shell script for building iodbc driver manager
+ README This file
+ IAFA-PACKAGE Version and copyright information
+ Changes.log Source changes log
+ Version.mk Version make include file
+ Config.mk Config make include file
+ Makefile make file
+ config.h system config include file
+ isql.h ODBC 1.0 macro
+ isqlext.h ODBC 2.0 macro
+ dlf.h general dynamic loader module interface
+ dlf.c general dynamic loader module (mapping to svr4)
+ dlproc.h simple dynamic loader module interface
+ dlproc.c simple dynamic loader on top of dlf module
+ herr.h error handling module interface
+ herr.c error handling module
+ herr.ci error handling source include
+ henv.h environment handle interface
+ henv.c environment handle module
+ henv.ci environment handle source include
+ hdbc.h connection handle interface
+ hdbc.c connection handle module
+ hstmt.h statement handle interface
+ hstmt.c statement handle module
+ connect.c connect functions
+ prepare.c query prepare functions
+ execute.c query executing functions
+ result.c query result property functions
+ fetch.c query result fetch functions
+ info.c driver information functions
+ catalog.c catalog functions
+ misc.c miscellaneous functions
+ itrace.h macro
+ itrace.c trace function
+ main.c entry function used to build a share library on AIX
+ shrsub.exp export symbol list used on AIX
+ autoconfig shell script for creating Config.mk
+ build shell script for building iodbc driver manager
+++ /dev/null
-VERSION = 2.12
-EXTVER = .0
+++ /dev/null
-#! /bin/sh
-
-echo autoconfig $1
-
-if sh ./autoconfig $1
-then
-echo make
-make
-fi
-/** Catalog functions of iODBC driver manager
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
-
-#include <../iodbc/itrace.h>
-
-static RETCODE _iodbcdm_cata_state_ok (
- HSTMT hstmt,
- int fidx )
+/*
+ * catalog.c
+ *
+ * $Id$
+ *
+ * Catalog functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
+
+static RETCODE
+_iodbcdm_cata_state_ok (
+ HSTMT hstmt,
+ int fidx)
/* check state for executing catalog functions */
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- int sqlstat = en_00000;
-
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- sqlstat = en_S1010;
- break;
-
- case en_stmt_fetched:
- case en_stmt_xfetched:
- sqlstat = en_24000;
- break;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != fidx )
- {
- sqlstat = en_S1010;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- return SQL_SUCCESS;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ int sqlstat = en_00000;
+
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ sqlstat = en_S1010;
+ break;
+
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ sqlstat = en_24000;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != fidx)
+ {
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ return SQL_SUCCESS;
}
-static RETCODE _iodbcdm_cata_state_tr(
- HSTMT hstmt,
- int fidx,
- RETCODE result )
+
+static RETCODE
+_iodbcdm_cata_state_tr (
+ HSTMT hstmt,
+ int fidx,
+ RETCODE result)
/* state transition for catalog function */
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- DBC_t FAR* pdbc;
-
- pdbc = (DBC_t FAR*)(pstmt->hdbc);
-
- if( pstmt->asyn_on == fidx )
- {
- switch( result )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return result;
- }
- }
-
- if( pstmt->state <= en_stmt_executed )
- {
- switch( result )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- pstmt->state = en_stmt_cursoropen;
- break;
-
- case SQL_ERROR:
- pstmt->state = en_stmt_allocated;
- pstmt->prep_state = 0;
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = fidx;
- break;
-
- default:
- break;
- }
- }
-
- return result;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ DBC_t FAR *pdbc;
+
+ pdbc = (DBC_t FAR *) (pstmt->hdbc);
+
+ if (pstmt->asyn_on == fidx)
+ {
+ switch (result)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return result;
+ }
+ }
+
+ if (pstmt->state <= en_stmt_executed)
+ {
+ switch (result)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ pstmt->state = en_stmt_cursoropen;
+ break;
+
+ case SQL_ERROR:
+ pstmt->state = en_stmt_allocated;
+ pstmt->prep_state = 0;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = fidx;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return result;
}
-RETCODE SQL_API SQLGetTypeInfo(
- HSTMT hstmt,
- SWORD fSqlType )
+
+RETCODE SQL_API
+SQLGetTypeInfo (
+ HSTMT hstmt,
+ SWORD fSqlType)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- int sqlstat = en_00000;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( fSqlType > SQL_TYPE_MAX )
- {
- sqlstat = en_S1004;
- break;
- }
-
- if( fSqlType < SQL_TYPE_MIN
- && fSqlType > SQL_TYPE_DRIVER_START )
- /* Note: SQL_TYPE_DRIVER_START is a nagtive
- * number So, we use ">" */
- {
- sqlstat = en_S1004;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok( hstmt, en_GetTypeInfo );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc ( pstmt->hdbc, en_GetTypeInfo );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc,
- en_GetTypeInfo, ( pstmt->dhstmt, fSqlType) )
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, fSqlType );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_GetTypeInfo, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ int sqlstat = en_00000;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if (fSqlType > SQL_TYPE_MAX)
+ {
+ sqlstat = en_S1004;
+ break;
+ }
+
+ /* Note: SQL_TYPE_DRIVER_START is a negative number So, we use ">" */
+ if (fSqlType < SQL_TYPE_MIN && fSqlType > SQL_TYPE_DRIVER_START)
+ {
+ sqlstat = en_S1004;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_GetTypeInfo);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetTypeInfo);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_GetTypeInfo,
+ (pstmt->dhstmt, fSqlType))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_GetTypeInfo, retcode);
}
-RETCODE SQL_API SQLSpecialColumns(
- HSTMT hstmt,
- UWORD fColType,
- UCHAR FAR* szTableQualifier,
- SWORD cbTableQualifier,
- UCHAR FAR* szTableOwner,
- SWORD cbTableOwner,
- UCHAR FAR* szTableName,
- SWORD cbTableName,
- UWORD fScope,
- UWORD fNullable )
+
+RETCODE SQL_API
+SQLSpecialColumns (
+ HSTMT hstmt,
+ UWORD fColType,
+ UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner,
+ SWORD cbTableOwner,
+ UCHAR FAR * szTableName,
+ SWORD cbTableName,
+ UWORD fScope,
+ UWORD fNullable)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbTableQualifier < 0 && cbTableQualifier != SQL_NTS )
- || ( cbTableOwner < 0 && cbTableOwner != SQL_NTS )
- || ( cbTableName < 0 && cbTableName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- if( fColType != SQL_BEST_ROWID
- && fColType != SQL_ROWVER )
- {
- sqlstat = en_S1097;
- break;
- }
-
- if( fScope != SQL_SCOPE_CURROW
- && fScope != SQL_SCOPE_TRANSACTION
- && fScope != SQL_SCOPE_SESSION )
- {
- sqlstat = en_S1098;
- break;
- }
-
- if( fNullable != SQL_NO_NULLS
- && fNullable != SQL_NULLABLE )
- {
- sqlstat = en_S1099;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_SpecialColumns );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_SpecialColumns );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_SpecialColumns, (
- pstmt->dhstmt,
- fColType,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- fScope,
- fNullable ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- fColType,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- fScope,
- fNullable );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_SpecialColumns, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
+ || (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
+ || (cbTableName < 0 && cbTableName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ if (fColType != SQL_BEST_ROWID && fColType != SQL_ROWVER)
+ {
+ sqlstat = en_S1097;
+ break;
+ }
+
+ if (fScope != SQL_SCOPE_CURROW
+ && fScope != SQL_SCOPE_TRANSACTION
+ && fScope != SQL_SCOPE_SESSION)
+ {
+ sqlstat = en_S1098;
+ break;
+ }
+
+ if (fNullable != SQL_NO_NULLS && fNullable != SQL_NULLABLE)
+ {
+ sqlstat = en_S1099;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_SpecialColumns);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_SpecialColumns);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SpecialColumns, (
+ pstmt->dhstmt,
+ fColType,
+ szTableQualifier,
+ cbTableQualifier,
+ szTableOwner,
+ cbTableOwner,
+ szTableName,
+ cbTableName,
+ fScope,
+ fNullable))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_SpecialColumns, retcode);
}
-RETCODE SQL_API SQLStatistics(
- HSTMT hstmt,
- UCHAR FAR* szTableQualifier,
- SWORD cbTableQualifier,
- UCHAR FAR* szTableOwner,
- SWORD cbTableOwner,
- UCHAR FAR* szTableName,
- SWORD cbTableName,
- UWORD fUnique,
- UWORD fAccuracy )
+
+RETCODE SQL_API
+SQLStatistics (
+ HSTMT hstmt,
+ UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner,
+ SWORD cbTableOwner,
+ UCHAR FAR * szTableName,
+ SWORD cbTableName,
+ UWORD fUnique,
+ UWORD fAccuracy)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbTableQualifier < 0 && cbTableQualifier != SQL_NTS )
- || ( cbTableOwner < 0 && cbTableOwner != SQL_NTS )
- || ( cbTableName < 0 && cbTableName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- if( fUnique != SQL_INDEX_UNIQUE
- && fUnique != SQL_INDEX_ALL )
- {
- sqlstat = en_S1100;
- break;
- }
-
- if( fAccuracy != SQL_ENSURE
- && fAccuracy != SQL_QUICK )
- {
- sqlstat = en_S1101;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_Statistics );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Statistics );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_Statistics, (
- pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- fUnique,
- fAccuracy ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- fUnique,
- fAccuracy );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_Statistics, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
+ || (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
+ || (cbTableName < 0 && cbTableName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ if (fUnique != SQL_INDEX_UNIQUE && fUnique != SQL_INDEX_ALL)
+ {
+ sqlstat = en_S1100;
+ break;
+ }
+
+ if (fAccuracy != SQL_ENSURE && fAccuracy != SQL_QUICK)
+ {
+ sqlstat = en_S1101;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_Statistics);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Statistics);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Statistics, (
+ pstmt->dhstmt,
+ szTableQualifier,
+ cbTableQualifier,
+ szTableOwner,
+ cbTableOwner,
+ szTableName,
+ cbTableName,
+ fUnique,
+ fAccuracy))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_Statistics, retcode);
}
-RETCODE SQL_API SQLTables(
- HSTMT hstmt,
- UCHAR FAR* szTableQualifier,
- SWORD cbTableQualifier,
- UCHAR FAR* szTableOwner,
- SWORD cbTableOwner,
- UCHAR FAR* szTableName,
- SWORD cbTableName,
- UCHAR FAR* szTableType,
- SWORD cbTableType )
+
+RETCODE SQL_API
+SQLTables (
+ HSTMT hstmt,
+ UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner,
+ SWORD cbTableOwner,
+ UCHAR FAR * szTableName,
+ SWORD cbTableName,
+ UCHAR FAR * szTableType,
+ SWORD cbTableType)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbTableQualifier < 0 && cbTableQualifier != SQL_NTS )
- || ( cbTableOwner < 0 && cbTableOwner != SQL_NTS )
- || ( cbTableName < 0 && cbTableName != SQL_NTS )
- || ( cbTableType < 0 && cbTableType != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_Tables );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Tables );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_Tables, (
- pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- szTableType,
- cbTableType ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- szTableType,
- cbTableType );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_Tables, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
+ || (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
+ || (cbTableName < 0 && cbTableName != SQL_NTS)
+ || (cbTableType < 0 && cbTableType != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_Tables);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Tables);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Tables, (
+ pstmt->dhstmt,
+ szTableQualifier,
+ cbTableQualifier,
+ szTableOwner,
+ cbTableOwner,
+ szTableName,
+ cbTableName,
+ szTableType,
+ cbTableType))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_Tables, retcode);
}
-RETCODE SQL_API SQLColumnPrivileges(
- HSTMT hstmt,
- UCHAR FAR* szTableQualifier,
- SWORD cbTableQualifier,
- UCHAR FAR* szTableOwner,
- SWORD cbTableOwner,
- UCHAR FAR* szTableName,
- SWORD cbTableName,
- UCHAR FAR* szColumnName,
- SWORD cbColumnName )
+
+RETCODE SQL_API
+SQLColumnPrivileges (
+ HSTMT hstmt,
+ UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner,
+ SWORD cbTableOwner,
+ UCHAR FAR * szTableName,
+ SWORD cbTableName,
+ UCHAR FAR * szColumnName,
+ SWORD cbColumnName)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbTableQualifier < 0 && cbTableQualifier != SQL_NTS )
- || ( cbTableOwner < 0 && cbTableOwner != SQL_NTS )
- || ( cbTableName < 0 && cbTableName != SQL_NTS )
- || ( cbColumnName < 0 && cbColumnName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_ColumnPrivileges );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_ColumnPrivileges );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ColumnPrivileges, (
- pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- szColumnName,
- cbColumnName ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- szColumnName,
- cbColumnName );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_ColumnPrivileges, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
+ || (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
+ || (cbTableName < 0 && cbTableName != SQL_NTS)
+ || (cbColumnName < 0 && cbColumnName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_ColumnPrivileges);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ColumnPrivileges);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ColumnPrivileges, (
+ pstmt->dhstmt,
+ szTableQualifier,
+ cbTableQualifier,
+ szTableOwner,
+ cbTableOwner,
+ szTableName,
+ cbTableName,
+ szColumnName,
+ cbColumnName))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_ColumnPrivileges, retcode);
}
-RETCODE SQL_API SQLColumns(
- HSTMT hstmt,
- UCHAR FAR* szTableQualifier,
- SWORD cbTableQualifier,
- UCHAR FAR* szTableOwner,
- SWORD cbTableOwner,
- UCHAR FAR* szTableName,
- SWORD cbTableName,
- UCHAR FAR* szColumnName,
- SWORD cbColumnName )
+
+RETCODE SQL_API
+SQLColumns (
+ HSTMT hstmt,
+ UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner,
+ SWORD cbTableOwner,
+ UCHAR FAR * szTableName,
+ SWORD cbTableName,
+ UCHAR FAR * szColumnName,
+ SWORD cbColumnName)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbTableQualifier < 0 && cbTableQualifier != SQL_NTS )
- || ( cbTableOwner < 0 && cbTableOwner != SQL_NTS )
- || ( cbTableName < 0 && cbTableName != SQL_NTS )
- || ( cbColumnName < 0 && cbColumnName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_Columns );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Columns );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_Columns, (
- pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- szColumnName,
- cbColumnName ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName,
- szColumnName,
- cbColumnName );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_Columns, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
+ || (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
+ || (cbTableName < 0 && cbTableName != SQL_NTS)
+ || (cbColumnName < 0 && cbColumnName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_Columns);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Columns);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Columns, (
+ pstmt->dhstmt,
+ szTableQualifier,
+ cbTableQualifier,
+ szTableOwner,
+ cbTableOwner,
+ szTableName,
+ cbTableName,
+ szColumnName,
+ cbColumnName))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_Columns, retcode);
}
-RETCODE SQL_API SQLForeignKeys(
- HSTMT hstmt,
- UCHAR FAR* szPkTableQualifier,
- SWORD cbPkTableQualifier,
- UCHAR FAR* szPkTableOwner,
- SWORD cbPkTableOwner,
- UCHAR FAR* szPkTableName,
- SWORD cbPkTableName,
- UCHAR FAR* szFkTableQualifier,
- SWORD cbFkTableQualifier,
- UCHAR FAR* szFkTableOwner,
- SWORD cbFkTableOwner,
- UCHAR FAR* szFkTableName,
- SWORD cbFkTableName )
+
+RETCODE SQL_API
+SQLForeignKeys (
+ HSTMT hstmt,
+ UCHAR FAR * szPkTableQualifier,
+ SWORD cbPkTableQualifier,
+ UCHAR FAR * szPkTableOwner,
+ SWORD cbPkTableOwner,
+ UCHAR FAR * szPkTableName,
+ SWORD cbPkTableName,
+ UCHAR FAR * szFkTableQualifier,
+ SWORD cbFkTableQualifier,
+ UCHAR FAR * szFkTableOwner,
+ SWORD cbFkTableOwner,
+ UCHAR FAR * szFkTableName,
+ SWORD cbFkTableName)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbPkTableQualifier < 0 && cbPkTableQualifier != SQL_NTS )
- || ( cbPkTableOwner < 0 && cbPkTableOwner != SQL_NTS )
- || ( cbPkTableName < 0 && cbPkTableName != SQL_NTS )
- || ( cbFkTableQualifier < 0 && cbFkTableQualifier != SQL_NTS )
- || ( cbFkTableOwner < 0 && cbFkTableOwner != SQL_NTS )
- || ( cbFkTableName < 0 && cbFkTableName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_ForeignKeys );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_ForeignKeys );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ForeignKeys, (
- pstmt->dhstmt,
- szPkTableQualifier,
- cbPkTableQualifier,
- szPkTableOwner,
- cbPkTableOwner,
- szPkTableName,
- cbPkTableName,
- szFkTableQualifier,
- cbFkTableQualifier,
- szFkTableOwner,
- cbFkTableOwner,
- szFkTableName,
- cbFkTableName ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szPkTableQualifier,
- cbPkTableQualifier,
- szPkTableOwner,
- cbPkTableOwner,
- szPkTableName,
- cbPkTableName,
- szFkTableQualifier,
- cbFkTableQualifier,
- szFkTableOwner,
- cbFkTableOwner,
- szFkTableName,
- cbFkTableName );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_ForeignKeys, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbPkTableQualifier < 0 && cbPkTableQualifier != SQL_NTS)
+ || (cbPkTableOwner < 0 && cbPkTableOwner != SQL_NTS)
+ || (cbPkTableName < 0 && cbPkTableName != SQL_NTS)
+ || (cbFkTableQualifier < 0 && cbFkTableQualifier != SQL_NTS)
+ || (cbFkTableOwner < 0 && cbFkTableOwner != SQL_NTS)
+ || (cbFkTableName < 0 && cbFkTableName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_ForeignKeys);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ForeignKeys);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ForeignKeys, (
+ pstmt->dhstmt,
+ szPkTableQualifier,
+ cbPkTableQualifier,
+ szPkTableOwner,
+ cbPkTableOwner,
+ szPkTableName,
+ cbPkTableName,
+ szFkTableQualifier,
+ cbFkTableQualifier,
+ szFkTableOwner,
+ cbFkTableOwner,
+ szFkTableName,
+ cbFkTableName))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_ForeignKeys, retcode);
}
-RETCODE SQL_API SQLPrimaryKeys(
- HSTMT hstmt,
- UCHAR FAR* szTableQualifier,
- SWORD cbTableQualifier,
- UCHAR FAR* szTableOwner,
- SWORD cbTableOwner,
- UCHAR FAR* szTableName,
- SWORD cbTableName )
+
+RETCODE SQL_API
+SQLPrimaryKeys (
+ HSTMT hstmt,
+ UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner,
+ SWORD cbTableOwner,
+ UCHAR FAR * szTableName,
+ SWORD cbTableName)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbTableQualifier < 0 && cbTableQualifier != SQL_NTS )
- || ( cbTableOwner < 0 && cbTableOwner != SQL_NTS )
- || ( cbTableName < 0 && cbTableName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_PrimaryKeys );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_PrimaryKeys );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_PrimaryKeys, (
- pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_PrimaryKeys, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
+ || (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
+ || (cbTableName < 0 && cbTableName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_PrimaryKeys);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_PrimaryKeys);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_PrimaryKeys, (
+ pstmt->dhstmt,
+ szTableQualifier,
+ cbTableQualifier,
+ szTableOwner,
+ cbTableOwner,
+ szTableName,
+ cbTableName))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_PrimaryKeys, retcode);
}
-RETCODE SQL_API SQLProcedureColumns(
- HSTMT hstmt,
- UCHAR FAR* szProcQualifier,
- SWORD cbProcQualifier,
- UCHAR FAR* szProcOwner,
- SWORD cbProcOwner,
- UCHAR FAR* szProcName,
- SWORD cbProcName,
- UCHAR FAR* szColumnName,
- SWORD cbColumnName )
+
+RETCODE SQL_API
+SQLProcedureColumns (
+ HSTMT hstmt,
+ UCHAR FAR * szProcQualifier,
+ SWORD cbProcQualifier,
+ UCHAR FAR * szProcOwner,
+ SWORD cbProcOwner,
+ UCHAR FAR * szProcName,
+ SWORD cbProcName,
+ UCHAR FAR * szColumnName,
+ SWORD cbColumnName)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbProcQualifier < 0 && cbProcQualifier != SQL_NTS )
- || ( cbProcOwner < 0 && cbProcOwner != SQL_NTS )
- || ( cbProcName < 0 && cbProcName != SQL_NTS )
- || ( cbColumnName < 0 && cbColumnName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_ProcedureColumns );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_ProcedureColumns );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ProcedureColumns, (
- pstmt->dhstmt,
- szProcQualifier,
- cbProcQualifier,
- szProcOwner,
- cbProcOwner,
- szProcName,
- cbProcName,
- szColumnName,
- cbColumnName ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szProcQualifier,
- cbProcQualifier,
- szProcOwner,
- cbProcOwner,
- szProcName,
- cbProcName,
- szColumnName,
- cbColumnName );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_ProcedureColumns, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbProcQualifier < 0 && cbProcQualifier != SQL_NTS)
+ || (cbProcOwner < 0 && cbProcOwner != SQL_NTS)
+ || (cbProcName < 0 && cbProcName != SQL_NTS)
+ || (cbColumnName < 0 && cbColumnName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_ProcedureColumns);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ProcedureColumns);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ProcedureColumns, (
+ pstmt->dhstmt,
+ szProcQualifier,
+ cbProcQualifier,
+ szProcOwner,
+ cbProcOwner,
+ szProcName,
+ cbProcName,
+ szColumnName,
+ cbColumnName))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_ProcedureColumns, retcode);
}
-RETCODE SQL_API SQLProcedures(
- HSTMT hstmt,
- UCHAR FAR* szProcQualifier,
- SWORD cbProcQualifier,
- UCHAR FAR* szProcOwner,
- SWORD cbProcOwner,
- UCHAR FAR* szProcName,
- SWORD cbProcName )
+
+RETCODE SQL_API
+SQLProcedures (
+ HSTMT hstmt,
+ UCHAR FAR * szProcQualifier,
+ SWORD cbProcQualifier,
+ UCHAR FAR * szProcOwner,
+ SWORD cbProcOwner,
+ UCHAR FAR * szProcName,
+ SWORD cbProcName)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbProcQualifier < 0 && cbProcQualifier != SQL_NTS )
- || ( cbProcOwner < 0 && cbProcOwner != SQL_NTS )
- || ( cbProcName < 0 && cbProcName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_Procedures );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Procedures );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_Procedures, (
- pstmt->dhstmt,
- szProcQualifier,
- cbProcQualifier,
- szProcOwner,
- cbProcOwner,
- szProcName,
- cbProcName ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szProcQualifier,
- cbProcQualifier,
- szProcOwner,
- cbProcOwner,
- szProcName,
- cbProcName );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_Procedures, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbProcQualifier < 0 && cbProcQualifier != SQL_NTS)
+ || (cbProcOwner < 0 && cbProcOwner != SQL_NTS)
+ || (cbProcName < 0 && cbProcName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_Procedures);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Procedures);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Procedures, (
+ pstmt->dhstmt,
+ szProcQualifier,
+ cbProcQualifier,
+ szProcOwner,
+ cbProcOwner,
+ szProcName,
+ cbProcName))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_Procedures, retcode);
}
-RETCODE SQL_API SQLTablePrivileges(
- HSTMT hstmt,
- UCHAR FAR* szTableQualifier,
- SWORD cbTableQualifier,
- UCHAR FAR* szTableOwner,
- SWORD cbTableOwner,
- UCHAR FAR* szTableName,
- SWORD cbTableName )
+
+RETCODE SQL_API
+SQLTablePrivileges (
+ HSTMT hstmt,
+ UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner,
+ SWORD cbTableOwner,
+ UCHAR FAR * szTableName,
+ SWORD cbTableName)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( ( cbTableQualifier < 0 && cbTableQualifier != SQL_NTS )
- || ( cbTableOwner < 0 && cbTableOwner != SQL_NTS )
- || ( cbTableName < 0 && cbTableName != SQL_NTS ) )
- {
- sqlstat = en_S1090;
- break;
- }
-
- retcode = _iodbcdm_cata_state_ok ( hstmt, en_TablePrivileges );
-
- if( retcode != SQL_SUCCESS )
- {
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_TablePrivileges );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
-
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_TablePrivileges, (
- pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szTableQualifier,
- cbTableQualifier,
- szTableOwner,
- cbTableOwner,
- szTableName,
- cbTableName );
-#endif
-
- return _iodbcdm_cata_state_tr( hstmt, en_TablePrivileges, retcode );
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if ((cbTableQualifier < 0 && cbTableQualifier != SQL_NTS)
+ || (cbTableOwner < 0 && cbTableOwner != SQL_NTS)
+ || (cbTableName < 0 && cbTableName != SQL_NTS))
+ {
+ sqlstat = en_S1090;
+ break;
+ }
+
+ retcode = _iodbcdm_cata_state_ok (hstmt, en_TablePrivileges);
+
+ if (retcode != SQL_SUCCESS)
+ {
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_TablePrivileges);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_TablePrivileges,
+ (pstmt->dhstmt, szTableQualifier, cbTableQualifier, szTableOwner,
+ cbTableOwner, szTableName, cbTableName))
+
+ return _iodbcdm_cata_state_tr (hstmt, en_TablePrivileges, retcode);
}
-#ifndef _CONFIG_H
-#define _CONFIG_H
-
-# if !defined(WINDOWS) && !defined(WIN32_SYSTEM) && !defined(OS2)
-# define _UNIX_
-
-# include <stdlib.h>
-# include <sys/types.h>
-# include <string.h>
-# include <stdio.h>
-
-# define MEM_ALLOC(size) (malloc((size_t)(size)))
-# define MEM_FREE(ptr) {if(ptr) free(ptr);}
-
-# define STRCPY(t, s) (strcpy((char*)(t), (char*)(s)))
-# define STRNCPY(t,s,n) (strncpy((char*)(t), (char*)(s), (size_t)(n)))
-# define STRCAT(t, s) (strcat((char*)(t), (char*)(s)))
-# define STRNCAT(t,s,n) (strncat((char*)(t), (char*)(s), (size_t)(n)))
-# define STREQ(a, b) (strcmp((char*)(a), (char*)(b)) == 0)
-# define STRLEN(str) ((str)? strlen((char*)(str)):0)
-
-# define EXPORT
-# define CALLBACK
-# define FAR
-
- typedef signed short SSHOR;
- typedef short WORD;
- typedef long DWORD;
-
- typedef WORD WPARAM;
- typedef DWORD LPARAM;
-// KB: I don't see where HWND and BOOL could get defined before here,
-// but putting in the #ifndef's solved the compilation problem on Solaris.
-#ifndef HWND
-typedef void* HWND;
-#endif
-#ifndef BOOL
-typedef int BOOL;
+/*
+ *
+ * config.h
+ *
+ * $Id$
+ *
+ * Configuration
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _CONFIG_H
+#define _CONFIG_H
+
+#if !defined(WINDOWS) && !defined(WIN32_SYSTEM)
+#define _UNIX_
+
+#include "wx/setup.h"
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <string.h>
+#include <stdio.h>
+
+#define MEM_ALLOC(size) (malloc((size_t)(size)))
+#define MEM_FREE(ptr) {if(ptr) free(ptr);}
+
+#define STRCPY(t, s) (strcpy((char*)(t), (char*)(s)))
+#define STRNCPY(t,s,n) (strncpy((char*)(t), (char*)(s), (size_t)(n)))
+#define STRCAT(t, s) (strcat((char*)(t), (char*)(s)))
+#define STRNCAT(t,s,n) (strncat((char*)(t), (char*)(s), (size_t)(n)))
+#define STREQ(a, b) (strcmp((char*)(a), (char*)(b)) == 0)
+#define STRLEN(str) ((str)? strlen((char*)(str)):0)
+
+#define EXPORT
+#define CALLBACK
+#define FAR
+
+typedef signed short SSHOR;
+typedef short WORD;
+typedef long DWORD;
+
+typedef WORD WPARAM;
+typedef DWORD LPARAM;
+typedef int BOOL;
+#endif /* _UNIX_ */
+
+#if defined(WINDOWS) || defined(WIN32_SYSTEM)
+#include <windows.h>
+#include <windowsx.h>
+
+#ifdef _MSVC_
+#define MEM_ALLOC(size) (fmalloc((size_t)(size)))
+#define MEM_FREE(ptr) ((ptr)? ffree((PTR)(ptr)):0))
+#define STRCPY(t, s) (fstrcpy((char FAR*)(t), (char FAR*)(s)))
+#define STRNCPY(t,s,n) (fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
+#define STRLEN(str) ((str)? fstrlen((char FAR*)(str)):0)
+#define STREQ(a, b) (fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
#endif
-# endif /* _UNIX_ */
-
-# if defined(WINDOWS) || defined(WIN32_SYSTEM)
-
-# include <windows.h>
-# include <windowsx.h>
-
-# ifdef _MSVC_
-# define MEM_ALLOC(size) (fmalloc((size_t)(size)))
-# define MEM_FREE(ptr) ((ptr)? ffree((PTR)(ptr)):0))
-# define STRCPY(t, s) (fstrcpy((char FAR*)(t), (char FAR*)(s)))
-# define STRNCPY(t,s,n) (fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
-# define STRLEN(str) ((str)? fstrlen((char FAR*)(str)):0)
-# define STREQ(a, b) (fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
-# endif
-
-# ifdef _BORLAND_
-# define MEM_ALLOC(size) (farmalloc((unsigned long)(size))
-# define MEM_FREE(ptr) ((ptr)? farfree((void far*)(ptr)):0)
-# define STRCPY(t, s) (_fstrcpy((char FAR*)(t), (char FAR*)(s)))
-# define STRNCPY(t,s,n) (_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
-# define STRLEN(str) ((str)? _fstrlen((char FAR*)(str)):0)
-# define STREQ(a, b) (_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
-# endif
-
-# endif /* WINDOWS */
-
-# if defined(OS2)
-
-# include <stdlib.h>
-# include <stdio.h>
-# include <string.h>
-# include <memory.h>
-# define INCL_DOSMODULEMGR /* Module Manager values */
-# define INCL_DOSERRORS /* Error values */
-# include <os2.h>
-
-# ifndef FAR
-# define FAR
-# endif
-
-# define MEM_ALLOC(size) (malloc((size_t)(size)))
-# define MEM_FREE(ptr) (free((ptr)))
-# define STRCPY(t, s) (strcpy((char*)(t), (char*)(s)))
-# define STRNCPY(t,s,n) (strncpy((char*)(t), (char*)(s), (size_t)(n)))
-# define STRCAT(t, s) (strcat((char*)(t), (char*)(s)))
-# define STRNCAT(t,s,n) (strncat((char*)(t), (char*)(s), (size_t)(n)))
-# define STRLEN(str) ((str)? strlen((char*)(str)):0)
-# define STREQ(a, b) (0 == strcmp((char *)(a), (char *)(b)))
-
- typedef signed short SSHOR;
- typedef short WORD;
- typedef long DWORD;
-
- typedef WORD WPARAM;
- typedef DWORD LPARAM;
+#ifdef _BORLAND_
+#define MEM_ALLOC(size) (farmalloc((unsigned long)(size))
+#define MEM_FREE(ptr) ((ptr)? farfree((void far*)(ptr)):0)
+#define STRCPY(t, s) (_fstrcpy((char FAR*)(t), (char FAR*)(s)))
+#define STRNCPY(t,s,n) (_fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
+#define STRLEN(str) ((str)? _fstrlen((char FAR*)(str)):0)
+#define STREQ(a, b) (_fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
+#endif
-# endif /* OS2 */
+#endif /* WINDOWS */
-# define SYSERR (-1)
+#define SYSERR (-1)
-# ifndef NULL
-# define NULL ((void FAR*)0UL)
-# endif
+#ifndef NULL
+#define NULL ((void FAR*)0UL)
+#endif
#endif
-/** Connect(load) driver
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
+/*
+ * connect.c
+ *
+ * $Id$
+ *
+ * Connect (load) driver
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
+#include <config.h>
-#include <../iodbc/dlproc.h>
+#include <isql.h>
+#include <isqlext.h>
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
+#include <dlproc.h>
-#include <../iodbc/itrace.h>
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
-#include <strings.h>
-#include <stdio.h>
+#include <itrace.h>
-extern char* _iodbcdm_getkeyvalbydsn();
-extern char* _iodbcdm_getkeyvalinstr();
-extern RETCODE _iodbcdm_driverunload();
+extern char* _iodbcdm_getkeyvalbydsn();
+extern char* _iodbcdm_getkeyvalinstr();
+extern RETCODE _iodbcdm_driverunload();
/*
- * Following id string is a copyright mark. Removing(i.e. use
- * souce code of this package without it or make it not appear
- * in the final object file) or modifing it without permission
- * from original author(kejin@empress.com) are copyright
+ * Following id string is a copyright mark. Removing(i.e. use
+ * souce code of this package without it or make it not appear
+ * in the final object file) or modifing it without permission
+ * from original author(kejin@empress.com) are copyright
* violation.
*/
-static char sccsid[]
- = "@(#)iODBC driver manager " "2.12" ", Copyright(c) 1995 by Ke Jin";
+static char sccsid[]
+ = "@(#)iODBC driver manager 2.5, Copyright(c) 1995 by Ke Jin";
-static RETCODE _iodbcdm_driverload(
- char FAR* path,
- HDBC hdbc )
-/* - Load driver share library( or increase its reference count
+/* - Load driver share library( or increase its reference count
* if it has already been loaded by another active connection)
* - Call driver's SQLAllocEnv() (for the first reference only)
* - Call driver's SQLAllocConnect()
* - Call driver's SQLSetConnectOption() (set login time out)
* - Increase the bookkeeping reference count
*/
+static RETCODE
+_iodbcdm_driverload (
+ char FAR * path,
+ HDBC hdbc)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- GENV_t FAR* genv;
- ENV_t FAR* penv = NULL;
- HDLL hdll;
- HPROC hproc;
- RETCODE retcode = SQL_SUCCESS;
- int sqlstat = en_00000;
-
- if(pdbc->trace)
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ GENV_t FAR *genv;
+ ENV_t FAR *penv = NULL;
+ HDLL hdll;
+ HPROC hproc;
+ RETCODE retcode = SQL_SUCCESS;
+ int sqlstat = en_00000;
+
+ if (path == NULL || path[0] == '\0')
+ {
+ PUSHSQLERR (pdbc->herr, en_IM002);
+
+ return SQL_ERROR;
+ }
+
+ if (hdbc == SQL_NULL_HDBC || pdbc->genv == SQL_NULL_HENV)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ genv = (GENV_t FAR *) pdbc->genv;
+
+ /* This will either load the driver dll or increase its reference count */
+ hdll = _iodbcdm_dllopen ((char FAR *) path);
+
+ if (hdll == SQL_NULL_HDLL)
+ {
+ PUSHSYSERR (pdbc->herr, _iodbcdm_dllerror ());
+ PUSHSQLERR (pdbc->herr, en_IM003);
+ return SQL_ERROR;
+ }
+
+ penv = (ENV_t FAR *) (pdbc->henv);
+
+ if (penv != NULL)
+ {
+ if (penv->hdll != hdll)
{
- fprintf(pdbc->tstm, "_iodbcdm_driverload(%s, 0x%x)\n", path, (int)hdbc);
+ _iodbcdm_driverunload (hdbc);
+ }
+ else
+ {
+ /*
+ * this will not unload the driver but only decrease its internal
+ * reference count
+ */
+ _iodbcdm_dllclose (hdll);
+ }
+ }
+
+ if (penv == NULL)
+ {
+ /*
+ * find out whether this dll has already been loaded on another
+ * connection
+ */
+ for (penv = (ENV_t FAR *) genv->henv;
+ penv != NULL;
+ penv = (ENV_t FAR *) penv->next)
+ {
+ if (penv->hdll == hdll)
+ {
+ /*
+ * this will not unload the driver but only decrease its internal
+ * reference count
+ */
+ _iodbcdm_dllclose (hdll);
+ break;
+ }
}
- if( path == NULL || path[0] == '\0' )
- {
- PUSHSQLERR ( pdbc->herr, en_IM002 );
-
- return SQL_ERROR;
- }
-
- if( hdbc == SQL_NULL_HDBC
- || pdbc->genv == SQL_NULL_HENV )
- {
- return SQL_INVALID_HANDLE;
- }
-
- genv = (GENV_t FAR*)pdbc->genv;
-
- hdll = _iodbcdm_dllopen( (char FAR*) path );
- /* This will either load the
- * driver dll or increase its
- * reference count */
-
- if( hdll == SQL_NULL_HDLL )
- {
- if(pdbc->trace)
- {
- fprintf(pdbc->tstm, "ERROR: _iodbcdm_driverload cannot load driver - '%s'\n", _iodbcdm_dllerror());
- }
-
- PUSHSYSERR ( pdbc->herr, _iodbcdm_dllerror() );
- PUSHSQLERR ( pdbc->herr, en_IM003 );
- return SQL_ERROR;
- }
-
- penv = (ENV_t FAR*)(pdbc->henv);
-
- if( penv != NULL )
- {
- if( penv->hdll != hdll )
- {
- _iodbcdm_driverunload(hdbc);
- }
- else
- {
- _iodbcdm_dllclose( hdll );
- /* this will not unload the driver
- * but only decrease its internal
- * reference count
- */
- }
- }
-
- if(penv == NULL )
- {
- /* find out whether this dll has already
- * been loaded on another connection */
- for( penv = (ENV_t FAR*)genv->henv;
- penv != NULL;
- penv = (ENV_t FAR*)penv->next )
- {
- if( penv->hdll == hdll )
- {
- _iodbcdm_dllclose( hdll );
- /* this will not unload the driver
- * but only decrease its internal
- * reference count
- */
- break;
- }
- }
-
- if( penv == NULL )
- /* no connection attaching with this dll */
- {
- int i;
-
- /* create a new dll env instance */
- penv = (ENV_t FAR*)MEM_ALLOC ( sizeof(ENV_t) );
-
- if( penv == NULL )
- {
- _iodbcdm_dllclose(hdll);
-
- PUSHSQLERR ( pdbc->herr, en_S1001 );
-
- return SQL_ERROR;
- }
-
- for( i = 0; i< SQL_EXT_API_LAST + 1; i++)
- {
- (penv->dllproc_tab)[i] = SQL_NULL_HPROC;
- }
-
- pdbc->henv = penv;
- penv->hdll = hdll;
-
- /* call driver's SQLAllocHandle() or SQLAllocEnv() */
+ if (penv == NULL)
+ /* no connection attaching with this dll */
+ {
+ int i;
+
+ /* create a new dll env instance */
+ penv = (ENV_t FAR *) MEM_ALLOC (sizeof (ENV_t));
+
+ if (penv == NULL)
+ {
+ _iodbcdm_dllclose (hdll);
+
+ PUSHSQLERR (pdbc->herr, en_S1001);
+
+ return SQL_ERROR;
+ }
+
+ for (i = 0; i < SQL_EXT_API_LAST + 1; i++)
+ {
+ (penv->dllproc_tab)[i] = SQL_NULL_HPROC;
+ }
+
+ pdbc->henv = penv;
+ penv->hdll = hdll;
+
+ /* call driver's SQLAllocHandle() or SQLAllocEnv() */
+
#if (ODBCVER >= 0x0300)
- hproc = _iodbcdm_getproc( hdbc, en_AllocHandle );
-
- if( hproc )
- {
- CALL_DRIVER ( hdbc, retcode, hproc, en_AllocHandle,
- ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(penv->dhenv) )
- }
- else /* try driver's SQLAllocEnv() */
+ hproc = _iodbcdm_getproc (hdbc, en_AllocHandle);
+
+ if (hproc)
+ {
+ CALL_DRIVER (hdbc, retcode, hproc, en_AllocHandle,
+ (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(penv->dhenv)))
+ }
+ else /* try driver's SQLAllocEnv() */
#endif
- {
- hproc = _iodbcdm_getproc( hdbc, en_AllocEnv );
-
- if( hproc == SQL_NULL_HPROC)
- {
- sqlstat = en_IM004;
- }
- else
- {
- CALL_DRIVER ( hdbc, retcode, hproc,
- en_AllocEnv, (&(penv->dhenv)) )
- }
- }
-
- if( retcode == SQL_ERROR )
- {
- sqlstat = en_IM004;
- }
-
- if( sqlstat != en_00000 )
- {
- _iodbcdm_dllclose ( hdll );
- MEM_FREE ( penv );
- PUSHSQLERR ( pdbc->herr, en_IM004 );
-
- return SQL_ERROR;
- }
-
- /* insert into dll env list */
- penv->next = (ENV_t FAR*)genv->henv;
- genv->henv = penv;
-
- /* initiate this new env entry */
- penv->refcount = 0; /* we will increase it after
- * driver's SQLAllocConnect()
- * success
- */
- }
-
- pdbc->henv = penv;
-
- if( pdbc->dhdbc == SQL_NULL_HDBC )
- {
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_AllocEnv);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM004;
+ }
+ else
+ {
+ CALL_DRIVER (hdbc, retcode, hproc,
+ en_AllocEnv, (&(penv->dhenv)))
+ }
+ }
+
+ if (retcode == SQL_ERROR)
+ {
+ sqlstat = en_IM004;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ _iodbcdm_dllclose (hdll);
+ MEM_FREE (penv);
+ PUSHSQLERR (pdbc->herr, en_IM004);
+
+ return SQL_ERROR;
+ }
+
+ /* insert into dll env list */
+ penv->next = (ENV_t FAR *) genv->henv;
+ genv->henv = penv;
+
+ /* initiate this new env entry */
+ penv->refcount = 0; /* we will increase it after
+ * driver's SQLAllocConnect()
+ * success
+ */
+ }
+
+ pdbc->henv = penv;
+
+ if (pdbc->dhdbc == SQL_NULL_HDBC)
+ {
+
#if (ODBCVER >= 0x0300)
- hproc = _iodbcdm_getproc( hdbc, en_AllocHandle );
-
- if( hproc )
- {
- CALL_DRIVER( hdbc, retcode, hproc, en_AllocHandle,
- (SQL_HANDLE_DBC, penv->dhenv, &(pdbc->dhdbc)) )
- }
- else
+ hproc = _iodbcdm_getproc (hdbc, en_AllocHandle);
+
+ if (hproc)
+ {
+ CALL_DRIVER (hdbc, retcode, hproc, en_AllocHandle,
+ (SQL_HANDLE_DBC, penv->dhenv, &(pdbc->dhdbc)))
+ }
+ else
#endif
- {
- hproc = _iodbcdm_getproc( hdbc, en_AllocConnect );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM005;
- }
- else
- {
- CALL_DRIVER ( hdbc, retcode, hproc,
- en_AllocConnect, (penv->dhenv, &(pdbc->dhdbc)) )
- }
- }
-
- if( retcode == SQL_ERROR )
- {
- sqlstat = en_IM005;
- }
-
- if( sqlstat != en_00000 )
- {
- _iodbcdm_driverunload(hdbc);
-
- pdbc->dhdbc = SQL_NULL_HDBC;
- PUSHSQLERR ( pdbc->herr, en_IM005 );
-
- return SQL_ERROR;
- }
- }
-
- pdbc->henv = penv;
- penv->refcount ++; /* bookkeeping reference count on this driver */
- }
-
- /* driver's login timeout option must been set before
- * its SQLConnect() call */
- if( pdbc->login_timeout != 0UL )
- {
- hproc = _iodbcdm_getproc( hdbc, en_SetConnectOption );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM004;
- }
- else
- {
- CALL_DRIVER ( hdbc, retcode, hproc,
- en_SetConnectOption, (
- pdbc->dhdbc,
- SQL_LOGIN_TIMEOUT,
- pdbc->login_timeout ) )
-
- if( retcode == SQL_ERROR )
- {
- PUSHSQLERR ( pdbc->herr, en_IM006 );
-
- return SQL_SUCCESS_WITH_INFO;
- }
- }
- }
-
- return SQL_SUCCESS;
+
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_AllocConnect);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM005;
+ }
+ else
+ {
+ CALL_DRIVER (hdbc, retcode, hproc,
+ en_AllocConnect, (penv->dhenv, &(pdbc->dhdbc)))
+ }
+ }
+
+ if (retcode == SQL_ERROR)
+ {
+ sqlstat = en_IM005;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ _iodbcdm_driverunload (hdbc);
+
+ pdbc->dhdbc = SQL_NULL_HDBC;
+ PUSHSQLERR (pdbc->herr, en_IM005);
+
+ return SQL_ERROR;
+ }
+ }
+
+ pdbc->henv = penv;
+ penv->refcount++; /* bookkeeping reference count on this driver */
+ }
+
+ /* driver's login timeout option must been set before
+ * its SQLConnect() call */
+ if (pdbc->login_timeout != 0UL)
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_SetConnectOption);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM004;
+ }
+ else
+ {
+ CALL_DRIVER (hdbc, retcode, hproc,
+ en_SetConnectOption, (
+ pdbc->dhdbc,
+ SQL_LOGIN_TIMEOUT,
+ pdbc->login_timeout))
+
+ if (retcode == SQL_ERROR)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM006);
+
+ return SQL_SUCCESS_WITH_INFO;
+ }
+ }
+ }
+
+ return SQL_SUCCESS;
}
-RETCODE _iodbcdm_driverunload( HDBC hdbc )
+
/* - Call driver's SQLFreeConnect()
* - Call driver's SQLFreeEnv() ( for the last reference only)
* - Unload the share library( or decrease its reference
* - decrease bookkeeping reference count
* - state transition to allocated
*/
+RETCODE
+_iodbcdm_driverunload (HDBC hdbc)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- ENV_t FAR* penv;
- ENV_t FAR* tpenv;
- GENV_t FAR* genv;
- HPROC hproc;
- RETCODE retcode = SQL_SUCCESS;
- int sqlstat = en_00000;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* no pointer check will be performed in this function */
- penv = (ENV_t FAR*)pdbc->henv;
- genv = (GENV_t FAR*)pdbc->genv;
-
- if( penv == NULL
- || penv->hdll == SQL_NULL_HDLL )
- {
- return SQL_SUCCESS;
- }
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ ENV_t FAR *penv;
+ ENV_t FAR *tpenv;
+ GENV_t FAR *genv;
+ HPROC hproc;
+ RETCODE retcode = SQL_SUCCESS;
+ int sqlstat = en_00000;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* no pointer check will be performed in this function */
+ penv = (ENV_t FAR *) pdbc->henv;
+ genv = (GENV_t FAR *) pdbc->genv;
+
+ if (penv == NULL || penv->hdll == SQL_NULL_HDLL)
+ {
+ return SQL_SUCCESS;
+ }
#if (ODBCVER >= 0x0300)
- hproc = _iodbcdm_getproc( hdbc, en_FreeHandle );
-
- if( hproc )
- {
- CALL_DRIVER ( hdbc, retcode, hproc, en_FreeHandle,
- ( SQL_HANDLE_DBC, pdbc->dhdbc ) )
- }
- else
+ hproc = _iodbcdm_getproc (hdbc, en_FreeHandle);
+
+ if (hproc)
+ {
+ CALL_DRIVER (hdbc, retcode, hproc, en_FreeHandle,
+ (SQL_HANDLE_DBC, pdbc->dhdbc))
+ }
+ else
#endif
- {
- hproc = _iodbcdm_getproc( hdbc, en_FreeConnect );
- if( hproc != SQL_NULL_HPROC )
- {
- CALL_DRIVER ( hdbc, retcode, hproc,
- en_FreeConnect, ( pdbc->dhdbc ) )
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_FreeConnect);
+
+ if (hproc != SQL_NULL_HPROC)
+ {
+ CALL_DRIVER (hdbc, retcode, hproc,
+ en_FreeConnect, (pdbc->dhdbc))
+
+ pdbc->dhdbc = SQL_NULL_HDBC;
+ }
+ }
- pdbc->dhdbc = SQL_NULL_HDBC;
- }
- }
+ penv->refcount--;
- penv->refcount --;
+ if (!penv->refcount)
+ /* no other connections still attaching with this driver */
+ {
- if( ! penv->refcount )
- /* no other connections still attaching with this driver */
- {
#if (ODBCVER >= 0x0300)
- hproc = _iodbcdm_getproc( hdbc, en_FreeHandle );
-
- if( hproc )
- {
- CALL_DRIVER ( hdbc, retcode, hproc, en_FreeHandle,
- ( SQL_HANDLE_ENV, penv->dhenv ) )
- }
- else
+ hproc = _iodbcdm_getproc (hdbc, en_FreeHandle);
+
+ if (hproc)
+ {
+ CALL_DRIVER (hdbc, retcode, hproc, en_FreeHandle,
+ (SQL_HANDLE_ENV, penv->dhenv))
+ }
+ else
#endif
- {
- hproc = _iodbcdm_getproc( hdbc, en_FreeEnv );
-
- if( hproc != SQL_NULL_HPROC )
- {
- CALL_DRIVER ( hdbc, retcode, hproc, en_FreeEnv,
- ( penv->dhenv ) )
-
- penv->dhenv = SQL_NULL_HENV;
- }
- }
-
- _iodbcdm_dllclose ( penv->hdll );
-
- penv->hdll == SQL_NULL_HDLL;
-
- for( tpenv = (ENV_t FAR*)genv->henv;
- tpenv != NULL;
- tpenv = (ENV_t FAR*)penv->next )
- {
- if( tpenv == penv )
- {
- genv->henv = penv->next;
- break;
- }
-
- if( tpenv->next == penv )
- {
- tpenv->next = penv->next;
- break;
- }
- }
-
- MEM_FREE( penv );
- }
-
- pdbc->henv = SQL_NULL_HENV;
- pdbc->hstmt= SQL_NULL_HSTMT;
- /* pdbc->herr = SQL_NULL_HERR;
- -- delay to DM's SQLFreeConnect() */
- pdbc->dhdbc= SQL_NULL_HDBC;
- pdbc->state= en_dbc_allocated;
-
- /* set connect options to default values */
- /**********
- pdbc->access_mode = SQL_MODE_DEFAULT;
- pdbc->autocommit = SQL_AUTOCOMMIT_DEFAULT;
- pdbc->login_timeout = 0UL;
- **********/
- pdbc->odbc_cursors = SQL_CUR_DEFAULT;
- pdbc->packet_size = 0UL;
- pdbc->quiet_mode = (UDWORD)NULL;
- pdbc->txn_isolation = SQL_TXN_READ_UNCOMMITTED;
-
- if( pdbc->current_qualifier != NULL )
- {
- MEM_FREE ( pdbc->current_qualifier );
- pdbc->current_qualifier = NULL;
- }
-
- return SQL_SUCCESS;
+
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_FreeEnv);
+
+ if (hproc != SQL_NULL_HPROC)
+ {
+ CALL_DRIVER (hdbc, retcode, hproc, en_FreeEnv,
+ (penv->dhenv))
+
+ penv->dhenv = SQL_NULL_HENV;
+ }
+ }
+
+ _iodbcdm_dllclose (penv->hdll);
+
+ penv->hdll = SQL_NULL_HDLL;
+
+ for (tpenv = (ENV_t FAR *) genv->henv;
+ tpenv != NULL;
+ tpenv = (ENV_t FAR *) penv->next)
+ {
+ if (tpenv == penv)
+ {
+ genv->henv = penv->next;
+ break;
+ }
+
+ if (tpenv->next == penv)
+ {
+ tpenv->next = penv->next;
+ break;
+ }
+ }
+
+ MEM_FREE (penv);
+ }
+
+ pdbc->henv = SQL_NULL_HENV;
+ pdbc->hstmt = SQL_NULL_HSTMT;
+ /* pdbc->herr = SQL_NULL_HERR;
+ -- delay to DM's SQLFreeConnect() */
+ pdbc->dhdbc = SQL_NULL_HDBC;
+ pdbc->state = en_dbc_allocated;
+
+ /* set connect options to default values */
+ /**********
+ pdbc->access_mode = SQL_MODE_DEFAULT;
+ pdbc->autocommit = SQL_AUTOCOMMIT_DEFAULT;
+ pdbc->login_timeout = 0UL;
+ **********/
+ pdbc->odbc_cursors = SQL_CUR_DEFAULT;
+ pdbc->packet_size = 0UL;
+ pdbc->quiet_mode = (UDWORD) NULL;
+ pdbc->txn_isolation = SQL_TXN_READ_UNCOMMITTED;
+
+ if (pdbc->current_qualifier != NULL)
+ {
+ MEM_FREE (pdbc->current_qualifier);
+ pdbc->current_qualifier = NULL;
+ }
+
+ return SQL_SUCCESS;
}
-static RETCODE _iodbcdm_dbcdelayset( HDBC hdbc )
+
+static RETCODE
+_iodbcdm_dbcdelayset (HDBC hdbc)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- ENV_t FAR* penv;
- HPROC hproc;
- RETCODE retcode = SQL_SUCCESS;
- RETCODE ret;
-
- penv = pdbc->henv;
-
- hproc = _iodbcdm_getproc( hdbc, en_SetConnectOption );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pdbc->herr, en_IM006 );
-
- return SQL_SUCCESS_WITH_INFO;
- }
-
- if( pdbc->access_mode != SQL_MODE_DEFAULT )
- {
- CALL_DRIVER ( hdbc, ret, hproc,
- en_SetConnectOption, (
- SQL_ACCESS_MODE,
- pdbc->access_mode) )
-
- retcode |= ret;
- }
-
- if( pdbc->autocommit != SQL_AUTOCOMMIT_DEFAULT )
- {
- CALL_DRIVER ( hdbc, ret, hproc,
- en_SetConnectOption, (
- pdbc->dhdbc,
- SQL_AUTOCOMMIT,
- pdbc->autocommit ) )
-
- retcode |= ret;
- }
-
- if( pdbc->current_qualifier != NULL )
- {
- CALL_DRIVER ( hdbc, ret, hproc,
- en_SetConnectOption, (
- pdbc->dhdbc,
- SQL_CURRENT_QUALIFIER,
- pdbc->current_qualifier ) )
-
- retcode |= ret;
- }
-
- if( pdbc->packet_size != 0UL )
- {
- CALL_DRIVER ( hdbc, ret, hproc,
- en_SetConnectOption, (
- pdbc->dhdbc,
- SQL_PACKET_SIZE,
- pdbc->packet_size ) )
-
- retcode |= ret;
- }
-
- if( pdbc->quiet_mode != (UDWORD)NULL )
- {
- CALL_DRIVER ( hdbc, ret, hproc,
- en_SetConnectOption, (
- pdbc->dhdbc,
- SQL_QUIET_MODE,
- pdbc->quiet_mode ) )
-
- retcode |= ret;
- }
-
- if( pdbc->txn_isolation != SQL_TXN_READ_UNCOMMITTED )
- {
- CALL_DRIVER ( hdbc, ret, hproc,
- en_SetConnectOption, (
- pdbc->dhdbc,
- SQL_TXN_ISOLATION,
- pdbc->txn_isolation ) )
- }
-
- /* check error code for driver's SQLSetConnectOption() call */
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- PUSHSQLERR ( pdbc->herr, en_IM006 );
-
- retcode = SQL_ERROR;
- }
-
- /* get cursor behavior on transaction commit or rollback */
- hproc = _iodbcdm_getproc( hdbc, en_GetInfo );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pdbc->herr, en_01000 );
-
- return retcode;
- }
-
- CALL_DRIVER ( hdbc, ret, hproc,
- en_GetInfo, (
- pdbc->dhdbc,
- SQL_CURSOR_COMMIT_BEHAVIOR,
- (PTR)&(pdbc->cb_commit),
- sizeof(pdbc->cb_commit),
- NULL ) )
-
- retcode |= ret;
-
- CALL_DRIVER ( hdbc, ret, hproc,
- en_GetInfo, (
- pdbc->dhdbc,
- SQL_CURSOR_ROLLBACK_BEHAVIOR,
- (PTR)&(pdbc->cb_rollback),
- sizeof(pdbc->cb_rollback),
- NULL ) )
-
- retcode |= ret;
-
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- return SQL_ERROR;
- }
-
- return retcode;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ ENV_t FAR *penv;
+ HPROC hproc;
+ RETCODE retcode = SQL_SUCCESS;
+ RETCODE ret;
+
+ penv = pdbc->henv;
+
+ hproc = _iodbcdm_getproc (hdbc, en_SetConnectOption);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM006);
+
+ return SQL_SUCCESS_WITH_INFO;
+ }
+
+ if (pdbc->access_mode != SQL_MODE_DEFAULT)
+ {
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_SetConnectOption, (
+ SQL_ACCESS_MODE,
+ pdbc->access_mode))
+
+ retcode |= ret;
+ }
+
+ if (pdbc->autocommit != SQL_AUTOCOMMIT_DEFAULT)
+ {
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_SetConnectOption, (
+ pdbc->dhdbc,
+ SQL_AUTOCOMMIT,
+ pdbc->autocommit))
+
+ retcode |= ret;
+ }
+
+ if (pdbc->current_qualifier != NULL)
+ {
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_SetConnectOption, (
+ pdbc->dhdbc,
+ SQL_CURRENT_QUALIFIER,
+ pdbc->current_qualifier))
+
+ retcode |= ret;
+ }
+
+ if (pdbc->packet_size != 0UL)
+ {
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_SetConnectOption, (
+ pdbc->dhdbc,
+ SQL_PACKET_SIZE,
+ pdbc->packet_size))
+
+ retcode |= ret;
+ }
+
+ if (pdbc->quiet_mode != (UDWORD) NULL)
+ {
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_SetConnectOption, (
+ pdbc->dhdbc,
+ SQL_QUIET_MODE,
+ pdbc->quiet_mode))
+
+ retcode |= ret;
+ }
+
+ if (pdbc->txn_isolation != SQL_TXN_READ_UNCOMMITTED)
+ {
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_SetConnectOption, (
+ pdbc->dhdbc,
+ SQL_TXN_ISOLATION,
+ pdbc->txn_isolation))
+ }
+
+ /* check error code for driver's SQLSetConnectOption() call */
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM006);
+
+ retcode = SQL_ERROR;
+ }
+
+ /* get cursor behavior on transaction commit or rollback */
+ hproc = _iodbcdm_getproc (hdbc, en_GetInfo);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pdbc->herr, en_01000);
+
+ return retcode;
+ }
+
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_GetInfo, (
+ pdbc->dhdbc,
+ SQL_CURSOR_COMMIT_BEHAVIOR,
+ (PTR) & (pdbc->cb_commit),
+ sizeof (pdbc->cb_commit),
+ NULL))
+
+ retcode |= ret;
+
+ CALL_DRIVER (hdbc, ret, hproc,
+ en_GetInfo, (
+ pdbc->dhdbc,
+ SQL_CURSOR_ROLLBACK_BEHAVIOR,
+ (PTR) & (pdbc->cb_rollback),
+ sizeof (pdbc->cb_rollback),
+ NULL))
+
+ retcode |= ret;
+
+ if (retcode != SQL_SUCCESS
+ && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ return SQL_ERROR;
+ }
+
+ return retcode;
}
-static RETCODE _iodbcdm_settracing( HDBC hdbc, char* dsn, int dsnlen )
+
+static RETCODE
+_iodbcdm_settracing (HDBC hdbc, char *dsn, int dsnlen)
{
- char buf[256];
- char* ptr;
- RETCODE setopterr = SQL_SUCCESS;
-
- /* Get Driver's DLL path from specificed or default dsn section */
- ptr = _iodbcdm_getkeyvalbydsn( dsn, dsnlen, "TraceFile",
- (char FAR*)buf, sizeof(buf));
-
- if( ptr == NULL || ptr[0] == '\0' )
- {
- ptr = (char FAR*)(SQL_OPT_TRACE_FILE_DEFAULT);
- }
-
- setopterr |= SQLSetConnectOption( hdbc,
- SQL_OPT_TRACEFILE, (UDWORD)(ptr));
-
- ptr = _iodbcdm_getkeyvalbydsn( dsn, dsnlen, "Trace",
- (char FAR*)buf, sizeof(buf));
-
- if( ptr != NULL )
- {
- UDWORD opt = (UDWORD)(-1L);
-
- if( STREQ(ptr, "ON")
- || STREQ(ptr, "On")
- || STREQ(ptr, "on")
- || STREQ(ptr, "1" ) )
- {
- opt = SQL_OPT_TRACE_ON;
- }
-
- if( STREQ(ptr, "OFF")
- || STREQ(ptr, "Off")
- || STREQ(ptr, "off")
- || STREQ(ptr, "0" ) )
- {
- opt = SQL_OPT_TRACE_OFF;
- }
-
- if( opt != (UDWORD)(-1L) )
- {
- setopterr |= SQLSetConnectOption( hdbc,
- SQL_OPT_TRACE, opt);
- }
- }
- return SQL_SUCCESS;
+ char buf[256];
+ char *ptr;
+ RETCODE setopterr = SQL_SUCCESS;
+
+ /* Get Driver's DLL path from specificed or default dsn section */
+ ptr = _iodbcdm_getkeyvalbydsn (dsn, dsnlen, "TraceFile",
+ (char FAR *) buf, sizeof (buf));
+
+ if (ptr == NULL || ptr[0] == '\0')
+ {
+ ptr = (char FAR *) (SQL_OPT_TRACE_FILE_DEFAULT);
+ }
+
+ setopterr |= SQLSetConnectOption (hdbc, SQL_OPT_TRACEFILE, (UDWORD) (ptr));
+
+ ptr = _iodbcdm_getkeyvalbydsn (dsn, dsnlen, "Trace",
+ (char FAR *) buf, sizeof (buf));
+
+ if (ptr != NULL)
+ {
+ UDWORD opt = (UDWORD) (-1L);
+
+ if (STREQ (ptr, "ON")
+ || STREQ (ptr, "On")
+ || STREQ (ptr, "on")
+ || STREQ (ptr, "1"))
+ {
+ opt = SQL_OPT_TRACE_ON;
+ }
+
+ if (STREQ (ptr, "OFF")
+ || STREQ (ptr, "Off")
+ || STREQ (ptr, "off")
+ || STREQ (ptr, "0"))
+ {
+ opt = SQL_OPT_TRACE_OFF;
+ }
+
+ if (opt != (UDWORD) (-1L))
+ {
+ setopterr |= SQLSetConnectOption (hdbc,
+ SQL_OPT_TRACE, opt);
+ }
+ }
+
+ return setopterr;
}
-RETCODE SQL_API SQLConnect (
- HDBC hdbc,
- UCHAR FAR* szDSN,
- SWORD cbDSN,
- UCHAR FAR* szUID,
- SWORD cbUID,
- UCHAR FAR* szAuthStr,
- SWORD cbAuthStr)
+
+RETCODE SQL_API
+SQLConnect (
+ HDBC hdbc,
+ UCHAR FAR * szDSN,
+ SWORD cbDSN,
+ UCHAR FAR * szUID,
+ SWORD cbUID,
+ UCHAR FAR * szAuthStr,
+ SWORD cbAuthStr)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- RETCODE retcode = SQL_SUCCESS;
- RETCODE setopterr = SQL_SUCCESS;
- char driver[1024] = { '\0' }; /* MS SDK Guide
- * specifies driver
- * path can't longer
- * than 255. */
- char szNewDSN[256]; /* OS/2 !!! */
- char *ptr;
- HPROC hproc;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check arguments */
- if( ( cbDSN < 0 && cbDSN != SQL_NTS )
- || ( cbUID < 0 && cbUID != SQL_NTS )
- || ( cbAuthStr < 0 && cbAuthStr != SQL_NTS )
- || ( cbDSN > SQL_MAX_DSN_LENGTH ) )
- {
- PUSHSQLERR ( pdbc->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- if( szDSN == NULL || cbDSN == 0 )
- {
- PUSHSQLERR ( pdbc->herr, en_IM002 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pdbc->state != en_dbc_allocated )
- {
- PUSHSQLERR ( pdbc->herr, en_08002 );
-
- return SQL_ERROR;
- }
-
- setopterr |= _iodbcdm_settracing( hdbc,
- (char*)szDSN, cbDSN );
-
- ptr = _iodbcdm_getkeyvalbydsn( szDSN, cbDSN, "Driver",
- (char FAR*)driver, sizeof(driver));
-
- if( ptr == NULL )
- /* No specified or default dsn section or
- * no driver specification in this dsn section */
- {
- PUSHSQLERR ( pdbc->herr, en_IM002 );
-
- return SQL_ERROR;
- }
-
- /*
- ** OS/2 !!!
- **
- ** get new szDSN from INI file, if existing
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ RETCODE retcode = SQL_SUCCESS;
+ RETCODE setopterr = SQL_SUCCESS;
+ char driver[1024] = {'\0'}; /* MS SDK Guide
+ * specifies driver
+ * path can't longer
+ * than 255. */
+ char *ptr;
+ HPROC hproc;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check arguments */
+ if ((cbDSN < 0 && cbDSN != SQL_NTS)
+ || (cbUID < 0 && cbUID != SQL_NTS)
+ || (cbAuthStr < 0 && cbAuthStr != SQL_NTS)
+ || (cbDSN > SQL_MAX_DSN_LENGTH))
+ {
+ PUSHSQLERR (pdbc->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+
+ if (szDSN == NULL || cbDSN == 0)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM002);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pdbc->state != en_dbc_allocated)
+ {
+ PUSHSQLERR (pdbc->herr, en_08002);
+
+ return SQL_ERROR;
+ }
+
+ setopterr |= _iodbcdm_settracing (hdbc,
+ (char *) szDSN, cbDSN);
+
+ ptr = _iodbcdm_getkeyvalbydsn (szDSN, cbDSN, "Driver",
+ (char FAR *) driver, sizeof (driver));
+
+ if (ptr == NULL)
+ /* No specified or default dsn section or
+ * no driver specification in this dsn section */
+ {
+ PUSHSQLERR (pdbc->herr, en_IM002);
+
+ return SQL_ERROR;
+ }
+
+ retcode = _iodbcdm_driverload (driver, hdbc);
+
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ break;
+
+ case SQL_SUCCESS_WITH_INFO:
+ setopterr = SQL_ERROR;
+ /* unsuccessed in calling driver's
+ * SQLSetConnectOption() to set login
+ * timeout.
*/
- if( NULL != _iodbcdm_getkeyvalbydsn( szDSN, cbDSN, "DSN",
- (char FAR*) &szNewDSN,
- sizeof(szNewDSN) ) )
- {
- szDSN = &szNewDSN[0];
- cbDSN = SQL_NTS;
- }
-
- retcode = _iodbcdm_driverload( driver, hdbc );
-
- switch( retcode )
- {
- case SQL_SUCCESS:
- break;
-
- case SQL_SUCCESS_WITH_INFO:
- setopterr = SQL_ERROR;
- /* unsuccessed in calling driver's
- * SQLSetConnectOption() to set login
- * timeout.
- */
- break;
-
- default:
- return retcode;
- }
-
- hproc = _iodbcdm_getproc( hdbc, en_Connect );
-
- if( hproc == SQL_NULL_HPROC )
- {
- _iodbcdm_driverunload( hdbc );
-
- PUSHSQLERR ( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_Connect, (
- pdbc->dhdbc,
- szDSN, cbDSN,
- szUID, cbUID,
- szAuthStr, cbAuthStr ) )
-
-#if 0
- retcode = hproc(pdbc->dhdbc,
- szDSN, cbDSN,
- szUID, cbUID,
- szAuthStr, cbAuthStr );
-#endif
+ break;
+
+ default:
+ return retcode;
+ }
+
+ hproc = _iodbcdm_getproc (hdbc, en_Connect);
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- /* not unload driver for retrive error
- * messge from driver */
- /*********
- _iodbcdm_driverunload( hdbc );
- **********/
+ if (hproc == SQL_NULL_HPROC)
+ {
+ _iodbcdm_driverunload (hdbc);
- return retcode;
- }
+ PUSHSQLERR (pdbc->herr, en_IM001);
- /* state transition */
- pdbc->state = en_dbc_connected;
+ return SQL_ERROR;
+ }
- /* do delaid option setting */
- setopterr |= _iodbcdm_dbcdelayset( hdbc );
+ CALL_DRIVER (hdbc, retcode, hproc, en_Connect, (
+ pdbc->dhdbc,
+ szDSN, cbDSN,
+ szUID, cbUID,
+ szAuthStr, cbAuthStr))
- if( setopterr != SQL_SUCCESS )
- {
- return SQL_SUCCESS_WITH_INFO;
- }
+ if (retcode != SQL_SUCCESS
+ && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ /* not unload driver for retrive error
+ * messge from driver */
+ /*********
+ _iodbcdm_driverunload( hdbc );
+ **********/
- return retcode;
+ return retcode;
+ }
+
+ /* state transition */
+ pdbc->state = en_dbc_connected;
+
+ /* do delaid option setting */
+ setopterr |= _iodbcdm_dbcdelayset (hdbc);
+
+ if (setopterr != SQL_SUCCESS)
+ {
+ return SQL_SUCCESS_WITH_INFO;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLDriverConnect (
- HDBC hdbc,
- HWND hwnd,
- UCHAR FAR* szConnStrIn,
- SWORD cbConnStrIn,
- UCHAR FAR* szConnStrOut,
- SWORD cbConnStrOutMax,
- SWORD FAR* pcbConnStrOut,
- UWORD fDriverCompletion )
+
+RETCODE SQL_API
+SQLDriverConnect (
+ HDBC hdbc,
+ HWND hwnd,
+ UCHAR FAR * szConnStrIn,
+ SWORD cbConnStrIn,
+ UCHAR FAR * szConnStrOut,
+ SWORD cbConnStrOutMax,
+ SWORD FAR * pcbConnStrOut,
+ UWORD fDriverCompletion)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- HDLL hdll;
- char FAR* drv;
- char drvbuf[1024];
- char FAR* dsn;
- char dsnbuf[SQL_MAX_DSN_LENGTH + 1];
- char szNewDSN[256]; /* OS/2 !!! */
- UCHAR cnstr2drv[1024];
-
- HPROC hproc, dialproc;
-
- int sqlstat = en_00000;
- RETCODE retcode = SQL_SUCCESS;
- RETCODE setopterr = SQL_SUCCESS;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check arguments */
- if( ( cbConnStrIn < 0 && cbConnStrIn != SQL_NTS )
- || cbConnStrOutMax < 0 )
- {
- PUSHSQLERR (pdbc->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pdbc->state != en_dbc_allocated )
- {
- PUSHSQLERR (pdbc->herr, en_08002 );
-
- return SQL_ERROR;
- }
-
- drv = _iodbcdm_getkeyvalinstr(szConnStrIn, cbConnStrIn,
- "DRIVER", drvbuf, sizeof(drvbuf));
-
- dsn = _iodbcdm_getkeyvalinstr(szConnStrIn, cbConnStrIn,
- "DSN", dsnbuf, sizeof(dsnbuf));
-
- switch( fDriverCompletion )
- {
- case SQL_DRIVER_NOPROMPT:
- break;
-
- case SQL_DRIVER_COMPLETE:
- case SQL_DRIVER_COMPLETE_REQUIRED:
- if( dsn != NULL )
- {
- break;
- }
- /* fall to next case */
- case SQL_DRIVER_PROMPT:
- /* Get data source dialog box function from
- * current executable */
- hdll = _iodbcdm_dllopen((char FAR*)NULL);
- dialproc = _iodbcdm_dllproc( hdll,
- "_iodbcdm_drvconn_dialbox");
-
- if( dialproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM008;
- break;
- }
-
- retcode = dialproc(
- hwnd, /* window or display handle */
- dsnbuf, /* input/output dsn buf */
- sizeof(dsnbuf), /* buf size */
- &sqlstat); /* error code */
-
- if( retcode != SQL_SUCCESS )
- {
- break;
- }
-
- if( cbConnStrIn == SQL_NTS )
- {
- cbConnStrIn = STRLEN(szConnStrIn );
- }
-
- dsn = dsnbuf;
-
- if( dsn[0] == '\0' )
- {
- dsn = "default";
- }
-
- if( cbConnStrIn > sizeof(cnstr2drv)
- - STRLEN(dsn) - STRLEN("DSN=;") -1 )
- {
- sqlstat = en_S1001; /* a lazy way to avoid
- * using heap memory */
- break;
- }
-
- sprintf(cnstr2drv, "DSN=%s;", dsn);
- cbConnStrIn += STRLEN(cnstr2drv);
- STRNCAT( cnstr2drv, szConnStrIn, cbConnStrIn );
- szConnStrIn = cnstr2drv;
- break;
-
- default:
- sqlstat = en_S1110;
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR( pdbc->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- if( dsn == NULL || dsn[0] == '\0' )
- {
- dsn = "default";
- }
- else /* if you want tracing, you must use a DSN */
- {
- setopterr |= _iodbcdm_settracing( hdbc,
- (char*)dsn, SQL_NTS );
- }
-
- if( drv == NULL || drv[0] == '\0' )
- {
- drv = _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS, "Driver",
- drvbuf, sizeof(drvbuf));
- }
-
- if( drv == NULL )
- {
- PUSHSQLERR( pdbc->herr, en_IM002 );
-
- return SQL_ERROR;
- }
-
- retcode = _iodbcdm_driverload( drv, hdbc );
-
- switch( retcode )
- {
- case SQL_SUCCESS:
- break;
-
- case SQL_SUCCESS_WITH_INFO:
- setopterr = SQL_ERROR;
- /* unsuccessed in calling driver's
- * SQLSetConnectOption() to set login
- * timeout.
- */
- break;
-
- default:
- return retcode;
- }
-
- hproc = _iodbcdm_getproc( hdbc, en_DriverConnect );
-
- if( hproc == SQL_NULL_HPROC )
- {
- _iodbcdm_driverunload( hdbc );
-
- PUSHSQLERR ( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
- /* giovanni */
- /*
- ** OS/2 !!!
- **
- ** get new szDSN from INI file, if existing
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ HDLL hdll;
+ char FAR *drv;
+ char drvbuf[1024];
+ char FAR *dsn;
+ char dsnbuf[SQL_MAX_DSN_LENGTH + 1];
+ UCHAR cnstr2drv[1024];
+
+ HPROC hproc;
+ HPROC dialproc;
+
+ int sqlstat = en_00000;
+ RETCODE retcode = SQL_SUCCESS;
+ RETCODE setopterr = SQL_SUCCESS;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check arguments */
+ if ((cbConnStrIn < 0 && cbConnStrIn != SQL_NTS)
+ || cbConnStrOutMax < 0)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pdbc->state != en_dbc_allocated)
+ {
+ PUSHSQLERR (pdbc->herr, en_08002);
+
+ return SQL_ERROR;
+ }
+
+ drv = _iodbcdm_getkeyvalinstr (szConnStrIn, cbConnStrIn,
+ "DRIVER", drvbuf, sizeof (drvbuf));
+
+ dsn = _iodbcdm_getkeyvalinstr (szConnStrIn, cbConnStrIn,
+ "DSN", dsnbuf, sizeof (dsnbuf));
+
+ switch (fDriverCompletion)
+ {
+ case SQL_DRIVER_NOPROMPT:
+ break;
+
+ case SQL_DRIVER_COMPLETE:
+ case SQL_DRIVER_COMPLETE_REQUIRED:
+ if (dsn != NULL || drv != NULL)
+ {
+ break;
+ }
+ /* fall to next case */
+ case SQL_DRIVER_PROMPT:
+ /* Get data source dialog box function from
+ * current executable */
+ hdll = _iodbcdm_dllopen ((char FAR *) NULL);
+ dialproc = _iodbcdm_dllproc (hdll,
+ "_iodbcdm_drvconn_dialbox");
+
+ if (dialproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM008;
+ break;
+ }
+
+ retcode = dialproc (
+ hwnd, /* window or display handle */
+ dsnbuf, /* input/output dsn buf */
+ sizeof (dsnbuf), /* buf size */
+ &sqlstat); /* error code */
+
+ if (retcode != SQL_SUCCESS)
+ {
+ break;
+ }
+
+ if (cbConnStrIn == SQL_NTS)
+ {
+ cbConnStrIn = STRLEN (szConnStrIn);
+ }
+
+ dsn = dsnbuf;
+
+ if (dsn[0] == '\0')
+ {
+ dsn = "default";
+ }
+
+ if (cbConnStrIn > sizeof (cnstr2drv)
+ - STRLEN (dsn) - STRLEN ("DSN=;") - 1)
+ {
+ sqlstat = en_S1001; /* a lazy way to avoid
+ * using heap memory */
+ break;
+ }
+
+ sprintf (cnstr2drv, "DSN=%s;", dsn);
+ cbConnStrIn += STRLEN (cnstr2drv);
+ STRNCAT (cnstr2drv, szConnStrIn, cbConnStrIn);
+ szConnStrIn = cnstr2drv;
+ break;
+
+ default:
+ sqlstat = en_S1110;
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pdbc->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ if (dsn == NULL || dsn[0] == '\0')
+ {
+ dsn = "default";
+ }
+ else
+ /* if you want tracing, you must use a DSN */
+ {
+ setopterr |= _iodbcdm_settracing (hdbc,
+ (char *) dsn, SQL_NTS);
+ }
+
+ if (drv == NULL || drv[0] == '\0')
+ {
+ drv = _iodbcdm_getkeyvalbydsn (dsn, SQL_NTS, "Driver",
+ drvbuf, sizeof (drvbuf));
+ }
+
+ if (drv == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM002);
+
+ return SQL_ERROR;
+ }
+
+ retcode = _iodbcdm_driverload (drv, hdbc);
+
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ break;
+
+ case SQL_SUCCESS_WITH_INFO:
+ setopterr = SQL_ERROR;
+ /* unsuccessed in calling driver's
+ * SQLSetConnectOption() to set login
+ * timeout.
*/
- strcpy( szNewDSN, "DSN=" );
- if( NULL != _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS, "DSN",
- (char FAR*) &szNewDSN[4],
- sizeof(szNewDSN) - 4 ) )
- {
- char *psz;
+ break;
- strcat( szNewDSN, ";UID=" );
- psz = strtok( szNewDSN, "\0" );
+ default:
+ return retcode;
+ }
+ hproc = _iodbcdm_getproc (hdbc, en_DriverConnect);
+ if (hproc == SQL_NULL_HPROC)
+ {
+ _iodbcdm_driverunload (hdbc);
+ PUSHSQLERR (pdbc->herr, en_IM001);
- if(NULL == _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
- /*
- "UID", psz, sizeof(szNewDSN) ))
- */
- "UID", (char FAR*) &szNewDSN[strlen(psz)],
- (sizeof(szNewDSN) - strlen(psz)) ) )
- {
- _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS,
- "UID", (char FAR*) &szNewDSN[strlen(psz)],
- (sizeof(szNewDSN) - strlen(psz)) );
- }
- strcat( szNewDSN, ";PWD=" );
- psz = strtok( szNewDSN, "\0" );
- if(NULL == _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
- /*
- "PWD", psz, sizeof(szNewDSN) ))
- */
- "PWD", (char FAR*) &szNewDSN[strlen(psz)],
- (sizeof(szNewDSN) - strlen(psz)) ) )
- {
+ return SQL_ERROR;
+ }
- _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS,
- "PWD", (char FAR*) &szNewDSN[strlen(psz)],
- (sizeof(szNewDSN) - strlen(psz)) );
- }
-/*
-new from dirk
- {
- register char *psz;
-
- strcat( szNewDSN, ";UID=" );
- psz = strtok( szNewDSN, "\0" );
- _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
- "UID", psz, sizeof(szNewDSN) );
- strcat( szNewDSN, ";PWD=" );
- psz = strtok( szNewDSN, "\0" );
- _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
- "PWD", psz, sizeof(szNewDSN) );
- szConnStrIn = &szNewDSN[0];
- cbConnStrIn = SQL_NTS;
- }
-
-
-*/
- /******** giovanni & monty ********/
- /* Add a lot of optional keywords */
- {
- static char *keywords[]= { "SERVER","PORT","SOCKET","OPTION","DB",0 };
- char buff[80],**key,*end;
-
- psz= szNewDSN+strlen(szNewDSN);
- end= szNewDSN+sizeof(szNewDSN);
- for (key=keywords ; *key ; key++)
- {
- if (_iodbcdm_getkeyvalbydsn(dsn, SQL_NTS,
- *key, (char FAR*) buff,
- sizeof(buff)) &&
- strlen(*key)+strlen(buff)+2 < (int) (end - psz))
- {
- *psz++=';';
- strcpy(psz,*key); psz+=strlen(*key);
- *psz++='=';
- strcpy(psz,buff); psz+=strlen(buff);
- }
- }
- }
- *psz=0;
- /******** giovanni */
- szConnStrIn = szNewDSN; /*giovanni, era &szNewDSN */
- cbConnStrIn = SQL_NTS;
- }
- /* giovanni */
- CALL_DRIVER ( hdbc, retcode, hproc, en_DriverConnect, (
- pdbc->dhdbc, hwnd,
- szConnStrIn, cbConnStrIn,
- szConnStrOut, cbConnStrOutMax,
- pcbConnStrOut, fDriverCompletion ) )
-#if 0
- retcode = hproc(pdbc->dhdbc, hwnd,
- szConnStrIn, cbConnStrIn,
- szConnStrOut, cbConnStrOutMax,
- pcbConnStrOut, fDriverCompletion );
-#endif
+ CALL_DRIVER (hdbc, retcode, hproc, en_DriverConnect, (
+ pdbc->dhdbc, hwnd,
+ szConnStrIn, cbConnStrIn,
+ szConnStrOut, cbConnStrOutMax,
+ pcbConnStrOut, fDriverCompletion))
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- /* don't unload driver here for retrive
- * error message from driver */
- /********
- _iodbcdm_driverunload( hdbc );
- *********/
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ /* don't unload driver here for retrive
+ * error message from driver */
+ /********
+ _iodbcdm_driverunload( hdbc );
+ *********/
- return retcode;
- }
+ return retcode;
+ }
- /* state transition */
- pdbc->state = en_dbc_connected;
+ /* state transition */
+ pdbc->state = en_dbc_connected;
- /* do delaid option setting */
- setopterr |= _iodbcdm_dbcdelayset( hdbc );
+ /* do delaid option setting */
+ setopterr |= _iodbcdm_dbcdelayset (hdbc);
- if( setopterr != SQL_SUCCESS )
- {
- return SQL_SUCCESS_WITH_INFO;
- }
+ if (setopterr != SQL_SUCCESS)
+ {
+ return SQL_SUCCESS_WITH_INFO;
+ }
- return retcode;
+ return retcode;
}
-RETCODE SQL_API SQLBrowseConnect (
- HDBC hdbc,
- HWND hwnd,
- UCHAR FAR* szConnStrIn,
- SWORD cbConnStrIn,
- UCHAR FAR* szConnStrOut,
- SWORD cbConnStrOutMax,
- SWORD FAR* pcbConnStrOut )
+
+RETCODE SQL_API
+SQLBrowseConnect (
+ HDBC hdbc,
+ UCHAR FAR * szConnStrIn,
+ SWORD cbConnStrIn,
+ UCHAR FAR * szConnStrOut,
+ SWORD cbConnStrOutMax,
+ SWORD FAR * pcbConnStrOut)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- HDLL hdll;
- char FAR* drv;
- char drvbuf[1024];
- char FAR* dsn;
- char dsnbuf[SQL_MAX_DSN_LENGTH + 1];
- UCHAR cnstr2drv[1024];
-
- HPROC hproc, dialproc;
-
- int sqlstat = en_00000;
- RETCODE retcode = SQL_SUCCESS;
- RETCODE setopterr = SQL_SUCCESS;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check arguments */
- if( ( cbConnStrIn < 0 && cbConnStrIn != SQL_NTS )
- || cbConnStrOutMax < 0 )
- {
- PUSHSQLERR (pdbc->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- if( pdbc->state == en_dbc_allocated )
- {
- drv = _iodbcdm_getkeyvalinstr(szConnStrIn, cbConnStrIn,
- "DRIVER", drvbuf, sizeof(drvbuf));
-
- dsn = _iodbcdm_getkeyvalinstr(szConnStrIn, cbConnStrIn,
- "DSN", dsnbuf, sizeof(dsnbuf));
-
- if( dsn == NULL || dsn[0] == '\0' )
- {
- dsn = "default";
- }
- else /* if you want tracing, you must use a DSN */
- {
- setopterr |= _iodbcdm_settracing( hdbc,
- (char*)dsn, SQL_NTS );
- }
-
- if( drv == NULL || drv[0] == '\0' )
- {
- drv = _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS, "Driver",
- drvbuf, sizeof(drvbuf));
- }
-
- if( drv == NULL )
- {
- PUSHSQLERR( pdbc->herr, en_IM002 );
-
- return SQL_ERROR;
- }
-
- retcode = _iodbcdm_driverload( drv, hdbc );
-
- switch( retcode )
- {
- case SQL_SUCCESS:
- break;
-
- case SQL_SUCCESS_WITH_INFO:
- setopterr = SQL_ERROR;
- /* unsuccessed in calling driver's
- * SQLSetConnectOption() to set login
- * timeout.
- */
- break;
-
- default:
- return retcode;
- }
- }
- else if( pdbc->state != en_dbc_needdata )
- {
- PUSHSQLERR ( pdbc->herr, en_08002 );
-
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( hdbc, en_BrowseConnect);
-
- if( hproc == SQL_NULL_HPROC )
- {
- _iodbcdm_driverunload( hdbc );
-
- pdbc->state = en_dbc_allocated;
-
- PUSHSQLERR( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_BrowseConnect, (
- pdbc->dhdbc, hwnd,
- szConnStrIn, cbConnStrIn,
- szConnStrOut, cbConnStrOutMax,
- pcbConnStrOut ) )
-
-#if 0
- retcode = hproc(pdbc->dhdbc, hwnd,
- szConnStrIn, cbConnStrIn,
- szConnStrOut, cbConnStrOutMax,
- pcbConnStrOut );
-#endif
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ HDLL hdll;
+ char FAR *drv;
+ char drvbuf[1024];
+ char FAR *dsn;
+ char dsnbuf[SQL_MAX_DSN_LENGTH + 1];
+ UCHAR cnstr2drv[1024];
+
+ HPROC hproc;
+ HPROC dialproc;
+
+ int sqlstat = en_00000;
+ RETCODE retcode = SQL_SUCCESS;
+ RETCODE setopterr = SQL_SUCCESS;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check arguments */
+ if ((cbConnStrIn < 0 && cbConnStrIn != SQL_NTS) || cbConnStrOutMax < 0)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+
+ if (pdbc->state == en_dbc_allocated)
+ {
+ drv = _iodbcdm_getkeyvalinstr (szConnStrIn, cbConnStrIn,
+ "DRIVER", drvbuf, sizeof (drvbuf));
+
+ dsn = _iodbcdm_getkeyvalinstr (szConnStrIn, cbConnStrIn,
+ "DSN", dsnbuf, sizeof (dsnbuf));
+
+ if (dsn == NULL || dsn[0] == '\0')
+ {
+ dsn = "default";
+ }
+ else
+ /* if you want tracing, you must use a DSN */
+ {
+ setopterr |= _iodbcdm_settracing (hdbc,
+ (char *) dsn, SQL_NTS);
+ }
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- pdbc->state = en_dbc_connected;
- setopterr |= _iodbcdm_dbcdelayset( hdbc );
- if( setopterr != SQL_SUCCESS )
- {
- retcode = SQL_SUCCESS_WITH_INFO;
- }
- break;
-
- case SQL_NEED_DATA:
- pdbc->state = en_dbc_needdata;
- break;
-
- case SQL_ERROR:
- pdbc->state = en_dbc_allocated;
- /* but the driver will not unloaded
- * to allow application retrive err
- * message from driver
- */
- break;
-
- default:
- break;
- }
-
- return retcode;
-}
+ if (drv == NULL || drv[0] == '\0')
+ {
+ drv = _iodbcdm_getkeyvalbydsn (dsn, SQL_NTS, "Driver",
+ drvbuf, sizeof (drvbuf));
+ }
-RETCODE SQL_API SQLDisconnect ( HDBC hdbc )
-{
- DBC_t FAR* pdbc = (DBC_t*)hdbc;
- STMT_t FAR* pstmt;
- RETCODE retcode;
- HPROC hproc;
-
- int sqlstat = en_00000;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check hdbc state */
- if ( pdbc->state == en_dbc_allocated )
- {
- sqlstat = en_08003;
- }
-
- /* check stmt(s) state */
- for( pstmt = (STMT_t FAR*)pdbc->hstmt;
- pstmt != NULL && sqlstat == en_00000;
- pstmt = (STMT_t FAR*)pstmt->next )
- {
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- /* In this case one need to call
- * SQLCancel() first */
- {
- sqlstat = en_S1010;
- }
- }
-
- if( sqlstat == en_00000 )
- {
- hproc = _iodbcdm_getproc( hdbc, en_Disconnect );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- }
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pdbc->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_Disconnect, (
- pdbc->dhdbc ) )
-
-#if 0
- retcode = hproc( pdbc->dhdbc );
-#endif
+ if (drv == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM002);
- if( retcode == SQL_SUCCESS
- || retcode == SQL_SUCCESS_WITH_INFO )
- {
- /* diff from MS specs. We disallow
- * driver SQLDisconnect() return
- * SQL_SUCCESS_WITH_INFO and post
- * error message.
- */
- retcode = SQL_SUCCESS;
- }
- else
- {
- return retcode;
- }
-
- /* free all statement handle(s) on this connection */
- for(;pdbc->hstmt;)
- {
- _iodbcdm_dropstmt( pdbc->hstmt );
- }
-
-#if 0
- retcode = _iodbcdm_driverunload( hdbc );
-#endif
+ return SQL_ERROR;
+ }
- /* state transition */
- if( retcode == SQL_SUCCESS )
- {
- pdbc->state = en_dbc_allocated;
- }
+ retcode = _iodbcdm_driverload (drv, hdbc);
+
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ break;
+
+ case SQL_SUCCESS_WITH_INFO:
+ setopterr = SQL_ERROR;
+ /* unsuccessed in calling driver's
+ * SQLSetConnectOption() to set login
+ * timeout.
+ */
+ break;
+
+ default:
+ return retcode;
+ }
+ }
+ else if (pdbc->state != en_dbc_needdata)
+ {
+ PUSHSQLERR (pdbc->herr, en_08002);
+
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (hdbc, en_BrowseConnect);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ _iodbcdm_driverunload (hdbc);
+
+ pdbc->state = en_dbc_allocated;
+
+ PUSHSQLERR (pdbc->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (hdbc, retcode, hproc, en_BrowseConnect, (
+ pdbc->dhdbc,
+ szConnStrIn, cbConnStrIn,
+ szConnStrOut, cbConnStrOutMax,
+ pcbConnStrOut))
+
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ pdbc->state = en_dbc_connected;
+ setopterr |= _iodbcdm_dbcdelayset (hdbc);
+ if (setopterr != SQL_SUCCESS)
+ {
+ retcode = SQL_SUCCESS_WITH_INFO;
+ }
+ break;
+
+ case SQL_NEED_DATA:
+ pdbc->state = en_dbc_needdata;
+ break;
+
+ case SQL_ERROR:
+ pdbc->state = en_dbc_allocated;
+ /* but the driver will not unloaded
+ * to allow application retrive err
+ * message from driver
+ */
+ break;
- return retcode;
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLNativeSql(
- HDBC hdbc,
- UCHAR FAR* szSqlStrIn,
- SDWORD cbSqlStrIn,
- UCHAR FAR* szSqlStr,
- SDWORD cbSqlStrMax,
- SDWORD FAR* pcbSqlStr )
+
+RETCODE SQL_API
+SQLDisconnect (HDBC hdbc)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- HPROC hproc;
- int sqlstat = en_00000;
- RETCODE retcode;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
- if( szSqlStrIn == NULL )
- {
- sqlstat = en_S1009;
- }
- else if( cbSqlStrIn < 0
- && cbSqlStrIn != SQL_NTS )
- {
- sqlstat = en_S1090;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pdbc->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pdbc->state <= en_dbc_needdata )
- {
- PUSHSQLERR ( pdbc->herr, en_08003 );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( hdbc, en_NativeSql );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_NativeSql, (
- pdbc->dhdbc,
- szSqlStrIn,
- cbSqlStrIn,
- szSqlStr,
- cbSqlStrMax,
- pcbSqlStr ) )
-
-#if 0
- retcode = hproc(pdbc->dhdbc,
- szSqlStrIn,
- cbSqlStrIn,
- szSqlStr,
- cbSqlStrMax,
- pcbSqlStr );
-#endif
+ DBC_t FAR *pdbc = (DBC_t *) hdbc;
+ STMT_t FAR *pstmt;
+ RETCODE retcode;
+ HPROC hproc;
+
+ int sqlstat = en_00000;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check hdbc state */
+ if (pdbc->state == en_dbc_allocated)
+ {
+ sqlstat = en_08003;
+ }
+
+ /* check stmt(s) state */
+ for (pstmt = (STMT_t FAR *) pdbc->hstmt;
+ pstmt != NULL && sqlstat == en_00000;
+ pstmt = (STMT_t FAR *) pstmt->next)
+ {
+ if (pstmt->state >= en_stmt_needdata
+ || pstmt->asyn_on != en_NullProc)
+ /* In this case one need to call
+ * SQLCancel() first */
+ {
+ sqlstat = en_S1010;
+ }
+ }
+
+ if (sqlstat == en_00000)
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_Disconnect);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pdbc->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (hdbc, retcode, hproc, en_Disconnect, (
+ pdbc->dhdbc))
+
+ if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
+ {
+ /* diff from MS specs. We disallow
+ * driver SQLDisconnect() return
+ * SQL_SUCCESS_WITH_INFO and post
+ * error message.
+ */
+ retcode = SQL_SUCCESS;
+ }
+ else
+ {
+ return retcode;
+ }
+
+ /* free all statement handle(s) on this connection */
+ for (; pdbc->hstmt;)
+ {
+ _iodbcdm_dropstmt (pdbc->hstmt);
+ }
+
+ /* state transition */
+ if (retcode == SQL_SUCCESS)
+ {
+ pdbc->state = en_dbc_allocated;
+ }
+
+ return retcode;
+}
- return retcode;
+
+RETCODE SQL_API
+SQLNativeSql (
+ HDBC hdbc,
+ UCHAR FAR * szSqlStrIn,
+ SDWORD cbSqlStrIn,
+ UCHAR FAR * szSqlStr,
+ SDWORD cbSqlStrMax,
+ SDWORD FAR * pcbSqlStr)
+{
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ HPROC hproc;
+ int sqlstat = en_00000;
+ RETCODE retcode;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+ if (szSqlStrIn == NULL)
+ {
+ sqlstat = en_S1009;
+ }
+ else if (cbSqlStrIn < 0 && cbSqlStrIn != SQL_NTS)
+ {
+ sqlstat = en_S1090;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pdbc->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pdbc->state <= en_dbc_needdata)
+ {
+ PUSHSQLERR (pdbc->herr, en_08003);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (hdbc, en_NativeSql);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (hdbc, retcode, hproc, en_NativeSql,
+ (pdbc->dhdbc, szSqlStrIn, cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr))
+
+ return retcode;
}
-/** dynamic library loader (mapping to svr4)
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#ifdef DLDAPI_OS2
-# define INCL_DOSMODULEMGR /* Module Manager values */
-# define INCL_DOSERRORS /* Error values */
-# include <os2.h>
-# include <stdio.h>
-#endif
+/*
+ * dlf.c
+ *
+ * $Id$
+ *
+ * Dynamic Library Loader (mapping to SVR4)
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
-#include "wx/setup.h"
-#include <../iodbc/dlf.h>
+#include <dlf.h>
#include <errno.h>
-#ifdef DLDAPI_DEFINED
-# undef DLDAPI_DEFINED
+#ifdef DLDAPI_DEFINED
+#undef DLDAPI_DEFINED
#endif
-#ifdef DLDAPI_SVR4_DLFCN
-# define DLDAPI_DEFINED
-static char sccsid[] = "@(#)dynamic load interface -- SVR4 dlfcn";
+#ifdef DLDAPI_SVR4_DLFCN
+#define DLDAPI_DEFINED
+static char sccsid[] = "@(#)dynamic load interface -- SVR4 dlfcn";
#endif
-/*********************************
+/*********************************
*
- * HP/UX
+ * HP/UX
*
*********************************/
-#ifdef DLDAPI_HP_SHL
-# define DLDAPI_DEFINED
-# include <dl.h>
-static char sccsid[] = "@(#)dynamic load interface -- HP/UX dl(shl)";
+#ifdef DLDAPI_HP_SHL
+#define DLDAPI_DEFINED
+#include <dl.h>
-void* dlopen(char* path, int mode)
+static char sccsid[] = "@(#)dynamic load interface -- HP/UX dl(shl)";
+
+void *
+dlopen (char *path, int mode)
{
- return (void*)shl_load((char*)(path), BIND_DEFERRED, 0L);
+ return (void *) shl_load ((char *) (path), BIND_DEFERRED, 0L);
}
-void* dlsym(void* hdll, char* sym)
+
+void *
+dlsym (void *hdll, char *sym)
{
- void* symaddr = 0;
- int ret;
+ void *symaddr = 0;
+ int ret;
- if( ! hdll )
- hdll = (void*)PROG_HANDLE;
+ if (!hdll)
+ hdll = (void *) PROG_HANDLE;
- /* Remember, a driver may export calls as function pointers
- * (i.e. with type TYPE_DATA) rather than as functions
- * (i.e. with type TYPE_PROCEDURE). Thus, to be safe, we
- * uses TYPE_UNDEFINED to cover all of them.
- */
- ret = shl_findsym((shl_t*)&hdll, sym, TYPE_UNDEFINED, &symaddr);
+ /* Remember, a driver may export calls as function pointers
+ * (i.e. with type TYPE_DATA) rather than as functions
+ * (i.e. with type TYPE_PROCEDURE). Thus, to be safe, we
+ * uses TYPE_UNDEFINED to cover all of them.
+ */
+ ret = shl_findsym ((shl_t *) & hdll, sym, TYPE_UNDEFINED, &symaddr);
- if( ret == -1 )
- return 0;
+ if (ret == -1)
+ return 0;
- return symaddr;
+ return symaddr;
}
-char* dlerror()
+
+char *
+dlerror ()
{
- extern char* strerror();
+ extern char *strerror ();
- return strerror(errno);
+ return strerror (errno);
}
-int dlclose(void* hdll)
+
+int
+dlclose (void *hdll)
{
- return shl_unload((shl_t)hdll);
+ return shl_unload ((shl_t) hdll);
}
+#endif /* end of HP/UX Seection */
-#endif /* end of HP/UX Seection */
/*********************************
*
- * IBM AIX
+ * IBM AIX
*
*********************************/
-#ifdef DLDAPI_AIX_LOAD
-# define DLDAPI_DEFINED
-# include <sys/ldr.h>
-# include <sys/stat.h>
-# include <nlist.h>
+
+#ifdef DLDAPI_AIX_LOAD
+#define DLDAPI_DEFINED
+#include <sys/types.h>
+#include <sys/ldr.h>
+#include <sys/stat.h>
+#include <nlist.h>
/*
- * Following id sting is a copyright mark. Removing(i.e. use the
+ * Following id sting is a copyright mark. Removing(i.e. use the
* source code in this .c file without include it or make it not
- * appear in the final object file of AIX platform) or modifing
- * it without permission from original author(kejin@empress.com)
+ * appear in the final object file of AIX platform) or modifing
+ * it without permission from original author(kejin@empress.com)
* are copyright violation.
*/
-static char sccsid[]
- = "@(#)dynamic load interface, Copyright(c) 1995 by Ke Jin";
+static char sccsid[]
+= "@(#)dynamic load interface, Copyright(c) 1995 by Ke Jin";
-# ifndef HTAB_SIZE
-# define HTAB_SIZE 256
-# endif
+#ifndef HTAB_SIZE
+#define HTAB_SIZE 256
+#endif
-# define FACTOR 0.618039887 /* i.e. (sqrt(5) - 1)/2 */
+#define FACTOR 0.618039887 /* i.e. (sqrt(5) - 1)/2 */
-# ifndef ENTRY_SYM
-# define ENTRY_SYM ".__start" /* default entry point for aix */
-# endif
+#ifndef ENTRY_SYM
+#define ENTRY_SYM ".__start" /* default entry point for aix */
+#endif
typedef struct slot_s
-{
- char* sym;
- long fdesc[3]; /* 12 bytes function descriptor */
- struct slot_s* next;
-} slot_t;
+ {
+ char *sym;
+ long fdesc[3]; /* 12 bytes function descriptor */
+ struct slot_s *next;
+ }
+slot_t;
/* Note: on AIX, a function pointer actually points to a
* function descriptor, a 12 bytes data. The first 4 bytes
- * is the virtual address of the function. The next 4 bytes
+ * is the virtual address of the function. The next 4 bytes
* is the virtual address of TOC (Table of Contents) of the
- * object module the function belong to. The last 4 bytes
- * are always 0 for C and Fortran functions. Every object
+ * object module the function belong to. The last 4 bytes
+ * are always 0 for C and Fortran functions. Every object
* module has an entry point (which can be specified at link
* time by -e ld option). iODBC driver manager requires ODBC
* driver shared library always use the default entry point
* (so you shouldn't use -e ld option when creating a driver
- * share library). load() returns the function descriptor of
+ * share library). load() returns the function descriptor of
* a module's entry point. From which we can calculate function
* descriptors of other functions in the same module by using
- * the fact that the load() doesn't change the relative
- * offset of functions to their module entry point(i.e the
- * offset in memory loaded by load() will be as same as in
- * the module library file).
+ * the fact that the load() doesn't change the relative
+ * offset of functions to their module entry point(i.e the
+ * offset in memory loaded by load() will be as same as in
+ * the module library file).
*/
-typedef slot_t* hent_t;
-typedef struct nlist nlist_t;
-typedef struct stat stat_t;
+typedef slot_t *hent_t;
+typedef struct nlist nlist_t;
+typedef struct stat stat_t;
typedef struct obj
-{
- int dev; /* device id */
- int ino; /* inode number */
- char* path; /* file name */
- int (*pentry)(); /* entry point of this share library */
- int refn; /* number of reference */
- hent_t htab[HTAB_SIZE];
- struct obj*
- next;
-} obj_t;
-
-static char* errmsg = 0;
-
-static void init_htab(hent_t* ht)
+ {
+ int dev; /* device id */
+ int ino; /* inode number */
+ char *path; /* file name */
+ int (*pentry) (); /* entry point of this share library */
+ int refn; /* number of reference */
+ hent_t htab[HTAB_SIZE];
+ struct obj * next;
+ }
+obj_t;
+
+static char *errmsg = 0;
+
+static void
+init_htab (hent_t * ht)
/* initate a hashing table */
{
- int i;
+ int i;
- for(i=0; i<HTAB_SIZE; i++)
- ht[i] = (slot_t*)0;
+ for (i = 0; i < HTAB_SIZE; i++)
+ ht[i] = (slot_t *) 0;
- return;
+ return;
}
-static void clean_htab(hent_t* ht)
+
+static void
+clean_htab (hent_t * ht)
/* free all slots */
{
- int i;
- slot_t* ent;
- slot_t* tent;
+ int i;
+ slot_t *ent;
+ slot_t *tent;
- for(i = 0; i< HTAB_SIZE; i++)
- {
- for( ent = ht[i]; ent; )
- {
- tent = ent->next;
+ for (i = 0; i < HTAB_SIZE; i++)
+ {
+ for (ent = ht[i]; ent;)
+ {
+ tent = ent->next;
- free(ent->sym);
- free(ent);
+ free (ent->sym);
+ free (ent);
- ent = tent;
- }
+ ent = tent;
+ }
- ht[i] = 0;
- }
+ ht[i] = 0;
+ }
- return;
+ return;
}
-static int hash(char* sym )
+
+static int
+hash (char *sym)
{
- int a, key;
- double f;
+ int a, key;
+ double f;
- if( !sym || !*sym )
- return 0;
+ if (!sym || !*sym)
+ return 0;
- for(key=*sym;*sym;sym++)
- {
- key += *sym;
- a = key;
+ for (key = *sym; *sym; sym++)
+ {
+ key += *sym;
+ a = key;
- key = (int)( (a<<8) + (key>>8) );
- key = (key>0)? key:-key;
- }
+ key = (int) ((a << 8) + (key >> 8));
+ key = (key > 0) ? key : -key;
+ }
- f = key*FACTOR;
- a = (int)f;
+ f = key * FACTOR;
+ a = (int) f;
- return (int)((HTAB_SIZE - 1)*( f - a ));
+ return (int) ((HTAB_SIZE - 1) * (f - a));
}
-static hent_t search(hent_t* htab, char* sym)
+
+static hent_t
+search (hent_t * htab, char *sym)
/* search hashing table to find a matched slot */
{
- int key;
- slot_t* ent;
+ int key;
+ slot_t *ent;
- key = hash(sym);
+ key = hash (sym);
- for(ent = htab[key]; ent; ent = ent->next )
- {
- if(!strcmp(ent->sym, sym))
- return ent;
- }
+ for (ent = htab[key]; ent; ent = ent->next)
+ {
+ if (!strcmp (ent->sym, sym))
+ return ent;
+ }
- return 0; /* no match */
+ return 0; /* no match */
}
-static void insert(hent_t* htab, slot_t* ent)
+
+static void
+insert (hent_t * htab, slot_t * ent)
/* insert a new slot to hashing table */
{
- int key;
+ int key;
- key = hash(ent->sym);
+ key = hash (ent->sym);
- ent->next = htab[key];
- htab[key] = ent;
+ ent->next = htab[key];
+ htab[key] = ent;
- return;
+ return;
}
-static slot_t* slot_alloc(char* sym)
+
+static slot_t *
+slot_alloc (char *sym)
/* allocate a new slot with symbol */
{
- slot_t* ent;
+ slot_t *ent;
- ent = (slot_t*)malloc(sizeof(slot_t));
+ ent = (slot_t *) malloc (sizeof (slot_t));
- ent->sym = (char*)malloc(strlen(sym)+1);
+ ent->sym = (char *) malloc (strlen (sym) + 1);
- if( ! ent->sym )
- {
- free(ent);
- return 0;
- }
+ if (!ent->sym)
+ {
+ free (ent);
+ return 0;
+ }
- strcpy( ent->sym, sym );
+ strcpy (ent->sym, sym);
- return ent;
+ return ent;
}
-static obj_t* obj_list = 0;
-
-void* dlopen(char* file, int mode )
-{
- stat_t st;
- obj_t* pobj;
- char buf[1024];
-
- if( ! file || ! *file )
- {
- errno = EINVAL;
- return 0;
- }
-
- errno = 0;
- errmsg = 0;
-
-#if 0
- if( file[0] != '/' && file[0] != '.' )
- {
- for(;;)
- {
- sprintf(buf, "/lib/%s", file);
-
- if( stat( buf, &st ) )
- {
- file = buf;
- break;
- }
-
- sprintf(buf, "/usr/lib/%s", file);
-
- if( stat( buf, &st ) )
- {
- file = buf;
- break;
- }
-
- if( stat( file, &st ) )
- break;
-
- return 0;
- }
- }
- else
-#endif
- if( stat( file, &st ) )
- return 0;
-
- for( pobj = obj_list; pobj; pobj = pobj->next )
- /* find a match object */
- {
- if( pobj->ino == st.st_ino
- && pobj->dev == st.st_dev )
- {
- /* found a match. increase its
- * reference count and return
- * its address */
- pobj->refn ++;
- return pobj;
- }
- }
-
- pobj = (obj_t*)malloc( sizeof(obj_t) );
-
- if( ! pobj )
- return 0;
-
- pobj->path = (char*)malloc( strlen(file) + 1);
-
- if( ! pobj->path )
- {
- free( pobj );
- return 0;
- }
-
- strcpy( pobj->path, file );
-
- pobj->dev = st.st_dev;
- pobj->ino = st.st_ino;
- pobj->refn = 1;
-
- pobj->pentry = (int(*)())load(file, 0, 0);
- if( ! pobj->pentry )
- {
- free( pobj->path );
- free( pobj );
- return 0;
- }
+static obj_t *obj_list = 0;
- init_htab(pobj->htab);
-
- pobj->next = obj_list;
- obj_list = pobj;
-
- return pobj;
+void *
+dlopen (char *file, int mode)
+{
+ stat_t st;
+ obj_t *pobj;
+ char buf[1024];
+
+ if (!file || !*file)
+ {
+ errno = EINVAL;
+ return 0;
+ }
+
+ errno = 0;
+ errmsg = 0;
+
+ if (stat (file, &st))
+ return 0;
+
+ for (pobj = obj_list; pobj; pobj = pobj->next)
+ /* find a match object */
+ {
+ if (pobj->ino == st.st_ino
+ && pobj->dev == st.st_dev)
+ {
+ /* found a match. increase its
+ * reference count and return
+ * its address */
+ pobj->refn++;
+ return pobj;
+ }
+ }
+
+ pobj = (obj_t *) malloc (sizeof (obj_t));
+
+ if (!pobj)
+ return 0;
+
+ pobj->path = (char *) malloc (strlen (file) + 1);
+
+ if (!pobj->path)
+ {
+ free (pobj);
+ return 0;
+ }
+
+ strcpy (pobj->path, file);
+
+ pobj->dev = st.st_dev;
+ pobj->ino = st.st_ino;
+ pobj->refn = 1;
+
+ pobj->pentry = (int (*)()) load (file, 0, 0);
+
+ if (!pobj->pentry)
+ {
+ free (pobj->path);
+ free (pobj);
+ return 0;
+ }
+
+ init_htab (pobj->htab);
+
+ pobj->next = obj_list;
+ obj_list = pobj;
+
+ return pobj;
}
-int dlclose(void* hobj)
+
+int
+dlclose (void *hobj)
{
- obj_t* pobj = (obj_t*)hobj;
- obj_t* tpobj;
- int match = 0;
-
- if( ! hobj )
- {
- errno = EINVAL;
- return -1;
- }
-
- errno = 0;
- errmsg = 0;
-
- if( pobj == obj_list )
- {
- pobj->refn --;
-
- if( pobj->refn )
- return 0;
-
- match = 1;
- obj_list = pobj->next;
- }
-
- for( tpobj = obj_list; !match && tpobj; tpobj = tpobj->next )
- {
- if( tpobj->next == pobj )
- {
- pobj->refn --;
-
- if( pobj->refn )
- return 0;
-
- match = 1;
- tpobj->next = pobj->next;
- }
- }
-
- if(match)
- {
- unload((void*)(pobj->pentry));
- clean_htab(pobj->htab);
- free(pobj->path);
- free(pobj);
- }
-
- return 0;
+ obj_t *pobj = (obj_t *) hobj;
+ obj_t *tpobj;
+ int match = 0;
+
+ if (!hobj)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ errno = 0;
+ errmsg = 0;
+
+ if (pobj == obj_list)
+ {
+ pobj->refn--;
+
+ if (pobj->refn)
+ return 0;
+
+ match = 1;
+ obj_list = pobj->next;
+ }
+
+ for (tpobj = obj_list; !match && tpobj; tpobj = tpobj->next)
+ {
+ if (tpobj->next == pobj)
+ {
+ pobj->refn--;
+
+ if (pobj->refn)
+ return 0;
+
+ match = 1;
+ tpobj->next = pobj->next;
+ }
+ }
+
+ if (match)
+ {
+ unload ((void *) (pobj->pentry));
+ clean_htab (pobj->htab);
+ free (pobj->path);
+ free (pobj);
+ }
+
+ return 0;
}
-char* dlerror()
+
+char *
+dlerror ()
{
- extern char* sys_errlist[];
+ extern char *sys_errlist[];
- if( ! errmsg || ! errmsg[0] )
- {
- if( errno >= 0 )
- return sys_errlist[errno];
+ if (!errmsg || !errmsg[0])
+ {
+ if (errno >= 0)
+ return sys_errlist[errno];
- return "";
- }
+ return "";
+ }
- return errmsg;
+ return errmsg;
}
-void* dlsym(void* hdl, char* sym)
+
+void *
+dlsym (void *hdl, char *sym)
{
- nlist_t nl[3];
- obj_t* pobj = (obj_t*)hdl;
- slot_t* ent;
- int (*fp)();
- long lbuf[3];
-
- if( !hdl || !(pobj->htab) || !sym || ! *sym )
- {
- errno = EINVAL;
- return 0;
- }
-
- errno = 0;
- errmsg = 0;
-
- ent = search( pobj->htab, sym );
-
- if( ent )
- return ent->fdesc;
-
-#define n_name _n._n_name
-
- nl[0].n_name = ENTRY_SYM;
- nl[1].n_name = sym;
- nl[2].n_name = 0;
-
- /* There is a potential problem here. If application
- * did not pass a full path name, and changed the
- * working directory after the load(), then nlist()
- * will be unable to open the original shared library
- * file to resolve the symbols. there are 3 ways to working
- * round this: 1. convert to full pathname in driver
- * manager. 2. applications always pass driver's full
- * path name. 3. if driver itself don't support
- * SQLGetFunctions(), call it with SQL_ALL_FUNCTIONS
- * as flag immidately after SQLConnect(), SQLDriverConnect()
- * and SQLBrowseConnect() to force the driver manager
- * resolving all will be used symbols.
- */
- if( nlist( pobj->path, nl) == -1 )
- return 0;
-
- if( ! nl[0].n_type && ! nl[0].n_value )
- {
- errmsg = "can't locate module entry symbol";
- return 0;
- }
-
- /* Note: On AIX 3.x if the object library is not
- * built with -g compiling option, .n_type field
- * is always 0. While on 4.x it will be 32.
- * On AIX 4.x, if the symbol is a entry point,
- * n_value will be 0. However, one thing is for sure
- * that if a symbol is not existance in the file,
- * both .n_type and .n_value would be 0.
- */
-
- if( ! nl[1].n_type && ! nl[1].n_value )
- {
- errmsg = "symbol not existance in this module";
- return 0;
- }
-
- ent = slot_alloc(sym);
-
- if( ! ent )
- return 0;
-
- /* catch it with a slot in the hashing table */
- insert(pobj->htab, ent);
-
- memcpy(ent->fdesc, pobj->pentry, sizeof(ent->fdesc));
-
- /* now ent->fdesc[0] is the virtual address of entry point
- * and ent->fdesc[1] is the TOC of the module
- */
-
- /* let's calculate the virtual address of the symbol
- * by adding a relative offset getting from the module
- * file symbol table, i.e
- *
- * functin virtual address = entry point virtual address +
- * + ( function offset in file - entry point offset in file )
- */
-
- (ent->fdesc)[0] = (ent->fdesc)[0] +
- ( nl[1].n_value - nl[0].n_value );
-
- /* return the function descriptor */
- return ent->fdesc;
+ nlist_t nl[3];
+ obj_t *pobj = (obj_t *) hdl;
+ slot_t *ent;
+ int (*fp) ();
+ long lbuf[3];
+
+ if (!hdl || !(pobj->htab) || !sym || !*sym)
+ {
+ errno = EINVAL;
+ return 0;
+ }
+
+ errno = 0;
+ errmsg = 0;
+
+ ent = search (pobj->htab, sym);
+
+ if (ent)
+ return ent->fdesc;
+
+#define n_name _n._n_name
+
+ nl[0].n_name = ENTRY_SYM;
+ nl[1].n_name = sym;
+ nl[2].n_name = 0;
+
+ /* There is a potential problem here. If application
+ * did not pass a full path name, and changed the
+ * working directory after the load(), then nlist()
+ * will be unable to open the original shared library
+ * file to resolve the symbols. there are 3 ways to working
+ * round this: 1. convert to full pathname in driver
+ * manager. 2. applications always pass driver's full
+ * path name. 3. if driver itself don't support
+ * SQLGetFunctions(), call it with SQL_ALL_FUNCTIONS
+ * as flag immidately after SQLConnect(), SQLDriverConnect()
+ * and SQLBrowseConnect() to force the driver manager
+ * resolving all will be used symbols.
+ */
+ if (nlist (pobj->path, nl) == -1)
+ return 0;
+
+ if (!nl[0].n_type && !nl[0].n_value)
+ {
+ errmsg = "can't locate module entry symbol";
+ return 0;
+ }
+
+ /* Note: On AIX 3.x if the object library is not
+ * built with -g compiling option, .n_type field
+ * is always 0. While on 4.x it will be 32.
+ * On AIX 4.x, if the symbol is a entry point,
+ * n_value will be 0. However, one thing is for sure
+ * that if a symbol is not existance in the file,
+ * both .n_type and .n_value would be 0.
+ */
+
+ if (!nl[1].n_type && !nl[1].n_value)
+ {
+ errmsg = "symbol not existance in this module";
+ return 0;
+ }
+
+ ent = slot_alloc (sym);
+
+ if (!ent)
+ return 0;
+
+ /* catch it with a slot in the hashing table */
+ insert (pobj->htab, ent);
+
+ memcpy (ent->fdesc, pobj->pentry, sizeof (ent->fdesc));
+
+ /* now ent->fdesc[0] is the virtual address of entry point
+ * and ent->fdesc[1] is the TOC of the module
+ */
+
+ /* let's calculate the virtual address of the symbol
+ * by adding a relative offset getting from the module
+ * file symbol table, i.e
+ *
+ * functin virtual address = entry point virtual address +
+ * + ( function offset in file - entry point offset in file )
+ */
+
+ (ent->fdesc)[0] = (ent->fdesc)[0] +
+ (nl[1].n_value - nl[0].n_value);
+
+ /* return the function descriptor */
+ return ent->fdesc;
}
-
-#endif /* end of IBM AIX Section */
+#endif /* end of IBM AIX Section */
-/*********************************
+/*********************************
*
- * Windows 3.x, 95, NT
+ * Windows 3.x, 95, NT
*
*********************************/
-#ifdef DLDAPI_WINDOWS
-# define DLDAPI_DEFINED
-# include <windows.h>
-void FAR* dlopen(char FAR* dll, int mode)
-{
- HINSTANCE hint;
+#ifdef DLDAPI_WINDOWS
+#define DLDAPI_DEFINED
+#include <windows.h>
- if( dll == NULL )
- {
- return GetWindowWord( NULL, GWW_HINSTANCE );
- }
+void FAR *
+dlopen (char FAR * dll, int mode)
+{
+ HINSTANCE hint;
- hint = LoadLibrary(dll);
+ if (dll == NULL)
+ {
+ return GetWindowWord (NULL, GWW_HINSTANCE);
+ }
- if( hint < HINSTANCE_ERROR )
- {
- return NULL;
- }
+ hint = LoadLibrary (dll);
- return (void FAR*)hint;
-}
+ if (hint < HINSTANCE_ERROR)
+ {
+ return NULL;
+ }
-void FAR* dlsym( void FAR* hdll, char FAR* sym )
-{
- return (void FAR*)GetProcAddress(hdll, sym);
+ return (void FAR *) hint;
}
-char FAR* dlerror()
-{
- return 0L; /* unimplemented yet */
-}
-int dlclose(void FAR* hdll)
+void FAR *
+dlsym (void FAR * hdll, char FAR * sym)
{
- FreeLibrary((HINSTANCE)hdll);
+ return (void FAR *) GetProcAddress (hdll, sym);
}
-#endif /* end of Windows family */
-/*********************************
- *
- * OS/2 2.x, 3.x
- *
- *********************************/
-#ifdef DLDAPI_OS2
-# define DLDAPI_DEFINED
-/*
- * DosLoadModule(), DosQueryProcAddress(), DosFreeModule(), ...
- */
-
-void FAR* dlopen(char FAR* dll, int mode)
+char FAR *
+dlerror ()
{
- APIRET rc = NO_ERROR; /* API return code */
- UCHAR LoadError[256] = ""; /* Area for Load fail. info */
- HMODULE ModuleHandle = NULLHANDLE; /* Module handle */
-
- if( dll == NULL || '\0' == *dll )
- {
- return NULL;
- }
-
- rc = NO_ERROR;
- rc = DosLoadModule( LoadError, /* Failure info buffer */
- sizeof(LoadError), /* Size of buffer */
- dll, /* Module to load */
- &ModuleHandle ); /* Module handle returned */
- if (rc != NO_ERROR)
- {
-#ifdef DEBUG
- fprintf( stderr,
- "[dlf.c] dlopen: DosLoadModule(0x%08lX, %d, \"%s\", 0x%08lX) = %d\n",
- &LoadError, sizeof(LoadError), dll, &ModuleHandle, rc
- );
- fprintf( stderr,
- " ---> missing module '%s'\n",
- LoadError );
-#endif
- return NULL;
- }
-
- return (void FAR*) ModuleHandle;
-
+ return 0L; /* unimplemented yet */
}
-void FAR* dlsym( void FAR* hdll, char FAR* sym )
-{
- APIRET rc = NO_ERROR; /* API return code */
- PFN ModuleAddress = NULL; /* Module address */
-
- rc = DosQueryProcAddr( (HMODULE) hdll, 0, sym, &ModuleAddress );
- return (void FAR*) (NO_ERROR == rc) ? ModuleAddress
- : NULL;
-}
-
-char FAR* dlerror()
+int
+dlclose (void FAR * hdll)
{
- return 0L; /* unimplemented yet */
+ FreeLibrary ((HINSTANCE) hdll);
}
+#endif /* end of Windows family */
-int dlclose(void FAR* hdll)
-{
- return DosFreeModule( (HMODULE) hdll );
-}
-
-#endif
/***********************************
*
- * other platforms
+ * other platforms
*
***********************************/
-#ifdef DLDAPI_MAC
-# define DLDAPI_DEFINED
+
+#ifdef DLDAPI_OS2
+#define DLDAPI_DEFINED
+/*
+ * DosLoadModule(), DosQueryProcAddress(), DosFreeModule(), ...
+ */
+#endif
+
+#ifdef DLDAPI_MAC
+#define DLDAPI_DEFINED
#endif
#ifdef DLDAPI_NEXT
-# define DLDAPI_DEFINED
+#define DLDAPI_DEFINED
#endif
#ifndef DLDAPI_DEFINED
-# error "dynamic load editor undefined"
+#error "dynamic load editor undefined"
#endif
-#ifndef _DLF_H
-# define _DLF_H
+/*
+ * dlf.h
+ *
+ * $Id$
+ *
+ * Dynamic Library Loader (mapping to SVR4)
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _DLF_H
+#define _DLF_H
+#include <config.h>
+#if defined(HAVE_LIBDL)
#define DLDAPI_SVR4_DLFCN
+#elif defined(HAVE_SHL_LOAD)
+#define DLDAPI_HP_SHL
+#endif
-# ifdef DLDAPI_SVR4_DLFCN
-# include <dlfcn.h>
-# else
- extern void FAR* dlopen(char FAR* path, int mode);
- extern void FAR* dlsym(void FAR* hdll, char FAR* sym);
- extern char FAR* dlerror();
- extern int dlclose(void FAR* hdll);
-# endif
-
-# ifndef RTLD_LAZY
-# define RTLD_LAZY 1
-# endif
+#ifdef DLDAPI_SVR4_DLFCN
+#include <dlfcn.h>
+#elif DLDAPI_AIX_LOAD
+#include <dlfcn.h>
+#else
+extern void FAR *dlopen (char FAR * path, int mode);
+extern void FAR *dlsym (void FAR * hdll, char FAR * sym);
+extern char FAR *dlerror ();
+extern int dlclose (void FAR * hdll);
+#endif
-# define DLL_OPEN(dll) (void*)dlopen((char*)(path), RTLD_LAZY)
-# define DLL_PROC(hdll, sym) (void*)dlsym((void*)(hdll), (char*)sym)
-# define DLL_ERROR() (char*)dlerror()
-# define DLL_CLOSE(hdll) dlclose((void*)(hdll))
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#define DLL_OPEN(dll) (void*)dlopen((char*)(path), RTLD_LAZY)
+#define DLL_PROC(hdll, sym) (void*)dlsym((void*)(hdll), (char*)sym)
+#define DLL_ERROR() (char*)dlerror()
+#define DLL_CLOSE(hdll) dlclose((void*)(hdll))
#endif
-/** Load driver and resolve driver's function entry point
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-
-#include <../iodbc/itrace.h>
-
-#include "../iodbc/henv.ci"
-
-HPROC _iodbcdm_getproc( HDBC hdbc, int idx )
+/*
+ * dlproc.c
+ *
+ * $Id$
+ *
+ * Load driver and resolve driver's function entry point
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+
+#include <itrace.h>
+
+#include "henv.ci"
+
+HPROC
+_iodbcdm_getproc (HDBC hdbc, int idx)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- ENV_t FAR* penv;
- HDLL hdll;
- static HPROC FAR* phproc;
-
- if( idx <= 0 || idx > SQL_EXT_API_LAST )
- /* first entry never used */
- {
- return SQL_NULL_HPROC;
- }
-
- penv = (ENV_t FAR*)(pdbc->henv);
-
- if( penv == NULL )
- {
- return SQL_NULL_HPROC;
- }
-
- phproc = penv->dllproc_tab + idx;
-
- if( *phproc == SQL_NULL_HPROC )
- {
- int i, en_idx;
-
- for( i=0 ; ; i++ )
- {
- en_idx = odbcapi_symtab[i].en_idx;
-
- if( en_idx == en_NullProc )
- {
- break;
- }
-
- if( en_idx == idx )
- {
- *phproc = _iodbcdm_dllproc( penv->hdll,
- odbcapi_symtab[i].symbol );
-
- break;
- }
- }
- }
-
- return *phproc;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ ENV_t FAR *penv;
+ HDLL hdll;
+ HPROC FAR *phproc;
+
+ if (idx <= 0 || idx > SQL_EXT_API_LAST)
+ /* first entry naver used */
+ {
+ return SQL_NULL_HPROC;
+ }
+
+ penv = (ENV_t FAR *) (pdbc->henv);
+
+ if (penv == NULL)
+ {
+ return SQL_NULL_HPROC;
+ }
+
+ phproc = penv->dllproc_tab + idx;
+
+ if (*phproc == SQL_NULL_HPROC)
+ {
+ int i, en_idx;
+
+ for (i = 0;; i++)
+ {
+ en_idx = odbcapi_symtab[i].en_idx;
+
+ if (en_idx == en_NullProc)
+ {
+ break;
+ }
+
+ if (en_idx == idx)
+ {
+ *phproc = _iodbcdm_dllproc (penv->hdll,
+ odbcapi_symtab[i].symbol);
+
+ break;
+ }
+ }
+ }
+
+ return *phproc;
}
-HDLL _iodbcdm_dllopen( char FAR* path )
+
+HDLL
+_iodbcdm_dllopen (char FAR * path)
{
- return (HDLL)DLL_OPEN( path );
+ return (HDLL) DLL_OPEN (path);
}
-HPROC _iodbcdm_dllproc( HDLL hdll, char FAR* sym )
+
+HPROC
+_iodbcdm_dllproc (HDLL hdll, char FAR * sym)
{
- return (HPROC)DLL_PROC( hdll, sym );
+ return (HPROC) DLL_PROC (hdll, sym);
}
-int _iodbcdm_dllclose( HDLL hdll )
+
+int
+_iodbcdm_dllclose (HDLL hdll)
{
- DLL_CLOSE( hdll );
+ DLL_CLOSE (hdll);
- return 0;
+ return 0;
}
-char* _iodbcdm_dllerror( )
+
+char *
+_iodbcdm_dllerror ()
{
- return DLL_ERROR();
+ return DLL_ERROR ();
}
+
-#ifndef _DLPROC_H
-# define _DLPROC_H
-
-# include <../iodbc/dlf.h>
-
-# ifdef OS2
- typedef RETCODE (FAR* _System HPROC)();
-# else
- typedef RETCODE (FAR* HPROC)();
-# endif
-
-# ifdef DLDAPI_SVR4_DLFCN
-# include <dlfcn.h>
- typedef void* HDLL;
-# endif
-
-# ifdef DLDAPI_HP_SHL
-# include <dl.h>
- typedef shl_t HDLL;
-# endif
-
-# ifdef DLDAPI_AIX_LOAD
- typedef void* HDLL;
-# endif
+/*
+ * dlproc.h
+ *
+ * $Id$
+ *
+ * Load driver and resolve driver's function entry point
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _DLPROC_H
+#define _DLPROC_H
+
+#include <dlf.h>
+
+typedef RETCODE (FAR * HPROC) ();
+
+#ifdef DLDAPI_SVR4_DLFCN
+#include <dlfcn.h>
+typedef void *HDLL;
+#endif
-# ifdef DLDAPI_OS2
- typedef HMODULE HDLL;
-# endif
+#ifdef DLDAPI_HP_SHL
+#include <dl.h>
+typedef shl_t HDLL;
+#endif
-extern HPROC _iodbcdm_getproc();
-extern HDLL _iodbcdm_dllopen(char FAR* dll);
-extern HPROC _iodbcdm_dllproc(HDLL hdll, char FAR* sym);
-extern char FAR* _iodbcdm_dllerror();
-extern int _iodbcdm_dllclose(HDLL hdll);
+#ifdef DLDAPI_AIX_LOAD
+typedef void *HDLL;
+#endif
-#define SQL_NULL_HDLL ((HDLL)NULL)
-#define SQL_NULL_HPROC ((HPROC)NULL)
+extern HPROC _iodbcdm_getproc ();
+extern HDLL _iodbcdm_dllopen (char FAR * dll);
+extern HPROC _iodbcdm_dllproc (HDLL hdll, char FAR * sym);
+extern char FAR *_iodbcdm_dllerror ();
+extern int _iodbcdm_dllclose (HDLL hdll);
+#define SQL_NULL_HDLL ((HDLL)NULL)
+#define SQL_NULL_HPROC ((HPROC)NULL)
#endif
-/** Invoke a query
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
-
-#include <../iodbc/itrace.h>
-
-static void do_cursoropen(STMT_t FAR* pstmt)
+/*
+ * execute.c
+ *
+ * $Id$
+ *
+ * Invoke a query
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
+
+static void
+do_cursoropen (STMT_t FAR * pstmt)
{
- RETCODE retcode;
- SWORD ncol;
-
- pstmt->state = en_stmt_executed;
-
- retcode = SQLNumResultCols( pstmt, &ncol );
-
- if( retcode == SQL_SUCCESS
- || retcode == SQL_SUCCESS_WITH_INFO )
- {
- if( ncol )
- {
- pstmt->state = en_stmt_cursoropen;
- pstmt->cursor_state = en_stmt_cursor_opened;
- }
- else
- {
- pstmt->state = en_stmt_executed;
- pstmt->cursor_state = en_stmt_cursor_no;
- }
- }
+ RETCODE retcode;
+ SWORD ncol;
+
+ pstmt->state = en_stmt_executed;
+
+ retcode = SQLNumResultCols (pstmt, &ncol);
+
+ if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
+ {
+ if (ncol)
+ {
+ pstmt->state = en_stmt_cursoropen;
+ pstmt->cursor_state = en_stmt_cursor_opened;
+ }
+ else
+ {
+ pstmt->state = en_stmt_executed;
+ pstmt->cursor_state = en_stmt_cursor_no;
+ }
+ }
}
-RETCODE SQL_API SQLExecute ( HSTMT hstmt )
+
+RETCODE SQL_API
+SQLExecute (HSTMT hstmt)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode;
-
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- sqlstat = en_S1010;
- break;
-
- case en_stmt_executed:
- if( ! pstmt->prep_state )
- {
- sqlstat = en_S1010;
- }
- break;
-
- case en_stmt_cursoropen:
- if( ! pstmt->prep_state )
- {
- sqlstat = en_S1010;
- }
- break;
-
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( ! pstmt->prep_state )
- {
- sqlstat = en_S1010;
- }
- else
- {
- sqlstat = en_24000;
- }
- break;
-
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- sqlstat = en_S1010;
- break;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_Execute )
- {
- sqlstat = en_S1010;
- }
-
- if( sqlstat == en_00000 )
- {
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Execute );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- }
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc,
- en_Execute, ( pstmt->dhstmt ) )
-
-#if 0
- retcode = hproc ( pstmt->dhstmt );
-#endif
-
- /* stmt state transition */
- if( pstmt->asyn_on == en_Execute )
- {
- switch ( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NEED_DATA:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- switch( pstmt->state )
- {
- case en_stmt_prepared:
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- do_cursoropen(hstmt);
- break;
-
- case SQL_NEED_DATA:
- pstmt->state = en_stmt_needdata;
- pstmt->need_on = en_Execute;
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_Execute;
- break;
-
- default:
- break;
- }
- break;
-
- case en_stmt_executed:
- switch( retcode )
- {
- case SQL_ERROR:
- pstmt->state = en_stmt_allocated;
- pstmt->cursor_state = en_stmt_cursor_no;
- pstmt->prep_state = 0;
- break;
-
- case SQL_NEED_DATA:
- pstmt->state = en_stmt_needdata;
- pstmt->need_on = en_Execute;
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_Execute;
- break;
-
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ sqlstat = en_S1010;
+ break;
+
+ case en_stmt_executed:
+ if (!pstmt->prep_state)
+ {
+ sqlstat = en_S1010;
+ }
+ break;
+
+ case en_stmt_cursoropen:
+ if (!pstmt->prep_state)
+ {
+ sqlstat = en_S1010;
+ }
+ break;
+
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (!pstmt->prep_state)
+ {
+ sqlstat = en_S1010;
+ }
+ else
+ {
+ sqlstat = en_24000;
+ }
+ break;
+
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ sqlstat = en_S1010;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_Execute)
+ {
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat == en_00000)
+ {
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Execute);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Execute,
+ (pstmt->dhstmt))
+
+ /* stmt state transition */
+ if (pstmt->asyn_on == en_Execute)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NEED_DATA:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_prepared:
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ do_cursoropen (hstmt);
+ break;
+
+ case SQL_NEED_DATA:
+ pstmt->state = en_stmt_needdata;
+ pstmt->need_on = en_Execute;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_Execute;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case en_stmt_executed:
+ switch (retcode)
+ {
+ case SQL_ERROR:
+ pstmt->state = en_stmt_allocated;
+ pstmt->cursor_state = en_stmt_cursor_no;
+ pstmt->prep_state = 0;
+ break;
+
+ case SQL_NEED_DATA:
+ pstmt->state = en_stmt_needdata;
+ pstmt->need_on = en_Execute;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_Execute;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLExecDirect (
- HSTMT hstmt,
- UCHAR FAR* szSqlStr,
- SDWORD cbSqlStr )
+
+RETCODE SQL_API
+SQLExecDirect (
+ HSTMT hstmt,
+ UCHAR FAR * szSqlStr,
+ SDWORD cbSqlStr)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc = SQL_NULL_HPROC;
-
- int sqlstat = en_00000;
- RETCODE retcode = SQL_SUCCESS;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check arguments */
- if( szSqlStr == NULL )
- {
- sqlstat = en_S1009;
- }
- else if( cbSqlStr < 0 && cbSqlStr != SQL_NTS )
- {
- sqlstat = en_S1090;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch ( pstmt->state )
- {
- case en_stmt_fetched:
- case en_stmt_xfetched:
- sqlstat = en_24000;
- break;
-
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- sqlstat = en_S1010;
- break;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_ExecDirect )
- {
- sqlstat = en_S1010;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_ExecDirect);
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ExecDirect, (
- pstmt->dhstmt, szSqlStr, cbSqlStr) )
-
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, szSqlStr, cbSqlStr );
-#endif
-
- /* stmt state transition */
- if( pstmt->asyn_on == en_ExecDirect )
- {
- switch ( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NEED_DATA:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- if( pstmt->state <= en_stmt_executed )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- do_cursoropen(hstmt);
- break;
-
- case SQL_NEED_DATA:
- pstmt->state = en_stmt_needdata;
- pstmt->need_on = en_ExecDirect;
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_ExecDirect;
- break;
-
- case SQL_ERROR:
- pstmt->state = en_stmt_allocated;
- pstmt->cursor_state = en_stmt_cursor_no;
- pstmt->prep_state = 0;
- break;
-
- default:
- break;
- }
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+
+ int sqlstat = en_00000;
+ RETCODE retcode = SQL_SUCCESS;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check arguments */
+ if (szSqlStr == NULL)
+ {
+ sqlstat = en_S1009;
+ }
+ else if (cbSqlStr < 0 && cbSqlStr != SQL_NTS)
+ {
+ sqlstat = en_S1090;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ sqlstat = en_24000;
+ break;
+
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ sqlstat = en_S1010;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_ExecDirect)
+ {
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ExecDirect);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ExecDirect,
+ (pstmt->dhstmt, szSqlStr, cbSqlStr))
+
+ /* stmt state transition */
+ if (pstmt->asyn_on == en_ExecDirect)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NEED_DATA:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ if (pstmt->state <= en_stmt_executed)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ do_cursoropen (hstmt);
+ break;
+
+ case SQL_NEED_DATA:
+ pstmt->state = en_stmt_needdata;
+ pstmt->need_on = en_ExecDirect;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_ExecDirect;
+ break;
+
+ case SQL_ERROR:
+ pstmt->state = en_stmt_allocated;
+ pstmt->cursor_state = en_stmt_cursor_no;
+ pstmt->prep_state = 0;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLPutData(
- HSTMT hstmt,
- PTR rgbValue,
- SDWORD cbValue )
+
+RETCODE SQL_API
+SQLPutData (
+ HSTMT hstmt,
+ PTR rgbValue,
+ SDWORD cbValue)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument value */
- if( rgbValue == NULL
- && ( cbValue != SQL_DEFAULT_PARAM
- && cbValue != SQL_NULL_DATA ) )
- {
- PUSHSQLERR ( pstmt->herr, en_S1009 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- if( pstmt->state <= en_stmt_xfetched )
- {
- PUSHSQLERR( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
- }
- else if( pstmt->asyn_on != en_PutData )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_PutData );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_PutData, (
- pstmt->dhstmt, rgbValue, cbValue ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt, rgbValue, cbValue );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_PutData )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- /* must in mustput or canput states */
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- pstmt->state = en_stmt_canput;
- break;
-
- case SQL_ERROR:
- switch( pstmt->need_on )
- {
- case en_ExecDirect:
- pstmt->state = en_stmt_allocated;
- pstmt->need_on = en_NullProc;
- break;
-
- case en_Execute:
- if( pstmt->prep_state )
- {
- pstmt->state = en_stmt_prepared;
- pstmt->need_on = en_NullProc;
- }
- break;
-
- case en_SetPos:
- /* Is this possible ???? */
- pstmt->state = en_stmt_xfetched;
- break;
-
- default:
- break;
- }
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_PutData;
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument value */
+ if (rgbValue == NULL &&
+ (cbValue != SQL_DEFAULT_PARAM && cbValue != SQL_NULL_DATA))
+ {
+ PUSHSQLERR (pstmt->herr, en_S1009);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ if (pstmt->state <= en_stmt_xfetched)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+ }
+ else if (pstmt->asyn_on != en_PutData)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_PutData);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_PutData,
+ (pstmt->dhstmt, rgbValue, cbValue))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_PutData)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ /* must in mustput or canput states */
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ pstmt->state = en_stmt_canput;
+ break;
+
+ case SQL_ERROR:
+ switch (pstmt->need_on)
+ {
+ case en_ExecDirect:
+ pstmt->state = en_stmt_allocated;
+ pstmt->need_on = en_NullProc;
+ break;
+
+ case en_Execute:
+ if (pstmt->prep_state)
+ {
+ pstmt->state = en_stmt_prepared;
+ pstmt->need_on = en_NullProc;
+ }
+ break;
+
+ case en_SetPos:
+ /* Is this possible ???? */
+ pstmt->state = en_stmt_xfetched;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_PutData;
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLParamData (
- HSTMT hstmt,
- PTR FAR* prgbValue )
+
+RETCODE SQL_API
+SQLParamData (
+ HSTMT hstmt,
+ PTR FAR * prgbValue)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- if( pstmt->state <= en_stmt_xfetched )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
- }
- else if( pstmt->asyn_on != en_ParamData )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_ParamData );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ParamData, (
- pstmt->dhstmt, prgbValue ) )
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, prgbValue );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_ParamData )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- if( pstmt->state < en_stmt_needdata )
- {
- return retcode;
- }
-
- switch( retcode )
- {
- case SQL_ERROR:
- switch( pstmt->need_on )
- {
- case en_ExecDirect:
- pstmt->state = en_stmt_allocated;
- break;
-
- case en_Execute:
- pstmt->state = en_stmt_prepared;
- break;
-
- case en_SetPos:
- pstmt->state = en_stmt_xfetched;
- pstmt->cursor_state
- = en_stmt_cursor_xfetched;
- break;
-
- default:
- break;
- }
- pstmt->need_on = en_NullProc;
- break;
-
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- switch( pstmt->state )
- {
- case en_stmt_needdata:
- pstmt->state = en_stmt_mustput;
- break;
-
- case en_stmt_canput:
- switch( pstmt->need_on )
- {
- case en_SetPos:
- pstmt->state
- = en_stmt_xfetched;
- pstmt->cursor_state
- = en_stmt_cursor_xfetched;
- break;
-
- case en_ExecDirect:
- case en_Execute:
- do_cursoropen(hstmt);
- break;
-
- default:
- break;
- }
- break;
-
- default:
- break;
- }
- pstmt->need_on = en_NullProc;
- break;
-
- case SQL_NEED_DATA:
- pstmt->state = en_stmt_mustput;
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ if (pstmt->state <= en_stmt_xfetched)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+ }
+ else if (pstmt->asyn_on != en_ParamData)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ParamData);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ParamData,
+ (pstmt->dhstmt, prgbValue))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_ParamData)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ if (pstmt->state < en_stmt_needdata)
+ {
+ return retcode;
+ }
+
+ switch (retcode)
+ {
+ case SQL_ERROR:
+ switch (pstmt->need_on)
+ {
+ case en_ExecDirect:
+ pstmt->state = en_stmt_allocated;
+ break;
+
+ case en_Execute:
+ pstmt->state = en_stmt_prepared;
+ break;
+
+ case en_SetPos:
+ pstmt->state = en_stmt_xfetched;
+ pstmt->cursor_state
+ = en_stmt_cursor_xfetched;
+ break;
+
+ default:
+ break;
+ }
+ pstmt->need_on = en_NullProc;
+ break;
+
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ switch (pstmt->state)
+ {
+ case en_stmt_needdata:
+ pstmt->state = en_stmt_mustput;
+ break;
+
+ case en_stmt_canput:
+ switch (pstmt->need_on)
+ {
+ case en_SetPos:
+ pstmt->state
+ = en_stmt_xfetched;
+ pstmt->cursor_state
+ = en_stmt_cursor_xfetched;
+ break;
+
+ case en_ExecDirect:
+ case en_Execute:
+ do_cursoropen (hstmt);
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ pstmt->need_on = en_NullProc;
+ break;
+
+ case SQL_NEED_DATA:
+ pstmt->state = en_stmt_mustput;
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLNumParams (
- HSTMT hstmt,
- SWORD FAR* pcpar )
+RETCODE SQL_API
+SQLNumParams (
+ HSTMT hstmt,
+ SWORD FAR * pcpar)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_NumParams )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc ( pstmt->hdbc, en_NumParams );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_NumParams, (
- pstmt->dhstmt, pcpar) )
-
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, pcpar );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_NumParams )
- {
- switch ( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- break;
-
- default:
- return retcode;
- }
- }
-
- if( retcode == SQL_STILL_EXECUTING )
- {
- pstmt->asyn_on = en_NumParams;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_NumParams)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_NumParams);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_NumParams,
+ (pstmt->dhstmt, pcpar))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_NumParams)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ break;
+
+ default:
+ return retcode;
+ }
+ }
+
+ if (retcode == SQL_STILL_EXECUTING)
+ {
+ pstmt->asyn_on = en_NumParams;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLDescribeParam (
- HSTMT hstmt,
- UWORD ipar,
- SWORD FAR* pfSqlType,
- UDWORD FAR* pcbColDef,
- SWORD FAR* pibScale,
- SWORD FAR* pfNullable )
+
+RETCODE SQL_API
+SQLDescribeParam (
+ HSTMT hstmt,
+ UWORD ipar,
+ SWORD FAR * pfSqlType,
+ UDWORD FAR * pcbColDef,
+ SWORD FAR * pibScale,
+ SWORD FAR * pfNullable)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
- if( ipar == 0 )
- {
- PUSHSQLERR ( pstmt->herr, en_S1093 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_DescribeParam )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc ( pstmt->hdbc, en_DescribeParam );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_DescribeParam, (
- pstmt->dhstmt,
- ipar,
- pfSqlType,
- pcbColDef,
- pibScale,
- pfNullable ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- ipar,
- pfSqlType,
- pcbColDef,
- pibScale,
- pfNullable );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_DescribeParam )
- {
- switch ( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- break;
-
- default:
- return retcode;
- }
- }
-
- if( retcode == SQL_STILL_EXECUTING )
- {
- pstmt->asyn_on = en_DescribeParam;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+ if (ipar == 0)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1093);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_DescribeParam)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_DescribeParam);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_DescribeParam,
+ (pstmt->dhstmt, ipar, pfSqlType, pcbColDef, pibScale, pfNullable))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_DescribeParam)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ break;
+
+ default:
+ return retcode;
+ }
+ }
+
+ if (retcode == SQL_STILL_EXECUTING)
+ {
+ pstmt->asyn_on = en_DescribeParam;
+ }
+
+ return retcode;
}
-/** Fetch query result
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <config.h>
-
-#include <isql.h>
-#include <isqlext.h>
+/*
+ * fetch.c
+ *
+ * $Id$
+ *
+ * Fetch query result
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
#include <dlproc.h>
-#include <herr.h>
-#include <henv.h>
-#include <hdbc.h>
-#include <hstmt.h>
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
-#include <itrace.h>
+#include <itrace.h>
-RETCODE SQL_API SQLFetch ( HSTMT hstmt )
+RETCODE SQL_API
+SQLFetch (HSTMT hstmt)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- case en_stmt_xfetched:
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_Fetch )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Fetch );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_Fetch, (pstmt->dhstmt) )
-
-#if 0
- retcode = hproc( pstmt->dhstmt );
-#endif
- /* state transition */
- if( pstmt->asyn_on == en_Fetch )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NO_DATA_FOUND:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- switch( pstmt->state )
- {
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- pstmt->state = en_stmt_fetched;
- pstmt->cursor_state = en_stmt_cursor_fetched;
- break;
-
- case SQL_NO_DATA_FOUND:
- if( pstmt->prep_state )
- {
- pstmt->state = en_stmt_prepared;
- }
- else
- {
-
- pstmt->state = en_stmt_allocated;
- }
- pstmt->cursor_state = en_stmt_cursor_no;
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_Fetch;
- break;
-
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ case en_stmt_xfetched:
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_Fetch)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Fetch);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Fetch,
+ (pstmt->dhstmt))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_Fetch)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NO_DATA_FOUND:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ pstmt->state = en_stmt_fetched;
+ pstmt->cursor_state = en_stmt_cursor_fetched;
+ break;
+
+ case SQL_NO_DATA_FOUND:
+ if (pstmt->prep_state)
+ {
+ pstmt->state = en_stmt_prepared;
+ }
+ else
+ {
+
+ pstmt->state = en_stmt_allocated;
+ }
+ pstmt->cursor_state = en_stmt_cursor_no;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_Fetch;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLExtendedFetch (
- HSTMT hstmt,
- UWORD fFetchType,
- SDWORD irow,
- UDWORD FAR* pcrow,
- UWORD FAR* rgfRowStatus )
+
+RETCODE SQL_API
+SQLExtendedFetch (
+ HSTMT hstmt,
+ UWORD fFetchType,
+ SDWORD irow,
+ UDWORD FAR * pcrow,
+ UWORD FAR * rgfRowStatus)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check fetch type */
- if( fFetchType < SQL_FETCH_NEXT
- || fFetchType > SQL_FETCH_BOOKMARK )
- {
- /* Unlike MS driver manager(i.e. DM),
- * we don't check driver's ODBC version
- * against SQL_FETCH_RESUME (only 1.0)
- * and SQL_FETCH_BOOKMARK (only 2.0).
- */
- PUSHSQLERR ( pstmt->herr, en_S1106 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- case en_stmt_fetched:
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_ExtendedFetch )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_ExtendedFetch );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ExtendedFetch, (
- pstmt->dhstmt,
- fFetchType,
- irow,
- pcrow,
- rgfRowStatus ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- fFetchType,
- irow,
- pcrow,
- rgfRowStatus );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_ExtendedFetch )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NO_DATA_FOUND:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- switch( pstmt->state )
- {
- case en_stmt_cursoropen:
- case en_stmt_xfetched:
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NO_DATA_FOUND:
- pstmt->state = en_stmt_xfetched;
- pstmt->cursor_state = en_stmt_cursor_xfetched;
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_ExtendedFetch;
- break;
-
- default:
- break;
- }
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check fetch type */
+ if (fFetchType < SQL_FETCH_NEXT || fFetchType > SQL_FETCH_BOOKMARK)
+ {
+ /* Unlike MS driver manager(i.e. DM),
+ * we don't check driver's ODBC version
+ * against SQL_FETCH_RESUME (only 1.0)
+ * and SQL_FETCH_BOOKMARK (only 2.0).
+ */
+ PUSHSQLERR (pstmt->herr, en_S1106);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ case en_stmt_fetched:
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_ExtendedFetch)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ExtendedFetch);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ExtendedFetch,
+ (pstmt->dhstmt, fFetchType, irow, pcrow, rgfRowStatus))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_ExtendedFetch)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NO_DATA_FOUND:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_cursoropen:
+ case en_stmt_xfetched:
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NO_DATA_FOUND:
+ pstmt->state = en_stmt_xfetched;
+ pstmt->cursor_state = en_stmt_cursor_xfetched;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_ExtendedFetch;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLGetData(
- HSTMT hstmt,
- UWORD icol,
- SWORD fCType,
- PTR rgbValue,
- SDWORD cbValueMax,
- SDWORD FAR* pcbValue )
+
+RETCODE SQL_API
+SQLGetData (
+ HSTMT hstmt,
+ UWORD icol,
+ SWORD fCType,
+ PTR rgbValue,
+ SDWORD cbValueMax,
+ SDWORD FAR * pcbValue)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
- if( rgbValue == NULL )
- {
- sqlstat = en_S1009;
- }
- else if( cbValueMax < 0 )
- {
- sqlstat = en_S1090;
- }
- else
- {
- switch(fCType)
- {
- case SQL_C_DEFAULT:
- case SQL_C_CHAR:
- case SQL_C_BINARY:
- case SQL_C_BIT:
- case SQL_C_TINYINT:
- case SQL_C_STINYINT:
- case SQL_C_UTINYINT:
- case SQL_C_SHORT:
- case SQL_C_SSHORT:
- case SQL_C_USHORT:
- case SQL_C_LONG:
- case SQL_C_SLONG:
- case SQL_C_ULONG:
- case SQL_C_FLOAT:
- case SQL_C_DOUBLE:
- case SQL_C_DATE:
- case SQL_C_TIME:
- case SQL_C_TIMESTAMP:
- break;
-
- default:
- sqlstat = en_S1003;
- break;
- }
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- sqlstat = en_S1010;
- break;
-
- case en_stmt_executed:
- case en_stmt_cursoropen:
- sqlstat = en_24000;
- break;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_GetData )
- {
- sqlstat = en_S1010;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_GetData );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_GetData, (
- pstmt->dhstmt,
- icol,
- fCType,
- rgbValue,
- cbValueMax,
- pcbValue ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- icol,
- fCType,
- rgbValue,
- cbValueMax,
- pcbValue );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_GetData )
- {
- switch ( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NO_DATA_FOUND:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- switch( pstmt->state )
- {
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( retcode == SQL_STILL_EXECUTING )
- {
- pstmt->asyn_on = en_GetData;
- break;
- }
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+ if (rgbValue == NULL)
+ {
+ sqlstat = en_S1009;
+ }
+ else if (cbValueMax < 0)
+ {
+ sqlstat = en_S1090;
+ }
+ else
+ {
+ switch (fCType)
+ {
+ case SQL_C_DEFAULT:
+ case SQL_C_CHAR:
+ case SQL_C_BINARY:
+ case SQL_C_BIT:
+ case SQL_C_TINYINT:
+ case SQL_C_STINYINT:
+ case SQL_C_UTINYINT:
+ case SQL_C_SHORT:
+ case SQL_C_SSHORT:
+ case SQL_C_USHORT:
+ case SQL_C_LONG:
+ case SQL_C_SLONG:
+ case SQL_C_ULONG:
+ case SQL_C_FLOAT:
+ case SQL_C_DOUBLE:
+ case SQL_C_DATE:
+ case SQL_C_TIME:
+ case SQL_C_TIMESTAMP:
+ break;
+
+ default:
+ sqlstat = en_S1003;
+ break;
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ sqlstat = en_S1010;
+ break;
+
+ case en_stmt_executed:
+ case en_stmt_cursoropen:
+ sqlstat = en_24000;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_GetData)
+ {
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetData);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_GetData,
+ (pstmt->dhstmt, icol, fCType, rgbValue, cbValueMax, pcbValue))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_GetData)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NO_DATA_FOUND:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (retcode == SQL_STILL_EXECUTING)
+ {
+ pstmt->asyn_on = en_GetData;
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLMoreResults( HSTMT hstmt )
+
+RETCODE SQL_API
+SQLMoreResults (HSTMT hstmt)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- return SQL_NO_DATA_FOUND;
-
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_MoreResults )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_MoreResults );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_MoreResults, (pstmt->dhstmt) )
-
-#if 0
- retcode = hproc( pstmt->dhstmt );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_MoreResults )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NO_DATA_FOUND:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- /* driver should return SQL_NO_DATA_FOUND */
- break;
-
- case en_stmt_executed:
- if( retcode == SQL_NO_DATA_FOUND )
- {
- if( pstmt->prep_state )
- {
- pstmt->state = en_stmt_prepared;
- }
- else
- {
- pstmt->state = en_stmt_allocated;
- }
- }
- else if( retcode == SQL_STILL_EXECUTING )
- {
- pstmt->asyn_on = en_MoreResults;
- }
- break;
-
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( retcode == SQL_SUCCESS )
- {
- break;
- }
- else if( retcode == SQL_NO_DATA_FOUND )
- {
- if( pstmt->prep_state )
- {
- pstmt->state = en_stmt_prepared;
- }
- else
- {
- pstmt->state = en_stmt_allocated;
- }
- }
- else if( retcode == SQL_STILL_EXECUTING )
- {
- pstmt->asyn_on = en_MoreResults;
- }
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT
+ || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ return SQL_NO_DATA_FOUND;
+
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_MoreResults)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_MoreResults);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_MoreResults,
+ (pstmt->dhstmt))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_MoreResults)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NO_DATA_FOUND:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ /* driver should return SQL_NO_DATA_FOUND */
+ break;
+
+ case en_stmt_executed:
+ if (retcode == SQL_NO_DATA_FOUND)
+ {
+ if (pstmt->prep_state)
+ {
+ pstmt->state = en_stmt_prepared;
+ }
+ else
+ {
+ pstmt->state = en_stmt_allocated;
+ }
+ }
+ else if (retcode == SQL_STILL_EXECUTING)
+ {
+ pstmt->asyn_on = en_MoreResults;
+ }
+ break;
+
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (retcode == SQL_SUCCESS)
+ {
+ break;
+ }
+ else if (retcode == SQL_NO_DATA_FOUND)
+ {
+ if (pstmt->prep_state)
+ {
+ pstmt->state = en_stmt_prepared;
+ }
+ else
+ {
+ pstmt->state = en_stmt_allocated;
+ }
+ }
+ else if (retcode == SQL_STILL_EXECUTING)
+ {
+ pstmt->asyn_on = en_MoreResults;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLSetPos (
- HSTMT hstmt,
- UWORD irow,
- UWORD fOption,
- UWORD fLock )
+
+RETCODE SQL_API
+SQLSetPos (
+ HSTMT hstmt,
+ UWORD irow,
+ UWORD fOption,
+ UWORD fLock)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument value */
- if( fOption > SQL_ADD
- || fLock > SQL_LOCK_UNLOCK )
- {
- PUSHSQLERR ( pstmt->herr, en_S1009 );
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- case en_stmt_fetched:
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- sqlstat = en_S1010;
- break;
-
- case en_stmt_executed:
- case en_stmt_cursoropen:
- sqlstat = en_24000;
- break;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_SetPos )
- {
- sqlstat = en_S1010;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_SetPos );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_SetPos, (
- pstmt->dhstmt,
- irow,
- fOption,
- fLock ) )
-#if 0
- retcode = hproc(pstmt->dhstmt,
- irow,
- fOption,
- fLock );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_SetPos )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_NEED_DATA:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- /* now, the only possible init state is 'xfetched' */
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- break;
-
- case SQL_NEED_DATA:
- pstmt->state = en_stmt_needdata;
- pstmt->need_on = en_SetPos;
- break;
-
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_SetPos;
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument value */
+ if (fOption > SQL_ADD || fLock > SQL_LOCK_UNLOCK)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1009);
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ case en_stmt_fetched:
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ sqlstat = en_S1010;
+ break;
+
+ case en_stmt_executed:
+ case en_stmt_cursoropen:
+ sqlstat = en_24000;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_SetPos)
+ {
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetPos);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetPos,
+ (pstmt->dhstmt, irow, fOption, fLock))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_SetPos)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_NEED_DATA:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ /* now, the only possible init state is 'xfetched' */
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ break;
+
+ case SQL_NEED_DATA:
+ pstmt->state = en_stmt_needdata;
+ pstmt->need_on = en_SetPos;
+ break;
+
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_SetPos;
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-/** data source connect object management functions
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
-
-#include <../iodbc/itrace.h>
+/*
+ * hdbc.c
+ *
+ * $Id$
+ *
+ * Data source connect object management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
#include <stdio.h>
extern RETCODE _iodbcdm_driverunload();
-RETCODE SQL_API SQLAllocConnect(
- HENV henv,
- HDBC FAR* phdbc )
+
+RETCODE SQL_API
+SQLAllocConnect (
+ HENV henv,
+ HDBC FAR * phdbc)
{
- GENV_t FAR* genv = (GENV_t FAR*)henv;
- DBC_t FAR* pdbc;
+ GENV_t FAR *genv = (GENV_t FAR *) henv;
+ DBC_t FAR *pdbc;
#if (ODBCVER >= 0x0300)
- if( henv == SQL_NULL_HENV
- || genv->type != SQL_HANDLE_ENV )
+ if (henv == SQL_NULL_HENV || genv->type != SQL_HANDLE_ENV)
#else
- if( henv == SQL_NULL_HENV )
+ if (henv == SQL_NULL_HENV)
#endif
- {
- return SQL_INVALID_HANDLE;
- }
- if( phdbc == NULL )
- {
- PUSHSQLERR ( genv->herr, en_S1009 );
+ {
+ return SQL_INVALID_HANDLE;
+ }
- return SQL_ERROR;
- }
+ if (phdbc == NULL)
+ {
+ PUSHSQLERR (genv->herr, en_S1009);
- pdbc = (DBC_t FAR*)MEM_ALLOC (sizeof(DBC_t));
+ return SQL_ERROR;
+ }
- if( pdbc == NULL )
- {
- *phdbc = SQL_NULL_HDBC;
+ pdbc = (DBC_t FAR *) MEM_ALLOC (sizeof (DBC_t));
- PUSHSQLERR ( genv->herr, en_S1001 );
+ if (pdbc == NULL)
+ {
+ *phdbc = SQL_NULL_HDBC;
- return SQL_ERROR;
- }
+ PUSHSQLERR (genv->herr, en_S1001);
+
+ return SQL_ERROR;
+ }
#if (ODBCVER >= 0x0300)
- pdbc->type = SQL_HANDLE_DBC;
+ pdbc->type = SQL_HANDLE_DBC;
#endif
- /* insert this dbc entry into the link list */
- pdbc->next = genv->hdbc;
- genv->hdbc = pdbc;
- pdbc->genv = henv;
-
- pdbc->henv = SQL_NULL_HENV;
- pdbc->hstmt= SQL_NULL_HSTMT;
- pdbc->herr = SQL_NULL_HERR;
- pdbc->dhdbc= SQL_NULL_HDBC;
- pdbc->state= en_dbc_allocated;
- pdbc->trace = 0;
- pdbc->tstm = NULL;
- pdbc->tfile = NULL;
-
- /* set connect options to default values */
- pdbc->access_mode = SQL_MODE_DEFAULT;
- pdbc->autocommit = SQL_AUTOCOMMIT_DEFAULT;
- pdbc->current_qualifier = NULL;
- pdbc->login_timeout = 0UL;
- pdbc->odbc_cursors = SQL_CUR_DEFAULT;
- pdbc->packet_size = 0UL;
- pdbc->quiet_mode = (UDWORD)NULL;
- pdbc->txn_isolation = SQL_TXN_READ_UNCOMMITTED;
- pdbc->cb_commit = (SWORD)SQL_CB_DELETE;
- pdbc->cb_rollback = (SWORD)SQL_CB_DELETE;
-
- *phdbc = (HDBC)pdbc;
-
- return SQL_SUCCESS;
+
+ /* insert this dbc entry into the link list */
+ pdbc->next = genv->hdbc;
+ genv->hdbc = pdbc;
+ pdbc->genv = henv;
+
+ pdbc->henv = SQL_NULL_HENV;
+ pdbc->hstmt = SQL_NULL_HSTMT;
+ pdbc->herr = SQL_NULL_HERR;
+ pdbc->dhdbc = SQL_NULL_HDBC;
+ pdbc->state = en_dbc_allocated;
+ pdbc->trace = 0;
+ pdbc->tstm = NULL;
+ pdbc->tfile = NULL;
+
+ /* set connect options to default values */
+ pdbc->access_mode = SQL_MODE_DEFAULT;
+ pdbc->autocommit = SQL_AUTOCOMMIT_DEFAULT;
+ pdbc->current_qualifier = NULL;
+ pdbc->login_timeout = 0UL;
+ pdbc->odbc_cursors = SQL_CUR_DEFAULT;
+ pdbc->packet_size = 0UL;
+ pdbc->quiet_mode = (UDWORD) NULL;
+ pdbc->txn_isolation = SQL_TXN_READ_UNCOMMITTED;
+ pdbc->cb_commit = (SWORD) SQL_CB_DELETE;
+ pdbc->cb_rollback = (SWORD) SQL_CB_DELETE;
+
+ *phdbc = (HDBC) pdbc;
+
+ return SQL_SUCCESS;
}
-RETCODE SQL_API SQLFreeConnect( HDBC hdbc )
+
+RETCODE SQL_API
+SQLFreeConnect (HDBC hdbc)
{
- GENV_t FAR* genv;
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- DBC_t FAR* tpdbc;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check state */
- if( pdbc->state != en_dbc_allocated )
- {
- PUSHSQLERR ( pdbc->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- genv = (GENV_t FAR*)pdbc->genv;
-
- for( tpdbc = (DBC_t FAR*)genv->hdbc;
- tpdbc != NULL;
- tpdbc = tpdbc->next )
- {
- if( pdbc == tpdbc )
- {
- genv->hdbc = pdbc->next;
- break;
- }
-
- if( pdbc == tpdbc->next )
- {
- tpdbc->next = pdbc->next;
- break;
- }
- }
-
- /* free this dbc */
- _iodbcdm_driverunload(pdbc);
- _iodbcdm_freesqlerrlist( pdbc->herr );
-
- if( pdbc->tfile )
- {
- MEM_FREE( pdbc->tfile );
- }
-
- SQLSetConnectOption( pdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF);
-
- MEM_FREE ( pdbc );
-
- return SQL_SUCCESS;
+ GENV_t FAR *genv;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ DBC_t FAR *tpdbc;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check state */
+ if (pdbc->state != en_dbc_allocated)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ genv = (GENV_t FAR *) pdbc->genv;
+
+ for (tpdbc = (DBC_t FAR *) genv->hdbc;
+ tpdbc != NULL;
+ tpdbc = tpdbc->next)
+ {
+ if (pdbc == tpdbc)
+ {
+ genv->hdbc = pdbc->next;
+ break;
+ }
+
+ if (pdbc == tpdbc->next)
+ {
+ tpdbc->next = pdbc->next;
+ break;
+ }
+ }
+
+ /* free this dbc */
+ _iodbcdm_driverunload (pdbc);
+ _iodbcdm_freesqlerrlist (pdbc->herr);
+
+ if (pdbc->tfile)
+ {
+ MEM_FREE (pdbc->tfile);
+ }
+
+ SQLSetConnectOption (pdbc, SQL_OPT_TRACE, SQL_OPT_TRACE_OFF);
+
+ MEM_FREE (pdbc);
+
+ return SQL_SUCCESS;
}
-RETCODE SQL_API SQLSetConnectOption(
- HDBC hdbc,
- UWORD fOption,
- UDWORD vParam )
+
+RETCODE SQL_API
+SQLSetConnectOption (
+ HDBC hdbc,
+ UWORD fOption,
+ UDWORD vParam)
{
- GENV_t FAR* genv;
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- STMT_t FAR* pstmt;
- HPROC hproc = SQL_NULL_HPROC;
- int sqlstat = en_00000;
- RETCODE retcode = SQL_SUCCESS;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check option */
- if( fOption < SQL_CONN_OPT_MIN
- || ( fOption > SQL_CONN_OPT_MAX
- && fOption < SQL_CONNECT_OPT_DRVR_START ) )
- {
- PUSHSQLERR ( pdbc->herr, en_S1092 );
-
- return SQL_ERROR;
- }
-
- /* check state of connection handle */
- switch( pdbc->state )
- {
- case en_dbc_allocated:
- if( fOption == SQL_TRANSLATE_DLL
- || fOption == SQL_TRANSLATE_OPTION )
- {
- /* This two options are only meaningful
- * for specified driver. So, has to be
- * set after a dirver has been loaded.
- */
- sqlstat = en_08003;
- break;
- }
-
- if( fOption >= SQL_CONNECT_OPT_DRVR_START
- && pdbc->henv == SQL_NULL_HENV )
- /* An option only meaningful for drivers
- * is passed before loading a driver.
- * We classify this as an invalid option error.
- * This is not documented by MS SDK guide.
- */
- {
- sqlstat = en_S1092;
- break;
- }
- break;
-
- case en_dbc_needdata:
- sqlstat = en_S1010;
- break;
-
- case en_dbc_connected:
- case en_dbc_hstmt:
- if( fOption == SQL_ODBC_CURSORS )
- {
- sqlstat = en_08002;
- }
- break;
-
- default:
- break;
- }
-
- /* check state of statement handle(s) */
- for( pstmt = (STMT_t FAR*)pdbc->hstmt;
- pstmt != NULL && sqlstat == en_00000;
- pstmt = (STMT_t FAR*)pstmt->next )
- {
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- sqlstat = en_S1010;
- }
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pdbc->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- if( fOption == SQL_OPT_TRACE )
- /* tracing flag can be set before and after connect
- * and only meaningful for driver manager(actually
- * there is only one tracing file under one global
- * environment).
- */
- {
- switch( vParam )
- {
- case SQL_OPT_TRACE_ON:
- if( pdbc->tfile == NULL )
- {
- pdbc->tfile = (char FAR*)MEM_ALLOC( 1 +
- STRLEN(SQL_OPT_TRACE_FILE_DEFAULT) );
-
- if( pdbc->tfile == NULL )
- {
- PUSHSQLERR( pdbc->herr, en_S1001 );
-
- return SQL_ERROR;
- }
-
- STRCPY( pdbc->tfile, SQL_OPT_TRACE_FILE_DEFAULT );
- }
-
- if( pdbc->tstm == NULL )
- {
-#if defined(stderr) && defined(stdout)
- if(STREQ( pdbc->tfile, "stderr"))
- {
- pdbc->tstm = stderr;
- }
- else
- if(STREQ(pdbc->tfile, "stdout"))
- {
- pdbc->tstm = stdout;
- }
- else
-#endif
- {
- pdbc->tstm
- = fopen(pdbc->tfile, "a+");
- }
-
- if(pdbc->tstm )
- {
- pdbc->trace = 1;
- }
- else
- {
- pdbc->trace = 0;
-
- sqlstat = en_IM013;
- retcode = SQL_ERROR;
- }
- }
- break;
-
- case SQL_OPT_TRACE_OFF:
- if( pdbc->trace && pdbc->tstm )
- {
-#if defined(stderr) && defined(stdout)
- if( stderr != (FILE FAR*)(pdbc->tstm)
- && stdout != (FILE FAR*)(pdbc->tstm) )
+ GENV_t FAR *genv;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ STMT_t FAR *pstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ int sqlstat = en_00000;
+ RETCODE retcode = SQL_SUCCESS;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check option */
+ if (fOption < SQL_CONN_OPT_MIN ||
+ (fOption > SQL_CONN_OPT_MAX && fOption < SQL_CONNECT_OPT_DRVR_START))
+ {
+ PUSHSQLERR (pdbc->herr, en_S1092);
+
+ return SQL_ERROR;
+ }
+
+ /* check state of connection handle */
+ switch (pdbc->state)
+ {
+ case en_dbc_allocated:
+ if (fOption == SQL_TRANSLATE_DLL || fOption == SQL_TRANSLATE_OPTION)
+ {
+ /* This two options are only meaningful
+ * for specified driver. So, has to be
+ * set after a dirver has been loaded.
+ */
+ sqlstat = en_08003;
+ break;
+ }
+
+ if (fOption >= SQL_CONNECT_OPT_DRVR_START && pdbc->henv == SQL_NULL_HENV)
+ /* An option only meaningful for drivers
+ * is passed before loading a driver.
+ * We classify this as an invalid option error.
+ * This is not documented by MS SDK guide.
+ */
+ {
+ sqlstat = en_S1092;
+ break;
+ }
+ break;
+
+ case en_dbc_needdata:
+ sqlstat = en_S1010;
+ break;
+
+ case en_dbc_connected:
+ case en_dbc_hstmt:
+ if (fOption == SQL_ODBC_CURSORS)
+ {
+ sqlstat = en_08002;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ /* check state of statement handle(s) */
+ for (pstmt = (STMT_t FAR *) pdbc->hstmt;
+ pstmt != NULL && sqlstat == en_00000;
+ pstmt = (STMT_t FAR *) pstmt->next)
+ {
+ if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
+ {
+ sqlstat = en_S1010;
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pdbc->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ if (fOption == SQL_OPT_TRACE)
+ /* tracing flag can be set before and after connect
+ * and only meaningful for driver manager(actually
+ * there is only one tracing file under one global
+ * environment).
+ */
+ {
+ switch (vParam)
+ {
+ case SQL_OPT_TRACE_ON:
+ if (pdbc->tfile == NULL)
+ {
+ pdbc->tfile = (char FAR *) MEM_ALLOC (1 +
+ STRLEN (SQL_OPT_TRACE_FILE_DEFAULT));
+
+ if (pdbc->tfile == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1001);
+
+ return SQL_ERROR;
+ }
+
+ STRCPY (pdbc->tfile, SQL_OPT_TRACE_FILE_DEFAULT);
+ }
+
+ if (pdbc->tstm == NULL)
+ {
+
+#if defined(stderr) && defined(stdout)
+ if (STREQ (pdbc->tfile, "stderr"))
+ {
+ pdbc->tstm = stderr;
+ }
+ else if (STREQ (pdbc->tfile, "stdout"))
+ {
+ pdbc->tstm = stdout;
+ }
+ else
#endif
- {
- fclose(pdbc->tstm);
- }
- }
- pdbc->tstm = NULL;
- pdbc->trace = 0;
- break;
-
- default:
- PUSHSQLERR (pdbc->herr, en_S1009);
- retcode = SQL_ERROR;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pdbc->herr, sqlstat );
- }
-
- return retcode;
- }
-
- if( fOption == SQL_OPT_TRACEFILE )
- /* Tracing file can be set before and after connect
- * and only meaningful for driver manager.
- */
- {
- if( vParam == 0UL
- || ((char FAR*)vParam)[0] == 0 )
- {
- PUSHSQLERR ( pdbc->herr, en_S1009 );
-
- return SQL_ERROR;
- }
-
- if( pdbc->tfile && STREQ (pdbc->tfile, vParam) )
- {
- return SQL_SUCCESS;
- }
-
- if( pdbc->trace )
- {
- PUSHSQLERR ( pdbc->herr, en_IM014 );
-
- return SQL_ERROR;
- }
-
- if( pdbc->tfile )
- {
- MEM_FREE( pdbc->tfile );
- }
-
- pdbc->tfile = (char FAR*)MEM_ALLOC( 1 + STRLEN( vParam ) );
-
- if( pdbc->tfile == NULL )
- {
- PUSHSQLERR( pdbc->herr, en_S1001 );
-
- return SQL_ERROR;
- }
-
- STRCPY ( pdbc->tfile, vParam );
-
- return SQL_SUCCESS;
- }
-
- if( pdbc->state != en_dbc_allocated )
- {
- /* If already connected, then, driver's odbc call
- * will be invoked. Otherwise, we only save the options
- * and delay the setting process until the connection
- * been established.
- */
- hproc = _iodbcdm_getproc( hdbc, en_SetConnectOption );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_SetConnectOption, (
- pdbc->dhdbc, fOption, vParam ) )
-
-#if 0
- retcode = hproc( pdbc->dhdbc, fOption, vParam);
+
+ {
+ pdbc->tstm
+ = fopen (pdbc->tfile, "a+");
+ }
+
+ if (pdbc->tstm)
+ {
+ pdbc->trace = 1;
+ }
+ else
+ {
+ pdbc->trace = 0;
+
+ sqlstat = en_IM013;
+ retcode = SQL_ERROR;
+ }
+ }
+ break;
+
+ case SQL_OPT_TRACE_OFF:
+ if (pdbc->trace && pdbc->tstm)
+ {
+
+#if defined(stderr) && defined(stdout)
+ if (stderr != (FILE FAR *) (pdbc->tstm)
+ && stdout != (FILE FAR *) (pdbc->tstm))
#endif
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- return retcode;
- }
- }
-
- /*
- * Now, either driver's odbc call was successed or
- * driver has not been loaded yet. In the first case, we
- * need flip flag for(such as access_mode, autocommit, ...)
- * for our finit state machine. While in the second case,
- * we need save option values(such as current_qualifier, ...)
- * for delaied setting. So, ...
- */
-
- /* No matter what state we are(i.e. allocated or connected, ..)
- * we need to flip the flag.
- */
- switch( fOption )
- {
- case SQL_ACCESS_MODE:
- pdbc->access_mode = vParam;
- break;
-
- case SQL_AUTOCOMMIT:
- pdbc->autocommit = vParam;
- break;
- }
-
- /* state transition */
- if( pdbc->state != en_dbc_allocated )
- {
- return retcode;
- }
-
- /* Only 'allocated' state is possible here, and we need to
- * save the options for delaied setting.
- */
- switch( fOption )
- {
- case SQL_CURRENT_QUALIFIER:
- if( pdbc->current_qualifier != NULL )
- {
- MEM_FREE ( pdbc->current_qualifier );
- }
-
- if( vParam == 0UL )
- {
- pdbc->current_qualifier = NULL;
-
- break;
- }
-
- pdbc->current_qualifier
- = (char FAR*)MEM_ALLOC (
- STRLEN (vParam) + 1 );
-
- if( pdbc->current_qualifier == NULL )
- {
- PUSHSQLERR ( pdbc->herr, en_S1001 );
- return SQL_ERROR;
- }
-
- STRCPY ( pdbc->current_qualifier, vParam );
- break;
-
- case SQL_LOGIN_TIMEOUT:
- pdbc->login_timeout = vParam;
- break;
-
- case SQL_ODBC_CURSORS:
- pdbc->odbc_cursors = vParam;
- break;
-
- case SQL_PACKET_SIZE:
- pdbc->packet_size = vParam;
- break;
-
- case SQL_QUIET_MODE:
- pdbc->quiet_mode = vParam;
- break;
-
- case SQL_TXN_ISOLATION:
- pdbc->txn_isolation = vParam;
- break;
-
- default:
- /* Since we didn't save the option value for delaied
- * setting, we should raise an error here.
- */
- break;
- }
-
- return retcode;
+ {
+ fclose (pdbc->tstm);
+ }
+ }
+ pdbc->tstm = NULL;
+ pdbc->trace = 0;
+ break;
+
+ default:
+ PUSHSQLERR (pdbc->herr, en_S1009);
+ retcode = SQL_ERROR;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pdbc->herr, sqlstat);
+ }
+
+ return retcode;
+ }
+
+ if (fOption == SQL_OPT_TRACEFILE)
+ /* Tracing file can be set before and after connect
+ * and only meaningful for driver manager.
+ */
+ {
+ if (vParam == 0UL || ((char FAR *) vParam)[0] == 0)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1009);
+
+ return SQL_ERROR;
+ }
+
+ if (pdbc->tfile && STREQ (pdbc->tfile, vParam))
+ {
+ return SQL_SUCCESS;
+ }
+
+ if (pdbc->trace)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM014);
+
+ return SQL_ERROR;
+ }
+
+ if (pdbc->tfile)
+ {
+ MEM_FREE (pdbc->tfile);
+ }
+
+ pdbc->tfile = (char FAR *) MEM_ALLOC (1 + STRLEN (vParam));
+
+ if (pdbc->tfile == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1001);
+
+ return SQL_ERROR;
+ }
+
+ STRCPY (pdbc->tfile, vParam);
+
+ return SQL_SUCCESS;
+ }
+
+ if (pdbc->state != en_dbc_allocated)
+ {
+ /* If already connected, then, driver's odbc call
+ * will be invoked. Otherwise, we only save the options
+ * and delay the setting process until the connection
+ * been established.
+ */
+ hproc = _iodbcdm_getproc (hdbc, en_SetConnectOption);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (hdbc, retcode, hproc, en_SetConnectOption,
+ (pdbc->dhdbc, fOption, vParam))
+
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ return retcode;
+ }
+ }
+
+ /*
+ * Now, either driver's odbc call was successed or
+ * driver has not been loaded yet. In the first case, we
+ * need flip flag for(such as access_mode, autocommit, ...)
+ * for our finit state machine. While in the second case,
+ * we need save option values(such as current_qualifier, ...)
+ * for delaied setting. So, ...
+ */
+
+ /* No matter what state we are(i.e. allocated or connected, ..)
+ * we need to flip the flag.
+ */
+ switch (fOption)
+ {
+ case SQL_ACCESS_MODE:
+ pdbc->access_mode = vParam;
+ break;
+
+ case SQL_AUTOCOMMIT:
+ pdbc->autocommit = vParam;
+ break;
+ }
+
+ /* state transition */
+ if (pdbc->state != en_dbc_allocated)
+ {
+ return retcode;
+ }
+
+ /* Only 'allocated' state is possible here, and we need to
+ * save the options for delaied setting.
+ */
+ switch (fOption)
+ {
+ case SQL_CURRENT_QUALIFIER:
+ if (pdbc->current_qualifier != NULL)
+ {
+ MEM_FREE (pdbc->current_qualifier);
+ }
+
+ if (vParam == 0UL)
+ {
+ pdbc->current_qualifier = NULL;
+
+ break;
+ }
+
+ pdbc->current_qualifier
+ = (char FAR *) MEM_ALLOC (
+ STRLEN (vParam) + 1);
+
+ if (pdbc->current_qualifier == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1001);
+ return SQL_ERROR;
+ }
+
+ STRCPY (pdbc->current_qualifier, vParam);
+ break;
+
+ case SQL_LOGIN_TIMEOUT:
+ pdbc->login_timeout = vParam;
+ break;
+
+ case SQL_ODBC_CURSORS:
+ pdbc->odbc_cursors = vParam;
+ break;
+
+ case SQL_PACKET_SIZE:
+ pdbc->packet_size = vParam;
+ break;
+
+ case SQL_QUIET_MODE:
+ pdbc->quiet_mode = vParam;
+ break;
+
+ case SQL_TXN_ISOLATION:
+ pdbc->txn_isolation = vParam;
+ break;
+
+ default:
+ /* Since we didn't save the option value for delaied
+ * setting, we should raise an error here.
+ */
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLGetConnectOption(
- HDBC hdbc,
- UWORD fOption,
- PTR pvParam )
-{
- GENV_t FAR* genv;
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- int sqlstat = en_00000;
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check option */
- if( fOption < SQL_CONN_OPT_MIN
- || ( fOption > SQL_CONN_OPT_MAX
- && fOption < SQL_CONNECT_OPT_DRVR_START ) )
- {
- PUSHSQLERR ( pdbc->herr, en_S1092 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- switch( pdbc->state )
- {
- case en_dbc_allocated:
- if( fOption != SQL_ACCESS_MODE
- && fOption != SQL_AUTOCOMMIT
- && fOption != SQL_LOGIN_TIMEOUT
- && fOption != SQL_OPT_TRACE
- && fOption != SQL_OPT_TRACEFILE )
- {
- sqlstat = en_08003;
- }
- /* MS ODBC SDK document only
- * allows SQL_ACCESS_MODE
- * and SQL_AUTOCOMMIT in this
- * dbc state. We allow another
- * two options, because they
- * are only meaningful for driver
- * manager.
- */
- break;
-
- case en_dbc_needdata:
- sqlstat = en_S1010;
- break;
-
- default:
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pdbc->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* Tracing and tracing file options are only
- * meaningful for driver manager
- */
- if( fOption == SQL_OPT_TRACE )
- {
- if( pdbc->trace )
- *((UDWORD*)pvParam) = (UDWORD)SQL_OPT_TRACE_ON;
- else
- *((UDWORD*)pvParam) = (UDWORD)SQL_OPT_TRACE_OFF;
-
- return SQL_SUCCESS;
- }
-
- if( fOption == SQL_OPT_TRACEFILE )
- {
- STRCPY (pvParam, pdbc->tfile );
-
- return SQL_ERROR;
- }
-
- if( pdbc->state != en_dbc_allocated )
- /* if already connected, we will invoke driver's function */
- {
- hproc = _iodbcdm_getproc( hdbc, en_GetConnectOption );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_GetConnectOption, (
- pdbc->dhdbc, fOption, pvParam ) )
-
-#if 0
- retcode = hproc(pdbc->dhdbc, fOption, pvParam);
-#endif
- return retcode;
- }
-
- /* We needn't to handle options which are not allowed
- * to be *get* at a allocated dbc state(and two tracing
- * options which has been handled and returned). Thus,
- * there are only two possible cases.
- */
- switch( fOption )
- {
- case SQL_ACCESS_MODE:
- *((UDWORD*)pvParam) = pdbc->access_mode;
- break;
-
- case SQL_AUTOCOMMIT:
- *((UDWORD*)pvParam) = pdbc->autocommit;
- break;
-
- case SQL_LOGIN_TIMEOUT:
- *((UDWORD*)pvParam) = pdbc->login_timeout;
- break;
-
- default:
- break;
- }
-
- return SQL_SUCCESS;
+RETCODE SQL_API
+SQLGetConnectOption (
+ HDBC hdbc,
+ UWORD fOption,
+ PTR pvParam)
+{
+ GENV_t FAR *genv;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ int sqlstat = en_00000;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check option */
+ if (fOption < SQL_CONN_OPT_MIN ||
+ (fOption > SQL_CONN_OPT_MAX && fOption < SQL_CONNECT_OPT_DRVR_START))
+ {
+ PUSHSQLERR (pdbc->herr, en_S1092);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ switch (pdbc->state)
+ {
+ case en_dbc_allocated:
+ if (fOption != SQL_ACCESS_MODE
+ && fOption != SQL_AUTOCOMMIT
+ && fOption != SQL_LOGIN_TIMEOUT
+ && fOption != SQL_OPT_TRACE
+ && fOption != SQL_OPT_TRACEFILE)
+ {
+ sqlstat = en_08003;
+ }
+ /* MS ODBC SDK document only
+ * allows SQL_ACCESS_MODE
+ * and SQL_AUTOCOMMIT in this
+ * dbc state. We allow another
+ * two options, because they
+ * are only meaningful for driver
+ * manager.
+ */
+ break;
+
+ case en_dbc_needdata:
+ sqlstat = en_S1010;
+ break;
+
+ default:
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pdbc->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* Tracing and tracing file options are only
+ * meaningful for driver manager
+ */
+ if (fOption == SQL_OPT_TRACE)
+ {
+ if (pdbc->trace)
+ *((UDWORD *) pvParam) = (UDWORD) SQL_OPT_TRACE_ON;
+ else
+ *((UDWORD *) pvParam) = (UDWORD) SQL_OPT_TRACE_OFF;
+
+ return SQL_SUCCESS;
+ }
+
+ if (fOption == SQL_OPT_TRACEFILE)
+ {
+ STRCPY (pvParam, pdbc->tfile);
+
+ return SQL_ERROR;
+ }
+
+ if (pdbc->state != en_dbc_allocated)
+ /* if already connected, we will invoke driver's function */
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_GetConnectOption);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (hdbc, retcode, hproc, en_GetConnectOption,
+ (pdbc->dhdbc, fOption, pvParam))
+
+ return retcode;
+ }
+
+ /* We needn't to handle options which are not allowed
+ * to be *get* at a allocated dbc state(and two tracing
+ * options which has been handled and returned). Thus,
+ * there are only two possible cases.
+ */
+ switch (fOption)
+ {
+ case SQL_ACCESS_MODE:
+ *((UDWORD *) pvParam) = pdbc->access_mode;
+ break;
+
+ case SQL_AUTOCOMMIT:
+ *((UDWORD *) pvParam) = pdbc->autocommit;
+ break;
+
+ case SQL_LOGIN_TIMEOUT:
+ *((UDWORD *) pvParam) = pdbc->login_timeout;
+ break;
+
+ default:
+ break;
+ }
+
+ return SQL_SUCCESS;
}
-static RETCODE _iodbcdm_transact(
- HDBC hdbc,
- UWORD fType )
-{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- STMT_t FAR* pstmt;
- HPROC hproc;
- RETCODE retcode;
-
- /* check state */
- switch( pdbc->state )
- {
- case en_dbc_allocated:
- case en_dbc_needdata:
- PUSHSQLERR ( pdbc->herr, en_08003 );
- return SQL_ERROR;
-
- case en_dbc_connected:
- return SQL_SUCCESS;
-
- case en_dbc_hstmt:
- default:
- break;
- }
-
- for( pstmt = (STMT_t FAR*)(pdbc->hstmt);
- pstmt != NULL;
- pstmt = pstmt->next )
- {
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- PUSHSQLERR ( pdbc->herr, en_S1010 );
-
- return SQL_ERROR;
- }
- }
-
- hproc = _iodbcdm_getproc( hdbc, en_Transact );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_Transact, (
- SQL_NULL_HENV, pdbc->dhdbc, fType ) )
-
-#if 0
- retcode = hproc( SQL_NULL_HENV, pdbc->dhdbc, fType );
-#endif
- /* state transition */
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- return retcode;
- }
-
- pdbc->state = en_dbc_hstmt;
-
- for( pstmt = (STMT_t FAR*)(pdbc->hstmt);
- pstmt != NULL;
- pstmt = pstmt->next )
- {
- switch( pstmt->state )
- {
- case en_stmt_prepared:
- if( pdbc->cb_commit == SQL_CB_DELETE
- || pdbc->cb_rollback == SQL_CB_DELETE )
- {
- pstmt->state = en_stmt_allocated;
- pstmt->prep_state = 0;
- break;
- }
- break;
-
- case en_stmt_executed:
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( ! pstmt->prep_state
- && pdbc->cb_commit != SQL_CB_PRESERVE
- && pdbc->cb_rollback != SQL_CB_PRESERVE )
- {
- pstmt->state = en_stmt_allocated;
- pstmt->prep_state = 0;
- pstmt->cursor_state = en_stmt_cursor_no;
- break;
- }
-
- if( pstmt->prep_state )
- {
- if( pdbc->cb_commit == SQL_CB_DELETE
- || pdbc->cb_rollback== SQL_CB_DELETE )
- {
- pstmt->state = en_stmt_allocated;
- pstmt->prep_state = 0;
- pstmt->cursor_state = en_stmt_cursor_no;
- break;
- }
-
- if( pdbc->cb_commit == SQL_CB_CLOSE
- || pdbc->cb_rollback== SQL_CB_CLOSE )
- {
- pstmt->state
- = en_stmt_prepared;
- pstmt->cursor_state
- = en_stmt_cursor_no;
- break;
- }
- break;
- }
- break;
-
- default:
- break;
- }
- }
-
- return retcode;
+static RETCODE
+_iodbcdm_transact (
+ HDBC hdbc,
+ UWORD fType)
+{
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ STMT_t FAR *pstmt;
+ HPROC hproc;
+ RETCODE retcode;
+
+ /* check state */
+ switch (pdbc->state)
+ {
+ case en_dbc_allocated:
+ case en_dbc_needdata:
+ PUSHSQLERR (pdbc->herr, en_08003);
+ return SQL_ERROR;
+
+ case en_dbc_connected:
+ return SQL_SUCCESS;
+
+ case en_dbc_hstmt:
+ default:
+ break;
+ }
+
+ for (pstmt = (STMT_t FAR *) (pdbc->hstmt);
+ pstmt != NULL;
+ pstmt = pstmt->next)
+ {
+ if (pstmt->state >= en_stmt_needdata
+ || pstmt->asyn_on != en_NullProc)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+ }
+
+ hproc = _iodbcdm_getproc (hdbc, en_Transact);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (hdbc, retcode, hproc, en_Transact,
+ (SQL_NULL_HENV, pdbc->dhdbc, fType))
+
+ /* state transition */
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ return retcode;
+ }
+
+ pdbc->state = en_dbc_hstmt;
+
+ for (pstmt = (STMT_t FAR *) (pdbc->hstmt);
+ pstmt != NULL;
+ pstmt = pstmt->next)
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_prepared:
+ if (pdbc->cb_commit == SQL_CB_DELETE
+ || pdbc->cb_rollback == SQL_CB_DELETE)
+ {
+ pstmt->state = en_stmt_allocated;
+ pstmt->prep_state = 0;
+ break;
+ }
+ break;
+
+ case en_stmt_executed:
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (!pstmt->prep_state
+ && pdbc->cb_commit != SQL_CB_PRESERVE
+ && pdbc->cb_rollback != SQL_CB_PRESERVE)
+ {
+ pstmt->state = en_stmt_allocated;
+ pstmt->prep_state = 0;
+ pstmt->cursor_state = en_stmt_cursor_no;
+ break;
+ }
+
+ if (pstmt->prep_state)
+ {
+ if (pdbc->cb_commit == SQL_CB_DELETE
+ || pdbc->cb_rollback == SQL_CB_DELETE)
+ {
+ pstmt->state = en_stmt_allocated;
+ pstmt->prep_state = 0;
+ pstmt->cursor_state = en_stmt_cursor_no;
+ break;
+ }
+
+ if (pdbc->cb_commit == SQL_CB_CLOSE
+ || pdbc->cb_rollback == SQL_CB_CLOSE)
+ {
+ pstmt->state
+ = en_stmt_prepared;
+ pstmt->cursor_state
+ = en_stmt_cursor_no;
+ break;
+ }
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLTransact(
- HENV henv,
- HDBC hdbc,
- UWORD fType )
+
+RETCODE SQL_API
+SQLTransact (
+ HENV henv,
+ HDBC hdbc,
+ UWORD fType)
{
- GENV_t FAR* genv = (GENV_t FAR*)henv;
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- HERR herr;
- RETCODE retcode;
-
- if( hdbc != SQL_NULL_HDBC )
- {
- herr = pdbc->herr;
- }
- else if( henv != SQL_NULL_HENV )
- {
- herr = genv->herr;
- }
- else
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
- if( fType != SQL_COMMIT
- && fType != SQL_ROLLBACK )
- {
- PUSHSQLERR ( herr, en_S1012 );
-
- return SQL_ERROR;
- }
-
- if( hdbc != SQL_NULL_HDBC )
- {
- retcode = _iodbcdm_transact( hdbc, fType );
- }
- else
- {
- for( pdbc = (DBC_t FAR*)(genv->hdbc);
- pdbc != NULL;
- pdbc = pdbc->next )
- {
- retcode |= _iodbcdm_transact( hdbc, fType );
- }
- }
-
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- /* fail on one of the connection */
- return SQL_ERROR;
- }
-
- return retcode;
+ GENV_t FAR *genv = (GENV_t FAR *) henv;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ HERR herr;
+ RETCODE retcode;
+
+ if (hdbc != SQL_NULL_HDBC)
+ {
+ herr = pdbc->herr;
+ }
+ else if (henv != SQL_NULL_HENV)
+ {
+ herr = genv->herr;
+ }
+ else
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+ if (fType != SQL_COMMIT
+ && fType != SQL_ROLLBACK)
+ {
+ PUSHSQLERR (herr, en_S1012);
+
+ return SQL_ERROR;
+ }
+
+ if (hdbc != SQL_NULL_HDBC)
+ {
+ retcode = _iodbcdm_transact (hdbc, fType);
+ }
+ else
+ {
+ for (pdbc = (DBC_t FAR *) (genv->hdbc);
+ pdbc != NULL;
+ pdbc = pdbc->next)
+ {
+ retcode |= _iodbcdm_transact (hdbc, fType);
+ }
+ }
+
+ if (retcode != SQL_SUCCESS
+ && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ /* fail on one of the connection */
+ return SQL_ERROR;
+ }
+
+ return retcode;
}
-#ifndef _HDBC_H
-#define _HDBC_H
+/*
+ * hdbc.h
+ *
+ * $Id$
+ *
+ * Data source connect object management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _HDBC_H
+#define _HDBC_H
typedef struct DBC
-{
- int type; /* must be 1st field */
- struct DBC FAR*
- next;
+ {
+ int type; /* must be 1st field */
+ struct DBC FAR *
+ next;
- HENV genv; /* back point to global env object */
+ HENV genv; /* back point to global env object */
- HDBC dhdbc; /* driver's private dbc */
- HENV henv; /* back point to instant env object */
- HSTMT hstmt; /* list of statement object handle(s) */
- HERR herr;
+ HDBC dhdbc; /* driver's private dbc */
+ HENV henv; /* back point to instant env object */
+ HSTMT hstmt; /* list of statement object handle(s) */
+ HERR herr;
- int state;
+ int state;
- /* options */
- UDWORD access_mode;
- UDWORD autocommit;
+ /* options */
+ UDWORD access_mode;
+ UDWORD autocommit;
- UDWORD login_timeout;
- UDWORD odbc_cursors;
- UDWORD packet_size;
- UDWORD quiet_mode;
- UDWORD txn_isolation;
- SWORD cb_commit;
- SWORD cb_rollback;
+ UDWORD login_timeout;
+ UDWORD odbc_cursors;
+ UDWORD packet_size;
+ UDWORD quiet_mode;
+ UDWORD txn_isolation;
+ SWORD cb_commit;
+ SWORD cb_rollback;
- char FAR*
- current_qualifier;
+ char FAR *
+ current_qualifier;
- int trace; /* trace flag */
- char FAR*
- tfile;
- void FAR*
- tstm; /* trace stream */
-} DBC_t;
+ int trace; /* trace flag */
+ char FAR *
+ tfile;
+ void FAR *
+ tstm; /* trace stream */
+ }
+DBC_t;
-/*
+/*
* Note:
- * - ODBC applications can see address of driver manager's
- * connection object, i.e connection handle -- a void pointer,
- * but not detail of it. ODBC applications can neither see
+ * - ODBC applications can see address of driver manager's
+ * connection object, i.e connection handle -- a void pointer,
+ * but not detail of it. ODBC applications can neither see
* detail driver's connection object nor its address.
*
* - ODBC driver manager knows its own connection objects and
* exposes their address to an ODBC application. Driver manager
* also knows address of driver's connection objects and keeps
* it via dhdbc field in driver manager's connection object.
- *
+ *
* - ODBC driver exposes address of its own connection object to
* driver manager without detail.
*
* SQLGetInfo() with fInfoType equals to SQL_DRIVER_HDBC.
*/
-enum {
- en_dbc_allocated,
- en_dbc_needdata,
- en_dbc_connected,
- en_dbc_hstmt
-};
-
+enum
+ {
+ en_dbc_allocated,
+ en_dbc_needdata,
+ en_dbc_connected,
+ en_dbc_hstmt
+ };
#endif
-/** Environment object managment functions
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-
-#include <../iodbc/itrace.h>
-
-RETCODE SQL_API SQLAllocEnv( HENV FAR* phenv )
+/*
+ * henv.c
+ *
+ * $Id$
+ *
+ * Environment object management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+
+#include <itrace.h>
+
+RETCODE SQL_API
+SQLAllocEnv (HENV FAR * phenv)
{
- GENV_t FAR* genv;
+ GENV_t FAR *genv;
- genv = (GENV_t*)MEM_ALLOC( sizeof(GENV_t) );
+ genv = (GENV_t *) MEM_ALLOC (sizeof (GENV_t));
- if( genv == NULL )
- {
- *phenv = SQL_NULL_HENV;
+ if (genv == NULL)
+ {
+ *phenv = SQL_NULL_HENV;
- return SQL_ERROR;
- }
+ return SQL_ERROR;
+ }
#if (ODBCVER >= 0x0300 )
- genv->type = SQL_HANDLE_ENV;
+ genv->type = SQL_HANDLE_ENV;
#endif
- genv->henv = SQL_NULL_HENV; /* driver's env list */
- genv->hdbc = SQL_NULL_HDBC; /* driver's dbc list */
- genv->herr = SQL_NULL_HERR; /* err list */
+ genv->henv = SQL_NULL_HENV; /* driver's env list */
+ genv->hdbc = SQL_NULL_HDBC; /* driver's dbc list */
+ genv->herr = SQL_NULL_HERR; /* err list */
- *phenv = (HENV)genv;
+ *phenv = (HENV) genv;
- return SQL_SUCCESS;
+ return SQL_SUCCESS;
}
-RETCODE SQL_API SQLFreeEnv ( HENV henv )
+
+RETCODE SQL_API
+SQLFreeEnv (HENV henv)
{
- GENV_t FAR* genv = (GENV_t*)henv;
+ GENV_t FAR *genv = (GENV_t *) henv;
- if( henv == SQL_NULL_HENV )
- {
- return SQL_INVALID_HANDLE;
- }
+ if (henv == SQL_NULL_HENV)
+ {
+ return SQL_INVALID_HANDLE;
+ }
- if( genv->hdbc != SQL_NULL_HDBC )
- {
- PUSHSQLERR ( genv->herr, en_S1010 );
+ if (genv->hdbc != SQL_NULL_HDBC)
+ {
+ PUSHSQLERR (genv->herr, en_S1010);
- return SQL_ERROR;
- }
+ return SQL_ERROR;
+ }
- _iodbcdm_freesqlerrlist( genv->herr );
+ _iodbcdm_freesqlerrlist (genv->herr);
- MEM_FREE( henv );
+ MEM_FREE (henv);
- return SQL_SUCCESS;
+ return SQL_SUCCESS;
}
-#ifndef CLI_NAME_PREFIX
+/*
+ * henv.ci
+ *
+ * $Id$
+ *
+ * Function names
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
/* There are some exceptions :
* on FreeBSD 2.x CLI_NAME_PREFIX is defined in Config.mk as "_SQL"
- * on HP/UX s300/s400, CLI_NAME_PREFIX is defined in Config.mk as "_SQL"
- * on AIX 3.x 4.x, CLI_NAME_PREFIX is defined in Config.mk as ".SQL"
+ * on HP/UX s300/s400, CLI_NAME_PREFIX is defined in Config.mk as "_SQL"
+ * on AIX 3.x 4.x, CLI_NAME_PREFIX is defined in Config.mk as ".SQL"
*/
-
-# define CLI_NAME_PREFIX "SQL" /* using call by value prefix */
+#ifndef CLI_NAME_PREFIX
+# define CLI_NAME_PREFIX "SQL" /* using call by value prefix */
+#else
+# ifdef NEED_USCORE
+# define CLI_NAME_PREFIX "_SQL"
+# endif
#endif
-static struct {
- int en_idx;
- char* symbol;
-} odbcapi_symtab[] = {
+static struct
+ {
+ int en_idx;
+ char *symbol;
+ }
+odbcapi_symtab[] = {
+
#if (ODBCVER >= 0x0300)
{ en_AllocHandle CLI_NAME_PREFIX "AllocHandle" },
{ en_FreeHandle CLI_NAME_PREFIX "FreeHandle" },
-#ifndef _HENV_H
-#define _HENV_H
+/*
+ * henv.h
+ *
+ * $Id$
+ *
+ * Environment object management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _HENV_H
+#define _HENV_H
+
+#include <config.h>
+#include <dlproc.h>
-# include "config.h"
-# include <dlproc.h>
+#include <isql.h>
+#include <isqlext.h>
-# include <isql.h>
-# include <isqlext.h>
+enum
+ {
-enum {
#if (ODBCVER >= 0x0300)
- en_AllocHandle = SQL_API_SQLALLOCHANDLE,
- en_FreeHandle = SQL_API_SQLFREEHANDLE,
+ en_AllocHandle = SQL_API_SQLALLOCHANDLE,
+ en_FreeHandle = SQL_API_SQLFREEHANDLE,
#endif
- en_AllocEnv = SQL_API_SQLALLOCENV,
- en_AllocConnect = SQL_API_SQLALLOCCONNECT,
- en_Connect = SQL_API_SQLCONNECT,
- en_DriverConnect = SQL_API_SQLDRIVERCONNECT,
- en_BrowseConnect = SQL_API_SQLBROWSECONNECT,
-
- en_DataSources = SQL_API_SQLDATASOURCES,
- en_Drivers = SQL_API_SQLDRIVERS,
- en_GetInfo = SQL_API_SQLGETINFO,
- en_GetFunctions = SQL_API_SQLGETFUNCTIONS,
- en_GetTypeInfo = SQL_API_SQLGETTYPEINFO,
-
- en_SetConnectOption = SQL_API_SQLSETCONNECTOPTION,
- en_GetConnectOption = SQL_API_SQLGETCONNECTOPTION,
- en_SetStmtOption = SQL_API_SQLSETSTMTOPTION,
- en_GetStmtOption = SQL_API_SQLGETSTMTOPTION,
-
- en_AllocStmt = SQL_API_SQLALLOCSTMT,
- en_Prepare = SQL_API_SQLPREPARE,
- en_BindParameter = SQL_API_SQLBINDPARAMETER,
- en_ParamOptions = SQL_API_SQLPARAMOPTIONS,
- en_GetCursorName = SQL_API_SQLGETCURSORNAME,
- en_SetCursorName = SQL_API_SQLSETCURSORNAME,
- en_SetScrollOptions = SQL_API_SQLSETSCROLLOPTIONS,
- en_SetParam = SQL_API_SQLSETPARAM,
-
- en_Execute = SQL_API_SQLEXECUTE,
- en_ExecDirect = SQL_API_SQLEXECDIRECT,
- en_NativeSql = SQL_API_SQLNATIVESQL,
- en_DescribeParam = SQL_API_SQLDESCRIBEPARAM,
- en_NumParams = SQL_API_SQLNUMPARAMS,
- en_ParamData = SQL_API_SQLPARAMDATA,
- en_PutData = SQL_API_SQLPUTDATA,
-
- en_RowCount = SQL_API_SQLROWCOUNT,
- en_NumResultCols = SQL_API_SQLNUMRESULTCOLS,
- en_DescribeCol = SQL_API_SQLDESCRIBECOL,
- en_ColAttributes = SQL_API_SQLCOLATTRIBUTES,
- en_BindCol = SQL_API_SQLBINDCOL,
- en_Fetch = SQL_API_SQLFETCH,
- en_ExtendedFetch = SQL_API_SQLEXTENDEDFETCH,
- en_GetData = SQL_API_SQLGETDATA,
- en_SetPos = SQL_API_SQLSETPOS,
- en_MoreResults = SQL_API_SQLMORERESULTS,
- en_Error = SQL_API_SQLERROR,
-
- en_ColumnPrivileges = SQL_API_SQLCOLUMNPRIVILEGES,
- en_Columns = SQL_API_SQLCOLUMNS,
- en_ForeignKeys = SQL_API_SQLFOREIGNKEYS,
- en_PrimaryKeys = SQL_API_SQLPRIMARYKEYS,
- en_ProcedureColumns = SQL_API_SQLPROCEDURECOLUMNS,
- en_Procedures = SQL_API_SQLPROCEDURES,
- en_SpecialColumns = SQL_API_SQLSPECIALCOLUMNS,
- en_Statistics = SQL_API_SQLSTATISTICS,
- en_TablePrivileges = SQL_API_SQLTABLEPRIVILEGES,
- en_Tables = SQL_API_SQLTABLES,
-
- en_FreeStmt = SQL_API_SQLFREESTMT,
- en_Cancel = SQL_API_SQLCANCEL,
- en_Transact = SQL_API_SQLTRANSACT,
-
- en_Disconnect = SQL_API_SQLDISCONNECT,
- en_FreeConnect = SQL_API_SQLFREECONNECT,
- en_FreeEnv = SQL_API_SQLFREEENV,
-
- en_NullProc = SYSERR
-};
-
-typedef struct {
- int type; /* must be 1st field */
-
- HENV henv; /* driver's env list */
- HDBC hdbc; /* driver's dbc list */
- HERR herr; /* err list */
- int state;
-} GENV_t;
-
-typedef struct {
- HENV next; /* next attached env handle */
- int refcount; /* Driver's bookkeeping reference count */
- HPROC dllproc_tab[SQL_EXT_API_LAST + 1]; /* driver api calls */
-
- HENV dhenv; /* driver env handle */
- HDLL hdll; /* driver share library handle */
-} ENV_t;
+
+ en_AllocEnv = SQL_API_SQLALLOCENV,
+ en_AllocConnect = SQL_API_SQLALLOCCONNECT,
+ en_Connect = SQL_API_SQLCONNECT,
+ en_DriverConnect = SQL_API_SQLDRIVERCONNECT,
+ en_BrowseConnect = SQL_API_SQLBROWSECONNECT,
+
+ en_DataSources = SQL_API_SQLDATASOURCES,
+ en_Drivers = SQL_API_SQLDRIVERS,
+ en_GetInfo = SQL_API_SQLGETINFO,
+ en_GetFunctions = SQL_API_SQLGETFUNCTIONS,
+ en_GetTypeInfo = SQL_API_SQLGETTYPEINFO,
+
+ en_SetConnectOption = SQL_API_SQLSETCONNECTOPTION,
+ en_GetConnectOption = SQL_API_SQLGETCONNECTOPTION,
+ en_SetStmtOption = SQL_API_SQLSETSTMTOPTION,
+ en_GetStmtOption = SQL_API_SQLGETSTMTOPTION,
+
+ en_AllocStmt = SQL_API_SQLALLOCSTMT,
+ en_Prepare = SQL_API_SQLPREPARE,
+ en_BindParameter = SQL_API_SQLBINDPARAMETER,
+ en_ParamOptions = SQL_API_SQLPARAMOPTIONS,
+ en_GetCursorName = SQL_API_SQLGETCURSORNAME,
+ en_SetCursorName = SQL_API_SQLSETCURSORNAME,
+ en_SetScrollOptions = SQL_API_SQLSETSCROLLOPTIONS,
+ en_SetParam = SQL_API_SQLSETPARAM,
+
+ en_Execute = SQL_API_SQLEXECUTE,
+ en_ExecDirect = SQL_API_SQLEXECDIRECT,
+ en_NativeSql = SQL_API_SQLNATIVESQL,
+ en_DescribeParam = SQL_API_SQLDESCRIBEPARAM,
+ en_NumParams = SQL_API_SQLNUMPARAMS,
+ en_ParamData = SQL_API_SQLPARAMDATA,
+ en_PutData = SQL_API_SQLPUTDATA,
+
+ en_RowCount = SQL_API_SQLROWCOUNT,
+ en_NumResultCols = SQL_API_SQLNUMRESULTCOLS,
+ en_DescribeCol = SQL_API_SQLDESCRIBECOL,
+ en_ColAttributes = SQL_API_SQLCOLATTRIBUTES,
+ en_BindCol = SQL_API_SQLBINDCOL,
+ en_Fetch = SQL_API_SQLFETCH,
+ en_ExtendedFetch = SQL_API_SQLEXTENDEDFETCH,
+ en_GetData = SQL_API_SQLGETDATA,
+ en_SetPos = SQL_API_SQLSETPOS,
+ en_MoreResults = SQL_API_SQLMORERESULTS,
+ en_Error = SQL_API_SQLERROR,
+
+ en_ColumnPrivileges = SQL_API_SQLCOLUMNPRIVILEGES,
+ en_Columns = SQL_API_SQLCOLUMNS,
+ en_ForeignKeys = SQL_API_SQLFOREIGNKEYS,
+ en_PrimaryKeys = SQL_API_SQLPRIMARYKEYS,
+ en_ProcedureColumns = SQL_API_SQLPROCEDURECOLUMNS,
+ en_Procedures = SQL_API_SQLPROCEDURES,
+ en_SpecialColumns = SQL_API_SQLSPECIALCOLUMNS,
+ en_Statistics = SQL_API_SQLSTATISTICS,
+ en_TablePrivileges = SQL_API_SQLTABLEPRIVILEGES,
+ en_Tables = SQL_API_SQLTABLES,
+
+ en_FreeStmt = SQL_API_SQLFREESTMT,
+ en_Cancel = SQL_API_SQLCANCEL,
+ en_Transact = SQL_API_SQLTRANSACT,
+
+ en_Disconnect = SQL_API_SQLDISCONNECT,
+ en_FreeConnect = SQL_API_SQLFREECONNECT,
+ en_FreeEnv = SQL_API_SQLFREEENV,
+
+ en_NullProc = SYSERR
+ };
+
+typedef struct
+ {
+ int type; /* must be 1st field */
+
+ HENV henv; /* driver's env list */
+ HDBC hdbc; /* driver's dbc list */
+ HERR herr; /* err list */
+ int state;
+ }
+GENV_t;
+
+typedef struct
+ {
+ HENV next; /* next attached env handle */
+ int refcount; /* Driver's bookkeeping reference count */
+ HPROC dllproc_tab[SQL_EXT_API_LAST + 1]; /* driver api calls */
+
+ HENV dhenv; /* driver env handle */
+ HDLL hdll; /* drvier share library handle */
+ }
+ENV_t;
/* Note:
- *
- * - ODBC applications only know about global environment handle,
+
+ * - ODBC applications only know about global environment handle,
* a void pointer points to a GENV_t object. There is only one
* this object per process(however, to make the library reentrant,
- * we still keep this object on heap). Applications only know
+ * we still keep this object on heap). Applications only know
* address of this object and needn't care about its detail.
*
* - ODBC driver manager knows about instance environment handles,
* - Applications can get driver's environment object handle by
* SQLGetInfo() with fInfoType equals to SQL_DRIVER_HENV
*/
-
#endif
-/** Error stack management functions
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
-
-#include <../iodbc/itrace.h>
-
-#include "../iodbc/herr.ci"
-#include <strings.h>
-#include <stdio.h>
-
-static HERR _iodbcdm_popsqlerr( HERR herr )
+/*
+ * herr.c
+ *
+ * $Id$
+ *
+ * Error stack management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
+
+#include "herr.ci"
+
+static HERR
+_iodbcdm_popsqlerr (HERR herr)
{
- sqlerr_t* list = (sqlerr_t*)herr;
- sqlerr_t* next;
+ sqlerr_t *list = (sqlerr_t *) herr;
+ sqlerr_t *next;
- if( herr == SQL_NULL_HERR )
- {
- return herr;
- }
+ if (herr == SQL_NULL_HERR)
+ {
+ return herr;
+ }
- next = list->next;
+ next = list->next;
- MEM_FREE (list);
+ MEM_FREE (list);
- return next;
+ return next;
}
-void _iodbcdm_freesqlerrlist( HERR herrlist )
+
+void
+_iodbcdm_freesqlerrlist (HERR herrlist)
{
- HERR list;
+ HERR list;
- for(list = herrlist; list!= 0; )
- {
- list = _iodbcdm_popsqlerr(list);
- }
+ for (list = herrlist; list != 0;)
+ {
+ list = _iodbcdm_popsqlerr (list);
+ }
}
-HERR _iodbcdm_pushsqlerr (
- HERR herr,
- sqlstcode_t code,
- char* msg )
+
+HERR
+_iodbcdm_pushsqlerr (
+ HERR herr,
+ sqlstcode_t code,
+ char *msg)
{
- sqlerr_t* ebuf;
- sqlerr_t* perr = (sqlerr_t*)herr;
- int idx = 0;
+ sqlerr_t *ebuf;
+ sqlerr_t *perr = (sqlerr_t *) herr;
+ int idx = 0;
- if(herr != SQL_NULL_HERR )
- {
- idx = perr->idx + 1;
- }
+ if (herr != SQL_NULL_HERR)
+ {
+ idx = perr->idx + 1;
+ }
- if( idx == 64 )
- /* over wirte the top entry to prevent error stack blow out */
- {
- perr->code = code;
- perr->msg = msg;
+ if (idx == 64)
+ /* over wirte the top entry to prevent error stack blow out */
+ {
+ perr->code = code;
+ perr->msg = msg;
- return herr;
- }
+ return herr;
+ }
- ebuf = (sqlerr_t*)MEM_ALLOC (sizeof(sqlerr_t));
+ ebuf = (sqlerr_t *) MEM_ALLOC (sizeof (sqlerr_t));
- if( ebuf == NULL )
- {
- return NULL;
- }
+ if (ebuf == NULL)
+ {
+ return NULL;
+ }
- ebuf->msg = msg;
- ebuf->code = code;
- ebuf->idx = idx;
- ebuf->next = (sqlerr_t*)herr;
+ ebuf->msg = msg;
+ ebuf->code = code;
+ ebuf->idx = idx;
+ ebuf->next = (sqlerr_t *) herr;
- return (HERR)ebuf;
+ return (HERR) ebuf;
}
-static char FAR* _iodbcdm_getsqlstate (
- HERR herr,
- void FAR* tab )
+
+static char FAR *
+_iodbcdm_getsqlstate (
+ HERR herr,
+ void FAR * tab)
{
- sqlerr_t* perr = (sqlerr_t*)herr;
- sqlerrmsg_t* ptr;
-
- if( herr == SQL_NULL_HERR || tab == NULL )
- {
- return (char FAR*)NULL;
- }
-
- for( ptr = tab;
- ptr->code != en_sqlstat_total;
- ptr++ )
- {
- if(ptr->code == perr->code)
- {
- return (char FAR*)(ptr->stat);
- }
- }
-
- return (char FAR*)NULL;
+ sqlerr_t *perr = (sqlerr_t *) herr;
+ sqlerrmsg_t *ptr;
+
+ if (herr == SQL_NULL_HERR || tab == NULL)
+ {
+ return (char FAR *) NULL;
+ }
+
+ for (ptr = tab;
+ ptr->code != en_sqlstat_total;
+ ptr++)
+ {
+ if (ptr->code == perr->code)
+ {
+ return (char FAR *) (ptr->stat);
+ }
+ }
+
+ return (char FAR *) NULL;
}
-static char FAR* _iodbcdm_getsqlerrmsg(
- HERR herr,
- void FAR* errtab )
+
+static char FAR *
+_iodbcdm_getsqlerrmsg (
+ HERR herr,
+ void FAR * errtab)
{
- sqlerr_t* perr = (sqlerr_t*)herr;
- sqlerrmsg_t* ptr;
-
- if( herr == SQL_NULL_HERR )
- {
- return NULL;
- }
-
- if( perr->msg == NULL && errtab == NULL )
- {
- return NULL;
- }
-
- if( perr->msg != NULL )
- {
- return perr->msg;
- }
-
- for( ptr = (sqlerrmsg_t*)errtab;
- ptr->code != en_sqlstat_total;
- ptr++ )
- {
- if( ptr->code == perr->code )
- {
- return (char FAR*)ptr->msg;
- }
- }
-
- return (char FAR*)NULL;
+ sqlerr_t *perr = (sqlerr_t *) herr;
+ sqlerrmsg_t *ptr;
+
+ if (herr == SQL_NULL_HERR)
+ {
+ return NULL;
+ }
+
+ if (perr->msg == NULL && errtab == NULL)
+ {
+ return NULL;
+ }
+
+ if (perr->msg != NULL)
+ {
+ return perr->msg;
+ }
+
+ for (ptr = (sqlerrmsg_t *) errtab;
+ ptr->code != en_sqlstat_total;
+ ptr++)
+ {
+ if (ptr->code == perr->code)
+ {
+ return (char FAR *) ptr->msg;
+ }
+ }
+
+ return (char FAR *) NULL;
}
-RETCODE SQL_API SQLError (
- HENV henv,
- HDBC hdbc,
- HSTMT hstmt,
- UCHAR FAR* szSqlstate,
- SDWORD FAR* pfNativeError,
- UCHAR FAR* szErrorMsg,
- SWORD cbErrorMsgMax,
- SWORD FAR* pcbErrorMsg )
+
+RETCODE SQL_API
+SQLError (
+ HENV henv,
+ HDBC hdbc,
+ HSTMT hstmt,
+ UCHAR FAR * szSqlstate,
+ SDWORD FAR * pfNativeError,
+ UCHAR FAR * szErrorMsg,
+ SWORD cbErrorMsgMax,
+ SWORD FAR * pcbErrorMsg)
{
- GENV_t FAR* genv = (GENV_t FAR*) henv;
- DBC_t FAR* pdbc = (DBC_t FAR*) hdbc;
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HDBC thdbc;
-
- HENV dhenv = SQL_NULL_HENV;
- HDBC dhdbc = SQL_NULL_HDBC;
- HSTMT dhstmt = SQL_NULL_HSTMT;
-
- HERR herr = SQL_NULL_HERR;
- HPROC hproc = SQL_NULL_HPROC;
-
- char FAR* errmsg = NULL;
- char FAR* ststr = NULL;
-
- int handle = 0;
- RETCODE retcode = SQL_SUCCESS;
-
- if( hstmt != SQL_NULL_HSTMT ) /* retrive stmt err */
- {
- herr = pstmt->herr;
- thdbc = pstmt->hdbc;
-
- if( thdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
- hproc = _iodbcdm_getproc( thdbc, en_Error );
- dhstmt = pstmt->dhstmt;
- handle = 3;
- }
- else if( hdbc != SQL_NULL_HDBC ) /* retrive dbc err */
- {
- herr = pdbc->herr;
- thdbc = hdbc;
- if( thdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
- hproc = _iodbcdm_getproc( thdbc, en_Error );
- dhdbc = pdbc->dhdbc;
- handle = 2;
-
- if( herr == SQL_NULL_HERR
- && pdbc->henv == SQL_NULL_HENV )
- {
- return SQL_NO_DATA_FOUND;
- }
- }
- else if( henv != SQL_NULL_HENV ) /* retrive env err */
- {
- herr = genv->herr;
-
- /* Drivers shouldn't push error message
- * on envoriment handle */
-
- if( herr == SQL_NULL_HERR )
- {
- return SQL_NO_DATA_FOUND;
- }
-
- handle = 1;
- }
- else
- {
- return SQL_INVALID_HANDLE;
- }
-
- if( szErrorMsg != NULL )
- {
- if( cbErrorMsgMax < 0
- || cbErrorMsgMax > SQL_MAX_MESSAGE_LENGTH - 1 )
- {
- return SQL_ERROR;
- /* SQLError() doesn't post error for itself */
- }
- }
-
- if( herr == SQL_NULL_HERR ) /* no err on drv mng */
- {
- /* call driver */
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( thdbc, retcode, hproc, en_Error, (
- dhenv, dhdbc, dhstmt,
- szSqlstate, pfNativeError,
- szErrorMsg, cbErrorMsgMax, pcbErrorMsg) )
-
-#if 0
- retcode = hproc(dhenv, dhdbc, dhstmt,
- szSqlstate, pfNativeError,
- szErrorMsg, cbErrorMsgMax, pcbErrorMsg);
-#endif
-
- return retcode;
- }
-
- if( szSqlstate != NULL )
- {
- int len;
-
- /* get sql state string */
- ststr = (char FAR*)_iodbcdm_getsqlstate( herr,
- (void FAR*)sqlerrmsg_tab );
-
- if( ststr == NULL)
- {
- len = 0;
- }
- else
- {
- len = (int)STRLEN(ststr);
- }
-
- STRNCPY ( szSqlstate, ststr, len );
- szSqlstate[len] = 0;
- /* buffer size of szSqlstate is not checked. Applications
- * suppose provide enough ( not less than 6 bytes ) buffer
- * or NULL for it.
- */
- }
-
- if( pfNativeError != NULL )
- {
- /* native error code is specific to data source */
- *pfNativeError = (SDWORD)0L;
- }
-
- if( szErrorMsg == NULL || cbErrorMsgMax == 0 )
- {
- if( pcbErrorMsg != NULL )
- {
- *pcbErrorMsg = (SWORD)0;
- }
- }
- else
- {
- int len;
- char msgbuf[256] = { '\0' };
-
- /* get sql state message */
- errmsg = _iodbcdm_getsqlerrmsg(herr,
- (void FAR*)sqlerrmsg_tab);
-
- if(errmsg == NULL)
- {
- errmsg = (char FAR*)"";
- }
-
- sprintf(msgbuf, "%s%s", sqlerrhd, errmsg);
-
- len = STRLEN( msgbuf );
-
- if( len < cbErrorMsgMax - 1 )
- {
- retcode = SQL_SUCCESS;
- }
- else
- {
- len = cbErrorMsgMax - 1;
- retcode = SQL_SUCCESS_WITH_INFO;
- /* and not posts error for itself */
- }
-
- STRNCPY((char*)szErrorMsg, msgbuf, len);
- szErrorMsg[len] = 0;
-
- if( pcbErrorMsg != NULL)
- {
- *pcbErrorMsg = (SWORD)len;
- }
- }
-
- switch(handle) /* free this err */
- {
- case 1:
- genv->herr = _iodbcdm_popsqlerr(genv->herr);
- break;
-
- case 2:
- pdbc->herr = _iodbcdm_popsqlerr(pdbc->herr);
- break;
-
- case 3:
- pstmt->herr= _iodbcdm_popsqlerr(pstmt->herr);
- break;
-
- default:
- break;
- }
-
- return retcode;
+ GENV_t FAR *genv = (GENV_t FAR *) henv;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HDBC thdbc;
+
+ HENV dhenv = SQL_NULL_HENV;
+ HDBC dhdbc = SQL_NULL_HDBC;
+ HSTMT dhstmt = SQL_NULL_HSTMT;
+
+ HERR herr = SQL_NULL_HERR;
+ HPROC hproc = SQL_NULL_HPROC;
+
+ char FAR *errmsg = NULL;
+ char FAR *ststr = NULL;
+
+ int handle = 0;
+ RETCODE retcode = SQL_SUCCESS;
+
+ if (hstmt != SQL_NULL_HSTMT) /* retrive stmt err */
+ {
+ herr = pstmt->herr;
+ thdbc = pstmt->hdbc;
+
+ if (thdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+ hproc = _iodbcdm_getproc (thdbc, en_Error);
+ dhstmt = pstmt->dhstmt;
+ handle = 3;
+ }
+ else if (hdbc != SQL_NULL_HDBC) /* retrive dbc err */
+ {
+ herr = pdbc->herr;
+ thdbc = hdbc;
+ if (thdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+ hproc = _iodbcdm_getproc (thdbc, en_Error);
+ dhdbc = pdbc->dhdbc;
+ handle = 2;
+
+ if (herr == SQL_NULL_HERR
+ && pdbc->henv == SQL_NULL_HENV)
+ {
+ return SQL_NO_DATA_FOUND;
+ }
+ }
+ else if (henv != SQL_NULL_HENV) /* retrive env err */
+ {
+ herr = genv->herr;
+
+ /* Drivers shouldn't push error message
+ * on envoriment handle */
+
+ if (herr == SQL_NULL_HERR)
+ {
+ return SQL_NO_DATA_FOUND;
+ }
+
+ handle = 1;
+ }
+ else
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ if (szErrorMsg != NULL)
+ {
+ if (cbErrorMsgMax < 0
+ || cbErrorMsgMax > SQL_MAX_MESSAGE_LENGTH - 1)
+ {
+ return SQL_ERROR;
+ /* SQLError() doesn't post error for itself */
+ }
+ }
+
+ if (herr == SQL_NULL_HERR) /* no err on drv mng */
+ {
+ /* call driver */
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (thdbc, retcode, hproc, en_Error,
+ (dhenv, dhdbc, dhstmt, szSqlstate, pfNativeError, szErrorMsg,
+ cbErrorMsgMax, pcbErrorMsg))
+
+ return retcode;
+ }
+
+ if (szSqlstate != NULL)
+ {
+ int len;
+
+ /* get sql state string */
+ ststr = (char FAR *) _iodbcdm_getsqlstate (herr,
+ (void FAR *) sqlerrmsg_tab);
+
+ if (ststr == NULL)
+ {
+ len = 0;
+ }
+ else
+ {
+ len = (int) STRLEN (ststr);
+ }
+
+ STRNCPY (szSqlstate, ststr, len);
+ szSqlstate[len] = 0;
+ /* buffer size of szSqlstate is not checked. Applications
+ * suppose provide enough ( not less than 6 bytes ) buffer
+ * or NULL for it.
+ */
+ }
+
+ if (pfNativeError != NULL)
+ {
+ /* native error code is specific to data source */
+ *pfNativeError = (SDWORD) 0L;
+ }
+
+ if (szErrorMsg == NULL || cbErrorMsgMax == 0)
+ {
+ if (pcbErrorMsg != NULL)
+ {
+ *pcbErrorMsg = (SWORD) 0;
+ }
+ }
+ else
+ {
+ int len;
+ char msgbuf[256] = {'\0'};
+
+ /* get sql state message */
+ errmsg = _iodbcdm_getsqlerrmsg (herr, (void FAR *) sqlerrmsg_tab);
+
+ if (errmsg == NULL)
+ {
+ errmsg = (char FAR *) "";
+ }
+
+ sprintf (msgbuf, "%s%s", sqlerrhd, errmsg);
+
+ len = STRLEN (msgbuf);
+
+ if (len < cbErrorMsgMax - 1)
+ {
+ retcode = SQL_SUCCESS;
+ }
+ else
+ {
+ len = cbErrorMsgMax - 1;
+ retcode = SQL_SUCCESS_WITH_INFO;
+ /* and not posts error for itself */
+ }
+
+ STRNCPY ((char *) szErrorMsg, msgbuf, len);
+ szErrorMsg[len] = 0;
+
+ if (pcbErrorMsg != NULL)
+ {
+ *pcbErrorMsg = (SWORD) len;
+ }
+ }
+
+ switch (handle) /* free this err */
+ {
+ case 1:
+ genv->herr = _iodbcdm_popsqlerr (genv->herr);
+ break;
+
+ case 2:
+ pdbc->herr = _iodbcdm_popsqlerr (pdbc->herr);
+ break;
+
+ case 3:
+ pstmt->herr = _iodbcdm_popsqlerr (pstmt->herr);
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
+/*
+ * herr.ci
+ *
+ * $Id$
+ *
+ * Error messages
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
static const sqlerrmsg_t sqlerrmsg_tab[] =
{
{ en_00000, "00000", "" },
{ en_sqlstat_total, NULL, NULL }
};
-static char FAR* sqlerrhd = "[iODBC][Driver Manager]";
+static char FAR* sqlerrhd = "[iODBC][Driver Manager]";
-#ifndef _HERR_H
-#define _HERR_H
+/*
+ * herr.h
+ *
+ * $Id$
+ *
+ * Error stack management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _HERR_H
+#define _HERR_H
-typedef enum {
- en_00000 = 0,
- en_01000,
- en_01002,
- en_01004,
- en_01006,
- en_01S00,
- en_01S01,
- en_01S02,
- en_01S03,
- en_01S04,
- en_07001,
- en_07006,
- en_08001,
- en_08002,
- en_08003,
- en_08004,
- en_08007,
- en_08S01,
- en_21S01,
- en_21S02,
- en_22001,
- en_22003,
- en_22005,
- en_22008,
- en_22012,
- en_22026,
- en_23000,
- en_24000,
- en_25000,
- en_28000,
- en_34000,
- en_37000,
- en_3C000,
- en_40001,
- en_42000,
- en_70100,
- en_IM001,
- en_IM002,
- en_IM003,
- en_IM004,
- en_IM005,
- en_IM006,
- en_IM007,
- en_IM008,
- en_IM009,
- en_IM010,
- en_IM011,
- en_IM012,
- en_IM013,
- en_IM014,
- en_S0001,
- en_S0002,
- en_S0011,
- en_S0012,
- en_S0021,
- en_S0022,
- en_S0023,
- en_S1000,
- en_S1001,
- en_S1002,
- en_S1003,
- en_S1004,
- en_S1008,
- en_S1009,
- en_S1010,
- en_S1011,
- en_S1012,
- en_S1015,
- en_S1090,
- en_S1091,
- en_S1092,
- en_S1093,
- en_S1094,
- en_S1095,
- en_S1096,
- en_S1097,
- en_S1098,
- en_S1099,
- en_S1100,
- en_S1101,
- en_S1103,
- en_S1104,
- en_S1105,
- en_S1106,
- en_S1107,
- en_S1108,
- en_S1109,
- en_S1110,
- en_S1111,
- en_S1C00,
- en_S1T00,
- en_sqlstat_total
-} sqlstcode_t;
+typedef enum
+ {
+ en_00000 = 0,
+ en_01000,
+ en_01002,
+ en_01004,
+ en_01006,
+ en_01S00,
+ en_01S01,
+ en_01S02,
+ en_01S03,
+ en_01S04,
+ en_07001,
+ en_07006,
+ en_08001,
+ en_08002,
+ en_08003,
+ en_08004,
+ en_08007,
+ en_08S01,
+ en_21S01,
+ en_21S02,
+ en_22001,
+ en_22003,
+ en_22005,
+ en_22008,
+ en_22012,
+ en_22026,
+ en_23000,
+ en_24000,
+ en_25000,
+ en_28000,
+ en_34000,
+ en_37000,
+ en_3C000,
+ en_40001,
+ en_42000,
+ en_70100,
+ en_IM001,
+ en_IM002,
+ en_IM003,
+ en_IM004,
+ en_IM005,
+ en_IM006,
+ en_IM007,
+ en_IM008,
+ en_IM009,
+ en_IM010,
+ en_IM011,
+ en_IM012,
+ en_IM013,
+ en_IM014,
+ en_S0001,
+ en_S0002,
+ en_S0011,
+ en_S0012,
+ en_S0021,
+ en_S0022,
+ en_S0023,
+ en_S1000,
+ en_S1001,
+ en_S1002,
+ en_S1003,
+ en_S1004,
+ en_S1008,
+ en_S1009,
+ en_S1010,
+ en_S1011,
+ en_S1012,
+ en_S1015,
+ en_S1090,
+ en_S1091,
+ en_S1092,
+ en_S1093,
+ en_S1094,
+ en_S1095,
+ en_S1096,
+ en_S1097,
+ en_S1098,
+ en_S1099,
+ en_S1100,
+ en_S1101,
+ en_S1103,
+ en_S1104,
+ en_S1105,
+ en_S1106,
+ en_S1107,
+ en_S1108,
+ en_S1109,
+ en_S1110,
+ en_S1111,
+ en_S1C00,
+ en_S1T00,
+ en_sqlstat_total
+ }
+sqlstcode_t;
-typedef void FAR* HERR;
-# define SQL_NULL_HERR ((HERR)NULL)
+typedef void FAR *HERR;
+#define SQL_NULL_HERR ((HERR)NULL)
typedef struct
-{
- sqlstcode_t code;
- char FAR* stat;
- char FAR* msg;
-} sqlerrmsg_t;
+ {
+ sqlstcode_t code;
+ char FAR *stat;
+ char FAR *msg;
+ }
+sqlerrmsg_t;
-typedef struct sqlerr {
- sqlstcode_t code;
- int idx;
- char FAR* msg;
- struct sqlerr* next;
-} sqlerr_t;
+typedef struct sqlerr
+ {
+ sqlstcode_t code;
+ int idx;
+ char FAR *msg;
+ struct sqlerr *next;
+ }
+sqlerr_t;
-extern void _iodbcdm_freesqlerrlist( HERR herr );
-extern HERR _iodbcdm_pushsqlerr ( HERR list, sqlstcode_t code, char* sysmsg );
+extern void _iodbcdm_freesqlerrlist (HERR herr);
+extern HERR _iodbcdm_pushsqlerr (HERR list, sqlstcode_t code, char *sysmsg);
-# define PUSHSYSERR(list, msg) \
- list = (HERR)_iodbcdm_pushsqlerr( (HERR)(list), 0, (char*)msg )
-# define PUSHSQLERR(list, code) \
- list = (HERR)_iodbcdm_pushsqlerr( (HERR)(list), (int)(code), NULL )
-
-
-#endif /* _SQLERR_H */
+#define PUSHSYSERR(list, msg) \
+ list = (HERR)_iodbcdm_pushsqlerr( (HERR)(list), 0, (char*)msg )
+#define PUSHSQLERR(list, code) \
+ list = (HERR)_iodbcdm_pushsqlerr( (HERR)(list), (int)(code), NULL )
+#endif /* _SQLERR_H */
-/** Query statement object management functions
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
-
-#include <../iodbc/itrace.h>
-
-RETCODE SQL_API SQLAllocStmt (
- HDBC hdbc,
- HSTMT FAR* phstmt )
+/*
+ * hstmt.c
+ *
+ * $Id$
+ *
+ * Query statement object management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
+
+RETCODE SQL_API
+SQLAllocStmt (
+ HDBC hdbc,
+ HSTMT FAR * phstmt)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- STMT_t FAR* pstmt = NULL;
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode = SQL_SUCCESS;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ STMT_t FAR *pstmt = NULL;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode = SQL_SUCCESS;
#if (ODBCVER >= 0x0300)
- if( hdbc == SQL_NULL_HDBC
- || pdbc->type != SQL_HANDLE_DBC )
+ if (hdbc == SQL_NULL_HDBC || pdbc->type != SQL_HANDLE_DBC)
#else
- if( hdbc == SQL_NULL_HDBC )
+ if (hdbc == SQL_NULL_HDBC)
#endif
- {
- return SQL_INVALID_HANDLE;
- }
+ {
+ return SQL_INVALID_HANDLE;
+ }
- if( phstmt == NULL )
- {
- PUSHSQLERR ( pdbc->herr, en_S1009 );
+ if (phstmt == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1009);
- return SQL_ERROR;
- }
+ return SQL_ERROR;
+ }
- /* check state */
- switch( pdbc->state )
- {
- case en_dbc_connected:
- case en_dbc_hstmt:
- break;
+ /* check state */
+ switch (pdbc->state)
+ {
+ case en_dbc_connected:
+ case en_dbc_hstmt:
+ break;
- case en_dbc_allocated:
- case en_dbc_needdata:
- PUSHSQLERR ( pdbc->herr, en_08003 );
- *phstmt = SQL_NULL_HSTMT;
- return SQL_ERROR;
+ case en_dbc_allocated:
+ case en_dbc_needdata:
+ PUSHSQLERR (pdbc->herr, en_08003);
+ *phstmt = SQL_NULL_HSTMT;
+ return SQL_ERROR;
- default:
- return SQL_INVALID_HANDLE;
- }
+ default:
+ return SQL_INVALID_HANDLE;
+ }
- pstmt = (STMT_t FAR*)MEM_ALLOC(sizeof(STMT_t));
+ pstmt = (STMT_t FAR *) MEM_ALLOC (sizeof (STMT_t));
- if( pstmt == NULL )
- {
- PUSHSQLERR ( pdbc->herr, en_S1001 );
- *phstmt = SQL_NULL_HSTMT;
+ if (pstmt == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1001);
+ *phstmt = SQL_NULL_HSTMT;
- return SQL_ERROR;
- }
+ return SQL_ERROR;
+ }
#if (ODBCVER >= 0x0300)
- pstmt->type = SQL_HANDLE_STMT;
+ pstmt->type = SQL_HANDLE_STMT;
#endif
- /* initiate the object */
- pstmt->herr = SQL_NULL_HERR;
- pstmt->hdbc = hdbc;
- pstmt->state = en_stmt_allocated;
- pstmt->cursor_state = en_stmt_cursor_no;
- pstmt->prep_state = 0;
- pstmt->asyn_on = en_NullProc;
- pstmt->need_on = en_NullProc;
-
- /* call driver's function */
+
+ /* initiate the object */
+ pstmt->herr = SQL_NULL_HERR;
+ pstmt->hdbc = hdbc;
+ pstmt->state = en_stmt_allocated;
+ pstmt->cursor_state = en_stmt_cursor_no;
+ pstmt->prep_state = 0;
+ pstmt->asyn_on = en_NullProc;
+ pstmt->need_on = en_NullProc;
+
+ /* call driver's function */
+
#if (ODBCVER >= 0x0300)
- hproc = _iodbcdm_getproc( hdbc, en_AllocHandle );
-
- if( hproc )
- {
- CALL_DRIVER ( pstmt->hdbc, hdbc, retcode, hproc,
- en_AllocHandle, (
- SQL_HANDLE_STMT,
- pdbc->dhdbc,
- &(pstmt->dhstmt) ) )
- }
- else
+ hproc = _iodbcdm_getproc (hdbc, en_AllocHandle);
+
+ if (hproc)
+ {
+ CALL_DRIVER (pstmt->hdbc, hdbc, retcode, hproc, en_AllocHandle,
+ (SQL_HANDLE_STMT, pdbc->dhdbc, &(pstmt->dhstmt)))
+ }
+ else
#endif
- {
- hproc = _iodbcdm_getproc( hdbc, en_AllocStmt );
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
- *phstmt = SQL_NULL_HSTMT;
- MEM_FREE ( pstmt );
+ {
+ hproc = _iodbcdm_getproc (hdbc, en_AllocStmt);
- return SQL_ERROR;
- }
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+ *phstmt = SQL_NULL_HSTMT;
+ MEM_FREE (pstmt);
- CALL_DRIVER ( hdbc, retcode, hproc, en_AllocStmt, (
- pdbc->dhdbc, &(pstmt->dhstmt) ) )
- }
+ return SQL_ERROR;
+ }
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- *phstmt = SQL_NULL_HSTMT;
- MEM_FREE ( pstmt );
+ CALL_DRIVER (hdbc, retcode, hproc, en_AllocStmt,
+ (pdbc->dhdbc, &(pstmt->dhstmt)))
+ }
- return retcode;
- }
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ *phstmt = SQL_NULL_HSTMT;
+ MEM_FREE (pstmt);
- /* insert into list */
- pstmt->next = pdbc->hstmt;
- pdbc->hstmt = pstmt;
+ return retcode;
+ }
- *phstmt = (HSTMT)pstmt;
+ /* insert into list */
+ pstmt->next = pdbc->hstmt;
+ pdbc->hstmt = pstmt;
- /* state transition */
- pdbc->state = en_dbc_hstmt;
+ *phstmt = (HSTMT) pstmt;
- return SQL_SUCCESS;
+ /* state transition */
+ pdbc->state = en_dbc_hstmt;
+
+ return SQL_SUCCESS;
}
-RETCODE _iodbcdm_dropstmt( HSTMT hstmt )
+
+RETCODE
+_iodbcdm_dropstmt (HSTMT hstmt)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- STMT_t FAR* tpstmt;
- DBC_t FAR* pdbc;
-
- if( hstmt == SQL_NULL_HSTMT )
- {
- return SQL_INVALID_HANDLE;
- }
-
- pdbc = (DBC_t FAR*)(pstmt->hdbc);
-
- for(tpstmt = (STMT_t FAR*)pdbc->hstmt;
- tpstmt != NULL;
- tpstmt = tpstmt->next )
- {
- if(tpstmt == pstmt)
- {
- pdbc->hstmt = (HSTMT)pstmt->next;
- break;
- }
-
- if(tpstmt->next == pstmt)
- {
- tpstmt->next = pstmt->next;
- break;
- }
- }
-
- if( tpstmt == NULL )
- {
- return SQL_INVALID_HANDLE;
- }
-
- _iodbcdm_freesqlerrlist(pstmt->herr);
- MEM_FREE(hstmt);
-
- return SQL_SUCCESS;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ STMT_t FAR *tpstmt;
+ DBC_t FAR *pdbc;
+
+ if (hstmt == SQL_NULL_HSTMT)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ pdbc = (DBC_t FAR *) (pstmt->hdbc);
+
+ for (tpstmt = (STMT_t FAR *) pdbc->hstmt;
+ tpstmt != NULL;
+ tpstmt = tpstmt->next)
+ {
+ if (tpstmt == pstmt)
+ {
+ pdbc->hstmt = (HSTMT) pstmt->next;
+ break;
+ }
+
+ if (tpstmt->next == pstmt)
+ {
+ tpstmt->next = pstmt->next;
+ break;
+ }
+ }
+
+ if (tpstmt == NULL)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ _iodbcdm_freesqlerrlist (pstmt->herr);
+ MEM_FREE (hstmt);
+
+ return SQL_SUCCESS;
}
-RETCODE SQL_API SQLFreeStmt (
- HSTMT hstmt,
- UWORD fOption )
+
+RETCODE SQL_API
+SQLFreeStmt (
+ HSTMT hstmt,
+ UWORD fOption)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- STMT_t FAR* tpstmt;
- DBC_t FAR* pdbc;
-
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- pdbc = (DBC_t FAR*)(pstmt->hdbc);
-
- /* check option */
- switch( fOption )
- {
- case SQL_DROP:
- case SQL_CLOSE:
- case SQL_UNBIND:
- case SQL_RESET_PARAMS:
- break;
-
- default:
- PUSHSQLERR ( pstmt->herr, en_S1092 );
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- hproc == SQL_NULL_HPROC;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ STMT_t FAR *tpstmt;
+ DBC_t FAR *pdbc;
-#if (ODBCVER >= 0x0300)
- if( fOption == SQL_DROP )
- {
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_FreeHandle );
-
- if( hproc )
- {
- CALL_DRIVER( pstmt->hdbc, retcode, hproc, en_FreeHandle, (
- SQL_HANDLE_STMT, pstmt->dhstmt )
- }
- }
-#endif
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
- if( hproc == SQL_NULL_HPROC )
- {
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_FreeStmt);
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_FreeStmt, (
- pstmt->dhstmt, fOption) )
- }
-
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- return retcode;
- }
-
- /* state transition */
- switch( fOption )
- {
- case SQL_DROP:
- /* delet this object (ignore return) */
- _iodbcdm_dropstmt( hstmt );
- break;
-
- case SQL_CLOSE:
- pstmt->cursor_state = en_stmt_cursor_no;
- /* This means cursor name set by
- * SQLSetCursorName() call will also
- * be erased.
- */
-
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- break;
-
- case en_stmt_executed:
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( pstmt->prep_state )
- {
- pstmt->state =
- en_stmt_prepared;
- }
- else
- {
- pstmt->state =
- en_stmt_allocated;
- }
- break;
-
- default:
- break;
- }
- break;
-
- case SQL_UNBIND:
- case SQL_RESET_PARAMS:
- default:
- break;
- }
-
- return retcode;
-}
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
-RETCODE SQL_API SQLSetStmtOption (
- HSTMT hstmt,
- UWORD fOption,
- UDWORD vParam )
-{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- int sqlstat = en_00000;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check option */
- if(/* fOption < SQL_STMT_OPT_MIN || */
- fOption > SQL_STMT_OPT_MAX )
- {
- PUSHSQLERR ( pstmt->herr, en_S1092 );
-
- return SQL_ERROR;
- }
-
- if( fOption == SQL_CONCURRENCY
- || fOption == SQL_CURSOR_TYPE
- || fOption == SQL_SIMULATE_CURSOR
- || fOption == SQL_USE_BOOKMARKS )
- {
- if( pstmt->asyn_on != en_NullProc )
- {
- if( pstmt->prep_state )
- {
- sqlstat = en_S1011;
- }
- }
- else
- {
- switch( pstmt->state )
- {
- case en_stmt_prepared:
- sqlstat = en_S1011;
- break;
-
- case en_stmt_executed:
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- sqlstat = en_24000;
- break;
-
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- if( pstmt->prep_state )
- {
- sqlstat = en_S1011;
- }
- break;
-
- default:
- break;
- }
- }
- }
- else
- {
- if( pstmt->asyn_on != en_NullProc )
- {
- if( ! pstmt->prep_state )
- {
- sqlstat = en_S1010;
- }
- }
- else
- {
- if( pstmt->state >= en_stmt_needdata )
- {
- sqlstat = en_S1010;
- }
- }
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_SetStmtOption );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_SetStmtOption, (
- pstmt->dhstmt, fOption, vParam ) )
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, fOption, vParam );
-#endif
+ pdbc = (DBC_t FAR *) (pstmt->hdbc);
- return retcode;
-}
+ /* check option */
+ switch (fOption)
+ {
+ case SQL_DROP:
+ case SQL_CLOSE:
+ case SQL_UNBIND:
+ case SQL_RESET_PARAMS:
+ break;
-RETCODE SQL_API SQLGetStmtOption (
- HSTMT hstmt,
- UWORD fOption,
- PTR pvParam )
-{
- STMT_t FAR* pstmt = (STMT_t*)hstmt;
- HPROC hproc;
- int sqlstat = en_00000;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check option */
- if( /* fOption < SQL_STMT_OPT_MIN || */
- fOption > SQL_STMT_OPT_MAX )
- {
- PUSHSQLERR ( pstmt->herr, en_S1092 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- sqlstat = en_S1010;
- }
- else
- {
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- case en_stmt_executed:
- case en_stmt_cursoropen:
- if( fOption == SQL_ROW_NUMBER
- || fOption == SQL_GET_BOOKMARK )
- {
- sqlstat = en_24000;
- }
- break;
-
- default:
- break;
- }
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_GetStmtOption);
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_GetStmtOption, (
- pstmt->dhstmt, fOption, pvParam ) )
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, fOption, pvParam );
-#endif
+ default:
+ PUSHSQLERR (pstmt->herr, en_S1092);
+ return SQL_ERROR;
+ }
- return retcode;
-}
+ /* check state */
+ if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
-RETCODE SQL_API SQLCancel ( HSTMT hstmt )
-{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
+ return SQL_ERROR;
+ }
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
+ hproc = SQL_NULL_HPROC;
- /* check argument */
- /* check state */
+#if (ODBCVER >= 0x0300)
+ if (fOption == SQL_DROP)
+ {
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_FreeHandle);
+
+ if (hproc)
+ {
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_FreeHandle,
+ (SQL_HANDLE_STMT, pstmt->dhstmt))
+ }
+ }
+#endif
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Cancel );
+ if (hproc == SQL_NULL_HPROC)
+ {
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_FreeStmt);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_FreeStmt,
+ (pstmt->dhstmt, fOption))
+ }
+
+ if (retcode != SQL_SUCCESS
+ && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ return retcode;
+ }
+
+ /* state transition */
+ switch (fOption)
+ {
+ case SQL_DROP:
+ /* delet this object (ignore return) */
+ _iodbcdm_dropstmt (hstmt);
+ break;
+
+ case SQL_CLOSE:
+ pstmt->cursor_state = en_stmt_cursor_no;
+ /* This means cursor name set by
+ * SQLSetCursorName() call will also
+ * be erased.
+ */
+
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ break;
+
+ case en_stmt_executed:
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (pstmt->prep_state)
+ {
+ pstmt->state =
+ en_stmt_prepared;
+ }
+ else
+ {
+ pstmt->state =
+ en_stmt_allocated;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case SQL_UNBIND:
+ case SQL_RESET_PARAMS:
+ default:
+ break;
+ }
+
+ return retcode;
+}
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
- return SQL_ERROR;
- }
+RETCODE SQL_API
+SQLSetStmtOption (
+ HSTMT hstmt,
+ UWORD fOption,
+ UDWORD vParam)
+{
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ int sqlstat = en_00000;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check option */
+ if ( /* fOption < SQL_STMT_OPT_MIN || */
+ fOption > SQL_STMT_OPT_MAX)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1092);
+
+ return SQL_ERROR;
+ }
+
+ if (fOption == SQL_CONCURRENCY
+ || fOption == SQL_CURSOR_TYPE
+ || fOption == SQL_SIMULATE_CURSOR
+ || fOption == SQL_USE_BOOKMARKS)
+ {
+ if (pstmt->asyn_on != en_NullProc)
+ {
+ if (pstmt->prep_state)
+ {
+ sqlstat = en_S1011;
+ }
+ }
+ else
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_prepared:
+ sqlstat = en_S1011;
+ break;
+
+ case en_stmt_executed:
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ sqlstat = en_24000;
+ break;
+
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ if (pstmt->prep_state)
+ {
+ sqlstat = en_S1011;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (pstmt->asyn_on != en_NullProc)
+ {
+ if (!pstmt->prep_state)
+ {
+ sqlstat = en_S1010;
+ }
+ }
+ else
+ {
+ if (pstmt->state >= en_stmt_needdata)
+ {
+ sqlstat = en_S1010;
+ }
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetStmtOption);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetStmtOption,
+ (pstmt->dhstmt, fOption, vParam))
+
+ return retcode;
+}
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_Cancel, (pstmt->dhstmt) )
-#if 0
- retcode = hproc ( pstmt->dhstmt );
-#endif
+RETCODE SQL_API
+SQLGetStmtOption (
+ HSTMT hstmt,
+ UWORD fOption,
+ PTR pvParam)
+{
+ STMT_t FAR *pstmt = (STMT_t *) hstmt;
+ HPROC hproc;
+ int sqlstat = en_00000;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check option */
+ if ( /* fOption < SQL_STMT_OPT_MIN || */
+ fOption > SQL_STMT_OPT_MAX)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1092);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->state >= en_stmt_needdata
+ || pstmt->asyn_on != en_NullProc)
+ {
+ sqlstat = en_S1010;
+ }
+ else
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ case en_stmt_executed:
+ case en_stmt_cursoropen:
+ if (fOption == SQL_ROW_NUMBER || fOption == SQL_GET_BOOKMARK)
+ {
+ sqlstat = en_24000;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetStmtOption);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_GetStmtOption,
+ (pstmt->dhstmt, fOption, pvParam))
+
+ return retcode;
+}
- /* state transition */
- if( retcode != SQL_SUCCESS
- && retcode != SQL_SUCCESS_WITH_INFO )
- {
- return retcode;
- }
-
- switch( pstmt->state )
- {
- case en_stmt_allocated:
- case en_stmt_prepared:
- break;
-
- case en_stmt_executed:
- if( pstmt->prep_state )
- {
- pstmt->state = en_stmt_prepared;
- }
- else
- {
- pstmt->state = en_stmt_allocated;
- }
- break;
-
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( pstmt->prep_state )
- {
- pstmt->state = en_stmt_prepared;
- }
- else
- {
- pstmt->state = en_stmt_allocated;
- }
- break;
-
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- switch( pstmt->need_on )
- {
- case en_ExecDirect:
- pstmt->state = en_stmt_allocated;
- break;
-
- case en_Execute:
- pstmt->state = en_stmt_prepared;
- break;
-
- case en_SetPos:
- pstmt->state = en_stmt_xfetched;
- break;
-
- default:
- break;
- }
- pstmt->need_on = en_NullProc;
- break;
-
- default:
- break;
- }
-
- return retcode;
+
+RETCODE SQL_API
+SQLCancel (HSTMT hstmt)
+{
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+ /* check state */
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Cancel);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Cancel,
+ (pstmt->dhstmt))
+
+ /* state transition */
+ if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
+ {
+ return retcode;
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_allocated:
+ case en_stmt_prepared:
+ break;
+
+ case en_stmt_executed:
+ if (pstmt->prep_state)
+ {
+ pstmt->state = en_stmt_prepared;
+ }
+ else
+ {
+ pstmt->state = en_stmt_allocated;
+ }
+ break;
+
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (pstmt->prep_state)
+ {
+ pstmt->state = en_stmt_prepared;
+ }
+ else
+ {
+ pstmt->state = en_stmt_allocated;
+ }
+ break;
+
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ switch (pstmt->need_on)
+ {
+ case en_ExecDirect:
+ pstmt->state = en_stmt_allocated;
+ break;
+
+ case en_Execute:
+ pstmt->state = en_stmt_prepared;
+ break;
+
+ case en_SetPos:
+ pstmt->state = en_stmt_xfetched;
+ break;
+
+ default:
+ break;
+ }
+ pstmt->need_on = en_NullProc;
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-#ifndef _HSTMT_H
-#define _HSTMT_H
+/*
+ * hstmt.h
+ *
+ * $Id$
+ *
+ * Query statement object management functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _HSTMT_H
+#define _HSTMT_H
-#include <config.h>
+#include <config.h>
-#include <isql.h>
-#include <isqlext.h>
+#include <isql.h>
+#include <isqlext.h>
typedef struct STMT
-{
- int type; /* must be 1st field */
-
- struct STMT* next;
-
- HERR herr;
- HDBC hdbc; /* back point to connection object */
- HSTMT dhstmt; /* driver's stmt handle */
-
- int state;
- int cursor_state;
- int prep_state;
- int asyn_on; /* async executing which odbc call */
- int need_on; /* which call return SQL_NEED_DATA */
-} STMT_t;
-
-enum {
- en_stmt_allocated = 0,
- en_stmt_prepared,
- en_stmt_executed,
- en_stmt_cursoropen,
- en_stmt_fetched,
- en_stmt_xfetched,
- en_stmt_needdata, /* not call SQLParamData() yet */
- en_stmt_mustput, /* not call SQLPutData() yet */
- en_stmt_canput /* SQLPutData() called */
-}; /* for statement handle state */
-
-enum {
- en_stmt_cursor_no = 0,
- en_stmt_cursor_named,
- en_stmt_cursor_opened,
- en_stmt_cursor_fetched,
- en_stmt_cursor_xfetched
-}; /* for statement cursor state */
-
-extern RETCODE _iodbcdm_dropstmt();
+ {
+ int type; /* must be 1st field */
+ struct STMT *next;
+
+ HERR herr;
+ HDBC hdbc; /* back point to connection object */
+ HSTMT dhstmt; /* driver's stmt handle */
+
+ int state;
+ int cursor_state;
+ int prep_state;
+ int asyn_on; /* async executing which odbc call */
+ int need_on; /* which call return SQL_NEED_DATA */
+ }
+STMT_t;
+
+enum
+ {
+ en_stmt_allocated = 0,
+ en_stmt_prepared,
+ en_stmt_executed,
+ en_stmt_cursoropen,
+ en_stmt_fetched,
+ en_stmt_xfetched,
+ en_stmt_needdata, /* not call SQLParamData() yet */
+ en_stmt_mustput, /* not call SQLPutData() yet */
+ en_stmt_canput /* SQLPutData() called */
+ }; /* for statement handle state */
+
+enum
+ {
+ en_stmt_cursor_no = 0,
+ en_stmt_cursor_named,
+ en_stmt_cursor_opened,
+ en_stmt_cursor_fetched,
+ en_stmt_cursor_xfetched
+ }; /* for statement cursor state */
+
+extern RETCODE _iodbcdm_dropstmt ();
#endif
-/** Information functions
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
-
-#include <../iodbc/itrace.h>
-
-#include <strings.h>
-#include <stdio.h>
-
-RETCODE SQL_API SQLDataSources(
- HENV henv,
- UWORD fDir,
- UCHAR FAR* szDSN,
- SWORD cbDSNMax,
- SWORD FAR* pcbDSN,
- UCHAR FAR* szDesc,
- SWORD cbDescMax,
- SWORD FAR* pcbDesc )
+/*
+ * info.c
+ *
+ * $Id$
+ *
+ * Information functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
+
+#include <stdio.h>
+#include <ctype.h>
+
+#define SECT1 "ODBC Data Sources"
+#define SECT2 "Default"
+#define MAX_ENTRIES 1024
+
+extern char * _iodbcdm_getinifile (char *buf, int size);
+extern char * _iodbcdm_getkeyvalbydsn (char *dsn, int dsnlen, char *keywd, char *value, int size);
+
+static int
+stricmp (const char *s1, const char *s2)
{
- GENV_t FAR* genv = (GENV_t FAR*)henv;
-
- if( henv == SQL_NULL_HENV )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
- if( cbDSNMax < 0 || cbDescMax < 0 )
- {
- PUSHSQLERR ( genv->herr, en_S1090 );
-
- return SQL_ERROR;
- }
+ int cmp;
+
+ while (*s1)
+ {
+ if ((cmp = toupper (*s1) - toupper (*s2)) != 0)
+ return cmp;
+ s1++;
+ s2++;
+ }
+ return (*s2) ? -1 : 0;
+}
- if( fDir != SQL_FETCH_FIRST
- && fDir != SQL_FETCH_NEXT )
- {
- PUSHSQLERR ( genv->herr, en_S1103 );
+static int
+SectSorter (const void *p1, const void *p2)
+{
+ char **s1 = (char **) p1;
+ char **s2 = (char **) p2;
- return SQL_ERROR;
- }
+ return stricmp (*s1, *s2);
+}
- /*************************/
- return SQL_SUCCESS;
+RETCODE SQL_API
+SQLDataSources (
+ HENV henv,
+ UWORD fDir,
+ UCHAR FAR * szDSN,
+ SWORD cbDSNMax,
+ SWORD FAR * pcbDSN,
+ UCHAR FAR * szDesc,
+ SWORD cbDescMax,
+ SWORD FAR * pcbDesc)
+{
+ GENV_t FAR *genv = (GENV_t FAR *) henv;
+ char *path;
+ char buf[1024];
+ FILE *fp;
+ int i;
+ static int cur_entry = -1;
+ static int num_entries = 0;
+ static char **sect = NULL;
+
+ if (henv == SQL_NULL_HENV)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+ /* check argument */
+ if (cbDSNMax < 0 || cbDescMax < 0)
+ {
+ PUSHSQLERR (genv->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+ if (fDir != SQL_FETCH_FIRST
+ && fDir != SQL_FETCH_NEXT)
+ {
+ PUSHSQLERR (genv->herr, en_S1103);
+
+ return SQL_ERROR;
+ }
+ if (cur_entry < 0 || fDir == SQL_FETCH_FIRST)
+ {
+ cur_entry = 0;
+ num_entries = 0;
+
+
+ /*
+ * Open the odbc.ini file
+ */
+ path = (char *) _iodbcdm_getinifile (buf, sizeof (buf));
+ if ((fp = fopen (path, "r")) == NULL)
+ {
+ return SQL_NO_DATA_FOUND;
+ }
+ /*
+ * Free old section list
+ */
+ if (sect)
+ {
+ for (i = 0; i < MAX_ENTRIES; i++)
+ if (sect[i])
+ free (sect[i]);
+ free (sect);
+ }
+ if ((sect = (char **) calloc (MAX_ENTRIES, sizeof (char *))) == NULL)
+ {
+ PUSHSQLERR (genv->herr, en_S1011);
+
+ return SQL_ERROR;
+ }
+ /*
+ * Build a dynamic list of sections
+ */
+ while (1)
+ {
+ char *str, *p;
+
+ str = fgets (buf, sizeof (buf), fp);
+
+ if (str == NULL)
+ break;
+
+ if (*str == '[')
+ {
+ str++;
+ for (p = str; *p; p++)
+ if (*p == ']')
+ *p = '\0';
+
+ if (!strcmp (str, SECT1))
+ continue;
+ if (!strcmp (str, SECT2))
+ continue;
+
+ /*
+ * Add this section to the comma separated list
+ */
+ if (num_entries >= MAX_ENTRIES)
+ break; /* Skip the rest */
+
+ sect[num_entries++] = (char *) strdup (str);
+ }
+ }
+
+ /*
+ * Sort all entries so we can present a nice list
+ */
+ if (num_entries > 1)
+ qsort (sect, num_entries, sizeof (char *), SectSorter);
+ }
+ /*
+ * Try to get to the next item
+ */
+ if (cur_entry >= num_entries)
+ {
+ cur_entry = 0; /* Next time, start all over again */
+ return SQL_NO_DATA_FOUND;
+ }
+ /*
+ * Copy DSN information
+ */
+ STRNCPY (szDSN, sect[cur_entry], cbDSNMax);
+
+ /*
+ * And find the description that goes with this entry
+ */
+ _iodbcdm_getkeyvalbydsn (sect[cur_entry], strlen (sect[cur_entry]),
+ "Description", szDesc, cbDescMax);
+
+ /*
+ * Next record
+ */
+ cur_entry++;
+
+ return SQL_SUCCESS;
}
-RETCODE SQL_API SQLDrivers(
- HENV henv,
- UWORD fDir,
- UCHAR FAR* szDrvDesc,
- SWORD cbDrvDescMax,
- SWORD FAR* pcbDrvDesc,
- UCHAR FAR* szDrvAttr,
- SWORD cbDrvAttrMax,
- SWORD FAR* pcbDrvAttr )
+
+RETCODE SQL_API
+SQLDrivers (
+ HENV henv,
+ UWORD fDir,
+ UCHAR FAR * szDrvDesc,
+ SWORD cbDrvDescMax,
+ SWORD FAR * pcbDrvDesc,
+ UCHAR FAR * szDrvAttr,
+ SWORD cbDrvAttrMax,
+ SWORD FAR * pcbDrvAttr)
{
- GENV_t FAR* genv = (GENV_t FAR*)henv;
+ GENV_t FAR *genv = (GENV_t FAR *) henv;
- if( henv == SQL_NULL_HENV )
- {
- return SQL_INVALID_HANDLE;
- }
+ if (henv == SQL_NULL_HENV)
+ {
+ return SQL_INVALID_HANDLE;
+ }
- if( cbDrvDescMax < 0
- || cbDrvAttrMax < 0
- || cbDrvAttrMax == 1 )
- {
- PUSHSQLERR ( genv->herr, en_S1090 );
+ if (cbDrvDescMax < 0 || cbDrvAttrMax < 0 || cbDrvAttrMax == 1)
+ {
+ PUSHSQLERR (genv->herr, en_S1090);
- return SQL_ERROR;
- }
+ return SQL_ERROR;
+ }
- if( fDir != SQL_FETCH_FIRST
- || fDir != SQL_FETCH_NEXT )
- {
- PUSHSQLERR ( genv->herr, en_S1103 );
+ if (fDir != SQL_FETCH_FIRST || fDir != SQL_FETCH_NEXT)
+ {
+ PUSHSQLERR (genv->herr, en_S1103);
- return SQL_ERROR;
- }
+ return SQL_ERROR;
+ }
- /*********************/
- return SQL_SUCCESS;
+/*********************/
+ return SQL_NO_DATA_FOUND;
}
-RETCODE SQL_API SQLGetInfo(
- HDBC hdbc,
- UWORD fInfoType,
- PTR rgbInfoValue,
- SWORD cbInfoValueMax,
- SWORD FAR* pcbInfoValue )
+RETCODE SQL_API
+SQLGetInfo (
+ HDBC hdbc,
+ UWORD fInfoType,
+ PTR rgbInfoValue,
+ SWORD cbInfoValueMax,
+ SWORD FAR * pcbInfoValue)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- ENV_t FAR* penv;
- STMT_t FAR* pstmt = NULL;
- STMT_t FAR* tpstmt;
- HPROC hproc;
- RETCODE retcode = SQL_SUCCESS;
-
- DWORD dword;
- int size = 0, len = 0;
- char buf[16] = { '\0' };
-
- if( hdbc == SQL_NULL_HDBC
- || pdbc->henv == SQL_NULL_HENV )
- {
- return SQL_INVALID_HANDLE;
- }
-
- if( cbInfoValueMax < 0 )
- {
- PUSHSQLERR ( pdbc->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- if( /* fInfoType < SQL_INFO_FIRST || */
- ( fInfoType > SQL_INFO_LAST
- && fInfoType < SQL_INFO_DRIVER_START ) )
- {
- PUSHSQLERR ( pdbc->herr, en_S1096 );
-
- return SQL_ERROR;
- }
-
- if( fInfoType == SQL_ODBC_VER )
- {
- sprintf( buf, "%02d.%02d",
- (ODBCVER)>>8, 0x00FF&(ODBCVER) );
-
-
- if( rgbInfoValue != NULL
- && cbInfoValueMax > 0 )
- {
- len = STRLEN( buf );
-
- if( len < cbInfoValueMax - 1 )
- {
- len = cbInfoValueMax - 1;
- PUSHSQLERR ( pdbc->herr, en_01004 );
-
- retcode = SQL_SUCCESS_WITH_INFO;
- }
-
- STRNCPY( rgbInfoValue, buf, len );
- ((char FAR*)rgbInfoValue)[len] = '\0';
- }
-
- if( pcbInfoValue != NULL )
- {
- *pcbInfoValue = (SWORD)len;
- }
-
- return retcode;
- }
-
- if( pdbc->state == en_dbc_allocated
- || pdbc->state == en_dbc_needdata )
- {
- PUSHSQLERR ( pdbc->herr, en_08003 );
-
- return SQL_ERROR;
- }
-
- switch( fInfoType )
- {
- case SQL_DRIVER_HDBC:
- dword = (DWORD)(pdbc->dhdbc);
- size = sizeof(dword);
- break;
-
- case SQL_DRIVER_HENV:
- penv = (ENV_t FAR*)(pdbc->henv);
- dword = (DWORD)(penv->dhenv);
- size = sizeof(dword);
- break;
-
- case SQL_DRIVER_HLIB:
- penv = (ENV_t FAR*)(pdbc->henv);
- dword = (DWORD)(penv->hdll);
- size = sizeof(dword);
- break;
-
- case SQL_DRIVER_HSTMT:
- if( rgbInfoValue != NULL )
- {
- pstmt = *((STMT_t FAR**)rgbInfoValue);
- }
-
- for( tpstmt = (STMT_t FAR*)(pdbc->hstmt);
- tpstmt != NULL;
- tpstmt = tpstmt->next )
- {
- if( tpstmt == pstmt )
- {
- break;
- }
- }
-
- if( tpstmt == NULL )
- {
- PUSHSQLERR ( pdbc->herr, en_S1009 );
-
- return SQL_ERROR;
- }
-
- dword = (DWORD)(pstmt->dhstmt);
- size = sizeof(dword);
- break;
-
- default:
- break;
- }
-
- if( size )
- {
- if( rgbInfoValue != NULL )
- {
- *((DWORD*)rgbInfoValue) = dword;
- }
-
- if( pcbInfoValue != NULL )
- {
- *(pcbInfoValue) = (SWORD)size;
- }
-
- return SQL_SUCCESS;
- }
-
- hproc = _iodbcdm_getproc( hdbc, en_GetInfo );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pdbc->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( hdbc, retcode, hproc, en_GetInfo, (
- pdbc->dhdbc,
- fInfoType,
- rgbInfoValue,
- cbInfoValueMax,
- pcbInfoValue ) )
-
-#if 0
- retcode = hproc(pdbc->dhdbc,
- fInfoType,
- rgbInfoValue,
- cbInfoValueMax,
- pcbInfoValue );
-#endif
-
- if( retcode == SQL_ERROR
- && fInfoType == SQL_DRIVER_ODBC_VER )
- {
- STRCPY( buf, "01.00" );
-
- if( rgbInfoValue != NULL
- && cbInfoValueMax > 0 )
- {
- len = STRLEN( buf );
-
- if( len < cbInfoValueMax - 1 )
- {
- len = cbInfoValueMax - 1;
- PUSHSQLERR ( pdbc->herr, en_01004 );
- }
-
- STRNCPY( rgbInfoValue, buf, len );
- ((char FAR*)rgbInfoValue)[len] = '\0';
- }
-
- if( pcbInfoValue != NULL )
- {
- *pcbInfoValue = (SWORD)len;
- }
-
- /* what should we return in this case ???? */
- }
-
- return retcode;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ ENV_t FAR *penv;
+ STMT_t FAR *pstmt = NULL;
+ STMT_t FAR *tpstmt;
+ HPROC hproc;
+ RETCODE retcode = SQL_SUCCESS;
+
+ DWORD dword;
+ int size = 0, len = 0;
+ char buf[16] = {'\0'};
+
+ if (hdbc == SQL_NULL_HDBC || pdbc->henv == SQL_NULL_HENV)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ if (cbInfoValueMax < 0)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+
+ if ( /* fInfoType < SQL_INFO_FIRST || */
+ (fInfoType > SQL_INFO_LAST
+ && fInfoType < SQL_INFO_DRIVER_START))
+ {
+ PUSHSQLERR (pdbc->herr, en_S1096);
+
+ return SQL_ERROR;
+ }
+
+ if (fInfoType == SQL_ODBC_VER)
+ {
+ sprintf (buf, "%02d.%02d",
+ (ODBCVER) >> 8, 0x00FF & (ODBCVER));
+
+
+ if (rgbInfoValue != NULL
+ && cbInfoValueMax > 0)
+ {
+ len = STRLEN (buf);
+
+ if (len < cbInfoValueMax - 1)
+ {
+ len = cbInfoValueMax - 1;
+ PUSHSQLERR (pdbc->herr, en_01004);
+
+ retcode = SQL_SUCCESS_WITH_INFO;
+ }
+
+ STRNCPY (rgbInfoValue, buf, len);
+ ((char FAR *) rgbInfoValue)[len] = '\0';
+ }
+
+ if (pcbInfoValue != NULL)
+ {
+ *pcbInfoValue = (SWORD) len;
+ }
+
+ return retcode;
+ }
+
+ if (pdbc->state == en_dbc_allocated || pdbc->state == en_dbc_needdata)
+ {
+ PUSHSQLERR (pdbc->herr, en_08003);
+
+ return SQL_ERROR;
+ }
+
+ switch (fInfoType)
+ {
+ case SQL_DRIVER_HDBC:
+ dword = (DWORD) (pdbc->dhdbc);
+ size = sizeof (dword);
+ break;
+
+ case SQL_DRIVER_HENV:
+ penv = (ENV_t FAR *) (pdbc->henv);
+ dword = (DWORD) (penv->dhenv);
+ size = sizeof (dword);
+ break;
+
+ case SQL_DRIVER_HLIB:
+ penv = (ENV_t FAR *) (pdbc->henv);
+ dword = (DWORD) (penv->hdll);
+ size = sizeof (dword);
+ break;
+
+ case SQL_DRIVER_HSTMT:
+ if (rgbInfoValue != NULL)
+ {
+ pstmt = *((STMT_t FAR **) rgbInfoValue);
+ }
+
+ for (tpstmt = (STMT_t FAR *) (pdbc->hstmt);
+ tpstmt != NULL;
+ tpstmt = tpstmt->next)
+ {
+ if (tpstmt == pstmt)
+ {
+ break;
+ }
+ }
+
+ if (tpstmt == NULL)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1009);
+
+ return SQL_ERROR;
+ }
+
+ dword = (DWORD) (pstmt->dhstmt);
+ size = sizeof (dword);
+ break;
+
+ default:
+ break;
+ }
+
+ if (size)
+ {
+ if (rgbInfoValue != NULL)
+ {
+ *((DWORD *) rgbInfoValue) = dword;
+ }
+
+ if (pcbInfoValue != NULL)
+ {
+ *(pcbInfoValue) = (SWORD) size;
+ }
+
+ return SQL_SUCCESS;
+ }
+
+ hproc = _iodbcdm_getproc (hdbc, en_GetInfo);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pdbc->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (hdbc, retcode, hproc, en_GetInfo,
+ (pdbc->dhdbc, fInfoType, rgbInfoValue, cbInfoValueMax, pcbInfoValue))
+
+ if (retcode == SQL_ERROR
+ && fInfoType == SQL_DRIVER_ODBC_VER)
+ {
+ STRCPY (buf, "01.00");
+
+ if (rgbInfoValue != NULL
+ && cbInfoValueMax > 0)
+ {
+ len = STRLEN (buf);
+
+ if (len < cbInfoValueMax - 1)
+ {
+ len = cbInfoValueMax - 1;
+ PUSHSQLERR (pdbc->herr, en_01004);
+ }
+
+ STRNCPY (rgbInfoValue, buf, len);
+ ((char FAR *) rgbInfoValue)[len] = '\0';
+ }
+
+ if (pcbInfoValue != NULL)
+ {
+ *pcbInfoValue = (SWORD) len;
+ }
+
+ /* what should we return in this case ???? */
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLGetFunctions(
- HDBC hdbc,
- UWORD fFunc,
- UWORD FAR* pfExists )
+
+RETCODE SQL_API
+SQLGetFunctions (
+ HDBC hdbc,
+ UWORD fFunc,
+ UWORD FAR * pfExists)
{
- DBC_t FAR* pdbc = (DBC_t FAR*)hdbc;
- HPROC hproc;
- RETCODE retcode;
-
- if( hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- if( fFunc > SQL_EXT_API_LAST )
- {
- PUSHSQLERR ( pdbc->herr, en_S1095 );
-
- return SQL_ERROR;
- }
-
- if( pdbc->state == en_dbc_allocated
- || pdbc->state == en_dbc_needdata )
- {
- PUSHSQLERR ( pdbc->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- if( pfExists == NULL )
- {
- return SQL_SUCCESS;
- }
-
- hproc = _iodbcdm_getproc( hdbc, en_GetFunctions );
-
- if( hproc != SQL_NULL_HPROC )
- {
- CALL_DRIVER ( hdbc, retcode, hproc, en_GetFunctions, (
- pdbc->dhdbc, fFunc, pfExists ) )
-
-#if 0
- retcode = hproc( pdbc->dhdbc, fFunc, pfExists );
-#endif
- return retcode;
- }
-
- if( fFunc == SQL_API_SQLSETPARAM )
- {
- fFunc = SQL_API_SQLBINDPARAMETER;
- }
-
- if( fFunc != SQL_API_ALL_FUNCTIONS )
- {
- hproc = _iodbcdm_getproc( hdbc, fFunc );
-
- if( hproc == SQL_NULL_HPROC )
- {
- *pfExists = (UWORD)0;
- }
- else
- {
- *pfExists = (UWORD)1;
- }
-
- return SQL_SUCCESS;
- }
-
- for( fFunc=0 ; fFunc < 100; fFunc ++ )
- {
- hproc = _iodbcdm_getproc( hdbc, fFunc );
-
- if( hproc == SQL_NULL_HPROC )
- {
- pfExists[fFunc] = (UWORD)0;
- }
- else
- {
- pfExists[fFunc] = (UWORD)1;
- }
- }
-
- return SQL_SUCCESS;
+ DBC_t FAR *pdbc = (DBC_t FAR *) hdbc;
+ HPROC hproc;
+ RETCODE retcode;
+
+ if (hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ if (fFunc > SQL_EXT_API_LAST)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1095);
+
+ return SQL_ERROR;
+ }
+
+ if (pdbc->state == en_dbc_allocated
+ || pdbc->state == en_dbc_needdata)
+ {
+ PUSHSQLERR (pdbc->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ if (pfExists == NULL)
+ {
+ return SQL_SUCCESS;
+ }
+
+ hproc = _iodbcdm_getproc (hdbc, en_GetFunctions);
+
+ if (hproc != SQL_NULL_HPROC)
+ {
+ CALL_DRIVER (hdbc, retcode, hproc, en_GetFunctions,
+ (pdbc->dhdbc, fFunc, pfExists))
+
+ return retcode;
+ }
+
+ if (fFunc == SQL_API_SQLSETPARAM)
+ {
+ fFunc = SQL_API_SQLBINDPARAMETER;
+ }
+
+ if (fFunc != SQL_API_ALL_FUNCTIONS)
+ {
+ hproc = _iodbcdm_getproc (hdbc, fFunc);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ *pfExists = (UWORD) 0;
+ }
+ else
+ {
+ *pfExists = (UWORD) 1;
+ }
+
+ return SQL_SUCCESS;
+ }
+
+ for (fFunc = 0; fFunc < 100; fFunc++)
+ {
+ hproc = _iodbcdm_getproc (hdbc, fFunc);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ pfExists[fFunc] = (UWORD) 0;
+ }
+ else
+ {
+ pfExists[fFunc] = (UWORD) 1;
+ }
+ }
+
+ return SQL_SUCCESS;
}
-#ifndef _INTRINSIC_SQL_H
-# define _INTRINSIC_SQL_H
-
-#ifndef OS2
-typedef unsigned char UCHAR;
-#endif
-typedef long int SDWORD;
-typedef short int SWORD;
-typedef unsigned long int UDWORD;
-typedef unsigned short int UWORD;
-typedef unsigned int UINT;
-
-#ifndef FAR
-# define FAR
+/*
+ * isql.h
+ *
+ * $Id$
+ *
+ * iODBC defines
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _ISQL_H
+#define _ISQL_H
+
+#ifdef WIN32
+#define SQL_API __stdcall
+#else
+#define FAR
+#define EXPORT
+#define CALLBACK
+#define SQL_API EXPORT CALLBACK
+
+typedef void *HWND;
#endif
-#ifndef NEAR
-# define NEAR
-#endif
-#ifndef HANDLE
- typedef int HANDLE;
- #endif
-#ifndef HGLOBAL
- typedef HANDLE HGLOBAL;
- #endif
-#ifndef SQL_INDEX_OTHER
-#define SQL_INDEX_OTHER 3
- #endif
-
-# ifndef BOOL
-# define BOOL int
-# endif
-# ifndef CHAR
-# define CHAR char
-# endif
-# ifndef FALSE
-# define FALSE (0 != 0)
-# endif
-# ifndef HWND
-# define HWND int
-# endif
-# ifndef SQLHWND
-# define SQLHWND int
-# endif
-# ifndef LONG
-# define LONG long
-# endif
-# ifndef PASCAL
-# define PASCAL
-# endif
-# ifndef SHORT
-# define SHORT short
-# endif
-# ifndef SQL_API
-# define SQL_API
-# endif
-# ifndef SQL_LOCAL_API
-# define SQL_LOCAL_API
-# endif
-# ifndef TRUE
-# define TRUE (0 == 0)
-# endif
-
-typedef struct tagDATE_STRUCT
-{
-SWORD year;
-UWORD month;
-UWORD day;
-} DATE_STRUCT;
-typedef struct tagTIME_STRUCT
+typedef unsigned char UCHAR;
+typedef long int SDWORD;
+typedef short int SWORD;
+typedef unsigned long int UDWORD;
+typedef unsigned short int UWORD;
+
+typedef void FAR *PTR;
+typedef void FAR *HENV;
+typedef void FAR *HDBC;
+typedef void FAR *HSTMT;
+
+typedef signed short RETCODE;
+#define SQLRETURN RETCODE
+
+
+#define ODBCVER 0x0250
+
+#define SQL_MAX_MESSAGE_LENGTH 512
+#define SQL_MAX_DSN_LENGTH 32
+
+/*
+ * Function return codes
+ */
+#define SQL_INVALID_HANDLE (-2)
+#define SQL_ERROR (-1)
+#define SQL_SUCCESS 0
+#define SQL_SUCCESS_WITH_INFO 1
+#define SQL_NO_DATA_FOUND 100
+
+/*
+ * Standard SQL datatypes, using ANSI type numbering
+ */
+#define SQL_CHAR 1
+#define SQL_NUMERIC 2
+#define SQL_DECIMAL 3
+#define SQL_INTEGER 4
+#define SQL_SMALLINT 5
+#define SQL_FLOAT 6
+#define SQL_REAL 7
+#define SQL_DOUBLE 8
+#define SQL_VARCHAR 12
+
+#define SQL_TYPE_MIN SQL_CHAR
+#define SQL_TYPE_NULL 0
+#define SQL_TYPE_MAX SQL_VARCHAR
+
+/*
+ * C datatype to SQL datatype mapping
+ */
+#define SQL_C_CHAR SQL_CHAR
+#define SQL_C_LONG SQL_INTEGER
+#define SQL_C_SHORT SQL_SMALLINT
+#define SQL_C_FLOAT SQL_REAL
+#define SQL_C_DOUBLE SQL_DOUBLE
+#define SQL_C_DEFAULT 99
+
+/*
+ * NULL status constants.
+ */
+#define SQL_NO_NULLS 0
+#define SQL_NULLABLE 1
+#define SQL_NULLABLE_UNKNOWN 2
+
+/*
+ * Special length values
+ */
+#define SQL_NULL_DATA (-1)
+#define SQL_DATA_AT_EXEC (-2)
+#define SQL_NTS (-3)
+
+/*
+ * SQLFreeStmt
+ */
+#define SQL_CLOSE 0
+#define SQL_DROP 1
+#define SQL_UNBIND 2
+#define SQL_RESET_PARAMS 3
+
+/*
+ * SQLTransact
+ */
+#define SQL_COMMIT 0
+#define SQL_ROLLBACK 1
+
+/*
+ * SQLColAttributes
+ */
+#define SQL_COLUMN_COUNT 0
+#define SQL_COLUMN_NAME 1
+#define SQL_COLUMN_TYPE 2
+#define SQL_COLUMN_LENGTH 3
+#define SQL_COLUMN_PRECISION 4
+#define SQL_COLUMN_SCALE 5
+#define SQL_COLUMN_DISPLAY_SIZE 6
+#define SQL_COLUMN_NULLABLE 7
+#define SQL_COLUMN_UNSIGNED 8
+#define SQL_COLUMN_MONEY 9
+#define SQL_COLUMN_UPDATABLE 10
+#define SQL_COLUMN_AUTO_INCREMENT 11
+#define SQL_COLUMN_CASE_SENSITIVE 12
+#define SQL_COLUMN_SEARCHABLE 13
+#define SQL_COLUMN_TYPE_NAME 14
+#define SQL_COLUMN_TABLE_NAME 15
+#define SQL_COLUMN_OWNER_NAME 16
+#define SQL_COLUMN_QUALIFIER_NAME 17
+#define SQL_COLUMN_LABEL 18
+
+#define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL
+#define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT
+#define SQL_COLUMN_DRIVER_START 1000
+
+/*
+ * SQLColAttributes : SQL_COLUMN_UPDATABLE
+ */
+#define SQL_ATTR_READONLY 0
+#define SQL_ATTR_WRITE 1
+#define SQL_ATTR_READWRITE_UNKNOWN 2
+
+/*
+ * SQLColAttributes : SQL_COLUMN_SEARCHABLE
+ */
+#define SQL_UNSEARCHABLE 0
+#define SQL_LIKE_ONLY 1
+#define SQL_ALL_EXCEPT_LIKE 2
+#define SQL_SEARCHABLE 3
+
+/*
+ * NULL Handles
+ */
+#define SQL_NULL_HENV 0
+#define SQL_NULL_HDBC 0
+#define SQL_NULL_HSTMT 0
+
+
+/*
+ * Function Prototypes
+ */
+#ifdef __cplusplus
+extern "C"
{
-UWORD hour;
-UWORD minute;
-UWORD second;
-} TIME_STRUCT;
-
-typedef struct tagTIMESTAMP_STRUCT
-{
-SWORD year;
-UWORD month;
-UWORD day;
-UWORD hour;
-UWORD minute;
-UWORD second;
-UDWORD fraction;
-} TIMESTAMP_STRUCT;
-
-
-
-typedef UCHAR FAR* PTR,
- FAR* SQLPTR;
-
-typedef void FAR* HENV,
- FAR* SQLHENV;
-typedef void FAR* HDBC,
- FAR* SQLHDBC;
-typedef void FAR* HSTMT,
- FAR* SQLHSTMT;
-typedef SDWORD SQLINTEGER;
-typedef signed short RETCODE;
-typedef UCHAR SQLCHAR;
-typedef UWORD SQLUSMALLINT;
-typedef PTR SQLPOINTER;
-typedef SWORD SQLSMALLINT;
-typedef UDWORD SQLUINTEGER;
-
-# ifdef WIN32
-# define SQL_API __stdcall
-# else
-# define SQL_API /* giovanni EXPORT CALLBACK */
-# endif
-# ifdef OS2
-# ifdef BCPP
-# define _Optlink
-# define _System _syscall
-# endif
-# undef SQL_API
-# define SQL_API _System
-# endif
-
-
-#ifndef ODBCVER
-# define ODBCVER 0x0200
#endif
-# define SQL_MAX_MESSAGE_LENGTH 512
-# define SQL_MAX_DSN_LENGTH 32
-
-/* return code */
-# define SQL_INVALID_HANDLE (-2)
-# define SQL_ERROR (-1)
-# define SQL_SUCCESS 0
-# define SQL_SUCCESS_WITH_INFO 1
-# define SQL_NO_DATA_FOUND 100
-
-/* standard SQL datatypes (agree with ANSI type numbering) */
-# define SQL_CHAR 1
-# define SQL_NUMERIC 2
-# define SQL_DECIMAL 3
-# define SQL_INTEGER 4
-# define SQL_SMALLINT 5
-# define SQL_FLOAT 6
-# define SQL_REAL 7
-# define SQL_DOUBLE 8
-# define SQL_VARCHAR 12
-
-# define SQL_TYPE_MIN SQL_CHAR
-# define SQL_TYPE_NULL 0
-# define SQL_TYPE_MAX SQL_VARCHAR
-
-/* C to SQL datatype mapping */
-# define SQL_C_CHAR SQL_CHAR
-# define SQL_C_LONG SQL_INTEGER
-# define SQL_C_SHORT SQL_SMALLINT
-# define SQL_C_FLOAT SQL_REAL
-# define SQL_C_DOUBLE SQL_DOUBLE
-# define SQL_C_DEFAULT 99
-
-# define SQL_NO_NULLS 0
-# define SQL_NULLABLE 1
-# define SQL_NULLABLE_UNKNOWN 2
-
-/* some special length values */
-# define SQL_NULL_DATA (-1)
-# define SQL_DATA_AT_EXEC (-2)
-# define SQL_NTS (-3)
-
-/* SQLFreeStmt flag values */
-# define SQL_CLOSE 0
-# define SQL_DROP 1
-# define SQL_UNBIND 2
-# define SQL_RESET_PARAMS 3
-
-/* SQLTransact flag values */
-# define SQL_COMMIT 0
-# define SQL_ROLLBACK 1
-
-/* SQLColAttributes flag values */
-# define SQL_COLUMN_COUNT 0
-# define SQL_COLUMN_LABEL 18
-# define SQL_COLATT_OPT_MAX SQL_COLUMN_LABEL
-# define SQL_COLUMN_DRIVER_START 1000
-
-# define SQL_COLATT_OPT_MIN SQL_COLUMN_COUNT
-
-/* Null handles */
-# define SQL_NULL_HENV 0
-# define SQL_NULL_HDBC 0
-# define SQL_NULL_HSTMT 0
-
+ RETCODE SQL_API SQLAllocConnect (HENV henv, HDBC FAR * phdbc);
+ RETCODE SQL_API SQLAllocEnv (HENV FAR * phenv);
+ RETCODE SQL_API SQLAllocStmt (HDBC hdbc, HSTMT FAR * phstmt);
+ RETCODE SQL_API SQLBindCol (HSTMT hstmt, UWORD icol, SWORD fCType,
+ PTR rgbValue, SDWORD cbValueMax, SDWORD FAR * pcbValue);
+ RETCODE SQL_API SQLCancel (HSTMT hstmt);
+ RETCODE SQL_API SQLColAttributes (HSTMT hstmt, UWORD icol, UWORD fDescType,
+ PTR rgbDesc, SWORD cbDescMax, SWORD FAR * pcbDesc, SDWORD FAR * pfDesc);
+ RETCODE SQL_API SQLConnect (HDBC hdbc, UCHAR FAR * szDSN, SWORD cbDSN,
+ UCHAR FAR * szUID, SWORD cbUID, UCHAR FAR * szAuthStr, SWORD cbAuthStr);
+ RETCODE SQL_API SQLDescribeCol (HSTMT hstmt, UWORD icol,
+ UCHAR FAR * szColName, SWORD cbColNameMax, SWORD FAR * pcbColName,
+ SWORD FAR * pfSqlType, UDWORD FAR * pcbColDef, SWORD FAR * pibScale,
+ SWORD FAR * pfNullable);
+ RETCODE SQL_API SQLDisconnect (HDBC hdbc);
+ RETCODE SQL_API SQLError (HENV henv, HDBC hdbc, HSTMT hstmt,
+ UCHAR FAR * szSqlState, SDWORD FAR * pfNativeError, UCHAR FAR * szErrorMsg,
+ SWORD cbErrorMsgMax, SWORD FAR * pcbErrorMsg);
+ RETCODE SQL_API SQLExecDirect (HSTMT hstmt, UCHAR FAR * szSqlStr,
+ SDWORD cbSqlStr);
+ RETCODE SQL_API SQLExecute (HSTMT hstmt);
+ RETCODE SQL_API SQLFetch (HSTMT hstmt);
+ RETCODE SQL_API SQLFreeConnect (HDBC hdbc);
+ RETCODE SQL_API SQLFreeEnv (HENV henv);
+ RETCODE SQL_API SQLFreeStmt (HSTMT hstmt, UWORD fOption);
+ RETCODE SQL_API SQLGetCursorName (HSTMT hstmt, UCHAR FAR * szCursor,
+ SWORD cbCursorMax, SWORD FAR * pcbCursor);
+ RETCODE SQL_API SQLNumResultCols (HSTMT hstmt, SWORD FAR * pccol);
+ RETCODE SQL_API SQLPrepare (HSTMT hstmt, UCHAR FAR * szSqlStr,
+ SDWORD cbSqlStr);
+ RETCODE SQL_API SQLRowCount (HSTMT hstmt, SDWORD FAR * pcrow);
+ RETCODE SQL_API SQLSetCursorName (HSTMT hstmt, UCHAR FAR * szCursor,
+ SWORD cbCursor);
+ RETCODE SQL_API SQLTransact (HENV henv, HDBC hdbc, UWORD fType);
+
+/*
+ * Depreciated ODBC 1.0 function - Use SQLBindParameter
+ */
+ RETCODE SQL_API SQLSetParam (HSTMT hstmt, UWORD ipar, SWORD fCType,
+ SWORD fSqlType, UDWORD cbColDef, SWORD ibScale, PTR rgbValue,
+ SDWORD FAR * pcbValue);
+
+#ifdef __cplusplus
+}
#endif
+#endif
-#ifndef _INTRINSIC_SQLEXT_H
-# define _INTRINSIC_SQLEXT_H
-
-# include <isql.h>
-
-# define SQL_STILL_EXECUTING 2
-# define SQL_NEED_DATA 99
-
-/* extend SQL datatypes */
-# define SQL_DATE 9
-# define SQL_TIME 10
-# define SQL_TIMESTAMP 11
-# define SQL_LONGVARCHAR (-1)
-# define SQL_BINARY (-2)
-# define SQL_VARBINARY (-3)
-# define SQL_LONGVARBINARY (-4)
-# define SQL_BIGINT (-5)
-# define SQL_TINYINT (-6)
-# define SQL_BIT (-7) /* conflict with SQL3 ??? */
-# define SQL_TYPE_DRIVER_START (-80)
-
-/* C to SQL datatype mapping */
-# define SQL_C_DATE SQL_DATE
-# define SQL_C_TIME SQL_TIME
-# define SQL_C_TIMESTAMP SQL_TIMESTAMP
-# define SQL_C_BINARY SQL_BINARY
-# define SQL_C_BIT SQL_BIT
-# define SQL_C_TINYINT SQL_TINYINT
-
-# define SQL_SIGNED_OFFSET (-20)
-# define SQL_UNSIGNED_OFFSET (-22)
-
-# define SQL_C_SLONG (SQL_C_LONG + SQL_SIGNED_OFFSET)
-# define SQL_C_SSHORT (SQL_C_SHORT + SQL_SIGNED_OFFSET)
-# define SQL_C_STINYINT (SQL_TINYINT + SQL_SIGNED_OFFSET)
-# define SQL_C_ULONG (SQL_C_LONG + SQL_UNSIGNED_OFFSET)
-# define SQL_C_USHORT (SQL_C_SHORT + SQL_UNSIGNED_OFFSET)
-# define SQL_C_UTINYINT (SQL_TINYINT + SQL_UNSIGNED_OFFSET)
-# define SQL_C_BOOKMARK SQL_C_ULONG
-
-# if defined(SQL_TYPE_MIN)
-# undef SQL_TYPE_MIN
-# define SQL_TYPE_MIN SQL_BIT
-/* Note:If SQL_BIT uses SQL3 value (i.e. 14) then,
- * SQL_TYPE_MIN need to be defined as SQL_TINYINT
- * (i.e. -6).
- */
-# endif
-
-# define SQL_ALL_TYPES 0
-
-/* SQLDriverConnect flag values */
-# define SQL_DRIVER_NOPROMPT 0
-# define SQL_DRIVER_COMPLETE 1
-# define SQL_DRIVER_PROMPT 2
-# define SQL_DRIVER_COMPLETE_REQUIRED 3
-
-/* SQLSetParam extensions */
-# define SQL_DEFAULT_PARAM (-5)
-# define SQL_IGNORE (-6)
-
-/* function number for SQLGetFunctions and _iodbcdm_getproc */
-# define SQL_API_SQLALLOCCONNECT 1
-# define SQL_API_SQLALLOCENV 2
-# define SQL_API_SQLALLOCSTMT 3
-# define SQL_API_SQLBINDCOL 4
-# define SQL_API_SQLCANCEL 5
-# define SQL_API_SQLCOLATTRIBUTES 6
-# define SQL_API_SQLCONNECT 7
-# define SQL_API_SQLDESCRIBECOL 8
-# define SQL_API_SQLDISCONNECT 9
-# define SQL_API_SQLERROR 10
-# define SQL_API_SQLEXECDIRECT 11
-# define SQL_API_SQLEXECUTE 12
-# define SQL_API_SQLFETCH 13
-# define SQL_API_SQLFREECONNECT 14
-# define SQL_API_SQLFREEENV 15
-# define SQL_API_SQLFREESTMT 16
-# define SQL_API_SQLGETCURSORNAME 17
-# define SQL_API_SQLNUMRESULTCOLS 18
-# define SQL_API_SQLPREPARE 19
-# define SQL_API_SQLROWCOUNT 20
-# define SQL_API_SQLSETCURSORNAME 21
-# define SQL_API_SQLSETPARAM 22
-# define SQL_API_SQLTRANSACT 23
-
-# define SQL_NUM_FUNCTIONS 23
-
-# define SQL_EXT_API_START 40
-
-# define SQL_API_SQLCOLUMNS 40
-
-# define SQL_API_SQLDRIVERCONNECT 41
-# define SQL_API_SQLGETCONNECTOPTION 42
-# define SQL_API_SQLGETDATA 43
-# define SQL_API_SQLGETFUNCTIONS 44
-# define SQL_API_SQLGETINFO 45
-# define SQL_API_SQLGETSTMTOPTION 46
-# define SQL_API_SQLGETTYPEINFO 47
-# define SQL_API_SQLPARAMDATA 48
-# define SQL_API_SQLPUTDATA 49
-# define SQL_API_SQLSETCONNECTOPTION 50
-# define SQL_API_SQLSETSTMTOPTION 51
-# define SQL_API_SQLSPECIALCOLUMNS 52
-# define SQL_API_SQLSTATISTICS 53
-# define SQL_API_SQLTABLES 54
-
-# define SQL_API_SQLBROWSECONNECT 55
-# define SQL_API_SQLCOLUMNPRIVILEGES 56
-# define SQL_API_SQLDATASOURCES 57
-# define SQL_API_SQLDESCRIBEPARAM 58
-# define SQL_API_SQLEXTENDEDFETCH 59
-# define SQL_API_SQLFOREIGNKEYS 60
-# define SQL_API_SQLMORERESULTS 61
-# define SQL_API_SQLNATIVESQL 62
-# define SQL_API_SQLNUMPARAMS 63
-# define SQL_API_SQLPARAMOPTIONS 64
-# define SQL_API_SQLPRIMARYKEYS 65
-# define SQL_API_SQLPROCEDURECOLUMNS 66
-# define SQL_API_SQLPROCEDURES 67
-# define SQL_API_SQLSETPOS 68
-# define SQL_API_SQLSETSCROLLOPTIONS 69
-# define SQL_API_SQLTABLEPRIVILEGES 70
-
-# define SQL_API_SQLDRIVERS 71
-# define SQL_API_SQLBINDPARAMETER 72
-# define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER
-
-# define SQL_API_ALL_FUNCTIONS 0
-
-/* SQLGetInfo infor number */
-# define SQL_INFO_FIRST 0
-# define SQL_DRIVER_HDBC 3
-# define SQL_DRIVER_HENV 4
-# define SQL_DRIVER_HSTMT 5
-# define SQL_DRIVER_NAME 6
-# define SQL_ODBC_VER 10
-# define SQL_CURSOR_COMMIT_BEHAVIOR 23
-# define SQL_CURSOR_ROLLBACK_BEHAVIOR 24
-# define SQL_DEFAULT_TXN_ISOLATION 26
-
-# define SQL_TXN_ISOLATION_OPTION 72
-# define SQL_NON_NULLABLE_COLUMNS 75
-
-# define SQL_DRIVER_HLIB 76
-# define SQL_DRIVER_ODBC_VER 77
-
-# define SQL_QUALIFIER_LOCATION 114
-
-# define SQL_INFO_LAST SQL_QUALIFIER_LOCATION
-
-# define SQL_INFO_DRIVER_START 1000
-
-
-/* SQL_TXN_ISOLATION_OPTION masks */
-# define SQL_TXN_READ_UNCOMMITTED 0x00000001L
-# define SQL_TXN_READ_COMMITTED 0x00000002L
-# define SQL_TXN_REPEATABLE_READ 0x00000004L
-# define SQL_TXN_SERIALIZABLE 0x00000008L
-# define SQL_TXN_VERSIONING 0x00000010L
-
-/* SQL_CURSOR_COMMIT_BEHAVIOR and SQL_CURSOR_ROLLBACK_BEHAVIOR values */
-
-# define SQL_CB_DELETE 0x0000
-# define SQL_CB_CLOSE 0x0001
-# define SQL_CB_PRESERVE 0x0002
-
-/* options for SQLGetStmtOption/SQLSetStmtOption */
-# define SQL_QUERY_TIMEOUT 0
-# define SQL_MAX_ROWS 1
-# define SQL_NOSCAN 2
-# define SQL_MAX_LENGTH 3
-# define SQL_ASYNC_ENABLE 4
-# define SQL_BIND_TYPE 5
-# define SQL_CURSOR_TYPE 6
-# define SQL_CONCURRENCY 7
-# define SQL_KEYSET_SIZE 8
-# define SQL_ROWSET_SIZE 9
-# define SQL_SIMULATE_CURSOR 10
-# define SQL_RETRIEVE_DATA 11
-# define SQL_USE_BOOKMARKS 12
-# define SQL_GET_BOOKMARK 13 /* GetStmtOption Only */
-# define SQL_ROW_NUMBER 14 /* GetStmtOption Only */
-# define SQL_STMT_OPT_MAX SQL_ROW_NUMBER
-
-# define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT
-
-
-/* SQL_QUERY_TIMEOUT options */
-# define SQL_QUERY_TIMEOUT_DEFAULT 0UL
-
-/* SQL_MAX_ROWS options */
-# define SQL_MAX_ROWS_DEFAULT 0UL
-
-/* SQL_MAX_LENGTH options */
-# define SQL_MAX_LENGTH_DEFAULT 0UL
-
-/* SQL_CONCURRENCY options */
-# define SQL_CONCUR_READ_ONLY 1
-# define SQL_CONCUR_LOCK 2
-# define SQL_CONCUR_ROWVER 3
-# define SQL_CONCUR_VALUES 4
-
-/* SQL_CURSOR_TYPE options */
-#define SQL_CURSOR_FORWARD_ONLY 0UL
+/*
+ *
+ * isqlext.h
+ *
+ * $Id$
+ *
+ * iODBC defines (ext)
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _ISQLEXT_H
+# define _ISQLEXT_H
+
+#include <isql.h>
+
+/*
+ * Generic constants
+ */
+#define SQL_MAX_OPTION_STRING_LENGTH 256
+
+/*
+ * Additional return codes
+ */
+#define SQL_STILL_EXECUTING 2
+#define SQL_NEED_DATA 99
+
+/*
+ * SQL extended datatypes
+ */
+#define SQL_DATE 9
+#define SQL_TIME 10
+#define SQL_TIMESTAMP 11
+#define SQL_LONGVARCHAR (-1)
+#define SQL_BINARY (-2)
+#define SQL_VARBINARY (-3)
+#define SQL_LONGVARBINARY (-4)
+#define SQL_BIGINT (-5)
+#define SQL_TINYINT (-6)
+#define SQL_BIT (-7)
+
+#define SQL_INTERVAL_YEAR (-80)
+#define SQL_INTERVAL_MONTH (-81)
+#define SQL_INTERVAL_YEAR_TO_MONTH (-82)
+#define SQL_INTERVAL_DAY (-83)
+#define SQL_INTERVAL_HOUR (-84)
+#define SQL_INTERVAL_MINUTE (-85)
+#define SQL_INTERVAL_SECOND (-86)
+#define SQL_INTERVAL_DAY_TO_HOUR (-87)
+#define SQL_INTERVAL_DAY_TO_MINUTE (-88)
+#define SQL_INTERVAL_DAY_TO_SECOND (-89)
+#define SQL_INTERVAL_HOUR_TO_MINUTE (-90)
+#define SQL_INTERVAL_HOUR_TO_SECOND (-91)
+#define SQL_INTERVAL_MINUTE_TO_SECOND (-92)
+#define SQL_UNICODE (-95)
+
+#define SQL_TYPE_DRIVER_START SQL_INTERVAL_YEAR
+#define SQL_TYPE_DRIVER_END SQL_UNICODE
+
+#define SQL_SIGNED_OFFSET (-20)
+#define SQL_UNSIGNED_OFFSET (-22)
+
+/*
+ * C datatype to SQL datatype mapping
+ */
+#define SQL_C_DATE SQL_DATE
+#define SQL_C_TIME SQL_TIME
+#define SQL_C_TIMESTAMP SQL_TIMESTAMP
+#define SQL_C_BINARY SQL_BINARY
+#define SQL_C_BIT SQL_BIT
+#define SQL_C_TINYINT SQL_TINYINT
+#define SQL_C_SLONG SQL_C_LONG+SQL_SIGNED_OFFSET
+#define SQL_C_SSHORT SQL_C_SHORT+SQL_SIGNED_OFFSET
+#define SQL_C_STINYINT SQL_TINYINT+SQL_SIGNED_OFFSET
+#define SQL_C_ULONG SQL_C_LONG+SQL_UNSIGNED_OFFSET
+#define SQL_C_USHORT SQL_C_SHORT+SQL_UNSIGNED_OFFSET
+#define SQL_C_UTINYINT SQL_TINYINT+SQL_UNSIGNED_OFFSET
+#define SQL_C_BOOKMARK SQL_C_ULONG
+
+/*
+ * Extended data types override sql.h defined
+ */
+#undef SQL_TYPE_MIN
+#define SQL_TYPE_MIN SQL_BIT
+#define SQL_ALL_TYPES 0
+
+/*
+ * SQL portable types for C - DATE, TIME, TIMESTAMP
+ */
+typedef struct _DATE_STRUCT
+ {
+ SWORD year;
+ UWORD month;
+ UWORD day;
+ }
+DATE_STRUCT;
+
+typedef struct _TIME_STRUCT
+ {
+ UWORD hour;
+ UWORD minute;
+ UWORD second;
+ }
+TIME_STRUCT;
+
+typedef struct _TIMESTAMP_STRUCT
+ {
+ SWORD year;
+ UWORD month;
+ UWORD day;
+ UWORD hour;
+ UWORD minute;
+ UWORD second;
+ UDWORD fraction;
+ }
+TIMESTAMP_STRUCT;
+
+typedef unsigned long int BOOKMARK;
+
+/*
+ * ----------------------------------------------------------------------
+ * Level 1 Functions
+ * ----------------------------------------------------------------------
+ */
+
+/*
+ * SQLDriverConnect
+ */
+#define SQL_DRIVER_NOPROMPT 0
+#define SQL_DRIVER_COMPLETE 1
+#define SQL_DRIVER_PROMPT 2
+#define SQL_DRIVER_COMPLETE_REQUIRED 3
+
+/*
+ * SQLGetData
+ */
+#define SQL_NO_TOTAL (-4)
+
+/*
+ * SQLBindParameter
+ */
+#define SQL_DEFAULT_PARAM (-5)
+#define SQL_IGNORE (-6)
+#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100)
+#define SQL_LEN_DATA_AT_EXEC(length) (-length+SQL_LEN_DATA_AT_EXEC_OFFSET)
+
+/*
+ * SQLGetFunctions
+ */
+#define SQL_API_SQLALLOCCONNECT 1 /* Core Functions */
+#define SQL_API_SQLALLOCENV 2
+#define SQL_API_SQLALLOCSTMT 3
+#define SQL_API_SQLBINDCOL 4
+#define SQL_API_SQLCANCEL 5
+#define SQL_API_SQLCOLATTRIBUTES 6
+#define SQL_API_SQLCONNECT 7
+#define SQL_API_SQLDESCRIBECOL 8
+#define SQL_API_SQLDISCONNECT 9
+#define SQL_API_SQLERROR 10
+#define SQL_API_SQLEXECDIRECT 11
+#define SQL_API_SQLEXECUTE 12
+#define SQL_API_SQLFETCH 13
+#define SQL_API_SQLFREECONNECT 14
+#define SQL_API_SQLFREEENV 15
+#define SQL_API_SQLFREESTMT 16
+#define SQL_API_SQLGETCURSORNAME 17
+#define SQL_API_SQLNUMRESULTCOLS 18
+#define SQL_API_SQLPREPARE 19
+#define SQL_API_SQLROWCOUNT 20
+#define SQL_API_SQLSETCURSORNAME 21
+#define SQL_API_SQLSETPARAM 22
+#define SQL_API_SQLTRANSACT 23
+
+#define SQL_NUM_FUNCTIONS 23
+
+#define SQL_EXT_API_START 40
+
+#define SQL_API_SQLCOLUMNS 40 /* Level 1 Functions */
+#define SQL_API_SQLDRIVERCONNECT 41
+#define SQL_API_SQLGETCONNECTOPTION 42
+#define SQL_API_SQLGETDATA 43
+#define SQL_API_SQLGETFUNCTIONS 44
+#define SQL_API_SQLGETINFO 45
+#define SQL_API_SQLGETSTMTOPTION 46
+#define SQL_API_SQLGETTYPEINFO 47
+#define SQL_API_SQLPARAMDATA 48
+#define SQL_API_SQLPUTDATA 49
+#define SQL_API_SQLSETCONNECTOPTION 50
+#define SQL_API_SQLSETSTMTOPTION 51
+#define SQL_API_SQLSPECIALCOLUMNS 52
+#define SQL_API_SQLSTATISTICS 53
+#define SQL_API_SQLTABLES 54
+
+#define SQL_API_SQLBROWSECONNECT 55 /* Level 2 Functions */
+#define SQL_API_SQLCOLUMNPRIVILEGES 56
+#define SQL_API_SQLDATASOURCES 57
+#define SQL_API_SQLDESCRIBEPARAM 58
+#define SQL_API_SQLEXTENDEDFETCH 59
+#define SQL_API_SQLFOREIGNKEYS 60
+#define SQL_API_SQLMORERESULTS 61
+#define SQL_API_SQLNATIVESQL 62
+#define SQL_API_SQLNUMPARAMS 63
+#define SQL_API_SQLPARAMOPTIONS 64
+#define SQL_API_SQLPRIMARYKEYS 65
+#define SQL_API_SQLPROCEDURECOLUMNS 66
+#define SQL_API_SQLPROCEDURES 67
+#define SQL_API_SQLSETPOS 68
+#define SQL_API_SQLSETSCROLLOPTIONS 69
+#define SQL_API_SQLTABLEPRIVILEGES 70
+
+#define SQL_API_SQLDRIVERS 71
+#define SQL_API_SQLBINDPARAMETER 72
+#define SQL_EXT_API_LAST SQL_API_SQLBINDPARAMETER
+
+#define SQL_API_ALL_FUNCTIONS 0
+
+#define SQL_NUM_EXTENSIONS (SQL_EXT_API_LAST-SQL_EXT_API_START+1)
+
+/*
+ * SQLGetInfo
+ */
+#define SQL_INFO_FIRST 0
+#define SQL_ACTIVE_CONNECTIONS 0
+#define SQL_ACTIVE_STATEMENTS 1
+#define SQL_DATA_SOURCE_NAME 2
+#define SQL_DRIVER_HDBC 3
+#define SQL_DRIVER_HENV 4
+#define SQL_DRIVER_HSTMT 5
+#define SQL_DRIVER_NAME 6
+#define SQL_DRIVER_VER 7
+#define SQL_FETCH_DIRECTION 8
+#define SQL_ODBC_API_CONFORMANCE 9
+#define SQL_ODBC_VER 10
+#define SQL_ROW_UPDATES 11
+#define SQL_ODBC_SAG_CLI_CONFORMANCE 12
+#define SQL_SERVER_NAME 13
+#define SQL_SEARCH_PATTERN_ESCAPE 14
+#define SQL_ODBC_SQL_CONFORMANCE 15
+#define SQL_DBMS_NAME 17
+#define SQL_DBMS_VER 18
+#define SQL_ACCESSIBLE_TABLES 19
+#define SQL_ACCESSIBLE_PROCEDURES 20
+#define SQL_PROCEDURES 21
+#define SQL_CONCAT_NULL_BEHAVIOR 22
+#define SQL_CURSOR_COMMIT_BEHAVIOR 23
+#define SQL_CURSOR_ROLLBACK_BEHAVIOR 24
+#define SQL_DATA_SOURCE_READ_ONLY 25
+#define SQL_DEFAULT_TXN_ISOLATION 26
+#define SQL_EXPRESSIONS_IN_ORDERBY 27
+#define SQL_IDENTIFIER_CASE 28
+#define SQL_IDENTIFIER_QUOTE_CHAR 29
+#define SQL_MAX_COLUMN_NAME_LEN 30
+#define SQL_MAX_CURSOR_NAME_LEN 31
+#define SQL_MAX_OWNER_NAME_LEN 32
+#define SQL_MAX_PROCEDURE_NAME_LEN 33
+#define SQL_MAX_QUALIFIER_NAME_LEN 34
+#define SQL_MAX_TABLE_NAME_LEN 35
+#define SQL_MULT_RESULT_SETS 36
+#define SQL_MULTIPLE_ACTIVE_TXN 37
+#define SQL_OUTER_JOINS 38
+#define SQL_OWNER_TERM 39
+#define SQL_PROCEDURE_TERM 40
+#define SQL_QUALIFIER_NAME_SEPARATOR 41
+#define SQL_QUALIFIER_TERM 42
+#define SQL_SCROLL_CONCURRENCY 43
+#define SQL_SCROLL_OPTIONS 44
+#define SQL_TABLE_TERM 45
+#define SQL_TXN_CAPABLE 46
+#define SQL_USER_NAME 47
+#define SQL_CONVERT_FUNCTIONS 48
+#define SQL_NUMERIC_FUNCTIONS 49
+#define SQL_STRING_FUNCTIONS 50
+#define SQL_SYSTEM_FUNCTIONS 51
+#define SQL_TIMEDATE_FUNCTIONS 52
+#define SQL_CONVERT_BIGINT 53
+#define SQL_CONVERT_BINARY 54
+#define SQL_CONVERT_BIT 55
+#define SQL_CONVERT_CHAR 56
+#define SQL_CONVERT_DATE 57
+#define SQL_CONVERT_DECIMAL 58
+#define SQL_CONVERT_DOUBLE 59
+#define SQL_CONVERT_FLOAT 60
+#define SQL_CONVERT_INTEGER 61
+#define SQL_CONVERT_LONGVARCHAR 62
+#define SQL_CONVERT_NUMERIC 63
+#define SQL_CONVERT_REAL 64
+#define SQL_CONVERT_SMALLINT 65
+#define SQL_CONVERT_TIME 66
+#define SQL_CONVERT_TIMESTAMP 67
+#define SQL_CONVERT_TINYINT 68
+#define SQL_CONVERT_VARBINARY 69
+#define SQL_CONVERT_VARCHAR 70
+#define SQL_CONVERT_LONGVARBINARY 71
+#define SQL_TXN_ISOLATION_OPTION 72
+#define SQL_ODBC_SQL_OPT_IEF 73
+
+/*
+ * ODBC SDK 1.0 Additions
+ */
+#define SQL_CORRELATION_NAME 74
+#define SQL_NON_NULLABLE_COLUMNS 75
+
+/*
+ * ODBC SDK 2.0 Additions
+ */
+#define SQL_DRIVER_HLIB 76
+#define SQL_DRIVER_ODBC_VER 77
+#define SQL_LOCK_TYPES 78
+#define SQL_POS_OPERATIONS 79
+#define SQL_POSITIONED_STATEMENTS 80
+#define SQL_GETDATA_EXTENSIONS 81
+#define SQL_BOOKMARK_PERSISTENCE 82
+#define SQL_STATIC_SENSITIVITY 83
+#define SQL_FILE_USAGE 84
+#define SQL_NULL_COLLATION 85
+#define SQL_ALTER_TABLE 86
+#define SQL_COLUMN_ALIAS 87
+#define SQL_GROUP_BY 88
+#define SQL_KEYWORDS 89
+#define SQL_ORDER_BY_COLUMNS_IN_SELECT 90
+#define SQL_OWNER_USAGE 91
+#define SQL_QUALIFIER_USAGE 92
+#define SQL_QUOTED_IDENTIFIER_CASE 93
+#define SQL_SPECIAL_CHARACTERS 94
+#define SQL_SUBQUERIES 95
+#define SQL_UNION 96
+#define SQL_MAX_COLUMNS_IN_GROUP_BY 97
+#define SQL_MAX_COLUMNS_IN_INDEX 98
+#define SQL_MAX_COLUMNS_IN_ORDER_BY 99
+#define SQL_MAX_COLUMNS_IN_SELECT 100
+#define SQL_MAX_COLUMNS_IN_TABLE 101
+#define SQL_MAX_INDEX_SIZE 102
+#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103
+#define SQL_MAX_ROW_SIZE 104
+#define SQL_MAX_STATEMENT_LEN 105
+#define SQL_MAX_TABLES_IN_SELECT 106
+#define SQL_MAX_USER_NAME_LEN 107
+#define SQL_MAX_CHAR_LITERAL_LEN 108
+#define SQL_TIMEDATE_ADD_INTERVALS 109
+#define SQL_TIMEDATE_DIFF_INTERVALS 110
+#define SQL_NEED_LONG_DATA_LEN 111
+#define SQL_MAX_BINARY_LITERAL_LEN 112
+#define SQL_LIKE_ESCAPE_CLAUSE 113
+#define SQL_QUALIFIER_LOCATION 114
+
+/*
+ * ODBC SDK 2.01 Additions
+ */
+#define SQL_OJ_CAPABILITIES 65003 /* Temp value until ODBC 3.0 */
+
+#define SQL_INFO_LAST SQL_QUALIFIER_LOCATION
+#define SQL_INFO_DRIVER_START 1000
+
+
+/*
+ * SQL_CONVERT_* bitmask values
+ */
+#define SQL_CVT_CHAR 0x00000001L
+#define SQL_CVT_NUMERIC 0x00000002L
+#define SQL_CVT_DECIMAL 0x00000004L
+#define SQL_CVT_INTEGER 0x00000008L
+#define SQL_CVT_SMALLINT 0x00000010L
+#define SQL_CVT_FLOAT 0x00000020L
+#define SQL_CVT_REAL 0x00000040L
+#define SQL_CVT_DOUBLE 0x00000080L
+#define SQL_CVT_VARCHAR 0x00000100L
+#define SQL_CVT_LONGVARCHAR 0x00000200L
+#define SQL_CVT_BINARY 0x00000400L
+#define SQL_CVT_VARBINARY 0x00000800L
+#define SQL_CVT_BIT 0x00001000L
+#define SQL_CVT_TINYINT 0x00002000L
+#define SQL_CVT_BIGINT 0x00004000L
+#define SQL_CVT_DATE 0x00008000L
+#define SQL_CVT_TIME 0x00010000L
+#define SQL_CVT_TIMESTAMP 0x00020000L
+#define SQL_CVT_LONGVARBINARY 0x00040000L
+
+/*
+ * SQL_CONVERT_FUNCTIONS
+ */
+#define SQL_FN_CVT_CONVERT 0x00000001L
+
+/*
+ * SQL_STRING_FUNCTIONS
+ */
+#define SQL_FN_STR_CONCAT 0x00000001L
+#define SQL_FN_STR_INSERT 0x00000002L
+#define SQL_FN_STR_LEFT 0x00000004L
+#define SQL_FN_STR_LTRIM 0x00000008L
+#define SQL_FN_STR_LENGTH 0x00000010L
+#define SQL_FN_STR_LOCATE 0x00000020L
+#define SQL_FN_STR_LCASE 0x00000040L
+#define SQL_FN_STR_REPEAT 0x00000080L
+#define SQL_FN_STR_REPLACE 0x00000100L
+#define SQL_FN_STR_RIGHT 0x00000200L
+#define SQL_FN_STR_RTRIM 0x00000400L
+#define SQL_FN_STR_SUBSTRING 0x00000800L
+#define SQL_FN_STR_UCASE 0x00001000L
+#define SQL_FN_STR_ASCII 0x00002000L
+#define SQL_FN_STR_CHAR 0x00004000L
+#define SQL_FN_STR_DIFFERENCE 0x00008000L
+#define SQL_FN_STR_LOCATE_2 0x00010000L
+#define SQL_FN_STR_SOUNDEX 0x00020000L
+#define SQL_FN_STR_SPACE 0x00040000L
+
+/*
+ * SQL_NUMERIC_FUNCTIONS
+ */
+#define SQL_FN_NUM_ABS 0x00000001L
+#define SQL_FN_NUM_ACOS 0x00000002L
+#define SQL_FN_NUM_ASIN 0x00000004L
+#define SQL_FN_NUM_ATAN 0x00000008L
+#define SQL_FN_NUM_ATAN2 0x00000010L
+#define SQL_FN_NUM_CEILING 0x00000020L
+#define SQL_FN_NUM_COS 0x00000040L
+#define SQL_FN_NUM_COT 0x00000080L
+#define SQL_FN_NUM_EXP 0x00000100L
+#define SQL_FN_NUM_FLOOR 0x00000200L
+#define SQL_FN_NUM_LOG 0x00000400L
+#define SQL_FN_NUM_MOD 0x00000800L
+#define SQL_FN_NUM_SIGN 0x00001000L
+#define SQL_FN_NUM_SIN 0x00002000L
+#define SQL_FN_NUM_SQRT 0x00004000L
+#define SQL_FN_NUM_TAN 0x00008000L
+#define SQL_FN_NUM_PI 0x00010000L
+#define SQL_FN_NUM_RAND 0x00020000L
+#define SQL_FN_NUM_DEGREES 0x00040000L
+#define SQL_FN_NUM_LOG10 0x00080000L
+#define SQL_FN_NUM_POWER 0x00100000L
+#define SQL_FN_NUM_RADIANS 0x00200000L
+#define SQL_FN_NUM_ROUND 0x00400000L
+#define SQL_FN_NUM_TRUNCATE 0x00800000L
+
+/*
+ * SQL_TIMEDATE_FUNCTIONS
+ */
+#define SQL_FN_TD_NOW 0x00000001L
+#define SQL_FN_TD_CURDATE 0x00000002L
+#define SQL_FN_TD_DAYOFMONTH 0x00000004L
+#define SQL_FN_TD_DAYOFWEEK 0x00000008L
+#define SQL_FN_TD_DAYOFYEAR 0x00000010L
+#define SQL_FN_TD_MONTH 0x00000020L
+#define SQL_FN_TD_QUARTER 0x00000040L
+#define SQL_FN_TD_WEEK 0x00000080L
+#define SQL_FN_TD_YEAR 0x00000100L
+#define SQL_FN_TD_CURTIME 0x00000200L
+#define SQL_FN_TD_HOUR 0x00000400L
+#define SQL_FN_TD_MINUTE 0x00000800L
+#define SQL_FN_TD_SECOND 0x00001000L
+#define SQL_FN_TD_TIMESTAMPADD 0x00002000L
+#define SQL_FN_TD_TIMESTAMPDIFF 0x00004000L
+#define SQL_FN_TD_DAYNAME 0x00008000L
+#define SQL_FN_TD_MONTHNAME 0x00010000L
+
+/*
+ * SQL_SYSTEM_FUNCTIONS
+ */
+#define SQL_FN_SYS_USERNAME 0x00000001L
+#define SQL_FN_SYS_DBNAME 0x00000002L
+#define SQL_FN_SYS_IFNULL 0x00000004L
+
+/*
+ * SQL_TIMEDATE_ADD_INTERVALS
+ * SQL_TIMEDATE_DIFF_INTERVALS
+ */
+#define SQL_FN_TSI_FRAC_SECOND 0x00000001L
+#define SQL_FN_TSI_SECOND 0x00000002L
+#define SQL_FN_TSI_MINUTE 0x00000004L
+#define SQL_FN_TSI_HOUR 0x00000008L
+#define SQL_FN_TSI_DAY 0x00000010L
+#define SQL_FN_TSI_WEEK 0x00000020L
+#define SQL_FN_TSI_MONTH 0x00000040L
+#define SQL_FN_TSI_QUARTER 0x00000080L
+#define SQL_FN_TSI_YEAR 0x00000100L
+
+/*
+ * SQL_ODBC_API_CONFORMANCE
+ */
+#define SQL_OAC_NONE 0x0000
+#define SQL_OAC_LEVEL1 0x0001
+#define SQL_OAC_LEVEL2 0x0002
+
+/*
+ * SQL_ODBC_SAG_CLI_CONFORMANCE
+ */
+#define SQL_OSCC_NOT_COMPLIANT 0x0000
+#define SQL_OSCC_COMPLIANT 0x0001
+
+/*
+ * SQL_ODBC_SQL_CONFORMANCE
+ */
+#define SQL_OSC_MINIMUM 0x0000
+#define SQL_OSC_CORE 0x0001
+#define SQL_OSC_EXTENDED 0x0002
+
+/*
+ * SQL_CONCAT_NULL_BEHAVIOR
+ */
+#define SQL_CB_NULL 0x0000
+#define SQL_CB_NON_NULL 0x0001
+
+/*
+ * SQL_CURSOR_COMMIT_BEHAVIOR
+ * SQL_CURSOR_ROLLBACK_BEHAVIOR
+ */
+#define SQL_CB_DELETE 0x0000
+#define SQL_CB_CLOSE 0x0001
+#define SQL_CB_PRESERVE 0x0002
+
+/*
+ * SQL_IDENTIFIER_CASE
+ */
+#define SQL_IC_UPPER 0x0001
+#define SQL_IC_LOWER 0x0002
+#define SQL_IC_SENSITIVE 0x0003
+#define SQL_IC_MIXED 0x0004
+
+/*
+ * SQL_TXN_CAPABLE
+ */
+#define SQL_TC_NONE 0x0000
+#define SQL_TC_DML 0x0001
+#define SQL_TC_ALL 0x0002
+#define SQL_TC_DDL_COMMIT 0x0003
+#define SQL_TC_DDL_IGNORE 0x0004
+
+/*
+ * SQL_SCROLL_OPTIONS
+ */
+#define SQL_SO_FORWARD_ONLY 0x00000001L
+#define SQL_SO_KEYSET_DRIVEN 0x00000002L
+#define SQL_SO_DYNAMIC 0x00000004L
+#define SQL_SO_MIXED 0x00000008L
+#define SQL_SO_STATIC 0x00000010L
+
+/*
+ * SQL_SCROLL_CONCURRENCY
+ */
+#define SQL_SCCO_READ_ONLY 0x00000001L
+#define SQL_SCCO_LOCK 0x00000002L
+#define SQL_SCCO_OPT_ROWVER 0x00000004L
+#define SQL_SCCO_OPT_VALUES 0x00000008L
+
+/*
+ * SQL_FETCH_DIRECTION
+ */
+#define SQL_FD_FETCH_NEXT 0x00000001L
+#define SQL_FD_FETCH_FIRST 0x00000002L
+#define SQL_FD_FETCH_LAST 0x00000004L
+#define SQL_FD_FETCH_PRIOR 0x00000008L
+#define SQL_FD_FETCH_ABSOLUTE 0x00000010L
+#define SQL_FD_FETCH_RELATIVE 0x00000020L
+#define SQL_FD_FETCH_RESUME 0x00000040L
+#define SQL_FD_FETCH_BOOKMARK 0x00000080L
+
+/*
+ * SQL_TXN_ISOLATION_OPTION
+ */
+#define SQL_TXN_READ_UNCOMMITTED 0x00000001L
+#define SQL_TXN_READ_COMMITTED 0x00000002L
+#define SQL_TXN_REPEATABLE_READ 0x00000004L
+#define SQL_TXN_SERIALIZABLE 0x00000008L
+#define SQL_TXN_VERSIONING 0x00000010L
+
+/*
+ * SQL_CORRELATION_NAME
+ */
+#define SQL_CN_NONE 0x0000
+#define SQL_CN_DIFFERENT 0x0001
+#define SQL_CN_ANY 0x0002
+
+/*
+ * SQL_NON_NULLABLE_COLUMNS
+ */
+#define SQL_NNC_NULL 0x0000
+#define SQL_NNC_NON_NULL 0x0001
+
+/*
+ * SQL_NULL_COLLATION
+ */
+#define SQL_NC_HIGH 0x0000
+#define SQL_NC_LOW 0x0001
+#define SQL_NC_START 0x0002
+#define SQL_NC_END 0x0004
+
+/*
+ * SQL_FILE_USAGE
+ */
+#define SQL_FILE_NOT_SUPPORTED 0x0000
+#define SQL_FILE_TABLE 0x0001
+#define SQL_FILE_QUALIFIER 0x0002
+
+/*
+ * SQL_GETDATA_EXTENSIONS
+ */
+#define SQL_GD_ANY_COLUMN 0x00000001L
+#define SQL_GD_ANY_ORDER 0x00000002L
+#define SQL_GD_BLOCK 0x00000004L
+#define SQL_GD_BOUND 0x00000008L
+
+/*
+ * SQL_ALTER_TABLE
+ */
+#define SQL_AT_ADD_COLUMN 0x00000001L
+#define SQL_AT_DROP_COLUMN 0x00000002L
+
+/*
+ * SQL_POSITIONED_STATEMENTS
+ */
+#define SQL_PS_POSITIONED_DELETE 0x00000001L
+#define SQL_PS_POSITIONED_UPDATE 0x00000002L
+#define SQL_PS_SELECT_FOR_UPDATE 0x00000004L
+
+/*
+ * SQL_GROUP_BY
+ */
+#define SQL_GB_NOT_SUPPORTED 0x0000
+#define SQL_GB_GROUP_BY_EQUALS_SELECT 0x0001
+#define SQL_GB_GROUP_BY_CONTAINS_SELECT 0x0002
+#define SQL_GB_NO_RELATION 0x0003
+
+/*
+ * SQL_OWNER_USAGE
+ */
+#define SQL_OU_DML_STATEMENTS 0x00000001L
+#define SQL_OU_PROCEDURE_INVOCATION 0x00000002L
+#define SQL_OU_TABLE_DEFINITION 0x00000004L
+#define SQL_OU_INDEX_DEFINITION 0x00000008L
+#define SQL_OU_PRIVILEGE_DEFINITION 0x00000010L
+
+/*
+ * SQL_QUALIFIER_USAGE
+ */
+#define SQL_QU_DML_STATEMENTS 0x00000001L
+#define SQL_QU_PROCEDURE_INVOCATION 0x00000002L
+#define SQL_QU_TABLE_DEFINITION 0x00000004L
+#define SQL_QU_INDEX_DEFINITION 0x00000008L
+#define SQL_QU_PRIVILEGE_DEFINITION 0x00000010L
+
+/*
+ * SQL_SUBQUERIES
+ */
+#define SQL_SQ_COMPARISON 0x00000001L
+#define SQL_SQ_EXISTS 0x00000002L
+#define SQL_SQ_IN 0x00000004L
+#define SQL_SQ_QUANTIFIED 0x00000008L
+#define SQL_SQ_CORRELATED_SUBQUERIES 0x00000010L
+
+/*
+ * SQL_UNION
+ */
+#define SQL_U_UNION 0x00000001L
+#define SQL_U_UNION_ALL 0x00000002L
+
+/*
+ * SQL_BOOKMARK_PERSISTENCE
+ */
+#define SQL_BP_CLOSE 0x00000001L
+#define SQL_BP_DELETE 0x00000002L
+#define SQL_BP_DROP 0x00000004L
+#define SQL_BP_TRANSACTION 0x00000008L
+#define SQL_BP_UPDATE 0x00000010L
+#define SQL_BP_OTHER_HSTMT 0x00000020L
+#define SQL_BP_SCROLL 0x00000040L
+
+/*
+ * SQL_STATIC_SENSITIVITY
+ */
+#define SQL_SS_ADDITIONS 0x00000001L
+#define SQL_SS_DELETIONS 0x00000002L
+#define SQL_SS_UPDATES 0x00000004L
+
+/*
+ * SQL_LOCK_TYPES
+ */
+#define SQL_LCK_NO_CHANGE 0x00000001L
+#define SQL_LCK_EXCLUSIVE 0x00000002L
+#define SQL_LCK_UNLOCK 0x00000004L
+
+/*
+ * SQL_POS_OPERATIONS
+ */
+#define SQL_POS_POSITION 0x00000001L
+#define SQL_POS_REFRESH 0x00000002L
+#define SQL_POS_UPDATE 0x00000004L
+#define SQL_POS_DELETE 0x00000008L
+#define SQL_POS_ADD 0x00000010L
+
+/*
+ * SQL_QUALIFIER_LOCATION
+ */
+#define SQL_QL_START 0x0001L
+#define SQL_QL_END 0x0002L
+
+/*
+ * SQL_OJ_CAPABILITIES
+ */
+#define SQL_OJ_LEFT 0x00000001L
+#define SQL_OJ_RIGHT 0x00000002L
+#define SQL_OJ_FULL 0x00000004L
+#define SQL_OJ_NESTED 0x00000008L
+#define SQL_OJ_NOT_ORDERED 0x00000010L
+#define SQL_OJ_INNER 0x00000020L
+#define SQL_OJ_ALL_COMPARISON_OPS 0x00000040L
+
+/*
+ * SQLGetStmtOption/SQLSetStmtOption
+ */
+#define SQL_QUERY_TIMEOUT 0
+#define SQL_MAX_ROWS 1
+#define SQL_NOSCAN 2
+#define SQL_MAX_LENGTH 3
+#define SQL_ASYNC_ENABLE 4
+#define SQL_BIND_TYPE 5
+#define SQL_CURSOR_TYPE 6
+#define SQL_CONCURRENCY 7
+#define SQL_KEYSET_SIZE 8
+#define SQL_ROWSET_SIZE 9
+#define SQL_SIMULATE_CURSOR 10
+#define SQL_RETRIEVE_DATA 11
+#define SQL_USE_BOOKMARKS 12
+#define SQL_GET_BOOKMARK 13
+#define SQL_ROW_NUMBER 14
+
+#define SQL_STMT_OPT_MIN SQL_QUERY_TIMEOUT
+#define SQL_STMT_OPT_MAX SQL_ROW_NUMBER
+
+
+/*
+ * SQL_QUERY_TIMEOUT
+ */
+#define SQL_QUERY_TIMEOUT_DEFAULT 0UL
+
+/*
+ * SQL_MAX_ROWS
+ */
+#define SQL_MAX_ROWS_DEFAULT 0UL
+
+/*
+ * SQL_NOSCAN
+ */
+#define SQL_NOSCAN_OFF 0UL /* 1.0 FALSE */
+#define SQL_NOSCAN_ON 1UL /* 1.0 TRUE */
+#define SQL_NOSCAN_DEFAULT SQL_NOSCAN_OFF
+
+/*
+ * SQL_MAX_LENGTH
+ */
+#define SQL_MAX_LENGTH_DEFAULT 0UL
+
+/*
+ * SQL_ASYNC_ENABLE
+ */
+#define SQL_ASYNC_ENABLE_OFF 0UL
+#define SQL_ASYNC_ENABLE_ON 1UL
+#define SQL_ASYNC_ENABLE_DEFAULT SQL_ASYNC_ENABLE_OFF
+
+/*
+ * SQL_BIND_TYPE
+ */
+#define SQL_BIND_BY_COLUMN 0UL
+#define SQL_BIND_TYPE_DEFAULT SQL_BIND_BY_COLUMN
+
+/*
+ * SQL_CONCURRENCY
+ */
+#define SQL_CONCUR_READ_ONLY 1
+#define SQL_CONCUR_LOCK 2
+#define SQL_CONCUR_ROWVER 3
+#define SQL_CONCUR_VALUES 4
+#define SQL_CONCUR_DEFAULT SQL_CONCUR_READ_ONLY
+
+/*
+ * SQL_CURSOR_TYPE
+ */
+#define SQL_CURSOR_FORWARD_ONLY 0UL
#define SQL_CURSOR_KEYSET_DRIVEN 1UL
#define SQL_CURSOR_DYNAMIC 2UL
-#define SQL_CURSOR_STATIC 3UL
+#define SQL_CURSOR_STATIC 3UL
#define SQL_CURSOR_TYPE_DEFAULT SQL_CURSOR_FORWARD_ONLY
-/* options for SQLSetConnectOption/SQLGetConnectOption */
-# define SQL_ACCESS_MODE 101
-# define SQL_AUTOCOMMIT 102
-# define SQL_LOGIN_TIMEOUT 103
-# define SQL_OPT_TRACE 104
-# define SQL_OPT_TRACEFILE 105
-# define SQL_TRANSLATE_DLL 106
-# define SQL_TRANSLATE_OPTION 107
-# define SQL_TXN_ISOLATION 108
-# define SQL_CURRENT_QUALIFIER 109
-# define SQL_ODBC_CURSORS 110
-# define SQL_QUIET_MODE 111
-# define SQL_PACKET_SIZE 112
-# define SQL_CONN_OPT_MAX SQL_PACKET_SIZE
-# define SQL_CONNECT_OPT_DRVR_START 1000
-
-# define SQL_CONN_OPT_MIN SQL_ACCESS_MODE
-
-/* SQL_ACCESS_MODE options */
-# define SQL_MODE_READ_WRITE 0UL
-# define SQL_MODE_READ_ONLY 1UL
-# define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE
-
-/* SQL_AUTOCOMMIT options */
-# define SQL_AUTOCOMMIT_OFF 0UL
-# define SQL_AUTOCOMMIT_ON 1UL
-# define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON
-
-/* SQL_LOGIN_TIMEOUT options */
-# define SQL_LOGIN_TIMEOUT_DEFAULT 15UL
-
-/* SQL_OPT_TRACE options */
-# define SQL_OPT_TRACE_OFF 0UL
-# define SQL_OPT_TRACE_ON 1UL
-# define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF
-# define SQL_OPT_TRACE_FILE_DEFAULT "odbc.log"
-
-/* SQL_ODBC_CURSORS options */
-# define SQL_CUR_USE_IF_NEEDED 0UL
-# define SQL_CUR_USE_ODBC 1UL
-# define SQL_CUR_USE_DRIVER 2UL
-# define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER
-
-/* Column types and scopes in SQLSpecialColumns. */
-# define SQL_BEST_ROWID 1
-# define SQL_ROWVER 2
-
-# define SQL_SCOPE_CURROW 0
-# define SQL_SCOPE_TRANSACTION 1
-# define SQL_SCOPE_SESSION 2
-
-/* Operations in SQLSetPos */
-# define SQL_ADD 4
-
-/* Lock options in SQLSetPos */
-# define SQL_LOCK_NO_CHANGE 0
-# define SQL_LOCK_EXCLUSIVE 1
-# define SQL_LOCK_UNLOCK 2
-
-/* SQLExtendedFetch flag values */
-# define SQL_FETCH_NEXT 1
-# define SQL_FETCH_FIRST 2
-# define SQL_FETCH_LAST 3
-# define SQL_FETCH_PRIOR 4
-# define SQL_FETCH_ABSOLUTE 5
-# define SQL_FETCH_RELATIVE 6
-# define SQL_FETCH_BOOKMARK 8
-
-/* Defines for SQLBindParameter/SQLProcedureColumns */
-# define SQL_PARAM_TYPE_UNKNOWN 0
-# define SQL_PARAM_INPUT 1
-# define SQL_PARAM_INPUT_OUTPUT 2
-# define SQL_RESULT_COL 3
-# define SQL_PARAM_OUTPUT 4
-
-/* Defines used by Driver Manager for mapping SQLSetParam to SQLBindParameter */
-# define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT
-# define SQL_SETPARAM_VALUE_MAX (-1L)
-
-/* SQLStatistics flag values */
-# define SQL_INDEX_UNIQUE 0
-# define SQL_INDEX_ALL 1
-
-# define SQL_QUICK 0
-# define SQL_ENSURE 1
-
-/* SQLSetScrollOption flag values */
-# define SQL_SCROLL_FORWARD_ONLY 0L
-# define SQL_SCROLL_KEYSET_DRIVEN (-1L)
-# define SQL_SCROLL_DYNAMIC (-2L)
-# define SQL_SCROLL_STATIC (-3L)
-
-# if defined(__cplusplus) || defined(__IBMCPP__)
- extern "C" {
-# endif
-
-RETCODE SQL_API SQLSetConnectOption (HDBC, UWORD, UDWORD);
-RETCODE SQL_API SQLNumResultCols ( HSTMT, SWORD FAR* );
-
-# if defined(__cplusplus) || defined(__IBMCPP__)
- }
-# endif
+/*
+ * SQL_ROWSET_SIZE
+ */
+#define SQL_ROWSET_SIZE_DEFAULT 1UL
+
+/*
+ * SQL_KEYSET_SIZE
+ */
+#define SQL_KEYSET_SIZE_DEFAULT 0UL
+
+/*
+ * SQL_SIMULATE_CURSOR
+ */
+#define SQL_SC_NON_UNIQUE 0UL
+#define SQL_SC_TRY_UNIQUE 1UL
+#define SQL_SC_UNIQUE 2UL
+
+/*
+ * SQL_RETRIEVE_DATA
+ */
+#define SQL_RD_OFF 0UL
+#define SQL_RD_ON 1UL
+#define SQL_RD_DEFAULT SQL_RD_ON
+
+/*
+ * SQL_USE_BOOKMARKS
+ */
+#define SQL_UB_OFF 0UL
+#define SQL_UB_ON 1UL
+#define SQL_UB_DEFAULT SQL_UB_OFF
+
+/*
+ * SQLSetConnectOption/SQLGetConnectOption
+ */
+#define SQL_ACCESS_MODE 101
+#define SQL_AUTOCOMMIT 102
+#define SQL_LOGIN_TIMEOUT 103
+#define SQL_OPT_TRACE 104
+#define SQL_OPT_TRACEFILE 105
+#define SQL_TRANSLATE_DLL 106
+#define SQL_TRANSLATE_OPTION 107
+#define SQL_TXN_ISOLATION 108
+#define SQL_CURRENT_QUALIFIER 109
+#define SQL_ODBC_CURSORS 110
+#define SQL_QUIET_MODE 111
+#define SQL_PACKET_SIZE 112
+
+#define SQL_CONN_OPT_MIN SQL_ACCESS_MODE
+#define SQL_CONN_OPT_MAX SQL_PACKET_SIZE
+#define SQL_CONNECT_OPT_DRVR_START 1000
+
+
+/*
+ * SQL_ACCESS_MODE
+ */
+#define SQL_MODE_READ_WRITE 0UL
+#define SQL_MODE_READ_ONLY 1UL
+#define SQL_MODE_DEFAULT SQL_MODE_READ_WRITE
+
+/*
+ * SQL_AUTOCOMMIT
+ */
+#define SQL_AUTOCOMMIT_OFF 0UL
+#define SQL_AUTOCOMMIT_ON 1UL
+#define SQL_AUTOCOMMIT_DEFAULT SQL_AUTOCOMMIT_ON
+
+/*
+ * SQL_LOGIN_TIMEOUT
+ */
+#define SQL_LOGIN_TIMEOUT_DEFAULT 15UL
+
+/*
+ * SQL_OPT_TRACE
+ */
+#define SQL_OPT_TRACE_OFF 0UL
+#define SQL_OPT_TRACE_ON 1UL
+#define SQL_OPT_TRACE_DEFAULT SQL_OPT_TRACE_OFF
+#define SQL_OPT_TRACE_FILE_DEFAULT "odbc.log"
+
+/*
+ * SQL_ODBC_CURSORS
+ */
+#define SQL_CUR_USE_IF_NEEDED 0UL
+#define SQL_CUR_USE_ODBC 1UL
+#define SQL_CUR_USE_DRIVER 2UL
+#define SQL_CUR_DEFAULT SQL_CUR_USE_DRIVER
+
+/*
+ * SQLSpecialColumns - Column types and scopes
+ */
+#define SQL_BEST_ROWID 1
+#define SQL_ROWVER 2
+
+#define SQL_SCOPE_CURROW 0
+#define SQL_SCOPE_TRANSACTION 1
+#define SQL_SCOPE_SESSION 2
+
+/*
+ * SQLSetPos
+ */
+#define SQL_ENTIRE_ROWSET 0
+
+/*
+ * SQLSetPos
+ */
+#define SQL_POSITION 0
+#define SQL_REFRESH 1
+#define SQL_UPDATE 2
+#define SQL_DELETE 3
+#define SQL_ADD 4
+
+/*
+ * SQLSetPos
+ */
+#define SQL_LOCK_NO_CHANGE 0
+#define SQL_LOCK_EXCLUSIVE 1
+#define SQL_LOCK_UNLOCK 2
+
+/*
+ * SQLSetPos
+ */
+#define SQL_POSITION_TO(hstmt,irow) \
+ SQLSetPos(hstmt,irow,SQL_POSITION,SQL_LOCK_NO_CHANGE)
+#define SQL_LOCK_RECORD(hstmt,irow,fLock) \
+ SQLSetPos(hstmt,irow,SQL_POSITION,fLock)
+#define SQL_REFRESH_RECORD(hstmt,irow,fLock) \
+ SQLSetPos(hstmt,irow,SQL_REFRESH,fLock)
+#define SQL_UPDATE_RECORD(hstmt,irow) \
+ SQLSetPos(hstmt,irow,SQL_UPDATE,SQL_LOCK_NO_CHANGE)
+#define SQL_DELETE_RECORD(hstmt,irow) \
+ SQLSetPos(hstmt,irow,SQL_DELETE,SQL_LOCK_NO_CHANGE)
+#define SQL_ADD_RECORD(hstmt,irow) \
+ SQLSetPos(hstmt,irow,SQL_ADD,SQL_LOCK_NO_CHANGE)
+
+/*
+ * All the ODBC keywords
+ */
+#define SQL_ODBC_KEYWORDS \
+"ABSOLUTE,ACTION,ADA,ADD,ALL,ALLOCATE,ALTER,AND,ANY,ARE,AS,"\
+"ASC,ASSERTION,AT,AUTHORIZATION,AVG,"\
+"BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY,CASCADE,CASCADED,CASE,CAST,CATALOG,"\
+"CHAR,CHAR_LENGTH,CHARACTER,CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,"\
+"COBOL,COLLATE,COLLATION,COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT,"\
+"CONSTRAINTS,CONTINUE,CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT,"\
+"CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_USER,CURSOR,"\
+"DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE,"\
+"DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS,DISCONNECT,"\
+"DISTINCT,DOMAIN,DOUBLE,DROP,"\
+"ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION,EXEC,EXECUTE,"\
+"EXISTS,EXTERNAL,EXTRACT,"\
+"FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FORTRAN,FOUND,FROM,FULL,"\
+"GET,GLOBAL,GO,GOTO,GRANT,GROUP,HAVING,HOUR,"\
+"IDENTITY,IMMEDIATE,IN,INCLUDE,INDEX,INDICATOR,INITIALLY,INNER,"\
+"INPUT,INSENSITIVE,INSERT,INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,"\
+"JOIN,KEY,LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER,"\
+"MATCH,MAX,MIN,MINUTE,MODULE,MONTH,MUMPS,"\
+"NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NONE,NOT,NULL,NULLIF,NUMERIC,"\
+"OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR,ORDER,OUTER,OUTPUT,OVERLAPS,"\
+"PAD,PARTIAL,PASCAL,PLI,POSITION,PRECISION,PREPARE,PRESERVE,"\
+"PRIMARY,PRIOR,PRIVILEGES,PROCEDURE,PUBLIC,"\
+"REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT,ROLLBACK,ROWS,"\
+"SCHEMA,SCROLL,SECOND,SECTION,SELECT,SEQUENCE,SESSION,SESSION_USER,SET,SIZE,"\
+"SMALLINT,SOME,SPACE,SQL,SQLCA,SQLCODE,SQLERROR,SQLSTATE,SQLWARNING,"\
+"SUBSTRING,SUM,SYSTEM_USER,"\
+"TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_HOUR,TIMEZONE_MINUTE,"\
+"TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE,"\
+"UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING,"\
+"VALUE,,VARCHAR,VARYING,VIEW,WHEN,WHENEVER,WHERE,WITH,WORK,YEAR"
+
+/*
+ * ----------------------------------------------------------------------
+ * Level 2 Functions
+ * ----------------------------------------------------------------------
+ */
+
+/*
+ * SQLExtendedFetch - fFetchType
+ */
+#define SQL_FETCH_NEXT 1
+#define SQL_FETCH_FIRST 2
+#define SQL_FETCH_LAST 3
+#define SQL_FETCH_PRIOR 4
+#define SQL_FETCH_ABSOLUTE 5
+#define SQL_FETCH_RELATIVE 6
+#define SQL_FETCH_BOOKMARK 8
+
+/*
+ * SQLExtendedFetch - rgfRowStatus
+ */
+#define SQL_ROW_SUCCESS 0
+#define SQL_ROW_DELETED 1
+#define SQL_ROW_UPDATED 2
+#define SQL_ROW_NOROW 3
+#define SQL_ROW_ADDED 4
+#define SQL_ROW_ERROR 5
+
+/*
+ * SQLForeignKeys - UPDATE_RULE/DELETE_RULE
+ */
+#define SQL_CASCADE 0
+#define SQL_RESTRICT 1
+#define SQL_SET_NULL 2
+
+/*
+ * SQLBindParameter - fParamType
+ * SQLProcedureColumns - COLUMN_TYPE
+ */
+#define SQL_PARAM_TYPE_UNKNOWN 0
+#define SQL_PARAM_INPUT 1
+#define SQL_PARAM_INPUT_OUTPUT 2
+#define SQL_RESULT_COL 3
+#define SQL_PARAM_OUTPUT 4
+#define SQL_RETURN_VALUE 5
+
+/*
+ * SQLSetParam to SQLBindParameter conversion
+ */
+#define SQL_PARAM_TYPE_DEFAULT SQL_PARAM_INPUT_OUTPUT
+#define SQL_SETPARAM_VALUE_MAX (-1L)
+
+/*
+ * SQLStatistics - fUnique
+ */
+#define SQL_INDEX_UNIQUE 0
+#define SQL_INDEX_ALL 1
+
+/*
+ * SQLStatistics - fAccuracy
+ */
+#define SQL_QUICK 0
+#define SQL_ENSURE 1
+
+/*
+ * SQLStatistics - TYPE
+ */
+#define SQL_TABLE_STAT 0
+#define SQL_INDEX_CLUSTERED 1
+#define SQL_INDEX_HASHED 2
+#define SQL_INDEX_OTHER 3
+
+/*
+ * SQLProcedures - PROCEDURE_TYPE
+ */
+#define SQL_PT_UNKNOWN 0
+#define SQL_PT_PROCEDURE 1
+#define SQL_PT_FUNCTION 2
+
+/*
+ * SQLSpecialColumns - PSEUDO_COLUMN
+ */
+#define SQL_PC_UNKNOWN 0
+#define SQL_PC_NOT_PSEUDO 1
+#define SQL_PC_PSEUDO 2
+
+/*
+ * Deprecated defines from prior versions of ODBC
+ */
+#define SQL_DATABASE_NAME 16
+#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR
+#define SQL_FETCH_PREV SQL_FETCH_PRIOR
+#define SQL_CONCUR_TIMESTAMP SQL_CONCUR_ROWVER
+#define SQL_SCCO_OPT_TIMESTAMP SQL_SCCO_OPT_ROWVER
+#define SQL_CC_DELETE SQL_CB_DELETE
+#define SQL_CR_DELETE SQL_CB_DELETE
+#define SQL_CC_CLOSE SQL_CB_CLOSE
+#define SQL_CR_CLOSE SQL_CB_CLOSE
+#define SQL_CC_PRESERVE SQL_CB_PRESERVE
+#define SQL_CR_PRESERVE SQL_CB_PRESERVE
+#define SQL_FETCH_RESUME 7
+#define SQL_SCROLL_FORWARD_ONLY 0L
+#define SQL_SCROLL_KEYSET_DRIVEN (-1L)
+#define SQL_SCROLL_DYNAMIC (-2L)
+#define SQL_SCROLL_STATIC (-3L)
+#define SQL_PC_NON_PSEUDO SQL_PC_NOT_PSEUDO
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Level 1 function rototypes
+ */
+RETCODE SQL_API SQLColumns (HSTMT hstmt, UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner,
+ UCHAR FAR * szTableName, SWORD cbTableName, UCHAR FAR * szColumnName,
+ SWORD cbColumnName);
+RETCODE SQL_API SQLDriverConnect (HDBC hdbc, HWND hwnd,
+ UCHAR FAR * szConnStrIn, SWORD cbConnStrIn, UCHAR FAR * szConnStrOut,
+ SWORD cbConnStrOutMax, SWORD FAR * pcbConnStrOut, UWORD fDriverCompletion);
+RETCODE SQL_API SQLGetConnectOption (HDBC hdbc, UWORD fOption, PTR pvParam);
+RETCODE SQL_API SQLGetData (HSTMT hstmt, UWORD icol, SWORD fCType,
+ PTR rgbValue, SDWORD cbValueMax, SDWORD FAR * pcbValue);
+RETCODE SQL_API SQLGetFunctions (HDBC hdbc, UWORD fFunction,
+ UWORD FAR * pfExists);
+RETCODE SQL_API SQLGetInfo (HDBC hdbc, UWORD fInfoType, PTR rgbInfoValue,
+ SWORD cbInfoValueMax, SWORD FAR * pcbInfoValue);
+RETCODE SQL_API SQLGetStmtOption (HSTMT hstmt, UWORD fOption, PTR pvParam);
+RETCODE SQL_API SQLGetTypeInfo (HSTMT hstmt, SWORD fSqlType);
+RETCODE SQL_API SQLParamData (HSTMT hstmt, PTR FAR * prgbValue);
+RETCODE SQL_API SQLPutData (HSTMT hstmt, PTR rgbValue, SDWORD cbValue);
+RETCODE SQL_API SQLSetConnectOption (HDBC hdbc, UWORD fOption, UDWORD vParam);
+RETCODE SQL_API SQLSetStmtOption (HSTMT hstmt, UWORD fOption, UDWORD vParam);
+RETCODE SQL_API SQLSpecialColumns (HSTMT hstmt, UWORD fColType,
+ UCHAR FAR * szTableQualifier, SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner, SWORD cbTableOwner, UCHAR FAR * szTableName,
+ SWORD cbTableName, UWORD fScope, UWORD fNullable);
+RETCODE SQL_API SQLStatistics (HSTMT hstmt, UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner,
+ UCHAR FAR * szTableName, SWORD cbTableName, UWORD fUnique, UWORD fAccuracy);
+RETCODE SQL_API SQLTables (HSTMT hstmt, UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner,
+ UCHAR FAR * szTableName, SWORD cbTableName, UCHAR FAR * szTableType,
+ SWORD cbTableType);
+
+/*
+ * Level 2 function prototypes
+ */
+RETCODE SQL_API SQLBrowseConnect (HDBC hdbc,
+ UCHAR FAR * szConnStrIn, SWORD cbConnStrIn, UCHAR FAR * szConnStrOut,
+ SWORD cbConnStrOutMax, SWORD FAR * pcbConnStrOut);
+RETCODE SQL_API SQLColumnPrivileges (HSTMT hstmt,
+ UCHAR FAR * szTableQualifier, SWORD cbTableQualifier,
+ UCHAR FAR * szTableOwner, SWORD cbTableOwner, UCHAR FAR * szTableName,
+ SWORD cbTableName, UCHAR FAR * szColumnName, SWORD cbColumnName);
+RETCODE SQL_API SQLDataSources (HENV henv, UWORD fDirection,
+ UCHAR FAR * szDSN, SWORD cbDSNMax, SWORD FAR * pcbDSN,
+ UCHAR FAR * szDescription, SWORD cbDescriptionMax,
+ SWORD FAR * pcbDescription);
+RETCODE SQL_API SQLDescribeParam (HSTMT hstmt, UWORD ipar,
+ SWORD FAR * pfSqlType, UDWORD FAR * pcbColDef, SWORD FAR * pibScale,
+ SWORD FAR * pfNullable);
+RETCODE SQL_API SQLExtendedFetch (HSTMT hstmt, UWORD fFetchType, SDWORD irow,
+ UDWORD FAR * pcrow, UWORD FAR * rgfRowStatus);
+RETCODE SQL_API SQLForeignKeys (HSTMT hstmt, UCHAR FAR * szPkTableQualifier,
+ SWORD cbPkTableQualifier, UCHAR FAR * szPkTableOwner, SWORD cbPkTableOwner,
+ UCHAR FAR * szPkTableName, SWORD cbPkTableName,
+ UCHAR FAR * szFkTableQualifier, SWORD cbFkTableQualifier,
+ UCHAR FAR * szFkTableOwner, SWORD cbFkTableOwner, UCHAR FAR * szFkTableName,
+ SWORD cbFkTableName);
+RETCODE SQL_API SQLMoreResults (HSTMT hstmt);
+RETCODE SQL_API SQLNativeSql (HDBC hdbc, UCHAR FAR * szSqlStrIn,
+ SDWORD cbSqlStrIn, UCHAR FAR * szSqlStr, SDWORD cbSqlStrMax,
+ SDWORD FAR * pcbSqlStr);
+RETCODE SQL_API SQLNumParams (HSTMT hstmt, SWORD FAR * pcpar);
+RETCODE SQL_API SQLParamOptions (HSTMT hstmt, UDWORD crow, UDWORD FAR * pirow);
+RETCODE SQL_API SQLPrimaryKeys (HSTMT hstmt, UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner,
+ UCHAR FAR * szTableName, SWORD cbTableName);
+RETCODE SQL_API SQLProcedureColumns (HSTMT hstmt, UCHAR FAR * szProcQualifier,
+ SWORD cbProcQualifier, UCHAR FAR * szProcOwner, SWORD cbProcOwner,
+ UCHAR FAR * szProcName, SWORD cbProcName, UCHAR FAR * szColumnName,
+ SWORD cbColumnName);
+RETCODE SQL_API SQLProcedures (HSTMT hstmt, UCHAR FAR * szProcQualifier,
+ SWORD cbProcQualifier, UCHAR FAR * szProcOwner, SWORD cbProcOwner,
+ UCHAR FAR * szProcName, SWORD cbProcName);
+RETCODE SQL_API SQLSetPos (HSTMT hstmt, UWORD irow, UWORD fOption, UWORD fLock);
+RETCODE SQL_API SQLTablePrivileges (HSTMT hstmt, UCHAR FAR * szTableQualifier,
+ SWORD cbTableQualifier, UCHAR FAR * szTableOwner, SWORD cbTableOwner,
+ UCHAR FAR * szTableName, SWORD cbTableName);
+
+/*
+ * SDK 2.0 Additional function prototypes
+ */
+RETCODE SQL_API SQLDrivers (HENV henv, UWORD fDirection,
+ UCHAR FAR * szDriverDesc, SWORD cbDriverDescMax, SWORD FAR * pcbDriverDesc,
+ UCHAR FAR * szDriverAttributes, SWORD cbDrvrAttrMax,
+ SWORD FAR * pcbDrvrAttr);
+RETCODE SQL_API SQLBindParameter (HSTMT hstmt, UWORD ipar, SWORD fParamType,
+ SWORD fCType, SWORD fSqlType, UDWORD cbColDef, SWORD ibScale, PTR rgbValue,
+ SDWORD cbValueMax, SDWORD FAR * pcbValue);
+
+/*
+ * Depreciated - use SQLSetStmtOptions
+ */
+RETCODE SQL_API SQLSetScrollOptions (HSTMT hstmt, UWORD fConcurrency,
+ SDWORD crowKeyset, UWORD crowRowset);
+
+#ifdef __cplusplus
+}
+#endif
#endif
-/** trace functions
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/itrace.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include "../iodbc/henv.ci"
+/*
+ * itrace.c
+ *
+ * $Id$
+ *
+ * Trace functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <itrace.h>
+
+#include <herr.h>
+#include <henv.h>
+#include "henv.ci"
#include <stdio.h>
-static int printreturn(void FAR* istm, int ret )
+static int
+printreturn (void FAR * istm, int ret)
{
- FILE FAR* stm = (FILE FAR*)istm;
- char FAR* ptr = "Invalid return value";
+ FILE FAR *stm = (FILE FAR *) istm;
+ char FAR *ptr = "Invalid return value";
- switch( ret )
- {
- case SQL_SUCCESS:
- ptr = "SQL_SUCCESS";
- break;
+ switch (ret)
+ {
+ case SQL_SUCCESS:
+ ptr = "SQL_SUCCESS";
+ break;
- case SQL_SUCCESS_WITH_INFO:
- ptr = "SQL_SUCCESS_WITH_INFO";
- break;
+ case SQL_SUCCESS_WITH_INFO:
+ ptr = "SQL_SUCCESS_WITH_INFO";
+ break;
- case SQL_NO_DATA_FOUND:
- ptr = "SQL_NO_DATA_FOUND";
- break;
+ case SQL_NO_DATA_FOUND:
+ ptr = "SQL_NO_DATA_FOUND";
+ break;
- case SQL_NEED_DATA:
- ptr = "SQL_NEED_DATA";
- break;
+ case SQL_NEED_DATA:
+ ptr = "SQL_NEED_DATA";
+ break;
- case SQL_INVALID_HANDLE:
- ptr = "SQL_INVALID_HANDLE";
- break;
+ case SQL_INVALID_HANDLE:
+ ptr = "SQL_INVALID_HANDLE";
+ break;
- case SQL_ERROR:
- ptr = "SQL_ERROR";
- break;
+ case SQL_ERROR:
+ ptr = "SQL_ERROR";
+ break;
- case SQL_STILL_EXECUTING:
- ptr = "SQL_STILL_EXECUTING";
- break;
+ case SQL_STILL_EXECUTING:
+ ptr = "SQL_STILL_EXECUTING";
+ break;
- default:
- break;
- }
+ default:
+ break;
+ }
- fprintf( stm, "%s\n", ptr);
- fflush( stm );
+ fprintf (stm, "%s\n", ptr);
+ fflush (stm);
- return 0;
+ return 0;
}
-HPROC _iodbcdm_gettrproc(void FAR* istm, int procid, int type)
+
+HPROC
+_iodbcdm_gettrproc (void FAR * istm, int procid, int type)
{
- FILE FAR* stm = (FILE FAR*)istm;
+ FILE FAR *stm = (FILE FAR *) istm;
- if( type == TRACE_TYPE_DM2DRV )
- {
- int i,j = 0;
+ if (type == TRACE_TYPE_DM2DRV)
+ {
+ int i, j = 0;
- for(i=0;j != en_NullProc ;i++)
- {
- j = odbcapi_symtab[i].en_idx;
+ for (i = 0; j != en_NullProc; i++)
+ {
+ j = odbcapi_symtab[i].en_idx;
- if( j == procid )
- {
- fprintf( stm, "\n%s ( ... )\n",
- odbcapi_symtab[i].symbol);
+ if (j == procid)
+ {
+ fprintf (stm, "\n%s ( ... )\n", odbcapi_symtab[i].symbol);
- fflush( stm );
- }
- }
- }
+ fflush (stm);
+ }
+ }
+ }
- if( type == TRACE_TYPE_RETURN )
- {
- return (HPROC)printreturn;
- }
+ if (type == TRACE_TYPE_RETURN)
+ {
+ return (HPROC) printreturn;
+ }
- return SQL_NULL_HPROC;
+ return SQL_NULL_HPROC;
}
-#ifndef _ITRACE_H
-# define _ITRACE_H
+/*
+ * itrace.h
+ *
+ * $Id$
+ *
+ * Trace functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#ifndef _ITRACE_H
+#define _ITRACE_H
-# ifdef DEBUG
-# ifndef NO_TRACE
-# define NO_TRACE
-# endif
-# endif
+#ifdef DEBUG
+#ifndef NO_TRACE
#define NO_TRACE
+#endif
+
+#endif
-# define TRACE_TYPE_APP2DM 1
-# define TRACE_TYPE_DM2DRV 2
-# define TRACE_TYPE_DRV2DM 3
+#define TRACE_TYPE_APP2DM 1
+#define TRACE_TYPE_DM2DRV 2
+#define TRACE_TYPE_DRV2DM 3
-# define TRACE_TYPE_RETURN 4
+#define TRACE_TYPE_RETURN 4
-extern HPROC _iodbcdm_gettrproc(void FAR* stm, int procid, int type);
+extern HPROC _iodbcdm_gettrproc (void FAR * stm, int procid, int type);
-# ifdef NO_TRACE
-# define TRACE_CALL( stm, trace_on, procid, plist )
-# else
-# define TRACE_CALL( stm, trace_on, plist )\
- {\
- if( trace_on)\
- {\
- HPROC hproc;\
+#ifdef NO_TRACE
+#define TRACE_CALL( stm, trace_on, procid, plist )
+#else
+#define TRACE_CALL( stm, trace_on, plist )\
+ {\
+ if( trace_on)\
+ {\
+ HPROC hproc;\
\
- hproc = _iodbcdm_gettrproc(stm, procid, TRACE_TYPE_APP2DM);\
+ hproc = _iodbcdm_gettrproc(stm, procid, TRACE_TYPE_APP2DM);\
\
- if( hproc )\
- hproc plist;\
- }\
- }
-# endif
+ if( hproc )\
+ hproc plist;\
+ }\
+ }
+#endif
-# ifdef NO_TRACE
-# define TRACE_DM2DRV( stm, procid, plist )
-# else
-# define TRACE_DM2DRV( stm, procid, plist )\
- {\
- HPROC hproc;\
+#ifdef NO_TRACE
+#define TRACE_DM2DRV( stm, procid, plist )
+#else
+#define TRACE_DM2DRV( stm, procid, plist )\
+ {\
+ HPROC hproc;\
\
- hproc = _iodbcdm_gettrproc(stm, procid, TRACE_TYPE_DM2DRV);\
+ hproc = _iodbcdm_gettrproc(stm, procid, TRACE_TYPE_DM2DRV);\
\
- if( hproc )\
- hproc plist;\
- }
-# endif
+ if( hproc )\
+ hproc plist;\
+ }
+#endif
-# ifdef NO_TRACE
-# define TRACE_DRV2DM( stm, procid, plist )
-# else
-# define TRACE_DRV2DM( stm, procid, plist ) \
- {\
- HPROC hproc;\
+#ifdef NO_TRACE
+#define TRACE_DRV2DM( stm, procid, plist )
+#else
+#define TRACE_DRV2DM( stm, procid, plist ) \
+ {\
+ HPROC hproc;\
\
- hproc = _iodbcdm_gettrproc( stm, procid, TRACE_TYPE_DRV2DM);\
+ hproc = _iodbcdm_gettrproc( stm, procid, TRACE_TYPE_DRV2DM);\
\
- if( hproc )\
- hproc plist;\
- }
-# endif
+ if( hproc )\
+ hproc plist;\
+ }
+#endif
-# ifdef NO_TRACE
-# define TRACE_RETURN( stm, trace_on, ret )
-# else
-# define TRACE_RETURN( stm, trace_on, ret )\
- {\
- if( trace_on ) {\
- HPROC hproc;\
+#ifdef NO_TRACE
+#define TRACE_RETURN( stm, trace_on, ret )
+#else
+#define TRACE_RETURN( stm, trace_on, ret )\
+ {\
+ if( trace_on ) {\
+ HPROC hproc;\
\
- hproc = _iodbcdm_gettrproc( stm, 0, TRACE_TYPE_RETURN);\
+ hproc = _iodbcdm_gettrproc( stm, 0, TRACE_TYPE_RETURN);\
\
- if( hproc )\
- hproc( stm, ret );\
- }\
- }
-# endif
+ if( hproc )\
+ hproc( stm, ret );\
+ }\
+ }
+#endif
-# ifdef NO_TRACE
-# define CALL_DRIVER( hdbc, ret, proc, procid, plist ) { ret = proc plist; }
-# else
-# define CALL_DRIVER( hdbc, ret, proc, procid, plist )\
- {\
- DBC_t FAR* pdbc = (DBC_t FAR*)(hdbc);\
+#ifdef NO_TRACE
+#define CALL_DRIVER( hdbc, ret, proc, procid, plist ) { ret = proc plist; }
+#else
+#define CALL_DRIVER( hdbc, ret, proc, procid, plist )\
+ {\
+ DBC_t FAR* pdbc = (DBC_t FAR*)(hdbc);\
\
- if( pdbc->trace ) {\
- TRACE_DM2DRV( pdbc->tstm, procid, plist )\
- ret = proc plist;\
- TRACE_DRV2DM( pdbc->tstm, procid, plist )\
- TRACE_RETURN( pdbc->tstm, 1, ret )\
- }\
- else\
- ret = proc plist;\
- }
-# endif
+ if( pdbc->trace ) {\
+ TRACE_DM2DRV( pdbc->tstm, procid, plist )\
+ ret = proc plist;\
+ TRACE_DRV2DM( pdbc->tstm, procid, plist )\
+ TRACE_RETURN( pdbc->tstm, 1, ret )\
+ }\
+ else\
+ ret = proc plist;\
+ }
+#endif
#endif
+++ /dev/null
-#include <config.h>
-
-/* entry function used to build a share library on AIX */
-int __start()
-{
- return 0;
-}
-/** miscellaneous functions
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#ifdef DLDAPI_OS2
-# define INCL_DOSMODULEMGR /* Module Manager values */
-# define INCL_DOSERRORS /* Error values */
-# include <os2.h>
-# include <stdio.h>
-#endif
+/*
+ * misc.c
+ *
+ * $Id$
+ *
+ * Miscellaneous functions
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
-#include <../iodbc/iodbc.h>
+#include <config.h>
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
+#include <isql.h>
+#include <isqlext.h>
#include <stdio.h>
-#include <strings.h>
-
#include <unistd.h>
-
static int
-upper_strneq(
- char* s1,
- char* s2,
- int n )
+upper_strneq (
+ char *s1,
+ char *s2,
+ int n)
{
- int i;
- char c1, c2;
-
- for(i=1;i<n;i++)
- {
- c1 = s1[i];
- c2 = s2[i];
-
- if( c1 >= 'a' && c1 <= 'z' )
- {
- c1 += ('A' - 'a');
- }
- else if( c1 == '\n' )
- {
- c1 = '\0';
- }
-
- if( c2 >= 'a' && c2 <= 'z' )
- {
- c2 += ('A' - 'a');
- }
- else if( c2 == '\n' )
- {
- c2 = '\0';
- }
-
- if( (c1 - c2) || !c1 || !c2 )
- {
- break;
- }
- }
-
- return (int)!(c1 - c2);
+ int i;
+ char c1, c2;
+
+ for (i = 1; i < n; i++)
+ {
+ c1 = s1[i];
+ c2 = s2[i];
+
+ if (c1 >= 'a' && c1 <= 'z')
+ {
+ c1 += ('A' - 'a');
+ }
+ else if (c1 == '\n')
+ {
+ c1 = '\0';
+ }
+
+ if (c2 >= 'a' && c2 <= 'z')
+ {
+ c2 += ('A' - 'a');
+ }
+ else if (c2 == '\n')
+ {
+ c2 = '\0';
+ }
+
+ if ((c1 - c2) || !c1 || !c2)
+ {
+ break;
+ }
+ }
+
+ return (int) !(c1 - c2);
}
-static char* /* return new position in input str */
-readtoken(
- char* istr, /* old position in input buf */
- char* obuf ) /* token string ( if "\0", then finished ) */
+static char * /* return new position in input str */
+readtoken (
+ char *istr, /* old position in input buf */
+ char *obuf) /* token string ( if "\0", then finished ) */
{
- for(; *istr && *istr != '\n' ; istr ++ )
- {
- char c, nx;
-
- c = *(istr);
-
- if( c == ' ' || c == '\t' )
- {
- continue;
- }
-
- nx = *(istr + 1);
-
- *obuf = c;
- obuf ++;
+ char *start = obuf;
+
+ /* Skip leading white space */
+ while (*istr == ' ' || *istr == '\t')
+ istr++;
+
+ for (; *istr && *istr != '\n'; istr++)
+ {
+ char c, nx;
+
+ c = *(istr);
+ nx = *(istr + 1);
+
+ if (c == ';')
+ {
+ for (; *istr && *istr != '\n'; istr++);
+ break;
+ }
+ *obuf = c;
+ obuf++;
+
+ if (nx == ';' || nx == '=' || c == '=')
+ {
+ istr++;
+ break;
+ }
+ }
+ *obuf = '\0';
+
+ /* Trim end of token */
+ for (; obuf > start && (*(obuf - 1) == ' ' || *(obuf - 1) == '\t');)
+ *--obuf = '\0';
+
+ return istr;
+}
- if( c == ';' || c == '=' )
- {
- istr ++;
- break;
- }
+#if !defined(WINDOWS) && !defined(WIN32) && !defined(OS2)
+# include <pwd.h>
+# define UNIX_PWD
+#endif
- if( nx == ' ' || nx == '\t' || nx == ';' || nx == '=' )
- {
- istr ++;
- break;
- }
- }
+char *
+_iodbcdm_getinifile (char *buf, int size)
+{
+ int i, j;
+ char *ptr;
- *obuf = '\0';
+ j = STRLEN ("/odbc.ini") + 1;
- return istr;
-}
+ if (size < j)
+ {
+ return NULL;
+ }
-#if !defined(WINDOWS) && !defined(WIN32) && !defined(OS2)
-# include <pwd.h>
-# define UNIX_PWD
-#endif
+#if !defined(UNIX_PWD)
-static char*
-getinitfile(char* buf, int size)
-{
- int i, j;
- char* ptr;
+ i = GetWindowsDirectory ((LPSTR) buf, size);
- j = STRLEN("/odbc.ini") + 1;
+ if (i == 0 || i > size - j)
+ {
+ return NULL;
+ }
- if( size < j )
- {
- return NULL;
- }
+ sprintf (buf + i, "/odbc.ini");
-#ifdef FIX_INI_FILE
- sprintf( buf, "%s/odbc.ini", DIR_INI_FILE );
+ return buf;
#else
-# ifdef OS2
- *buf = '\0';
- if( NULL != getenv("IODBC_INI") )
- {
- strcpy( buf, getenv("IODBC_INI") );
- }
- else
- {
- HMODULE hModule;
-
- if( NO_ERROR == DosQueryModuleHandle(DLL_NAME, &hModule) &&
- NO_ERROR == DosQueryModuleName(hModule, 256L, buf) )
- {
- if( NULL != strrchr(buf, '.') )
- *(strchr(buf, '.')) = '\0';
- strcat( buf, ".ini" );
- }
- else
- {
- strcpy( buf, "odbc.ini" );
- }
-
- }
- return buf;
-# else
-# if !defined(UNIX_PWD)
-
- i = GetWindowsDirectory((LPSTR)buf, size );
-
- if( i == 0 || i > size - j )
- {
- return NULL;
- }
-
- sprintf( buf + i, "/odbc.ini");
-
- return buf;
-# else
- ptr = (char*)getpwuid(getuid());
-
- if( ptr == NULL )
- {
- return NULL;
- }
-
- ptr = ((struct passwd*)ptr)->pw_dir;
-
- if( ptr == NULL || *ptr == '\0' )
- {
- ptr = "/home";
- }
-
- if( size < STRLEN(ptr) + j )
- {
- return NULL;
- }
-
- sprintf( buf, "%s%s", ptr, "/.odbc.ini");
- /* i.e. searching ~/.iodbc.ini */
-# endif
-# endif
+ if ((ptr = getenv ("ODBCINI")) != NULL)
+ {
+ strcpy (buf, ptr);
+ return buf;
+ }
+
+ if ((ptr = getenv ("IODBCINI")) != NULL)
+ {
+ strcpy (buf, ptr);
+ return buf;
+ }
+
+ if ((ptr = getenv ("HOME")) == NULL)
+ {
+ ptr = (char *) getpwuid (getuid ());
+
+ if (ptr == NULL)
+ {
+ return NULL;
+ }
+
+ ptr = ((struct passwd *) ptr)->pw_dir;
+ }
+
+ if (ptr == NULL || *ptr == '\0')
+ {
+ ptr = "/home";
+ }
+
+ if (size < STRLEN (ptr) + j)
+ {
+ return NULL;
+ }
+
+ sprintf (buf, "%s%s", ptr, "/.odbc.ini");
+ /* i.e. searching ~/.odbc.ini */
#endif
- return buf;
+ return buf;
}
-char* _iodbcdm_getkeyvalbydsn(
- char* dsn,
- int dsnlen,
- char* keywd,
- char* value,
- int size )
-/* read odbc init file to resolve the value of specified
- * key from named or defaulted dsn section
+
+/*
+ * read odbc init file to resolve the value of specified
+ * key from named or defaulted dsn section
*/
+char *
+_iodbcdm_getkeyvalbydsn (
+ char *dsn,
+ int dsnlen,
+ char *keywd,
+ char *value,
+ int size)
{
- char buf[1024];
- char dsntk[SQL_MAX_DSN_LENGTH + 3] = { '[', '\0' };
- char token[1024]; /* large enough */
- FILE* file;
- char pathbuf[1024];
- char* path;
-
-#define DSN_NOMATCH 0
-#define DSN_NAMED 1
-#define DSN_DEFAULT 2
-
- int dsnid = DSN_NOMATCH;
- int defaultdsn = DSN_NOMATCH;
-
- if( dsn == NULL || *dsn == 0 )
- {
- dsn = "default";
- dsnlen = STRLEN(dsn);
- }
-
- if( dsnlen == SQL_NTS )
- {
- dsnlen = STRLEN(dsn);
- }
-
- if( dsnlen <= 0 || keywd == NULL || buf == 0 || size <= 0 )
- {
- return NULL;
- }
-
- if( dsnlen > sizeof(dsntk) - 2 )
- {
- return NULL;
- }
-
- value[0] = '\0';
-
- STRNCAT( dsntk, dsn, dsnlen );
- STRCAT( dsntk, "]" );
-
- dsnlen = dsnlen + 2;
-
- path = getinitfile(pathbuf, sizeof(pathbuf));
-
- if( path == NULL )
- {
- return NULL;
- }
-
- file = (FILE*)fopen(path, "r");
-
- if( file == NULL )
- {
- return NULL;
- }
-
- for(;;)
- {
- char* str;
-
- str = fgets(buf, sizeof(buf), file);
-
- if( str == NULL )
- {
- break;
- }
-
- strtok( str, "\n\r" );
-
- if( *str == '[' )
- {
- if( upper_strneq(str, "[default]", STRLEN("[default]")) )
- {
- /* we only read first dsn default dsn
- * section (as well as named dsn).
- */
- if( defaultdsn == DSN_NOMATCH )
- {
- dsnid = DSN_DEFAULT;
- defaultdsn = DSN_DEFAULT;
- }
- else
- {
- dsnid = DSN_NOMATCH;
- }
-
- continue;
- }
- else if( upper_strneq( str, dsntk, dsnlen ) )
- {
- dsnid = DSN_NAMED;
- }
- else
- {
- dsnid = DSN_NOMATCH;
- }
-
- continue;
- }
- else if( dsnid == DSN_NOMATCH )
- {
- continue;
- }
-
- str = readtoken(str, token);
-
- if( upper_strneq( keywd, token, STRLEN(keywd)) )
- {
- str = readtoken(str, token);
-
- if( ! STREQ( token, "=") )
- /* something other than = */
- {
- continue;
- }
-
- str = readtoken(str, token);
-
- if( STRLEN(token) > size - 1)
- {
- break;
- }
-
- STRNCPY(value, token, size);
- /* copy the value(i.e. next token) to buf */
-
- if( dsnid != DSN_DEFAULT )
- {
- break;
- }
- }
- }
-
- fclose(file);
-
- return (*value)? value:NULL;
+ char buf[1024];
+ char dsntk[SQL_MAX_DSN_LENGTH + 3] = {'[', '\0'};
+ char token[1024]; /* large enough */
+ FILE *file;
+ char pathbuf[1024];
+ char *path;
+
+#define DSN_NOMATCH 0
+#define DSN_NAMED 1
+#define DSN_DEFAULT 2
+
+ int dsnid = DSN_NOMATCH;
+ int defaultdsn = DSN_NOMATCH;
+
+ if (dsn == NULL || *dsn == 0)
+ {
+ dsn = "default";
+ dsnlen = STRLEN (dsn);
+ }
+
+ if (dsnlen == SQL_NTS)
+ {
+ dsnlen = STRLEN (dsn);
+ }
+
+ if (dsnlen <= 0 || keywd == NULL || buf == 0 || size <= 0)
+ {
+ return NULL;
+ }
+
+ if (dsnlen > sizeof (dsntk) - 2)
+ {
+ return NULL;
+ }
+
+ value[0] = '\0';
+
+ STRNCAT (dsntk, dsn, dsnlen);
+ STRCAT (dsntk, "]");
+
+ dsnlen = dsnlen + 2;
+
+ path = _iodbcdm_getinifile (pathbuf, sizeof (pathbuf));
+
+ if (path == NULL)
+ {
+ return NULL;
+ }
+
+ file = (FILE *) fopen (path, "r");
+
+ if (file == NULL)
+ {
+ return NULL;
+ }
+
+ for (;;)
+ {
+ char *str;
+
+ str = fgets (buf, sizeof (buf), file);
+
+ if (str == NULL)
+ {
+ break;
+ }
+
+ if (*str == '[')
+ {
+ if (upper_strneq (str, "[default]", STRLEN ("[default]")))
+ {
+ /* we only read first dsn default dsn
+ * section (as well as named dsn).
+ */
+ if (defaultdsn == DSN_NOMATCH)
+ {
+ dsnid = DSN_DEFAULT;
+ defaultdsn = DSN_DEFAULT;
+ }
+ else
+ {
+ dsnid = DSN_NOMATCH;
+ }
+
+ continue;
+ }
+ else if (upper_strneq (str, dsntk, dsnlen))
+ {
+ dsnid = DSN_NAMED;
+ }
+ else
+ {
+ dsnid = DSN_NOMATCH;
+ }
+
+ continue;
+ }
+ else if (dsnid == DSN_NOMATCH)
+ {
+ continue;
+ }
+
+ str = readtoken (str, token);
+
+ if (upper_strneq (keywd, token, STRLEN (keywd)))
+ {
+ str = readtoken (str, token);
+
+ if (!STREQ (token, "="))
+ /* something other than = */
+ {
+ continue;
+ }
+
+ str = readtoken (str, token);
+
+ if (STRLEN (token) > size - 1)
+ {
+ break;
+ }
+
+ STRNCPY (value, token, size);
+ /* copy the value(i.e. next token) to buf */
+
+ if (dsnid != DSN_DEFAULT)
+ {
+ break;
+ }
+ }
+ }
+
+ fclose (file);
+
+ return (*value) ? value : NULL;
}
-char* _iodbcdm_getkeyvalinstr(
- char* cnstr,
- int cnlen,
- char* keywd,
- char* value,
- int size )
+
+char *
+_iodbcdm_getkeyvalinstr (
+ char *cnstr,
+ int cnlen,
+ char *keywd,
+ char *value,
+ int size)
{
- char token[1024] = { '\0' };
- int flag = 0;
-
- if( cnstr == NULL || value == NULL
- || keywd == NULL || size < 1 )
- {
- return NULL;
- }
-
- if( cnlen == SQL_NTS )
- {
- cnlen = STRLEN (cnstr);
- }
-
- if( cnlen <= 0 )
- {
- return NULL;
- }
-
- for(;;)
- {
- cnstr = readtoken(cnstr, token);
-
- if( *token == '\0' )
- {
- break;
- }
-
- if( STREQ( token, ";" ) )
- {
- flag = 0;
- continue;
- }
-
- switch(flag)
- {
- case 0:
- if( upper_strneq(token, keywd, strlen(keywd)) )
- {
- flag = 1;
- }
- break;
-
- case 1:
- if( STREQ( token, "=" ) )
- {
- flag = 2;
- }
- break;
-
- case 2:
- if( size < strlen(token) + 1 )
- {
- return NULL;
- }
-
- STRNCPY( value, token, size );
-
- return value;
-
- default:
- break;
- }
- }
-
- return NULL;
+ char token[1024] = {'\0'};
+ int flag = 0;
+
+ if (cnstr == NULL || value == NULL
+ || keywd == NULL || size < 1)
+ {
+ return NULL;
+ }
+
+ if (cnlen == SQL_NTS)
+ {
+ cnlen = STRLEN (cnstr);
+ }
+
+ if (cnlen <= 0)
+ {
+ return NULL;
+ }
+
+ for (;;)
+ {
+ cnstr = readtoken (cnstr, token);
+
+ if (*token == '\0')
+ {
+ break;
+ }
+
+ if (STREQ (token, ";"))
+ {
+ flag = 0;
+ continue;
+ }
+
+ switch (flag)
+ {
+ case 0:
+ if (upper_strneq (token, keywd, strlen (keywd)))
+ {
+ flag = 1;
+ }
+ break;
+
+ case 1:
+ if (STREQ (token, "="))
+ {
+ flag = 2;
+ }
+ break;
+
+ case 2:
+ if (size < strlen (token) + 1)
+ {
+ return NULL;
+ }
+
+ STRNCPY (value, token, size);
+
+ return value;
+
+ default:
+ break;
+ }
+ }
+
+ return NULL;
}
+++ /dev/null
-#define SQLRETURN RETCODE
-SQLRETURN SQL_API SQLDriverConnect(
- SQLHDBC hdbc,
- SQLHWND hwnd,
- SQLCHAR FAR *szConnStrIn,
- SQLSMALLINT cbConnStrIn,
- SQLCHAR FAR *szConnStrOut,
- SQLSMALLINT cbConnStrOutMax,
- SQLSMALLINT FAR *pcbConnStrOut,
- SQLUSMALLINT fDriverCompletion);
-
-SQLRETURN SQL_API SQLBrowseConnect(
- SQLHDBC hdbc,
- SQLCHAR FAR *szConnStrIn,
- SQLSMALLINT cbConnStrIn,
- SQLCHAR FAR *szConnStrOut,
- SQLSMALLINT cbConnStrOutMax,
- SQLSMALLINT FAR *pcbConnStrOut);
-
-SQLRETURN SQL_API SQLColumnPrivileges(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szTableName,
- SQLSMALLINT cbTableName,
- SQLCHAR FAR *szColumnName,
- SQLSMALLINT cbColumnName);
-
-SQLRETURN SQL_API SQLDescribeParam(
- SQLHSTMT hstmt,
- SQLUSMALLINT ipar,
- SQLSMALLINT FAR *pfSqlType,
- SQLUINTEGER FAR *pcbParamDef,
- SQLSMALLINT FAR *pibScale,
- SQLSMALLINT FAR *pfNullable);
-
-SQLRETURN SQL_API SQLExtendedFetch(
- SQLHSTMT hstmt,
- SQLUSMALLINT fFetchType,
- SQLINTEGER irow,
- SQLUINTEGER FAR *pcrow,
- SQLUSMALLINT FAR *rgfRowStatus);
-
-SQLRETURN SQL_API SQLForeignKeys(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szPkCatalogName,
- SQLSMALLINT cbPkCatalogName,
- SQLCHAR FAR *szPkSchemaName,
- SQLSMALLINT cbPkSchemaName,
- SQLCHAR FAR *szPkTableName,
- SQLSMALLINT cbPkTableName,
- SQLCHAR FAR *szFkCatalogName,
- SQLSMALLINT cbFkCatalogName,
- SQLCHAR FAR *szFkSchemaName,
- SQLSMALLINT cbFkSchemaName,
- SQLCHAR FAR *szFkTableName,
- SQLSMALLINT cbFkTableName);
-
-SQLRETURN SQL_API SQLMoreResults(
- SQLHSTMT hstmt);
-
-SQLRETURN SQL_API SQLNativeSql(
- SQLHDBC hdbc,
- SQLCHAR FAR *szSqlStrIn,
- SQLINTEGER cbSqlStrIn,
- SQLCHAR FAR *szSqlStr,
- SQLINTEGER cbSqlStrMax,
- SQLINTEGER FAR *pcbSqlStr);
-
-SQLRETURN SQL_API SQLNumParams(
- SQLHSTMT hstmt,
- SQLSMALLINT FAR *pcpar);
-
-SQLRETURN SQL_API SQLParamOptions(
- SQLHSTMT hstmt,
- SQLUINTEGER crow,
- SQLUINTEGER FAR *pirow);
-
-SQLRETURN SQL_API SQLPrimaryKeys(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szTableName,
- SQLSMALLINT cbTableName);
-
-SQLRETURN SQL_API SQLProcedureColumns(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szProcName,
- SQLSMALLINT cbProcName,
- SQLCHAR FAR *szColumnName,
- SQLSMALLINT cbColumnName);
-
-SQLRETURN SQL_API SQLProcedures(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szProcName,
- SQLSMALLINT cbProcName);
-
-SQLRETURN SQL_API SQLSetPos(
- SQLHSTMT hstmt,
- SQLUSMALLINT irow,
- SQLUSMALLINT fOption,
- SQLUSMALLINT fLock);
-
-SQLRETURN SQL_API SQLTablePrivileges(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szTableName,
- SQLSMALLINT cbTableName);
-
-SQLRETURN SQL_API SQLDrivers(
- SQLHENV henv,
- SQLUSMALLINT fDirection,
- SQLCHAR FAR *szDriverDesc,
- SQLSMALLINT cbDriverDescMax,
- SQLSMALLINT FAR *pcbDriverDesc,
- SQLCHAR FAR *szDriverAttributes,
- SQLSMALLINT cbDrvrAttrMax,
- SQLSMALLINT FAR *pcbDrvrAttr);
-
-SQLRETURN SQL_API SQLBindParameter(
- SQLHSTMT hstmt,
- SQLUSMALLINT ipar,
- SQLSMALLINT fParamType,
- SQLSMALLINT fCType,
- SQLSMALLINT fSqlType,
- SQLUINTEGER cbColDef,
- SQLSMALLINT ibScale,
- SQLPOINTER rgbValue,
- SQLINTEGER cbValueMax,
- SQLINTEGER FAR *pcbValue);
-
-SQLRETURN SQL_API SQLAllocConnect(
- SQLHENV henv,
- SQLHDBC FAR *phdbc);
-
-SQLRETURN SQL_API SQLAllocEnv(
- SQLHENV FAR *phenv);
-
-SQLRETURN SQL_API SQLAllocStmt(
- SQLHDBC hdbc,
- SQLHSTMT FAR *phstmt);
-
-SQLRETURN SQL_API SQLBindCol(
- SQLHSTMT hstmt,
- SQLUSMALLINT icol,
- SQLSMALLINT fCType,
- SQLPOINTER rgbValue,
- SQLINTEGER cbValueMax,
- SQLINTEGER FAR *pcbValue);
-
-SQLRETURN SQL_API SQLCancel(
- SQLHSTMT hstmt);
-
-SQLRETURN SQL_API SQLColAttributes(
- SQLHSTMT hstmt,
- SQLUSMALLINT icol,
- SQLUSMALLINT fDescType,
- SQLPOINTER rgbDesc,
- SQLSMALLINT cbDescMax,
- SQLSMALLINT FAR *pcbDesc,
- SQLINTEGER FAR *pfDesc);
-
-SQLRETURN SQL_API SQLConnect(
- SQLHDBC hdbc,
- SQLCHAR FAR *szDSN,
- SQLSMALLINT cbDSN,
- SQLCHAR FAR *szUID,
- SQLSMALLINT cbUID,
- SQLCHAR FAR *szAuthStr,
- SQLSMALLINT cbAuthStr);
-
-SQLRETURN SQL_API SQLDescribeCol(
- SQLHSTMT hstmt,
- SQLUSMALLINT icol,
- SQLCHAR FAR *szColName,
- SQLSMALLINT cbColNameMax,
- SQLSMALLINT FAR *pcbColName,
- SQLSMALLINT FAR *pfSqlType,
- SQLUINTEGER FAR *pcbColDef,
- SQLSMALLINT FAR *pibScale,
- SQLSMALLINT FAR *pfNullable);
-
-SQLRETURN SQL_API SQLDisconnect(
- SQLHDBC hdbc);
-
-SQLRETURN SQL_API SQLError(
- SQLHENV henv,
- SQLHDBC hdbc,
- SQLHSTMT hstmt,
- SQLCHAR FAR *szSqlState,
- SQLINTEGER FAR *pfNativeError,
- SQLCHAR FAR *szErrorMsg,
- SQLSMALLINT cbErrorMsgMax,
- SQLSMALLINT FAR *pcbErrorMsg);
-
-SQLRETURN SQL_API SQLExecDirect(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szSqlStr,
- SQLINTEGER cbSqlStr);
-
-SQLRETURN SQL_API SQLExecute(
- SQLHSTMT hstmt);
-
-SQLRETURN SQL_API SQLFetch(
- SQLHSTMT hstmt);
-
-SQLRETURN SQL_API SQLFreeConnect(
- SQLHDBC hdbc);
-
-SQLRETURN SQL_API SQLFreeEnv(
- SQLHENV henv);
-
-SQLRETURN SQL_API SQLFreeStmt(
- SQLHSTMT hstmt,
- SQLUSMALLINT fOption);
-
-SQLRETURN SQL_API SQLGetCursorName(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCursor,
- SQLSMALLINT cbCursorMax,
- SQLSMALLINT FAR *pcbCursor);
-
-SQLRETURN SQL_API SQLNumResultCols(
- SQLHSTMT hstmt,
- SQLSMALLINT FAR *pccol);
-
-SQLRETURN SQL_API SQLPrepare(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szSqlStr,
- SQLINTEGER cbSqlStr);
-
-SQLRETURN SQL_API SQLRowCount(
- SQLHSTMT hstmt,
- SQLINTEGER FAR *pcrow);
-
-SQLRETURN SQL_API SQLSetCursorName(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCursor,
- SQLSMALLINT cbCursor);
-
-SQLRETURN SQL_API SQLTransact(
- SQLHENV henv,
- SQLHDBC hdbc,
- SQLUSMALLINT fType);
-
-
-SQLRETURN SQL_API SQLSetParam( /* Use SQLBindParameter */
- SQLHSTMT hstmt,
- SQLUSMALLINT ipar,
- SQLSMALLINT fCType,
- SQLSMALLINT fSqlType,
- SQLUINTEGER cbParamDef,
- SQLSMALLINT ibScale,
- SQLPOINTER rgbValue,
- SQLINTEGER FAR *pcbValue);
-
-SQLRETURN SQL_API SQLColumns(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szTableName,
- SQLSMALLINT cbTableName,
- SQLCHAR FAR *szColumnName,
- SQLSMALLINT cbColumnName);
-
-SQLRETURN SQL_API SQLGetConnectOption(
- SQLHDBC hdbc,
- SQLUSMALLINT fOption,
- SQLPOINTER pvParam);
-
-SQLRETURN SQL_API SQLGetData(
- SQLHSTMT hstmt,
- SQLUSMALLINT icol,
- SQLSMALLINT fCType,
- SQLPOINTER rgbValue,
- SQLINTEGER cbValueMax,
- SQLINTEGER FAR *pcbValue);
-
-SQLRETURN SQL_API SQLGetFunctions(
- SQLHDBC hdbc,
- SQLUSMALLINT fFunction,
- SQLUSMALLINT FAR *pfExists);
-
-SQLRETURN SQL_API SQLGetInfo(
- SQLHDBC hdbc,
- SQLUSMALLINT fInfoType,
- SQLPOINTER rgbInfoValue,
- SQLSMALLINT cbInfoValueMax,
- SQLSMALLINT FAR *pcbInfoValue);
-
-SQLRETURN SQL_API SQLGetStmtOption(
- SQLHSTMT hstmt,
- SQLUSMALLINT fOption,
- SQLPOINTER pvParam);
-
-SQLRETURN SQL_API SQLGetTypeInfo(
- SQLHSTMT hstmt,
- SQLSMALLINT fSqlType);
-
-SQLRETURN SQL_API SQLParamData(
- SQLHSTMT hstmt,
- SQLPOINTER FAR *prgbValue);
-
-SQLRETURN SQL_API SQLPutData(
- SQLHSTMT hstmt,
- SQLPOINTER rgbValue,
- SQLINTEGER cbValue);
-
-SQLRETURN SQL_API SQLSetConnectOption(
- SQLHDBC hdbc,
- SQLUSMALLINT fOption,
- SQLUINTEGER vParam);
-
-SQLRETURN SQL_API SQLSetStmtOption(
- SQLHSTMT hstmt,
- SQLUSMALLINT fOption,
- SQLUINTEGER vParam);
-
-SQLRETURN SQL_API SQLSpecialColumns(
- SQLHSTMT hstmt,
- SQLUSMALLINT fColType,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szTableName,
- SQLSMALLINT cbTableName,
- SQLUSMALLINT fScope,
- SQLUSMALLINT fNullable);
-
-SQLRETURN SQL_API SQLStatistics(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szTableName,
- SQLSMALLINT cbTableName,
- SQLUSMALLINT fUnique,
- SQLUSMALLINT fAccuracy);
-
-SQLRETURN SQL_API SQLTables(
- SQLHSTMT hstmt,
- SQLCHAR FAR *szCatalogName,
- SQLSMALLINT cbCatalogName,
- SQLCHAR FAR *szSchemaName,
- SQLSMALLINT cbSchemaName,
- SQLCHAR FAR *szTableName,
- SQLSMALLINT cbTableName,
- SQLCHAR FAR *szTableType,
- SQLSMALLINT cbTableType);
-
-
-SQLRETURN SQL_API SQLDataSources(
- SQLHENV henv,
- SQLUSMALLINT fDirection,
- SQLCHAR FAR *szDSN,
- SQLSMALLINT cbDSNMax,
- SQLSMALLINT FAR *pcbDSN,
- SQLCHAR FAR *szDescription,
- SQLSMALLINT cbDescriptionMax,
- SQLSMALLINT FAR *pcbDescription);
-
+++ /dev/null
-#define SQL_MAX_USER_NAME_LEN 107
-#define SQL_SPEC_STRING "02.50" /* String constant for version */
-#define SQL_ACTIVE_CONNECTIONS 0
-#define SQL_ACTIVE_STATEMENTS 1
-#define SQL_DATA_SOURCE_NAME 2
-#define SQL_DATABASE_NAME 16 /* Use SQLGetConnectOption/SQL_CURRENT_QUALIFIER */
-#define SQL_DBMS_VER 18
-#define SQL_FETCH_DIRECTION 8
-#define SQL_ROW_UPDATES 11
-#define SQL_ODBC_SAG_CLI_CONFORMANCE 12
-#define SQL_DRIVER_VER 7
-#define SQL_SERVER_NAME 13
-#define SQL_SEARCH_PATTERN_ESCAPE 14
-#define SQL_ODBC_API_CONFORMANCE 9
-#define SQL_ODBC_SQL_CONFORMANCE 15
-#define SQL_OAC_LEVEL1 0x0001
-#define SQL_DBMS_NAME 17
-#define SQL_ACCESSIBLE_PROCEDURES 20
-#define SQL_OUTER_JOINS 38
-#define SQL_NEED_LONG_DATA_LEN 111
-#define SQL_EXPRESSIONS_IN_ORDERBY 27
-#define SQL_PROCEDURES 21
-#define SQL_COLUMN_ALIAS 87
-#define SQL_CONCAT_NULL_BEHAVIOR 22
-#define SQL_DATA_SOURCE_READ_ONLY 25
-#define SQL_ACCESSIBLE_TABLES 19
-#define SQL_IDENTIFIER_QUOTE_CHAR 29
-#define SQL_MAX_COLUMN_NAME_LEN 30
-#define SQL_MAX_CURSOR_NAME_LEN 31
-#define SQL_MAX_OWNER_NAME_LEN 32
-#define SQL_MAX_PROCEDURE_NAME_LEN 33
-#define SQL_MAX_QUALIFIER_NAME_LEN 34
-#define SQL_MAX_TABLE_NAME_LEN 35
-#define SQL_MULT_RESULT_SETS 36
-#define SQL_MULTIPLE_ACTIVE_TXN 37
-#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103
-#define SQL_OWNER_TERM 39
-#define SQL_PROCEDURE_TERM 40
-#define SQL_QUALIFIER_NAME_SEPARATOR 41
-#define SQL_QUALIFIER_TERM 42
-#define SQL_SCROLL_CONCURRENCY 43
-#define SQL_SCROLL_OPTIONS 44
-#define SQL_TABLE_TERM 45
-#define SQL_TXN_CAPABLE 46
-#define SQL_USER_NAME 47
-#define SQL_CONVERT_FUNCTIONS 48
-#define SQL_SYSTEM_FUNCTIONS 51
-#define SQL_NUMERIC_FUNCTIONS 49
-#define SQL_STRING_FUNCTIONS 50
-#define SQL_TIMEDATE_FUNCTIONS 52
-
-#define SQL_CONVERT_BIGINT 53
-#define SQL_CONVERT_BIT 55
-#define SQL_CONVERT_CHAR 56
-#define SQL_CONVERT_DATE 57
-#define SQL_CONVERT_DECIMAL 58
-#define SQL_CONVERT_DOUBLE 59
-#define SQL_CONVERT_FLOAT 60
-#define SQL_CONVERT_INTEGER 61
-#define SQL_CONVERT_LONGVARCHAR 62
-#define SQL_CONVERT_NUMERIC 63
-#define SQL_CONVERT_REAL 64
-#define SQL_CONVERT_SMALLINT 65
-#define SQL_CONVERT_TIME 66
-#define SQL_CONVERT_TIMESTAMP 67
-#define SQL_CONVERT_TIMESTAMP 67
-#define SQL_CONVERT_TINYINT 68
-#define SQL_CONVERT_VARCHAR 70
-#define SQL_CVT_CHAR 0x00000001L
-#define SQL_CVT_NUMERIC 0x00000002L
-#define SQL_CVT_DECIMAL 0x00000004L
-#define SQL_CVT_INTEGER 0x00000008L
-#define SQL_CVT_SMALLINT 0x00000010L
-#define SQL_CVT_FLOAT 0x00000020L
-#define SQL_CVT_REAL 0x00000040L
-#define SQL_CVT_DOUBLE 0x00000080L
-#define SQL_CVT_VARCHAR 0x00000100L
-#define SQL_CVT_LONGVARCHAR 0x00000200L
-#define SQL_CVT_BIT 0x00001000L
-#define SQL_CVT_TINYINT 0x00002000L
-#define SQL_CVT_BIGINT 0x00004000L
-#define SQL_CVT_DATE 0x00008000L
-#define SQL_CVT_TIME 0x00010000L
-#define SQL_CVT_TIMESTAMP 0x00020000L
-#define SQL_CVT_TIMESTAMP 0x00020000L
-#define SQL_CONVERT_BINARY 54
-#define SQL_CONVERT_VARBINARY 69
-#define SQL_CONVERT_LONGVARBINARY 71
-#define SQL_CORRELATION_NAME 74
-#define SQL_CN_DIFFERENT 0x0001
-#define SQL_NNC_NON_NULL 0x0001
-#define SQL_NULL_COLLATION 85
-#define SQL_NC_START 0x0002
-#define SQL_MAX_COLUMNS_IN_GROUP_BY 97
-#define SQL_MAX_COLUMNS_IN_ORDER_BY 99
-#define SQL_MAX_COLUMNS_IN_SELECT 100
-#define SQL_MAX_COLUMNS_IN_TABLE 101
-#define SQL_MAX_TABLES_IN_SELECT 106
-#define SQL_MAX_ROW_SIZE_INCLUDES_LONG 103
-#define SQL_MAX_ROW_SIZE 104
-#define SQL_MAX_BINARY_LITERAL_LEN 112
-#define SQL_MAX_CHAR_LITERAL_LEN 108
-#define SQL_MAX_COLUMNS_IN_INDEX 98
-#define SQL_MAX_INDEX_SIZE 102
-#define SQL_MAX_STATEMENT_LEN 105
-#define SQL_MAX_OPTION_STRING_LENGTH 256
-
-#define SQL_QL_START 0x0001L
-#define SQL_SEARCHABLE 3
-#define SQL_IDENTIFIER_CASE 28
-#define SQL_COLUMN_NAME 1
-#define SQL_COLUMN_TYPE 2
-#define SQL_COLUMN_TYPE_NAME 14
-#define SQL_COLUMN_PRECISION 4
-#define SQL_COLUMN_DISPLAY_SIZE 6
-#define SQL_COLUMN_LENGTH 3
-#define SQL_COLUMN_SCALE 5
-#define SQL_COLUMN_NULLABLE 7
-#define SQL_COLUMN_SEARCHABLE 13
-#define SQL_COLUMN_UNSIGNED 8
-#define SQL_COLUMN_MONEY 9
-#define SQL_COLUMN_AUTO_INCREMENT 11
-#define SQL_COLUMN_CASE_SENSITIVE 12
-#define SQL_COLUMN_UPDATABLE 10
-#define SQL_COLUMN_OWNER_NAME 16
-#define SQL_COLUMN_QUALIFIER_NAME 17
-#define SQL_OSCC_COMPLIANT 0x0001
-#define SQL_ODBC_SQL_OPT_IEF 73
-#define SQL_LIKE_ESCAPE_CLAUSE 113
-#define SQL_ORDER_BY_COLUMNS_IN_SELECT 90
-#define SQL_POS_OPERATIONS 79
-#define SQL_POSITIONED_STATEMENTS 80
-#define SQL_LOCK_TYPES 78
-#define SQL_BOOKMARK_PERSISTENCE 82
-#define SQL_ALTER_TABLE 86
-#define SQL_OWNER_USAGE 91
-#define SQL_QUALIFIER_USAGE 92
-#define SQL_QUOTED_IDENTIFIER_CASE 93
-#define SQL_SUBQUERIES 95
-#define SQL_UNION 96
-#define SQL_TIMEDATE_DIFF_INTERVALS 110
-#define SQL_GETDATA_EXTENSIONS 81
-#define SQL_GD_ANY_COLUMN 0x00000001L
-#define SQL_GD_ANY_ORDER 0x00000002L
-#define SQL_GD_BOUND 0x00000008L
-#define SQL_STATIC_SENSITIVITY 83
-#define SQL_SS_DELETIONS 0x00000002L
-#define SQL_SS_UPDATES 0x00000004L
-#define SQL_FILE_USAGE 84
-#define SQL_FILE_NOT_SUPPORTED 0x0000
-#define SQL_GROUP_BY 88
-#define SQL_GB_GROUP_BY_EQUALS_SELECT 0x0001
-#define SQL_KEYWORDS 89
-#define SQL_SPECIAL_CHARACTERS 94
-#define SQL_TIMEDATE_ADD_INTERVALS 109
-#define SQL_IC_MIXED 0x0004
-#define SQL_FN_SYS_DBNAME 0x00000002L
-#define SQL_FN_SYS_IFNULL 0x00000004L
-#define SQL_FN_SYS_USERNAME 0x00000001L
-#define SQL_FN_STR_INSERT 0x00000002L
-#define SQL_FN_STR_LTRIM 0x00000008L
-#define SQL_FN_STR_RTRIM 0x00000400L
-#define SQL_BLOB 21
-#define SQL_BLOB_LOCATOR 22
-#define SQL_CLOB 23
-#define SQL_CLOB_LOCATOR 24
-#define SQL_DBCLOB 25
-#define SQL_DBCLOB_LOCATOR 26
-#define SQL_GRAPHIC 27
-#define SQL_LONGVARGRAPHIC 30
-#define SQL_VARGRAPHIC 32
-#define SQL_SQLSTATE_SIZE 8
-#define SQL_COLUMN_DISTINCT_TYPE 1250
-#define SQL_COLUMN_TABLE_NAME 15
-#define SQL_LEN_DATA_AT_EXEC_OFFSET (-100)
-#define SQL_CB_NULL 0x0000
-#define SQL_TC_NONE 0x0000
-#define SQL_NOSCAN_OFF 0UL
-#define SQL_ASYNC_ENABLE_OFF 0UL
-#define SQL_SC_NON_UNIQUE 0UL
-#define SQL_UB_OFF 0UL
-#define SQL_PC_NOT_PSEUDO 1
-#define SQL_PC_NON_PSEUDO SQL_PC_NOT_PSEUDO
-#define SQL_UNSEARCHABLE 0
-#define SQL_FD_FETCH_NEXT 0x00000001L
-#define SQL_FD_FETCH_FIRST 0x00000002L
-#define SQL_FD_FETCH_LAST 0x00000004L
-#define SQL_FD_FETCH_PRIOR 0x00000008L
-#define SQL_FD_FETCH_PREV SQL_FD_FETCH_PRIOR
-#define SQL_FD_FETCH_ABSOLUTE 0x00000010L
-#define SQL_FD_FETCH_RELATIVE 0x00000020L
-
-#define SQL_FN_NUM_ABS 0x00000001L
-#define SQL_FN_NUM_ACOS 0x00000002L
-#define SQL_FN_NUM_ASIN 0x00000004L
-#define SQL_FN_NUM_ATAN 0x00000008L
-#define SQL_FN_NUM_ATAN2 0x00000010L
-#define SQL_FN_NUM_CEILING 0x00000020L
-#define SQL_FN_NUM_COS 0x00000040L
-#define SQL_FN_NUM_COT 0x00000080L
-#define SQL_FN_NUM_EXP 0x00000100L
-#define SQL_FN_NUM_FLOOR 0x00000200L
-#define SQL_FN_NUM_LOG 0x00000400L
-#define SQL_FN_NUM_MOD 0x00000800L
-#define SQL_FN_NUM_SIGN 0x00001000L
-#define SQL_FN_NUM_SIN 0x00002000L
-#define SQL_FN_NUM_SQRT 0x00004000L
-#define SQL_FN_NUM_TAN 0x00008000L
-#define SQL_FN_NUM_PI 0x00010000L
-#define SQL_FN_NUM_RAND 0x00020000L
-#define SQL_FN_NUM_DEGREES 0x00040000L
-#define SQL_FN_NUM_LOG10 0x00080000L
-#define SQL_FN_NUM_POWER 0x00100000L
-#define SQL_FN_NUM_RADIANS 0x00200000L
-#define SQL_FN_NUM_ROUND 0x00400000L
-#define SQL_FN_NUM_TRUNCATE 0x00800000L
-
-#define SQL_FN_STR_CONCAT 0x00000001L
-#define SQL_FN_STR_INSERT 0x00000002L
-#define SQL_FN_STR_LEFT 0x00000004L
-#define SQL_FN_STR_LTRIM 0x00000008L
-#define SQL_FN_STR_LENGTH 0x00000010L
-#define SQL_FN_STR_LOCATE 0x00000020L
-#define SQL_FN_STR_LCASE 0x00000040L
-#define SQL_FN_STR_REPEAT 0x00000080L
-#define SQL_FN_STR_REPLACE 0x00000100L
-#define SQL_FN_STR_RIGHT 0x00000200L
-#define SQL_FN_STR_RTRIM 0x00000400L
-#define SQL_FN_STR_SUBSTRING 0x00000800L
-#define SQL_FN_STR_UCASE 0x00001000L
-#define SQL_FN_STR_ASCII 0x00002000L
-#define SQL_FN_STR_CHAR 0x00004000L
-#define SQL_FN_STR_DIFFERENCE 0x00008000L
-#define SQL_FN_STR_LOCATE_2 0x00010000L
-#define SQL_FN_STR_SOUNDEX 0x00020000L
-#define SQL_FN_STR_SPACE 0x00040000L
-#define SQL_FN_STR_BIT_LENGTH 0x00080000L
-#define SQL_FN_STR_CHAR_LENGTH 0x00100000L
-#define SQL_FN_STR_CHARACTER_LENGTH 0x00200000L
-#define SQL_FN_STR_OCTET_LENGTH 0x00400000L
-#define SQL_FN_STR_POSITION 0x00800000L
-
-#define SQL_FN_TD_NOW 0x00000001L
-#define SQL_FN_TD_CURDATE 0x00000002L
-#define SQL_FN_TD_DAYOFMONTH 0x00000004L
-#define SQL_FN_TD_DAYOFWEEK 0x00000008L
-#define SQL_FN_TD_DAYOFYEAR 0x00000010L
-#define SQL_FN_TD_MONTH 0x00000020L
-#define SQL_FN_TD_QUARTER 0x00000040L
-#define SQL_FN_TD_WEEK 0x00000080L
-#define SQL_FN_TD_YEAR 0x00000100L
-#define SQL_FN_TD_CURTIME 0x00000200L
-#define SQL_FN_TD_HOUR 0x00000400L
-#define SQL_FN_TD_MINUTE 0x00000800L
-#define SQL_FN_TD_SECOND 0x00001000L
-#define SQL_FN_TD_TIMESTAMPADD 0x00002000L
-#define SQL_FN_TD_TIMESTAMPDIFF 0x00004000L
-#define SQL_FN_TD_DAYNAME 0x00008000L
-#define SQL_FN_TD_MONTHNAME 0x00010000L
-#define SQL_FN_TD_CURRENT_DATE 0x00020000L
-#define SQL_FN_TD_CURRENT_TIME 0x00040000L
-#define SQL_FN_TD_CURRENT_TIMESTAMP 0x00080000L
-#define SQL_FN_TD_EXTRACT 0x00100000L
-
-#define SQL_POS_POSITION 0x00000001L
-#define SQL_AT_ADD_COLUMN 0x00000001L
-#define SQL_AT_DROP_COLUMN 0x00000002L
-#define SQL_GB_NO_RELATION 0x0003
-#define SQL_BIND_BY_COLUMN 0UL
-#define SQL_BIND_TYPE_DEFAULT SQL_BIND_BY_COLUMN /* Default value */
-#define SQL_ATTR_READONLY 0
-#define SQL_FETCH_PREV SQL_FETCH_PRIOR
-#define SQL_ROW_SUCCESS 0
-#define SQL_ROW_NOROW 3
-#define SQL_NOSCAN 2
-
-#define SQL_RD_OFF 0UL
-#define SQL_RD_ON 1UL
-#define SQL_RD_DEFAULT SQL_RD_ON
-
-#define SQL_NOSCAN_OFF 0UL
-#define SQL_NOSCAN_ON 1UL
-#define SQL_NOSCAN_DEFAULT SQL_NOSCAN_OFF
-/** Prepare a query
-
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
-
-#include <../iodbc/iodbc.h>
-
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
-
-#include <../iodbc/dlproc.h>
-
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
-
-#include <../iodbc/itrace.h>
-
-
-RETCODE SQL_API SQLPrepare (
- HSTMT hstmt,
- UCHAR FAR* szSqlStr,
- SDWORD cbSqlStr )
+/*
+ * prepare.c
+ *
+ * $Id$
+ *
+ * Prepare a query
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
+
+#include <unistd.h>
+
+RETCODE SQL_API
+SQLPrepare (
+ HSTMT hstmt,
+ UCHAR FAR * szSqlStr,
+ SDWORD cbSqlStr)
{
- STMT_t FAR* pstmt = (STMT_t*)hstmt;
-
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode = SQL_SUCCESS;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- /* not on asyn state */
- switch( pstmt->state )
- {
- case en_stmt_fetched:
- case en_stmt_xfetched:
- sqlstat = en_24000;
- break;
-
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- sqlstat = en_S1010;
- break;
-
- default:
- break;
- }
- }
- else if( pstmt->asyn_on != en_Prepare )
- {
- /* asyn on other */
- sqlstat = en_S1010;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- if( szSqlStr == NULL )
- {
- PUSHSQLERR ( pstmt->herr, en_S1009 );
-
- return SQL_ERROR;
- }
-
- if( cbSqlStr < 0 && cbSqlStr != SQL_NTS )
- {
- PUSHSQLERR ( pstmt->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_Prepare );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_Prepare, (
- pstmt->dhstmt, szSqlStr, cbSqlStr) )
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, szSqlStr, cbSqlStr );
-#endif
-
- /* stmt state transition */
- if( pstmt->asyn_on == en_Prepare )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- return retcode;
-
- case SQL_STILL_EXECUTING:
- default:
- return retcode;
- }
- }
-
- switch( retcode )
- {
- case SQL_STILL_EXECUTING:
- pstmt->asyn_on = en_Prepare;
- break;
-
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- pstmt->state = en_stmt_prepared;
- pstmt->prep_state = 1;
- break;
-
- case SQL_ERROR:
- switch( pstmt->state )
- {
- case en_stmt_prepared:
- case en_stmt_executed:
- pstmt->state = en_stmt_allocated;
- pstmt->prep_state = 0;
- break;
-
- default:
- break;
- }
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t *) hstmt;
+
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode = SQL_SUCCESS;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ /* not on asyn state */
+ switch (pstmt->state)
+ {
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ sqlstat = en_24000;
+ break;
+
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ sqlstat = en_S1010;
+ break;
+
+ default:
+ break;
+ }
+ }
+ else if (pstmt->asyn_on != en_Prepare)
+ {
+ /* asyn on other */
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ if (szSqlStr == NULL)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1009);
+
+ return SQL_ERROR;
+ }
+
+ if (cbSqlStr < 0 && cbSqlStr != SQL_NTS)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_Prepare);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Prepare,
+ (pstmt->dhstmt, szSqlStr, cbSqlStr))
+
+ /* stmt state transition */
+ if (pstmt->asyn_on == en_Prepare)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ return retcode;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ return retcode;
+ }
+ }
+
+ switch (retcode)
+ {
+ case SQL_STILL_EXECUTING:
+ pstmt->asyn_on = en_Prepare;
+ break;
+
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ pstmt->state = en_stmt_prepared;
+ pstmt->prep_state = 1;
+ break;
+
+ case SQL_ERROR:
+ switch (pstmt->state)
+ {
+ case en_stmt_prepared:
+ case en_stmt_executed:
+ pstmt->state = en_stmt_allocated;
+ pstmt->prep_state = 0;
+ break;
+
+ default:
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLSetCursorName (
- HSTMT hstmt,
- UCHAR FAR* szCursor,
- SWORD cbCursor )
+
+RETCODE SQL_API
+SQLSetCursorName (
+ HSTMT hstmt,
+ UCHAR FAR * szCursor,
+ SWORD cbCursor)
{
- STMT_t FAR* pstmt = (STMT_t*)hstmt;
- HPROC hproc = SQL_NULL_HPROC;
-
- RETCODE retcode = SQL_SUCCESS;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- if( szCursor == NULL )
- {
- PUSHSQLERR ( pstmt->herr, en_S1009 );
-
- return SQL_ERROR;
- }
-
- if( cbCursor < 0 && cbCursor != SQL_NTS )
- {
- PUSHSQLERR ( pstmt->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on != en_NullProc )
- {
- sqlstat = en_S1010;
- }
- else
- {
- switch( pstmt->state )
- {
- case en_stmt_executed:
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- sqlstat = en_24000;
- break;
-
- case en_stmt_needdata:
- case en_stmt_mustput:
- case en_stmt_canput:
- sqlstat = en_S1010;
- break;
-
- default:
- break;
- }
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_SetCursorName);
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_SetCursorName, (
- pstmt->dhstmt, szCursor, cbCursor ) )
-
-#if 0
- retcode = hproc ( pstmt->dhstmt, szCursor, cbCursor );
-#endif
-
- if( retcode == SQL_SUCCESS
- || retcode == SQL_SUCCESS_WITH_INFO )
- {
- pstmt->cursor_state = en_stmt_cursor_named;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+
+ RETCODE retcode = SQL_SUCCESS;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ if (szCursor == NULL)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1009);
+
+ return SQL_ERROR;
+ }
+
+ if (cbCursor < 0 && cbCursor != SQL_NTS)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on != en_NullProc)
+ {
+ sqlstat = en_S1010;
+ }
+ else
+ {
+ switch (pstmt->state)
+ {
+ case en_stmt_executed:
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ sqlstat = en_24000;
+ break;
+
+ case en_stmt_needdata:
+ case en_stmt_mustput:
+ case en_stmt_canput:
+ sqlstat = en_S1010;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetCursorName);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetCursorName,
+ (pstmt->dhstmt, szCursor, cbCursor))
+
+ if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
+ {
+ pstmt->cursor_state = en_stmt_cursor_named;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLBindParameter (
- HSTMT hstmt,
- UWORD ipar,
- SWORD fParamType,
- SWORD fCType,
- SWORD fSqlType,
- UDWORD cbColDef,
- SWORD ibScale,
- PTR rgbValue,
- SDWORD cbValueMax,
- SDWORD FAR* pcbValue )
+
+RETCODE SQL_API
+SQLBindParameter (
+ HSTMT hstmt,
+ UWORD ipar,
+ SWORD fParamType,
+ SWORD fCType,
+ SWORD fSqlType,
+ UDWORD cbColDef,
+ SWORD ibScale,
+ PTR rgbValue,
+ SDWORD cbValueMax,
+ SDWORD FAR * pcbValue)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc = SQL_NULL_HPROC;
-
- int sqlstat = en_00000;
- RETCODE retcode = SQL_SUCCESS;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check param */
- if( fSqlType > SQL_TYPE_MAX
- || ( fSqlType < SQL_TYPE_MIN
- && fSqlType > SQL_TYPE_DRIVER_START ) )
- /* Note: SQL_TYPE_DRIVER_START is a nagtive number
- * So, we use ">" */
- {
- sqlstat = en_S1004;
- }
- else if ( ipar < 1 )
- {
- sqlstat = en_S1093;
- }
- else if( (rgbValue == NULL && pcbValue == NULL)
- && fParamType != SQL_PARAM_OUTPUT )
- {
- sqlstat = en_S1009;
- /* This means, I allow output to nowhere
- * (i.e. * junk output result). But I can't
- * allow input from nowhere.
- */
- }
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+
+ int sqlstat = en_00000;
+ RETCODE retcode = SQL_SUCCESS;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check param */
+ if (fSqlType > SQL_TYPE_MAX ||
+ (fSqlType < SQL_TYPE_MIN && fSqlType > SQL_TYPE_DRIVER_START))
+ /* Note: SQL_TYPE_DRIVER_START is a nagtive number
+ * So, we use ">" */
+ {
+ sqlstat = en_S1004;
+ }
+ else if (ipar < 1)
+ {
+ sqlstat = en_S1093;
+ }
+ else if ((rgbValue == NULL && pcbValue == NULL)
+ && fParamType != SQL_PARAM_OUTPUT)
+ {
+ sqlstat = en_S1009;
+ /* This means, I allow output to nowhere
+ * (i.e. * junk output result). But I can't
+ * allow input from nowhere.
+ */
+ }
/**********
- else if( cbValueMax < 0L && cbValueMax != SQL_SETPARAM_VALUE_MAX )
- {
- sqlstat = en_S1090;
- }
+ else if( cbValueMax < 0L && cbValueMax != SQL_SETPARAM_VALUE_MAX )
+ {
+ sqlstat = en_S1090;
+ }
**********/
- else if( fParamType != SQL_PARAM_INPUT
- && fParamType != SQL_PARAM_OUTPUT
- && fParamType != SQL_PARAM_INPUT_OUTPUT )
- {
- sqlstat = en_S1105;
- }
- else
- {
- switch( fCType )
- {
- case SQL_C_DEFAULT:
- case SQL_C_CHAR:
- case SQL_C_BINARY:
- case SQL_C_BIT:
- case SQL_C_TINYINT:
- case SQL_C_STINYINT:
- case SQL_C_UTINYINT:
- case SQL_C_SHORT:
- case SQL_C_SSHORT:
- case SQL_C_USHORT:
- case SQL_C_LONG:
- case SQL_C_SLONG:
- case SQL_C_ULONG:
- case SQL_C_FLOAT:
- case SQL_C_DOUBLE:
- case SQL_C_DATE:
- case SQL_C_TIME:
- case SQL_C_TIMESTAMP:
- break;
-
- default:
- sqlstat = en_S1003;
- break;
- }
- }
-
- if(sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- retcode = SQL_ERROR;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_BindParameter );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_BindParameter, (
- pstmt->dhstmt, ipar, fParamType, fCType, fSqlType,
- cbColDef, ibScale, rgbValue, cbValueMax, pcbValue ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt, ipar, fParamType, fCType, fSqlType,
- cbColDef, ibScale, rgbValue, cbValueMax, pcbValue );
-#endif
-
- return retcode;
+ else if (fParamType != SQL_PARAM_INPUT
+ && fParamType != SQL_PARAM_OUTPUT
+ && fParamType != SQL_PARAM_INPUT_OUTPUT)
+ {
+ sqlstat = en_S1105;
+ }
+ else
+ {
+ switch (fCType)
+ {
+ case SQL_C_DEFAULT:
+ case SQL_C_CHAR:
+ case SQL_C_BINARY:
+ case SQL_C_BIT:
+ case SQL_C_TINYINT:
+ case SQL_C_STINYINT:
+ case SQL_C_UTINYINT:
+ case SQL_C_SHORT:
+ case SQL_C_SSHORT:
+ case SQL_C_USHORT:
+ case SQL_C_LONG:
+ case SQL_C_SLONG:
+ case SQL_C_ULONG:
+ case SQL_C_FLOAT:
+ case SQL_C_DOUBLE:
+ case SQL_C_DATE:
+ case SQL_C_TIME:
+ case SQL_C_TIMESTAMP:
+ break;
+
+ default:
+ sqlstat = en_S1003;
+ break;
+ }
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ retcode = SQL_ERROR;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_BindParameter);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_BindParameter,
+ (pstmt->dhstmt, ipar, fParamType, fCType, fSqlType, cbColDef,
+ ibScale, rgbValue, cbValueMax, pcbValue))
+
+ return retcode;
}
-RETCODE SQL_API SQLParamOptions(
- HSTMT hstmt,
- UDWORD crow,
- UDWORD FAR* pirow )
-{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
+RETCODE SQL_API
+SQLParamOptions (
+ HSTMT hstmt,
+ UDWORD crow,
+ UDWORD FAR * pirow)
+{
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
- if( crow == (UDWORD)0UL )
- {
- PUSHSQLERR ( pstmt->herr, en_S1107 );
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
- return SQL_ERROR;
- }
+ if (crow == (UDWORD) 0UL)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1107);
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
+ return SQL_ERROR;
+ }
- return SQL_ERROR;
- }
+ if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
- hproc = _iodbcdm_getproc ( pstmt->hdbc, en_ParamOptions );
+ return SQL_ERROR;
+ }
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ParamOptions);
- return SQL_ERROR;
- }
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ParamOptions, (
- pstmt->dhstmt, crow, pirow) )
+ return SQL_ERROR;
+ }
-#if 0
- retcode = hproc ( pstmt->dhstmt, crow, pirow );
-#endif
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ParamOptions,
+ (pstmt->dhstmt, crow, pirow))
- return retcode;
+ return retcode;
}
-RETCODE SQL_API SQLSetScrollOptions(
- HSTMT hstmt,
- UWORD fConcurrency,
- SDWORD crowKeyset,
- UWORD crowRowset )
+
+RETCODE SQL_API
+SQLSetScrollOptions (
+ HSTMT hstmt,
+ UWORD fConcurrency,
+ SDWORD crowKeyset,
+ UWORD crowRowset)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- int sqlstat = en_00000;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- for(;;)
- {
- if( crowRowset == (UWORD)0 )
- {
- sqlstat = en_S1107;
- break;
- }
-
- if( crowKeyset > (SDWORD)0L && crowKeyset < (SDWORD)crowRowset )
- {
- sqlstat = en_S1107;
- break;
- }
-
- if( crowKeyset < 1 )
- {
- if( crowKeyset != SQL_SCROLL_FORWARD_ONLY
- && crowKeyset != SQL_SCROLL_STATIC
- && crowKeyset != SQL_SCROLL_KEYSET_DRIVEN
- && crowKeyset != SQL_SCROLL_DYNAMIC )
- {
- sqlstat = en_S1107;
- break;
- }
- }
-
- if( fConcurrency != SQL_CONCUR_READ_ONLY
- && fConcurrency != SQL_CONCUR_LOCK
- && fConcurrency != SQL_CONCUR_ROWVER
- && fConcurrency != SQL_CONCUR_VALUES )
- {
- sqlstat = en_S1108;
- break;
- }
-
- if( pstmt->state != en_stmt_allocated )
- {
- sqlstat = en_S1010;
- break;
- }
-
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_SetScrollOptions );
-
- if( hproc == SQL_NULL_HPROC )
- {
- sqlstat = en_IM001;
- break;
- }
-
- sqlstat = en_00000;
- if( 1 ) /* turn off solaris warning message */
- break;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_SetScrollOptions, (
- pstmt->dhstmt,
- fConcurrency,
- crowKeyset,
- crowRowset ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- fConcurrency,
- crowKeyset,
- crowRowset );
-#endif
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ int sqlstat = en_00000;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ for (;;)
+ {
+ if (crowRowset == (UWORD) 0)
+ {
+ sqlstat = en_S1107;
+ break;
+ }
+
+ if (crowKeyset > (SDWORD) 0L && crowKeyset < (SDWORD) crowRowset)
+ {
+ sqlstat = en_S1107;
+ break;
+ }
+
+ if (crowKeyset < 1)
+ {
+ if (crowKeyset != SQL_SCROLL_FORWARD_ONLY
+ && crowKeyset != SQL_SCROLL_STATIC
+ && crowKeyset != SQL_SCROLL_KEYSET_DRIVEN
+ && crowKeyset != SQL_SCROLL_DYNAMIC)
+ {
+ sqlstat = en_S1107;
+ break;
+ }
+ }
+
+ if (fConcurrency != SQL_CONCUR_READ_ONLY
+ && fConcurrency != SQL_CONCUR_LOCK
+ && fConcurrency != SQL_CONCUR_ROWVER
+ && fConcurrency != SQL_CONCUR_VALUES)
+ {
+ sqlstat = en_S1108;
+ break;
+ }
+
+ if (pstmt->state != en_stmt_allocated)
+ {
+ sqlstat = en_S1010;
+ break;
+ }
+
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetScrollOptions);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ sqlstat = en_IM001;
+ break;
+ }
+
+ sqlstat = en_00000;
+ if (1) /* turn off solaris warning message */
+ break;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_SetScrollOptions,
+ (pstmt->dhstmt, fConcurrency, crowKeyset, crowRowset))
+
+ return retcode;
}
-RETCODE SQL_API SQLSetParam (
- HSTMT hstmt,
- UWORD ipar,
- SWORD fCType,
- SWORD fSqlType,
- UDWORD cbColDef,
- SWORD ibScale,
- PTR rgbValue,
- SDWORD FAR *pcbValue)
+
+RETCODE SQL_API
+SQLSetParam (
+ HSTMT hstmt,
+ UWORD ipar,
+ SWORD fCType,
+ SWORD fSqlType,
+ UDWORD cbColDef,
+ SWORD ibScale,
+ PTR rgbValue,
+ SDWORD FAR * pcbValue)
{
- return SQLBindParameter(hstmt,
- ipar,
- (SWORD)SQL_PARAM_INPUT_OUTPUT,
- fCType,
- fSqlType,
- cbColDef,
- ibScale,
- rgbValue,
- SQL_SETPARAM_VALUE_MAX,
- pcbValue );
+ return SQLBindParameter (hstmt,
+ ipar,
+ (SWORD) SQL_PARAM_INPUT_OUTPUT,
+ fCType,
+ fSqlType,
+ cbColDef,
+ ibScale,
+ rgbValue,
+ SQL_SETPARAM_VALUE_MAX,
+ pcbValue);
}
-/** Prepare for getting query result
+/*
+ * result.c
+ *
+ * $Id$
+ *
+ * Prepare for getting query result
+ *
+ * The iODBC driver manager.
+ *
+ * Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <isql.h>
+#include <isqlext.h>
+
+#include <dlproc.h>
+
+#include <herr.h>
+#include <henv.h>
+#include <hdbc.h>
+#include <hstmt.h>
+
+#include <itrace.h>
+
+RETCODE SQL_API
+SQLBindCol (
+ HSTMT hstmt,
+ UWORD icol,
+ SWORD fCType,
+ PTR rgbValue,
+ SDWORD cbValueMax,
+ SDWORD FAR * pcbValue)
+{
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc = SQL_NULL_HPROC;
+ RETCODE retcode;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check argument */
+ switch (fCType)
+ {
+ case SQL_C_DEFAULT:
+ case SQL_C_CHAR:
+ case SQL_C_BINARY:
+ case SQL_C_BIT:
+ case SQL_C_TINYINT:
+ case SQL_C_STINYINT:
+ case SQL_C_UTINYINT:
+ case SQL_C_SHORT:
+ case SQL_C_SSHORT:
+ case SQL_C_USHORT:
+ case SQL_C_LONG:
+ case SQL_C_SLONG:
+ case SQL_C_ULONG:
+ case SQL_C_FLOAT:
+ case SQL_C_DOUBLE:
+ case SQL_C_DATE:
+ case SQL_C_TIME:
+ case SQL_C_TIMESTAMP:
+ break;
+
+ default:
+ PUSHSQLERR (pstmt->herr, en_S1003);
+ return SQL_ERROR;
+ }
+
+ if (cbValueMax < 0)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1090);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->state > en_stmt_needdata || pstmt->asyn_on != en_NullProc)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+ }
+
+ /* call driver's function */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_BindCol);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_BindCol,
+ (pstmt->dhstmt, icol, fCType, rgbValue, cbValueMax, pcbValue))
+
+ return retcode;
+}
- Copyright (C) 1995 by Ke Jin <kejin@empress.com>
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+RETCODE SQL_API
+SQLGetCursorName (
+ HSTMT hstmt,
+ UCHAR FAR * szCursor,
+ SWORD cbCursorMax,
+ SWORD FAR * pcbCursor)
+{
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-**/
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
-#include <../iodbc/iodbc.h>
+ /* check argument */
+ if (cbCursorMax < (SWORD) 0)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1090);
-#include <../iodbc/isql.h>
-#include <../iodbc/isqlext.h>
+ return SQL_ERROR;
+ }
-#include <../iodbc/dlproc.h>
+ /* check state */
+ if (pstmt->state >= en_stmt_needdata || pstmt->asyn_on != en_NullProc)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
-#include <../iodbc/herr.h>
-#include <../iodbc/henv.h>
-#include <../iodbc/hdbc.h>
-#include <../iodbc/hstmt.h>
+ return SQL_ERROR;
+ }
-#include <../iodbc/itrace.h>
+ if (pstmt->state < en_stmt_cursoropen
+ && pstmt->cursor_state == en_stmt_cursor_no)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1015);
-RETCODE SQL_API SQLBindCol (
- HSTMT hstmt,
- UWORD icol,
- SWORD fCType,
- PTR rgbValue,
- SDWORD cbValueMax,
- SDWORD FAR* pcbValue )
-{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc = SQL_NULL_HPROC;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
- switch(fCType)
- {
- case SQL_C_DEFAULT:
- case SQL_C_CHAR:
- case SQL_C_BINARY:
- case SQL_C_BIT:
- case SQL_C_TINYINT:
- case SQL_C_STINYINT:
- case SQL_C_UTINYINT:
- case SQL_C_SHORT:
- case SQL_C_SSHORT:
- case SQL_C_USHORT:
- case SQL_C_LONG:
- case SQL_C_SLONG:
- case SQL_C_ULONG:
- case SQL_C_FLOAT:
- case SQL_C_DOUBLE:
- case SQL_C_DATE:
- case SQL_C_TIME:
- case SQL_C_TIMESTAMP:
- break;
-
- default:
- PUSHSQLERR ( pstmt->herr, en_S1003);
- return SQL_ERROR;
- }
-
- if( cbValueMax < 0 )
- {
- PUSHSQLERR ( pstmt->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->state > en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
- }
-
- /* call driver's function */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_BindCol );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_BindCol, (
- pstmt->dhstmt,
- icol,
- fCType,
- rgbValue,
- cbValueMax,
- pcbValue ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- icol,
- fCType,
- rgbValue,
- cbValueMax,
- pcbValue );
-#endif
-
- return retcode;
-}
+ return SQL_ERROR;
+ }
-RETCODE SQL_API SQLGetCursorName(
- HSTMT hstmt,
- UCHAR FAR* szCursor,
- SWORD cbCursorMax,
- SWORD FAR* pcbCursor )
-{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check argument */
- if( cbCursorMax < (SWORD)0 )
- {
- PUSHSQLERR ( pstmt->herr, en_S1090 );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->state >= en_stmt_needdata
- || pstmt->asyn_on != en_NullProc )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- if( pstmt->state < en_stmt_cursoropen
- && pstmt->cursor_state == en_stmt_cursor_no )
- {
- PUSHSQLERR ( pstmt->herr, en_S1015 );
-
- return SQL_ERROR;
- }
-
- /* call driver's function */
- hproc = _iodbcdm_getproc ( pstmt->hdbc, en_GetCursorName );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_GetCursorName, (
- pstmt->dhstmt,
- szCursor,
- cbCursorMax,
- pcbCursor ) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- szCursor,
- cbCursorMax,
- pcbCursor );
-#endif
-
- return retcode;
+ /* call driver's function */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetCursorName);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_GetCursorName,
+ (pstmt->dhstmt, szCursor, cbCursorMax, pcbCursor))
+
+ return retcode;
}
-RETCODE SQL_API SQLRowCount(
- HSTMT hstmt,
- SDWORD FAR* pcrow )
-{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
+RETCODE SQL_API
+SQLRowCount (
+ HSTMT hstmt,
+ SDWORD FAR * pcrow)
+{
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
- /* check state */
- if( pstmt->state >= en_stmt_needdata
- || pstmt->state <= en_stmt_prepared
- || pstmt->asyn_on != en_NullProc )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
- return SQL_ERROR;
- }
+ /* check state */
+ if (pstmt->state >= en_stmt_needdata
+ || pstmt->state <= en_stmt_prepared
+ || pstmt->asyn_on != en_NullProc)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_RowCount );
+ return SQL_ERROR;
+ }
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_RowCount);
- return SQL_ERROR;
- }
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_RowCount, (
- pstmt->dhstmt, pcrow) )
+ return SQL_ERROR;
+ }
-#if 0
- retcode = hproc ( pstmt->dhstmt, pcrow );
-#endif
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_RowCount,
+ (pstmt->dhstmt, pcrow))
- return retcode;
+ return retcode;
}
-RETCODE SQL_API SQLNumResultCols(
- HSTMT hstmt,
- SWORD FAR* pccol )
+
+RETCODE SQL_API
+SQLNumResultCols (
+ HSTMT hstmt,
+ SWORD FAR * pccol)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- SWORD ccol;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- if( pstmt->state == en_stmt_allocated
- || pstmt->state >= en_stmt_needdata )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
- return SQL_ERROR;
- }
- }
- else if( pstmt->asyn_on != en_NumResultCols )
- {
- PUSHSQLERR ( pstmt->herr, en_S1010 );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_NumResultCols );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_NumResultCols, (
- pstmt->dhstmt, &ccol) )
-
-#if 0
- retcode = hproc( pstmt->dhstmt, &ccol );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_NumResultCols )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
-
- case SQL_STILL_EXECUTING:
- default:
- break;
- }
- }
-
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- break;
-
- case SQL_STILL_EXECUTING:
- ccol = 0;
- pstmt->asyn_on = en_NumResultCols;
- break;
-
- default:
- ccol = 0;
- break;
- }
-
- if( pccol )
- {
- *pccol = ccol;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+ SWORD ccol;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ if (pstmt->state == en_stmt_allocated
+ || pstmt->state >= en_stmt_needdata)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+ return SQL_ERROR;
+ }
+ }
+ else if (pstmt->asyn_on != en_NumResultCols)
+ {
+ PUSHSQLERR (pstmt->herr, en_S1010);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_NumResultCols);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_NumResultCols,
+ (pstmt->dhstmt, &ccol))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_NumResultCols)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+
+ case SQL_STILL_EXECUTING:
+ default:
+ break;
+ }
+ }
+
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ break;
+
+ case SQL_STILL_EXECUTING:
+ ccol = 0;
+ pstmt->asyn_on = en_NumResultCols;
+ break;
+
+ default:
+ ccol = 0;
+ break;
+ }
+
+ if (pccol)
+ {
+ *pccol = ccol;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLDescribeCol(
- HSTMT hstmt,
- UWORD icol,
- UCHAR FAR* szColName,
- SWORD cbColNameMax,
- SWORD FAR* pcbColName,
- SWORD FAR* pfSqlType,
- UDWORD FAR* pcbColDef,
- SWORD FAR* pibScale,
- SWORD FAR* pfNullable )
+
+RETCODE SQL_API
+SQLDescribeCol (
+ HSTMT hstmt,
+ UWORD icol,
+ UCHAR FAR * szColName,
+ SWORD cbColNameMax,
+ SWORD FAR * pcbColName,
+ SWORD FAR * pfSqlType,
+ UDWORD FAR * pcbColDef,
+ SWORD FAR * pibScale,
+ SWORD FAR * pfNullable)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check arguments */
- if( icol == 0 )
- {
- sqlstat = en_S1002;
- }
- else if( cbColNameMax < 0 )
- {
- sqlstat = en_S1090;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- if( pstmt->asyn_on == en_stmt_allocated
- || pstmt->asyn_on >= en_stmt_needdata )
- {
- sqlstat = en_S1010;
- }
- }
- else if( pstmt->asyn_on != en_DescribeCol )
- {
- sqlstat = en_S1010;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_DescribeCol );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_DescribeCol, (
- pstmt->dhstmt,
- icol,
- szColName,
- cbColNameMax,
- pcbColName,
- pfSqlType,
- pcbColDef,
- pibScale,
- pfNullable) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- icol,
- szColName,
- cbColNameMax,
- pcbColName,
- pfSqlType,
- pcbColDef,
- pibScale,
- pfNullable );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_DescribeCol )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- default:
- return retcode;
- }
- }
-
- switch( pstmt->state )
- {
- case en_stmt_prepared:
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( retcode == SQL_STILL_EXECUTING )
- {
- pstmt->asyn_on = en_DescribeCol;
- }
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT
+ || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check arguments */
+ if (icol == 0)
+ {
+ sqlstat = en_S1002;
+ }
+ else if (cbColNameMax < 0)
+ {
+ sqlstat = en_S1090;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ if (pstmt->asyn_on == en_stmt_allocated
+ || pstmt->asyn_on >= en_stmt_needdata)
+ {
+ sqlstat = en_S1010;
+ }
+ }
+ else if (pstmt->asyn_on != en_DescribeCol)
+ {
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_DescribeCol);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_DescribeCol,
+ (pstmt->dhstmt, icol, szColName, cbColNameMax, pcbColName,
+ pfSqlType, pcbColDef, pibScale, pfNullable))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_DescribeCol)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ default:
+ return retcode;
+ }
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_prepared:
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (retcode == SQL_STILL_EXECUTING)
+ {
+ pstmt->asyn_on = en_DescribeCol;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
-RETCODE SQL_API SQLColAttributes(
- HSTMT hstmt,
- UWORD icol,
- UWORD fDescType,
- PTR rgbDesc,
- SWORD cbDescMax,
- SWORD FAR* pcbDesc,
- SDWORD FAR* pfDesc )
+
+RETCODE SQL_API
+SQLColAttributes (
+ HSTMT hstmt,
+ UWORD icol,
+ UWORD fDescType,
+ PTR rgbDesc,
+ SWORD cbDescMax,
+ SWORD FAR * pcbDesc,
+ SDWORD FAR * pfDesc)
{
- STMT_t FAR* pstmt = (STMT_t FAR*)hstmt;
- HPROC hproc;
- RETCODE retcode;
- int sqlstat = en_00000;
-
- if( hstmt == SQL_NULL_HSTMT
- || pstmt->hdbc == SQL_NULL_HDBC )
- {
- return SQL_INVALID_HANDLE;
- }
-
- /* check arguments */
- if( icol == 0 && fDescType != SQL_COLUMN_COUNT )
- {
- sqlstat = en_S1002;
- }
- else if( cbDescMax < 0 )
- {
- sqlstat = en_S1090;
- }
- else if(/* fDescType < SQL_COLATT_OPT_MIN || */ /* turnoff warning */
- ( fDescType > SQL_COLATT_OPT_MAX
- && fDescType < SQL_COLUMN_DRIVER_START ) )
- {
- sqlstat = en_S1091;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* check state */
- if( pstmt->asyn_on == en_NullProc )
- {
- if( pstmt->asyn_on == en_stmt_allocated
- || pstmt->asyn_on >= en_stmt_needdata )
- {
- sqlstat = en_S1010;
- }
- }
- else if( pstmt->asyn_on != en_ColAttributes )
- {
- sqlstat = en_S1010;
- }
-
- if( sqlstat != en_00000 )
- {
- PUSHSQLERR ( pstmt->herr, sqlstat );
-
- return SQL_ERROR;
- }
-
- /* call driver */
- hproc = _iodbcdm_getproc( pstmt->hdbc, en_ColAttributes );
-
- if( hproc == SQL_NULL_HPROC )
- {
- PUSHSQLERR ( pstmt->herr, en_IM001 );
-
- return SQL_ERROR;
- }
-
- CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ColAttributes, (
- pstmt->dhstmt,
- icol,
- fDescType,
- rgbDesc,
- cbDescMax,
- pcbDesc,
- pfDesc) )
-
-#if 0
- retcode = hproc(pstmt->dhstmt,
- icol,
- fDescType,
- rgbDesc,
- cbDescMax,
- pcbDesc,
- pfDesc );
-#endif
-
- /* state transition */
- if( pstmt->asyn_on == en_ColAttributes )
- {
- switch( retcode )
- {
- case SQL_SUCCESS:
- case SQL_SUCCESS_WITH_INFO:
- case SQL_ERROR:
- pstmt->asyn_on = en_NullProc;
- break;
-
- default:
- return retcode;
- }
- }
-
- switch( pstmt->state )
- {
- case en_stmt_prepared:
- case en_stmt_cursoropen:
- case en_stmt_fetched:
- case en_stmt_xfetched:
- if( retcode == SQL_STILL_EXECUTING )
- {
- pstmt->asyn_on = en_ColAttributes;
- }
- break;
-
- default:
- break;
- }
-
- return retcode;
+ STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+ HPROC hproc;
+ RETCODE retcode;
+ int sqlstat = en_00000;
+
+ if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+ {
+ return SQL_INVALID_HANDLE;
+ }
+
+ /* check arguments */
+ if (icol == 0 && fDescType != SQL_COLUMN_COUNT)
+ {
+ sqlstat = en_S1002;
+ }
+ else if (cbDescMax < 0)
+ {
+ sqlstat = en_S1090;
+ }
+ else if ( /* fDescType < SQL_COLATT_OPT_MIN || *//* turnoff warning */
+ (fDescType > SQL_COLATT_OPT_MAX
+ && fDescType < SQL_COLUMN_DRIVER_START))
+ {
+ sqlstat = en_S1091;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* check state */
+ if (pstmt->asyn_on == en_NullProc)
+ {
+ if (pstmt->asyn_on == en_stmt_allocated
+ || pstmt->asyn_on >= en_stmt_needdata)
+ {
+ sqlstat = en_S1010;
+ }
+ }
+ else if (pstmt->asyn_on != en_ColAttributes)
+ {
+ sqlstat = en_S1010;
+ }
+
+ if (sqlstat != en_00000)
+ {
+ PUSHSQLERR (pstmt->herr, sqlstat);
+
+ return SQL_ERROR;
+ }
+
+ /* call driver */
+ hproc = _iodbcdm_getproc (pstmt->hdbc, en_ColAttributes);
+
+ if (hproc == SQL_NULL_HPROC)
+ {
+ PUSHSQLERR (pstmt->herr, en_IM001);
+
+ return SQL_ERROR;
+ }
+
+ CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_ColAttributes,
+ (pstmt->dhstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc))
+
+ /* state transition */
+ if (pstmt->asyn_on == en_ColAttributes)
+ {
+ switch (retcode)
+ {
+ case SQL_SUCCESS:
+ case SQL_SUCCESS_WITH_INFO:
+ case SQL_ERROR:
+ pstmt->asyn_on = en_NullProc;
+ break;
+
+ default:
+ return retcode;
+ }
+ }
+
+ switch (pstmt->state)
+ {
+ case en_stmt_prepared:
+ case en_stmt_cursoropen:
+ case en_stmt_fetched:
+ case en_stmt_xfetched:
+ if (retcode == SQL_STILL_EXECUTING)
+ {
+ pstmt->asyn_on = en_ColAttributes;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return retcode;
}
+++ /dev/null
-#ifndef DEBUG
-
-#endif
-#ifndef APWIN /* don't reinclude */
-#define APWIN
-#ifndef DEBUG
-
-#endif
-
-#ifdef WININC
-# include <windows.h> /* normal windows.h */
-# ifdef WIN32
-# include <windowsx.h> /* windows extensions */
-# define GetCurrentTask (HTASK)GetCurrentProcess
-# define GetDOSEnvironment GetEnvironmentStrings
-# define PCALL
-# else
-# define PCALL PASCAL
-# endif
-#else /* not windows */
-/******* Common definitions and typedefs **********************/
-#ifdef HPUX
-# ifndef _VOID
-# define VOID int
-# endif
-# ifndef _UCHAR
- typedef char UCHAR;
-# define _UCHAR
-# endif
-# ifndef _SCHAR
- typedef char SCHAR;
-# define _SCHAR
-# endif
-#endif /* HPUX */
-
-#ifdef OSF1
-# ifndef _UCHAR
- typedef char UCHAR;
-# define _UCHAR
-# endif
-# ifndef _SDWORD
-# define _SDWORD
- typedef int SDWORD;
-# endif
-# ifndef _UDWORD
-# define _UDWORD
- typedef unsigned int UDWORD;
-# endif
-# ifndef _LDOUBLE
-# define _LDOUBLE
- typedef double LDOUBLE;
-# endif
-# ifndef _DWORD
-# define _DWORD
- typedef int DWORD;
-# endif
-#endif /* OSF1 */
-
-#if defined (SVR4) && defined(I386)
-# ifndef _UCHAR
- typedef char UCHAR;
-# define _UCHAR
-# endif
-# ifndef _LDOUBLE
-# define _LDOUBLE
- typedef double LDOUBLE;
-# endif
-#endif /* SVR4 && I386 */
-
-#ifndef _VOID
-# define _VOID
-# define VOID void
-#endif
-
-#ifdef WIN
-# define LONG long
-#endif
-
-#ifndef _DWORD
-# define _DWORD
-/* typedef unsigned long DWORD; */
-#endif
-
-#ifndef _UINT
-# define _UINT
- typedef unsigned int UINT;
-#endif
-
-#ifdef PC
-# define FAR _far
-# define NEAR _near
-# define PASCAL _pascal
-# define CDECL _cdecl
-# define WINAPI _far _pascal
-# define CALLBACK _far _pascal
-# define EXPORT _export
-#else
-# define FAR
-# define NEAR
-# define PASCAL
-# define CDECL
-# define WINAPI
-# define CALLBACK
-# define EXPORT
-#endif
-#define PCALL PASCAL
-
-/****** Simple types & common helper macros ********************/
-
-/* typedef int BOOL; */
-#define FALSE 0
-#define TRUE 1
-
-typedef unsigned char BYTE;
-/* typedef unsigned short WORD; */
-
-#define LOBYTE(w) ((BYTE)(w))
-#define HIBYTE(w) ((BYTE)(((UINT)(w) >> 8) & 0xFF))
-
-#define LOWORD(l) ((WORD)(DWORD)(l))
-#define HIWORD(l) ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
-
-#define MAKELONG(low, high) ((LONG)(((WORD)(low)) |\
- (((DWORD)((WORD)(high))) << 16)))
-
-#define max(a,b) (((a) > (b)) ? (a) : (b))
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-
-/****** Common pointer types **********************************/
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-/****** Common handle types *************************************/
-
-typedef UINT HANDLE;
-/* typedef UINT HWND; */
-
-
-#endif /* ifdef not WIN */
-
-#endif /* ifdef APWIN */
-
-/* end of apwin.h */