From cd5bf2a6e3a7d03e8b1f97e989eecdcc63f7151f Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Fri, 22 Jan 1999 10:52:42 +0000 Subject: [PATCH] iODBC v2.5 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1446 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- configure | 504 ++++++-- configure.in | 63 +- include/wx/db.h | 8 +- include/wx/gtk/dataobj.h | 24 +- include/wx/gtk1/dataobj.h | 24 +- src/Makefile.in | 1 - src/gtk/dataobj.cpp | 100 +- src/gtk1/dataobj.cpp | 100 +- src/iodbc/COPYING | 482 ++++++++ src/iodbc/Changes.log | 113 +- src/iodbc/Config.mk | 21 - src/iodbc/IAFA-PACKAGE | 29 +- src/iodbc/INSTALL | 182 +++ src/iodbc/Makefile | 58 - src/iodbc/NEWS | 8 + src/iodbc/README | 276 ++--- src/iodbc/Version.mk | 2 - src/iodbc/build | 9 - src/iodbc/catalog.c | 1993 ++++++++++++++---------------- src/iodbc/config.h | 185 ++- src/iodbc/connect.c | 2444 ++++++++++++++++++------------------- src/iodbc/dlf.c | 961 +++++++-------- src/iodbc/dlf.h | 67 +- src/iodbc/dlproc.c | 190 +-- src/iodbc/dlproc.h | 84 +- src/iodbc/execute.c | 1515 ++++++++++++----------- src/iodbc/fetch.c | 1286 ++++++++++--------- src/iodbc/hdbc.c | 1545 +++++++++++------------ src/iodbc/hdbc.h | 110 +- src/iodbc/henv.c | 124 +- src/iodbc/henv.ci | 49 +- src/iodbc/henv.h | 227 ++-- src/iodbc/herr.c | 686 ++++++----- src/iodbc/herr.ci | 28 +- src/iodbc/herr.h | 264 ++-- src/iodbc/hstmt.c | 1100 ++++++++--------- src/iodbc/hstmt.h | 111 +- src/iodbc/info.c | 865 +++++++------ src/iodbc/isql.h | 406 +++--- src/iodbc/isqlext.h | 1479 +++++++++++++++++----- src/iodbc/itrace.c | 173 +-- src/iodbc/itrace.h | 179 +-- src/iodbc/main.c | 7 - src/iodbc/misc.c | 773 ++++++------ src/iodbc/odbc_funcs.h | 380 ------ src/iodbc/odbc_types.h | 283 ----- src/iodbc/prepare.c | 1005 ++++++++------- src/iodbc/result.c | 1036 ++++++++-------- src/iodbc/windows.h | 145 --- 49 files changed, 11396 insertions(+), 10308 deletions(-) create mode 100644 src/iodbc/COPYING delete mode 100644 src/iodbc/Config.mk create mode 100644 src/iodbc/INSTALL delete mode 100644 src/iodbc/Makefile create mode 100644 src/iodbc/NEWS delete mode 100644 src/iodbc/Version.mk delete mode 100755 src/iodbc/build delete mode 100644 src/iodbc/main.c delete mode 100644 src/iodbc/odbc_funcs.h delete mode 100644 src/iodbc/odbc_types.h delete mode 100644 src/iodbc/windows.h diff --git a/configure b/configure index dc1f6630a9..7e4dd540fd 100755 --- a/configure +++ b/configure @@ -4296,6 +4296,340 @@ fi +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 < +/* 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 <> 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 <&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 <&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 < +/* 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 <> 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 < +#include +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 < +/* 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 <&6 +fi +done + + + CHECK_INCLUDE="-I/usr/include $X_CFLAGS" CHECK_LIB="-L/lib -L/usr/lib $X_LIBS" @@ -4307,7 +4641,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } 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 @@ -4550,7 +4884,7 @@ DEFAULT_wxUSE_WCSRTOMBS=0 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" @@ -4580,7 +4914,7 @@ fi 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" @@ -4610,7 +4944,7 @@ fi 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" @@ -4641,7 +4975,7 @@ fi 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" @@ -4671,7 +5005,7 @@ fi 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" @@ -4701,7 +5035,7 @@ fi 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" @@ -4731,7 +5065,7 @@ fi 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" @@ -4761,7 +5095,7 @@ fi 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" @@ -4791,7 +5125,7 @@ fi 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" @@ -4821,7 +5155,7 @@ fi 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" @@ -4851,7 +5185,7 @@ fi 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" @@ -4881,7 +5215,7 @@ fi 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" @@ -4911,7 +5245,7 @@ fi 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" @@ -4942,7 +5276,7 @@ fi 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" @@ -4972,7 +5306,7 @@ fi 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" @@ -5002,7 +5336,7 @@ fi 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" @@ -5033,7 +5367,7 @@ fi 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" @@ -5063,7 +5397,7 @@ fi 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" @@ -5093,7 +5427,7 @@ fi 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" @@ -5123,7 +5457,7 @@ fi 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" @@ -5153,7 +5487,7 @@ fi 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" @@ -5184,7 +5518,7 @@ fi 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" @@ -5214,7 +5548,7 @@ fi 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" @@ -5244,7 +5578,7 @@ fi 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" @@ -5275,7 +5609,7 @@ fi 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" @@ -5305,7 +5639,7 @@ fi 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" @@ -5336,7 +5670,7 @@ fi 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" @@ -5366,7 +5700,7 @@ fi 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" @@ -5396,7 +5730,7 @@ fi 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" @@ -5427,7 +5761,7 @@ fi 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" @@ -5457,7 +5791,7 @@ fi 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" @@ -5487,7 +5821,7 @@ fi 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" @@ -5517,7 +5851,7 @@ fi 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" @@ -5548,7 +5882,7 @@ fi 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" @@ -5578,7 +5912,7 @@ fi 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" @@ -5608,7 +5942,7 @@ fi 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" @@ -5638,7 +5972,7 @@ fi 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" @@ -5676,7 +6010,7 @@ fi 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 @@ -5684,7 +6018,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lc $LIBS" cat > conftest.$ac_ext <&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 @@ -5766,7 +6100,7 @@ fi # 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 @@ -5797,7 +6131,7 @@ fi 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` @@ -5810,7 +6144,7 @@ echo "configure:5801: checking for GTK - version >= $min_gtk_version" >&5 echo $ac_n "cross compiling; assumed OK... $ac_c" else cat > conftest.$ac_ext < @@ -5834,7 +6168,7 @@ main () } 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 @@ -5874,7 +6208,7 @@ fi 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; @@ -5888,7 +6222,7 @@ 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; @@ -5939,7 +6273,7 @@ fi 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; @@ -5953,7 +6287,7 @@ 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; @@ -5990,7 +6324,7 @@ 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; @@ -6016,7 +6350,7 @@ 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; @@ -6345,46 +6679,6 @@ fi -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 <&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="" @@ -6392,7 +6686,7 @@ if test "$wxUSE_THREADS" = "1"; then 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 @@ -6400,7 +6694,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpthread-0.7 $LIBS" cat > conftest.$ac_ext <&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 @@ -6435,17 +6729,17 @@ 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 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* @@ -6471,7 +6765,7 @@ fi 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 @@ -6479,7 +6773,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lpthread $LIBS" cat > conftest.$ac_ext <&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 @@ -6526,7 +6820,7 @@ EOF 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 @@ -6534,7 +6828,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lposix4 $LIBS" cat > conftest.$ac_ext <&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 @@ -6700,7 +6994,7 @@ EOF 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 @@ -6876,6 +7170,7 @@ s%@YACC@%$YACC%g 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 @@ -6900,7 +7195,6 @@ s%@Z_C_SRC@%$Z_C_SRC%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 diff --git a/configure.in b/configure.in index 3a2e876435..c40297ad14 100644 --- a/configure.in +++ b/configure.in @@ -559,6 +559,60 @@ dnl defines YYTEXT_POINTER if yytext is char* 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 +#include +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 ------------------------------------------------------------------------ @@ -1243,13 +1297,6 @@ if test "$wxUSE_HELP" = 1 ; then 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 ---------------------------------------------------------------- @@ -1405,7 +1452,7 @@ case "${canonical}" in 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 diff --git a/include/wx/db.h b/include/wx/db.h index bb718ba3bb..8d29a834e5 100644 --- a/include/wx/db.h +++ b/include/wx/db.h @@ -45,11 +45,9 @@ 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 } diff --git a/include/wx/gtk/dataobj.h b/include/wx/gtk/dataobj.h index 2a9bc78242..13c80135ca 100644 --- a/include/wx/gtk/dataobj.h +++ b/include/wx/gtk/dataobj.h @@ -63,22 +63,26 @@ class wxDataFormat : public wxObject 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; }; //------------------------------------------------------------------------- @@ -151,9 +155,13 @@ public: /* implementation */ - virtual wxDataFormat &GetFormat() const; + wxDataFormat &GetFormat(); + + wxDataType GetFormatType() const; + wxString GetFormatId() const; + GdkAtom GetFormatAtom() const; - wxDataFormat *m_format; + wxDataFormat m_format; }; //---------------------------------------------------------------------------- diff --git a/include/wx/gtk1/dataobj.h b/include/wx/gtk1/dataobj.h index 2a9bc78242..13c80135ca 100644 --- a/include/wx/gtk1/dataobj.h +++ b/include/wx/gtk1/dataobj.h @@ -63,22 +63,26 @@ class wxDataFormat : public wxObject 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; }; //------------------------------------------------------------------------- @@ -151,9 +155,13 @@ public: /* implementation */ - virtual wxDataFormat &GetFormat() const; + wxDataFormat &GetFormat(); + + wxDataType GetFormatType() const; + wxString GetFormatId() const; + GdkAtom GetFormatAtom() const; - wxDataFormat *m_format; + wxDataFormat m_format; }; //---------------------------------------------------------------------------- diff --git a/src/Makefile.in b/src/Makefile.in index bfd94286f9..4d34f7e9c2 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -27,7 +27,6 @@ IODBC_C_SRC=\ iodbc/hstmt.c \ iodbc/info.c \ iodbc/itrace.c \ - iodbc/main.c \ iodbc/misc.c \ iodbc/prepare.c \ iodbc/result.c diff --git a/src/gtk/dataobj.cpp b/src/gtk/dataobj.cpp index e6b756326a..6f8a442e14 100644 --- a/src/gtk/dataobj.cpp +++ b/src/gtk/dataobj.cpp @@ -23,37 +23,21 @@ 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 ) @@ -89,7 +73,33 @@ wxDataFormat::wxDataFormat( const GdkAtom atom ) } } -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; } @@ -246,21 +256,33 @@ IMPLEMENT_ABSTRACT_CLASS( wxDataObject, wxObject ) 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 // ---------------------------------------------------------------------------- @@ -269,12 +291,12 @@ IMPLEMENT_DYNAMIC_CLASS( wxTextDataObject, wxDataObject ) 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; } @@ -310,9 +332,9 @@ void wxTextDataObject::WriteString( const wxString &str, void *dest ) const 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 ) @@ -344,12 +366,12 @@ IMPLEMENT_DYNAMIC_CLASS( wxBitmapDataObject, wxDataObject ) 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; } @@ -390,7 +412,7 @@ wxPrivateDataObject::wxPrivateDataObject() 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; @@ -404,7 +426,7 @@ wxPrivateDataObject::~wxPrivateDataObject() void wxPrivateDataObject::SetId( const wxString& id ) { m_id = id; - m_format->SetId( m_id ); + m_format.SetId( m_id ); } wxString wxPrivateDataObject::GetId() const diff --git a/src/gtk1/dataobj.cpp b/src/gtk1/dataobj.cpp index e6b756326a..6f8a442e14 100644 --- a/src/gtk1/dataobj.cpp +++ b/src/gtk1/dataobj.cpp @@ -23,37 +23,21 @@ 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 ) @@ -89,7 +73,33 @@ wxDataFormat::wxDataFormat( const GdkAtom atom ) } } -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; } @@ -246,21 +256,33 @@ IMPLEMENT_ABSTRACT_CLASS( wxDataObject, wxObject ) 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 // ---------------------------------------------------------------------------- @@ -269,12 +291,12 @@ IMPLEMENT_DYNAMIC_CLASS( wxTextDataObject, wxDataObject ) 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; } @@ -310,9 +332,9 @@ void wxTextDataObject::WriteString( const wxString &str, void *dest ) const 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 ) @@ -344,12 +366,12 @@ IMPLEMENT_DYNAMIC_CLASS( wxBitmapDataObject, wxDataObject ) 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; } @@ -390,7 +412,7 @@ wxPrivateDataObject::wxPrivateDataObject() 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; @@ -404,7 +426,7 @@ wxPrivateDataObject::~wxPrivateDataObject() void wxPrivateDataObject::SetId( const wxString& id ) { m_id = id; - m_format->SetId( m_id ); + m_format.SetId( m_id ); } wxString wxPrivateDataObject::GetId() const diff --git a/src/iodbc/COPYING b/src/iodbc/COPYING new file mode 100644 index 0000000000..79d009a2fb --- /dev/null +++ b/src/iodbc/COPYING @@ -0,0 +1,482 @@ + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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. + + 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 + + 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. + + + Copyright (C) + + 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. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + diff --git a/src/iodbc/Changes.log b/src/iodbc/Changes.log index 68e651b9a2..e7c359f2b3 100644 --- a/src/iodbc/Changes.log +++ b/src/iodbc/Changes.log @@ -1,58 +1,67 @@ -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. + diff --git a/src/iodbc/Config.mk b/src/iodbc/Config.mk deleted file mode 100644 index 35511a785d..0000000000 --- a/src/iodbc/Config.mk +++ /dev/null @@ -1,21 +0,0 @@ -# -# Copyright (C) 1995 by Ke Jin -# - -#============ 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 diff --git a/src/iodbc/IAFA-PACKAGE b/src/iodbc/IAFA-PACKAGE index 488ec4c711..a53af75fec 100644 --- a/src/iodbc/IAFA-PACKAGE +++ b/src/iodbc/IAFA-PACKAGE @@ -1,23 +1,26 @@ -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 +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 @@ -32,6 +35,6 @@ Platforms: SunOS (Sparc) 4.1.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 diff --git a/src/iodbc/INSTALL b/src/iodbc/INSTALL new file mode 100644 index 0000000000..b42a17ac46 --- /dev/null +++ b/src/iodbc/INSTALL @@ -0,0 +1,182 @@ +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. diff --git a/src/iodbc/Makefile b/src/iodbc/Makefile deleted file mode 100644 index d899c15586..0000000000 --- a/src/iodbc/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -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 - diff --git a/src/iodbc/NEWS b/src/iodbc/NEWS new file mode 100644 index 0000000000..27eb6d4202 --- /dev/null +++ b/src/iodbc/NEWS @@ -0,0 +1,8 @@ +Version: 2.5 +------------- +Added OpenLink enhancements + + +Version: 2.12 +------------- +Original version of Ke Jin diff --git a/src/iodbc/README b/src/iodbc/README index ed0f3008a0..23cb2a5e82 100644 --- a/src/iodbc/README +++ b/src/iodbc/README @@ -1,187 +1,187 @@ 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 = - Trace = ON | On | on | 1 | OFF | Off | off | 0 + TraceFile = + Trace = ON | On | on | 1 | OFF | Off | off | 0 If 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 diff --git a/src/iodbc/Version.mk b/src/iodbc/Version.mk deleted file mode 100644 index c61ab27c21..0000000000 --- a/src/iodbc/Version.mk +++ /dev/null @@ -1,2 +0,0 @@ -VERSION = 2.12 -EXTVER = .0 diff --git a/src/iodbc/build b/src/iodbc/build deleted file mode 100755 index eb47c38745..0000000000 --- a/src/iodbc/build +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh - -echo autoconfig $1 - -if sh ./autoconfig $1 -then -echo make -make -fi diff --git a/src/iodbc/catalog.c b/src/iodbc/catalog.c index 6c28eabdcf..2e7a25ac54 100644 --- a/src/iodbc/catalog.c +++ b/src/iodbc/catalog.c @@ -1,1092 +1,983 @@ -/** Catalog functions of iODBC driver manager - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +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); } diff --git a/src/iodbc/config.h b/src/iodbc/config.h index 6cd62312c3..1fb5ac1b82 100644 --- a/src/iodbc/config.h +++ b/src/iodbc/config.h @@ -1,106 +1,93 @@ -#ifndef _CONFIG_H -#define _CONFIG_H - -# if !defined(WINDOWS) && !defined(WIN32_SYSTEM) && !defined(OS2) -# define _UNIX_ - -# include -# include -# include -# include - -# 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 + * + * 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 +#include +#include +#include + +#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 +#include + +#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 -# include - -# 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 -# include -# include -# include -# define INCL_DOSMODULEMGR /* Module Manager values */ -# define INCL_DOSERRORS /* Error values */ -# include - -# 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 diff --git a/src/iodbc/connect.c b/src/iodbc/connect.c index 11a5bbd0c9..be9e0f6041 100644 --- a/src/iodbc/connect.c +++ b/src/iodbc/connect.c @@ -1,296 +1,297 @@ -/** Connect(load) driver - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 -#include <../iodbc/dlproc.h> +#include +#include -#include <../iodbc/herr.h> -#include <../iodbc/henv.h> -#include <../iodbc/hdbc.h> -#include <../iodbc/hstmt.h> +#include -#include <../iodbc/itrace.h> +#include +#include +#include +#include -#include -#include +#include -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 @@ -298,1079 +299,948 @@ RETCODE _iodbcdm_driverunload( HDBC hdbc ) * - 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; } diff --git a/src/iodbc/dlf.c b/src/iodbc/dlf.c index 9c5ed64272..8797c4b6bd 100644 --- a/src/iodbc/dlf.c +++ b/src/iodbc/dlf.c @@ -1,661 +1,612 @@ -/** dynamic library loader (mapping to svr4) - - Copyright (C) 1995 by Ke Jin - - 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 -# include -#endif +/* + * dlf.c + * + * $Id$ + * + * Dynamic Library Loader (mapping to SVR4) + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 #include -#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 -static char sccsid[] = "@(#)dynamic load interface -- HP/UX dl(shl)"; +#ifdef DLDAPI_HP_SHL +#define DLDAPI_DEFINED +#include -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 -# include -# include + +#ifdef DLDAPI_AIX_LOAD +#define DLDAPI_DEFINED +#include +#include +#include +#include /* - * 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; inext; + 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 -void FAR* dlopen(char FAR* dll, int mode) -{ - HINSTANCE hint; +#ifdef DLDAPI_WINDOWS +#define DLDAPI_DEFINED +#include - 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 diff --git a/src/iodbc/dlf.h b/src/iodbc/dlf.h index 2d04cf39b2..b56e326460 100644 --- a/src/iodbc/dlf.h +++ b/src/iodbc/dlf.h @@ -1,24 +1,55 @@ -#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 + * + * 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 +#if defined(HAVE_LIBDL) #define DLDAPI_SVR4_DLFCN +#elif defined(HAVE_SHL_LOAD) +#define DLDAPI_HP_SHL +#endif -# ifdef DLDAPI_SVR4_DLFCN -# include -# 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 +#elif DLDAPI_AIX_LOAD +#include +#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 diff --git a/src/iodbc/dlproc.c b/src/iodbc/dlproc.c index 24f1bfda9c..85b04fad42 100644 --- a/src/iodbc/dlproc.c +++ b/src/iodbc/dlproc.c @@ -1,100 +1,120 @@ -/** Load driver and resolve driver's function entry point - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include +#include +#include + +#include + +#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 (); } + diff --git a/src/iodbc/dlproc.h b/src/iodbc/dlproc.h index b757369a8b..34aeac6cd1 100644 --- a/src/iodbc/dlproc.h +++ b/src/iodbc/dlproc.h @@ -1,39 +1,55 @@ -#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 - typedef void* HDLL; -# endif - -# ifdef DLDAPI_HP_SHL -# include - 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 + * + * 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 + +typedef RETCODE (FAR * HPROC) (); + +#ifdef DLDAPI_SVR4_DLFCN +#include +typedef void *HDLL; +#endif -# ifdef DLDAPI_OS2 - typedef HMODULE HDLL; -# endif +#ifdef DLDAPI_HP_SHL +#include +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 diff --git a/src/iodbc/execute.c b/src/iodbc/execute.c index bdb8f7dcd8..bab022bc7e 100644 --- a/src/iodbc/execute.c +++ b/src/iodbc/execute.c @@ -1,789 +1,768 @@ -/** Invoke a query - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +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; } diff --git a/src/iodbc/fetch.c b/src/iodbc/fetch.c index d7c8db3e50..5c4227339a 100644 --- a/src/iodbc/fetch.c +++ b/src/iodbc/fetch.c @@ -1,675 +1,649 @@ -/** Fetch query result - - Copyright (C) 1995 by Ke Jin - - 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 - -#include -#include +/* + * fetch.c + * + * $Id$ + * + * Fetch query result + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 + +#include +#include #include -#include -#include -#include -#include +#include +#include +#include +#include -#include +#include -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; } diff --git a/src/iodbc/hdbc.c b/src/iodbc/hdbc.c index 1d47da84f5..67eb5e6865 100644 --- a/src/iodbc/hdbc.c +++ b/src/iodbc/hdbc.c @@ -1,806 +1,813 @@ -/** data source connect object management functions - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include #include 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; } diff --git a/src/iodbc/hdbc.h b/src/iodbc/hdbc.h index ef62292432..659eadcc05 100644 --- a/src/iodbc/hdbc.h +++ b/src/iodbc/hdbc.h @@ -1,55 +1,81 @@ -#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 + * + * 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. * @@ -57,11 +83,11 @@ typedef struct DBC * 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 diff --git a/src/iodbc/henv.c b/src/iodbc/henv.c index 2ee89b2feb..f0f8a018b0 100644 --- a/src/iodbc/henv.c +++ b/src/iodbc/henv.c @@ -1,75 +1,89 @@ -/** Environment object managment functions - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include +#include + +#include + +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; } diff --git a/src/iodbc/henv.ci b/src/iodbc/henv.ci index 46a2125d69..c320b45f8d 100644 --- a/src/iodbc/henv.ci +++ b/src/iodbc/henv.ci @@ -1,18 +1,49 @@ -#ifndef CLI_NAME_PREFIX +/* + * henv.ci + * + * $Id$ + * + * Function names + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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" }, diff --git a/src/iodbc/henv.h b/src/iodbc/henv.h index 96b0b600a0..d4a175635d 100644 --- a/src/iodbc/henv.h +++ b/src/iodbc/henv.h @@ -1,109 +1,141 @@ -#ifndef _HENV_H -#define _HENV_H +/* + * henv.h + * + * $Id$ + * + * Environment object management functions + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 +#include -# include "config.h" -# include +#include +#include -# include -# include +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, @@ -121,5 +153,4 @@ typedef struct { * - Applications can get driver's environment object handle by * SQLGetInfo() with fInfoType equals to SQL_DRIVER_HENV */ - #endif diff --git a/src/iodbc/herr.c b/src/iodbc/herr.c index b860b834b0..16d9e63dc5 100644 --- a/src/iodbc/herr.c +++ b/src/iodbc/herr.c @@ -1,366 +1,378 @@ -/** Error stack management functions - - Copyright (C) 1995 by Ke Jin - - 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 -#include - -static HERR _iodbcdm_popsqlerr( HERR herr ) +/* + * herr.c + * + * $Id$ + * + * Error stack management functions + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#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; } diff --git a/src/iodbc/herr.ci b/src/iodbc/herr.ci index 0e63022644..c880c12a0d 100644 --- a/src/iodbc/herr.ci +++ b/src/iodbc/herr.ci @@ -1,3 +1,29 @@ +/* + * herr.ci + * + * $Id$ + * + * Error messages + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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", "" }, @@ -95,4 +121,4 @@ static const sqlerrmsg_t sqlerrmsg_tab[] = { en_sqlstat_total, NULL, NULL } }; -static char FAR* sqlerrhd = "[iODBC][Driver Manager]"; +static char FAR* sqlerrhd = "[iODBC][Driver Manager]"; diff --git a/src/iodbc/herr.h b/src/iodbc/herr.h index 0ab2c1c66e..8355c012ad 100644 --- a/src/iodbc/herr.h +++ b/src/iodbc/herr.h @@ -1,125 +1,153 @@ -#ifndef _HERR_H -#define _HERR_H +/* + * herr.h + * + * $Id$ + * + * Error stack management functions + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 */ diff --git a/src/iodbc/hstmt.c b/src/iodbc/hstmt.c index 425fe8b2e2..8a90a3d8d3 100644 --- a/src/iodbc/hstmt.c +++ b/src/iodbc/hstmt.c @@ -1,598 +1,600 @@ -/** Query statement object management functions - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +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; } diff --git a/src/iodbc/hstmt.h b/src/iodbc/hstmt.h index 99e826e5fa..b70b54d047 100644 --- a/src/iodbc/hstmt.h +++ b/src/iodbc/hstmt.h @@ -1,48 +1,75 @@ -#ifndef _HSTMT_H -#define _HSTMT_H +/* + * hstmt.h + * + * $Id$ + * + * Query statement object management functions + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 +#include -#include -#include +#include +#include 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 diff --git a/src/iodbc/info.c b/src/iodbc/info.c index 34bfdeec64..938d6ab443 100644 --- a/src/iodbc/info.c +++ b/src/iodbc/info.c @@ -1,392 +1,517 @@ -/** Information functions - - Copyright (C) 1995 by Ke Jin - - 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 -#include - -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 + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#include +#include + +#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; } diff --git a/src/iodbc/isql.h b/src/iodbc/isql.h index df5df0860f..5774241d4c 100644 --- a/src/iodbc/isql.h +++ b/src/iodbc/isql.h @@ -1,192 +1,228 @@ -#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 + * + * 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 diff --git a/src/iodbc/isqlext.h b/src/iodbc/isqlext.h index 26e9ee5b5f..a082988534 100644 --- a/src/iodbc/isqlext.h +++ b/src/iodbc/isqlext.h @@ -1,314 +1,1177 @@ -#ifndef _INTRINSIC_SQLEXT_H -# define _INTRINSIC_SQLEXT_H - -# include - -# 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 + * + * 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 + +/* + * 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 diff --git a/src/iodbc/itrace.c b/src/iodbc/itrace.c index ae164808a5..4151f175e3 100644 --- a/src/iodbc/itrace.c +++ b/src/iodbc/itrace.c @@ -1,104 +1,117 @@ -/** trace functions - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include + +#include +#include +#include "henv.ci" #include -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; } diff --git a/src/iodbc/itrace.h b/src/iodbc/itrace.h index 1fa2f27075..61ba072ec8 100644 --- a/src/iodbc/itrace.h +++ b/src/iodbc/itrace.h @@ -1,99 +1,124 @@ -#ifndef _ITRACE_H -# define _ITRACE_H +/* + * itrace.h + * + * $Id$ + * + * Trace functions + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 diff --git a/src/iodbc/main.c b/src/iodbc/main.c deleted file mode 100644 index 8addc3ced6..0000000000 --- a/src/iodbc/main.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -/* entry function used to build a share library on AIX */ -int __start() -{ - return 0; -} diff --git a/src/iodbc/misc.c b/src/iodbc/misc.c index 713467766f..183b8defc0 100644 --- a/src/iodbc/misc.c +++ b/src/iodbc/misc.c @@ -1,422 +1,413 @@ -/** miscellaneous functions - - Copyright (C) 1995 by Ke Jin - - 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 -# include -#endif +/* + * misc.c + * + * $Id$ + * + * Miscellaneous functions + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 -#include <../iodbc/isql.h> -#include <../iodbc/isqlext.h> +#include +#include #include -#include - #include - 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= '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 +# 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 -# 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; } diff --git a/src/iodbc/odbc_funcs.h b/src/iodbc/odbc_funcs.h deleted file mode 100644 index 508d5bd717..0000000000 --- a/src/iodbc/odbc_funcs.h +++ /dev/null @@ -1,380 +0,0 @@ -#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); - diff --git a/src/iodbc/odbc_types.h b/src/iodbc/odbc_types.h deleted file mode 100644 index b7d78b8b95..0000000000 --- a/src/iodbc/odbc_types.h +++ /dev/null @@ -1,283 +0,0 @@ -#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 diff --git a/src/iodbc/prepare.c b/src/iodbc/prepare.c index a0c215ca25..f432ad5600 100644 --- a/src/iodbc/prepare.c +++ b/src/iodbc/prepare.c @@ -1,538 +1,525 @@ -/** Prepare a query - - Copyright (C) 1995 by Ke Jin - - 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 + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#include + +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); } diff --git a/src/iodbc/result.c b/src/iodbc/result.c index c00474b04f..12209a15e3 100644 --- a/src/iodbc/result.c +++ b/src/iodbc/result.c @@ -1,575 +1,523 @@ -/** Prepare for getting query result +/* + * result.c + * + * $Id$ + * + * Prepare for getting query result + * + * The iODBC driver manager. + * + * Copyright (C) 1995 by Ke Jin + * + * 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 + +#include +#include + +#include + +#include +#include +#include +#include + +#include + +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 - 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; } diff --git a/src/iodbc/windows.h b/src/iodbc/windows.h deleted file mode 100644 index ab92116aed..0000000000 --- a/src/iodbc/windows.h +++ /dev/null @@ -1,145 +0,0 @@ -#ifndef DEBUG - -#endif -#ifndef APWIN /* don't reinclude */ -#define APWIN -#ifndef DEBUG - -#endif - -#ifdef WININC -# include /* normal windows.h */ -# ifdef WIN32 -# include /* 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 */ -- 2.45.2