]> git.saurik.com Git - wxWidgets.git/commitdiff
added ODBC support
authorRobert Roebling <robert@roebling.de>
Sat, 18 Jul 1998 00:57:32 +0000 (00:57 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 18 Jul 1998 00:57:32 +0000 (00:57 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@299 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

57 files changed:
include/wx/odbc.h
include/wx/zstream.h
install/gtk/configure
install/gtk/configure.in
src/Makefile.in
src/common/zstream.cpp
src/gtk/dialog.cpp
src/gtk/setup/setup.hin
src/gtk/window.cpp
src/gtk1/dialog.cpp
src/gtk1/setup/setup.hin
src/gtk1/window.cpp
src/iodbc/Changes.log [new file with mode: 0644]
src/iodbc/Config.mk [new file with mode: 0644]
src/iodbc/IAFA-PACKAGE [new file with mode: 0644]
src/iodbc/Makefile [new file with mode: 0644]
src/iodbc/README [new file with mode: 0644]
src/iodbc/Version.mk [new file with mode: 0644]
src/iodbc/autoconfig [new file with mode: 0755]
src/iodbc/build [new file with mode: 0755]
src/iodbc/catalog.c [new file with mode: 0644]
src/iodbc/config.h [new file with mode: 0644]
src/iodbc/connect.c [new file with mode: 0644]
src/iodbc/dlf.c [new file with mode: 0644]
src/iodbc/dlf.h [new file with mode: 0644]
src/iodbc/dlproc.c [new file with mode: 0644]
src/iodbc/dlproc.h [new file with mode: 0644]
src/iodbc/execute.c [new file with mode: 0644]
src/iodbc/fetch.c [new file with mode: 0644]
src/iodbc/hdbc.c [new file with mode: 0644]
src/iodbc/hdbc.h [new file with mode: 0644]
src/iodbc/henv.c [new file with mode: 0644]
src/iodbc/henv.ci [new file with mode: 0644]
src/iodbc/henv.h [new file with mode: 0644]
src/iodbc/herr.c [new file with mode: 0644]
src/iodbc/herr.ci [new file with mode: 0644]
src/iodbc/herr.h [new file with mode: 0644]
src/iodbc/hstmt.c [new file with mode: 0644]
src/iodbc/hstmt.h [new file with mode: 0644]
src/iodbc/info.c [new file with mode: 0644]
src/iodbc/iodbc.h [new file with mode: 0644]
src/iodbc/isql.h [new file with mode: 0644]
src/iodbc/isqlext.h [new file with mode: 0644]
src/iodbc/itrace.c [new file with mode: 0644]
src/iodbc/itrace.h [new file with mode: 0644]
src/iodbc/main.c [new file with mode: 0644]
src/iodbc/misc.c [new file with mode: 0644]
src/iodbc/postgres/isql.h [new file with mode: 0644]
src/iodbc/postgres/isqlext.h [new file with mode: 0644]
src/iodbc/postgres/odbc_funcs.h [new file with mode: 0644]
src/iodbc/postgres/odbc_types.h [new file with mode: 0644]
src/iodbc/prepare.c [new file with mode: 0644]
src/iodbc/result.c [new file with mode: 0644]
src/iodbc/shrsub.exp [new file with mode: 0644]
src/iodbc/windows.h [new file with mode: 0644]
src/mkdirs
user/wxTest/wxTest.cpp

index ba9d3220cac3e38dece722b6e53da3ecc2b9c81d..ed73055dedcc1f2d6e03c575b4556b8a26de862f 100644 (file)
 #include <windows.h>
 #endif
 
+#ifdef __WXGTK__
+#include <../iodbc/postgres/isqlext.h>
+#include <../iodbc/postgres/odbc_funcs.h>
+#include <../iodbc/postgres/odbc_types.h>
+#else
 #include <sqlext.h>
+#endif
 
 #include "wx/defs.h"
 #include "wx/list.h"
index 9fec85d2a9bccbb57f2f49b828807aaddc70d339..addbcf06b99314d77511867ea0d532c338d63af2 100644 (file)
@@ -16,7 +16,7 @@
 #endif
 
 #include <wx/stream.h>
-#include "zlib.h"
+#include "../../src/zlib/zlib.h"
 
 class wxZlibInputStream: public wxFilterInputStream {
  public:
index e1ba36ebdd1dd4efdf49d2a8d44c7b82c95ddc87..88634368bcad1fdc9f13bfa22941257206e4b8cb 100755 (executable)
@@ -34,6 +34,8 @@ ac_help="$ac_help
 ac_help="$ac_help
 **--with-libpng           use libpng (PNG image format)"
 ac_help="$ac_help
+**--with-odbc           use iODBC"
+ac_help="$ac_help
 **--with-opengl           use opengl (OpenGL or Mesa)"
 ac_help="$ac_help
 **--with_apple_ieee      use the Apple IEEE codec"
@@ -674,7 +676,7 @@ SEARCH_LIB="`echo "$SEARCH_INCLUDE" | sed s/include/lib/g` \
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:678: checking for $ac_word" >&5
+echo "configure:680: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -703,7 +705,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:707: checking for $ac_word" >&5
+echo "configure:709: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -751,7 +753,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:755: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:757: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -761,11 +763,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS
 cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext <<EOF
-#line 765 "configure"
+#line 767 "configure"
 #include "confdefs.h"
 main(){return(0);}
 EOF
-if { (eval echo configure:769: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -785,12 +787,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:789: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:791: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:794: checking whether we are using GNU C" >&5
+echo "configure:796: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -799,7 +801,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:805: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -814,7 +816,7 @@ if test $ac_cv_prog_gcc = yes; then
   ac_save_CFLAGS="$CFLAGS"
   CFLAGS=
   echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:818: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:820: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -846,10 +848,10 @@ CFLAGS=`echo "$CFLAGS" | sed 's/-g//g'`
 
 if test "x$CC" != xcc; then
   echo $ac_n "checking whether $CC and cc understand -c and -o together""... $ac_c" 1>&6
-echo "configure:850: checking whether $CC and cc understand -c and -o together" >&5
+echo "configure:852: checking whether $CC and cc understand -c and -o together" >&5
 else
   echo $ac_n "checking whether cc understands -c and -o together""... $ac_c" 1>&6
-echo "configure:853: checking whether cc understands -c and -o together" >&5
+echo "configure:855: checking whether cc understands -c and -o together" >&5
 fi
 set dummy $CC; ac_cc="`echo $2 |
                       sed -e 's/[^a-zA-Z0-9_]/_/g' -e 's/^[0-9]/_/'`"
@@ -861,16 +863,16 @@ else
 # We do the test twice because some compilers refuse to overwrite an
 # existing .o file with -o, though they will create one.
 ac_try='${CC-cc} -c conftest.c -o conftest.o 1>&5'
-if { (eval echo configure:865: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
-   test -f conftest.o && { (eval echo configure:866: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
+if { (eval echo configure:867: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
+   test -f conftest.o && { (eval echo configure:868: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
 then
   eval ac_cv_prog_cc_${ac_cc}_c_o=yes
   if test "x$CC" != xcc; then
     # Test first that cc exists at all.
-    if { ac_try='cc -c conftest.c 1>&5'; { (eval echo configure:871: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+    if { ac_try='cc -c conftest.c 1>&5'; { (eval echo configure:873: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
       ac_try='cc -c conftest.c -o conftest.o 1>&5'
-      if { (eval echo configure:873: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
-        test -f conftest.o && { (eval echo configure:874: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
+      if { (eval echo configure:875: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } &&
+        test -f conftest.o && { (eval echo configure:876: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; };
       then
         # cc works too.
         :
@@ -897,7 +899,7 @@ EOF
 fi
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:901: checking how to run the C preprocessor" >&5
+echo "configure:903: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -912,13 +914,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 916 "configure"
+#line 918 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:922: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:924: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -929,13 +931,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 933 "configure"
+#line 935 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:939: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:941: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -959,13 +961,13 @@ echo "$ac_t""$CPP" 1>&6
 
 if test $ac_cv_prog_gcc = yes; then
     echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
-echo "configure:963: checking whether ${CC-cc} needs -traditional" >&5
+echo "configure:965: checking whether ${CC-cc} needs -traditional" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
     ac_pattern="Autoconf.*'x'"
   cat > conftest.$ac_ext <<EOF
-#line 969 "configure"
+#line 971 "configure"
 #include "confdefs.h"
 #include <sgtty.h>
 Autoconf TIOCGETP
@@ -983,7 +985,7 @@ rm -f conftest*
 
   if test $ac_cv_prog_gcc_traditional = no; then
     cat > conftest.$ac_ext <<EOF
-#line 987 "configure"
+#line 989 "configure"
 #include "confdefs.h"
 #include <termio.h>
 Autoconf TCGETA
@@ -1012,7 +1014,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1016: checking for $ac_word" >&5
+echo "configure:1018: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1043,7 +1045,7 @@ test -n "$CXX" || CXX="gcc"
 
 
 echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1047: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+echo "configure:1049: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
 
 ac_ext=C
 # CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1053,11 +1055,11 @@ ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $L
 cross_compiling=$ac_cv_prog_cxx_cross
 
 cat > conftest.$ac_ext <<EOF
-#line 1057 "configure"
+#line 1059 "configure"
 #include "confdefs.h"
 main(){return(0);}
 EOF
-if { (eval echo configure:1061: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   ac_cv_prog_cxx_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1083,12 +1085,12 @@ if test $ac_cv_prog_cxx_works = no; then
   { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1087: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1089: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
 cross_compiling=$ac_cv_prog_cxx_cross
 
 echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
-echo "configure:1092: checking whether we are using GNU C++" >&5
+echo "configure:1094: checking whether we are using GNU C++" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1097,7 +1099,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1101: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1103: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gxx=yes
 else
   ac_cv_prog_gxx=no
@@ -1112,7 +1114,7 @@ if test $ac_cv_prog_gxx = yes; then
   ac_save_CXXFLAGS="$CXXFLAGS"
   CXXFLAGS=
   echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
-echo "configure:1116: checking whether ${CXX-g++} accepts -g" >&5
+echo "configure:1118: checking whether ${CXX-g++} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1140,7 +1142,7 @@ else
 fi
 
 echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
-echo "configure:1144: checking how to run the C++ preprocessor" >&5
+echo "configure:1146: checking how to run the C++ preprocessor" >&5
 if test -z "$CXXCPP"; then
 if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1153,12 +1155,12 @@ ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $L
 cross_compiling=$ac_cv_prog_cxx_cross
   CXXCPP="${CXX-g++} -E"
   cat > conftest.$ac_ext <<EOF
-#line 1157 "configure"
+#line 1159 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1162: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1164: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -1190,7 +1192,7 @@ CXXFLAGS=`echo "$CXXFLAGS" | sed 's/-g//g'`
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1194: checking for $ac_word" >&5
+echo "configure:1196: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1220,7 +1222,7 @@ fi
 # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1224: checking for $ac_word" >&5
+echo "configure:1226: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1277,7 +1279,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:1281: checking for a BSD compatible install" >&5
+echo "configure:1283: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1328,7 +1330,7 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1332: checking whether ln -s works" >&5
+echo "configure:1334: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1354,7 +1356,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1358: checking for $ac_word" >&5
+echo "configure:1360: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1384,7 +1386,7 @@ done
 
 
 echo $ac_n "checking "make for VPATH support"""... $ac_c" 1>&6
-echo "configure:1388: checking "make for VPATH support"" >&5
+echo "configure:1390: checking "make for VPATH support"" >&5
 cat - << EOF > confMake
 check : file
        cp \$? \$@
@@ -1414,7 +1416,7 @@ fi
 # Uses ac_ vars as temps to allow command line to override cache and checks.
 # --without-x overrides everything else, but does not touch the cache.
 echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:1418: checking for X" >&5
+echo "configure:1420: checking for X" >&5
 
 # Check whether --with-x or --without-x was given.
 if test "${with_x+set}" = set; then
@@ -1476,12 +1478,12 @@ if test "$ac_x_includes" = NO; then
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 1480 "configure"
+#line 1482 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1485: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1487: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -1550,14 +1552,14 @@ if test "$ac_x_libraries" = NO; then
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1554 "configure"
+#line 1556 "configure"
 #include "confdefs.h"
 
 int main() {
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:1561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1563: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -1663,17 +1665,17 @@ else
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:1667: checking whether -R must be followed by a space" >&5
+echo "configure:1669: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 1670 "configure"
+#line 1672 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:1677: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1679: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -1689,14 +1691,14 @@ rm -f conftest*
       else
        LIBS="$ac_xsave_LIBS -R $x_libraries"
        cat > conftest.$ac_ext <<EOF
-#line 1693 "configure"
+#line 1695 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:1700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1702: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -1728,7 +1730,7 @@ rm -f conftest*
     # libraries were built with DECnet support.  And karl@cs.umb.edu says
     # the Alpha needs dnet_stub (dnet does not exist).
     echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:1732: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:1734: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1736,7 +1738,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1740 "configure"
+#line 1742 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1747,7 +1749,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1751: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1753: \"$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
@@ -1769,7 +1771,7 @@ fi
 
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:1773: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:1775: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1777,7 +1779,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldnet_stub  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1781 "configure"
+#line 1783 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1788,7 +1790,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:1792: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1794: \"$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
@@ -1817,12 +1819,12 @@ fi
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:1821: checking for gethostbyname" >&5
+echo "configure:1823: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1826 "configure"
+#line 1828 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -1845,7 +1847,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1849: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1851: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -1866,7 +1868,7 @@ fi
 
     if test $ac_cv_func_gethostbyname = no; then
       echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:1870: checking for gethostbyname in -lnsl" >&5
+echo "configure:1872: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1874,7 +1876,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1878 "configure"
+#line 1880 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1885,7 +1887,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:1889: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1891: \"$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
@@ -1915,12 +1917,12 @@ fi
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:1919: checking for connect" >&5
+echo "configure:1921: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1924 "configure"
+#line 1926 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -1943,7 +1945,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:1947: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1949: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -1964,7 +1966,7 @@ fi
 
     if test $ac_cv_func_connect = no; then
       echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:1968: checking for connect in -lsocket" >&5
+echo "configure:1970: checking for connect in -lsocket" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1972,7 +1974,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 1976 "configure"
+#line 1978 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -1983,7 +1985,7 @@ int main() {
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:1987: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1989: \"$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
@@ -2007,12 +2009,12 @@ fi
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:2011: checking for remove" >&5
+echo "configure:2013: checking for remove" >&5
 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2016 "configure"
+#line 2018 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -2035,7 +2037,7 @@ remove();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2039: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2041: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -2056,7 +2058,7 @@ fi
 
     if test $ac_cv_func_remove = no; then
       echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:2060: checking for remove in -lposix" >&5
+echo "configure:2062: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2064,7 +2066,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lposix  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2068 "configure"
+#line 2070 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2075,7 +2077,7 @@ int main() {
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:2079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2081: \"$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
@@ -2099,12 +2101,12 @@ fi
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:2103: checking for shmat" >&5
+echo "configure:2105: checking for shmat" >&5
 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2108 "configure"
+#line 2110 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -2127,7 +2129,7 @@ shmat();
 
 ; return 0; }
 EOF
-if { (eval echo configure:2131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2133: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -2148,7 +2150,7 @@ fi
 
     if test $ac_cv_func_shmat = no; then
       echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:2152: checking for shmat in -lipc" >&5
+echo "configure:2154: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2156,7 +2158,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lipc  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2160 "configure"
+#line 2162 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2167,7 +2169,7 @@ int main() {
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:2171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2173: \"$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
@@ -2200,7 +2202,7 @@ fi
   # libraries we check for below, so use a different variable.
   #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
   echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:2204: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:2206: checking for IceConnectionNumber in -lICE" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2208,7 +2210,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lICE  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2212 "configure"
+#line 2214 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2219,7 +2221,7 @@ int main() {
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:2223: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2225: \"$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
@@ -2249,12 +2251,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
-echo "configure:2253: checking for $ac_hdr that defines DIR" >&5
+echo "configure:2255: checking for $ac_hdr that defines DIR" >&5
 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2258 "configure"
+#line 2260 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_hdr>
@@ -2262,7 +2264,7 @@ int main() {
 DIR *dirp = 0;
 ; return 0; }
 EOF
-if { (eval echo configure:2266: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2268: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   eval "ac_cv_header_dirent_$ac_safe=yes"
 else
@@ -2287,7 +2289,7 @@ done
 # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
 if test $ac_header_dirent = dirent.h; then
 echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
-echo "configure:2291: checking for opendir in -ldir" >&5
+echo "configure:2293: checking for opendir in -ldir" >&5
 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2295,7 +2297,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldir  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2299 "configure"
+#line 2301 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2306,7 +2308,7 @@ int main() {
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:2310: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2312: \"$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
@@ -2328,7 +2330,7 @@ fi
 
 else
 echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
-echo "configure:2332: checking for opendir in -lx" >&5
+echo "configure:2334: checking for opendir in -lx" >&5
 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -2336,7 +2338,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lx  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 2340 "configure"
+#line 2342 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2347,7 +2349,7 @@ int main() {
 opendir()
 ; return 0; }
 EOF
-if { (eval echo configure:2351: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:2353: \"$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
@@ -2370,12 +2372,12 @@ fi
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:2374: checking for ANSI C header files" >&5
+echo "configure:2376: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2379 "configure"
+#line 2381 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -2383,7 +2385,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2387: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2389: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2400,7 +2402,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 2404 "configure"
+#line 2406 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -2418,7 +2420,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 2422 "configure"
+#line 2424 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -2439,7 +2441,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 2443 "configure"
+#line 2445 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -2450,7 +2452,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:2454: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -2474,12 +2476,12 @@ EOF
 fi
 
 echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:2478: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:2480: checking for sys/wait.h that is POSIX.1 compatible" >&5
 if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2483 "configure"
+#line 2485 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -2495,7 +2497,7 @@ wait (&s);
 s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:2499: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2501: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_sys_wait_h=yes
 else
@@ -2517,17 +2519,17 @@ fi
 
 ac_safe=`echo "fcntl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for fcntl.h""... $ac_c" 1>&6
-echo "configure:2521: checking for fcntl.h" >&5
+echo "configure:2523: checking for fcntl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2526 "configure"
+#line 2528 "configure"
 #include "confdefs.h"
 #include <fcntl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2531: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2550,17 +2552,17 @@ fi
 
 ac_safe=`echo "limits.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for limits.h""... $ac_c" 1>&6
-echo "configure:2554: checking for limits.h" >&5
+echo "configure:2556: checking for limits.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2559 "configure"
+#line 2561 "configure"
 #include "confdefs.h"
 #include <limits.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2564: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2566: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2583,17 +2585,17 @@ fi
 
 ac_safe=`echo "sys/file.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/file.h""... $ac_c" 1>&6
-echo "configure:2587: checking for sys/file.h" >&5
+echo "configure:2589: checking for sys/file.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2592 "configure"
+#line 2594 "configure"
 #include "confdefs.h"
 #include <sys/file.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2597: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2599: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2616,17 +2618,17 @@ fi
 
 ac_safe=`echo "sys/time.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/time.h""... $ac_c" 1>&6
-echo "configure:2620: checking for sys/time.h" >&5
+echo "configure:2622: checking for sys/time.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2625 "configure"
+#line 2627 "configure"
 #include "confdefs.h"
 #include <sys/time.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2630: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2632: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2649,17 +2651,17 @@ fi
 
 ac_safe=`echo "unistd.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for unistd.h""... $ac_c" 1>&6
-echo "configure:2653: checking for unistd.h" >&5
+echo "configure:2655: checking for unistd.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2658 "configure"
+#line 2660 "configure"
 #include "confdefs.h"
 #include <unistd.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2665: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2682,17 +2684,17 @@ fi
 
 ac_safe=`echo "linux/joystick.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for linux/joystick.h""... $ac_c" 1>&6
-echo "configure:2686: checking for linux/joystick.h" >&5
+echo "configure:2688: checking for linux/joystick.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2691 "configure"
+#line 2693 "configure"
 #include "confdefs.h"
 #include <linux/joystick.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2696: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2698: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -2720,12 +2722,12 @@ fi
 
 
 echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:2724: checking for uid_t in sys/types.h" >&5
+echo "configure:2726: checking for uid_t in sys/types.h" >&5
 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2729 "configure"
+#line 2731 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 EOF
@@ -2754,7 +2756,7 @@ EOF
 fi
 
 echo $ac_n "checking type of array argument to getgroups""... $ac_c" 1>&6
-echo "configure:2758: checking type of array argument to getgroups" >&5
+echo "configure:2760: checking type of array argument to getgroups" >&5
 if eval "test \"`echo '$''{'ac_cv_type_getgroups'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2762,7 +2764,7 @@ else
   ac_cv_type_getgroups=cross
 else
   cat > conftest.$ac_ext <<EOF
-#line 2766 "configure"
+#line 2768 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Rendell for this test.  */
@@ -2787,7 +2789,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:2791: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
     ac_cv_type_getgroups=gid_t
 else
@@ -2801,7 +2803,7 @@ fi
 
 if test $ac_cv_type_getgroups = cross; then
         cat > conftest.$ac_ext <<EOF
-#line 2805 "configure"
+#line 2807 "configure"
 #include "confdefs.h"
 #include <unistd.h>
 EOF
@@ -2825,12 +2827,12 @@ EOF
 
 
 echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:2829: checking for mode_t" >&5
+echo "configure:2831: checking for mode_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2834 "configure"
+#line 2836 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2858,12 +2860,12 @@ EOF
 fi
 
 echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:2862: checking for off_t" >&5
+echo "configure:2864: checking for off_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2867 "configure"
+#line 2869 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2891,12 +2893,12 @@ EOF
 fi
 
 echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:2895: checking for pid_t" >&5
+echo "configure:2897: checking for pid_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2900 "configure"
+#line 2902 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2924,12 +2926,12 @@ EOF
 fi
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:2928: checking return type of signal handlers" >&5
+echo "configure:2930: checking return type of signal handlers" >&5
 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2933 "configure"
+#line 2935 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -2946,7 +2948,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:2950: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2952: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -2965,12 +2967,12 @@ EOF
 
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:2969: checking for size_t" >&5
+echo "configure:2971: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 2974 "configure"
+#line 2976 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -2998,12 +3000,12 @@ EOF
 fi
 
 echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:3002: checking for uid_t in sys/types.h" >&5
+echo "configure:3004: checking for uid_t in sys/types.h" >&5
 if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3007 "configure"
+#line 3009 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 EOF
@@ -3034,12 +3036,12 @@ fi
 
 
 echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
-echo "configure:3038: checking whether stat file-mode macros are broken" >&5
+echo "configure:3040: checking whether stat file-mode macros are broken" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3043 "configure"
+#line 3045 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -3090,12 +3092,12 @@ EOF
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:3094: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:3096: checking whether time.h and sys/time.h may both be included" >&5
 if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3099 "configure"
+#line 3101 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -3104,7 +3106,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:3108: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3110: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -3125,12 +3127,12 @@ EOF
 fi
 
 echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6
-echo "configure:3129: checking for st_blksize in struct stat" >&5
+echo "configure:3131: checking for st_blksize in struct stat" >&5
 if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3134 "configure"
+#line 3136 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -3138,7 +3140,7 @@ int main() {
 struct stat s; s.st_blksize;
 ; return 0; }
 EOF
-if { (eval echo configure:3142: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3144: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_st_blksize=yes
 else
@@ -3159,12 +3161,12 @@ EOF
 fi
  
 echo $ac_n "checking for st_blocks in struct stat""... $ac_c" 1>&6
-echo "configure:3163: checking for st_blocks in struct stat" >&5
+echo "configure:3165: checking for st_blocks in struct stat" >&5
 if eval "test \"`echo '$''{'ac_cv_struct_st_blocks'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3168 "configure"
+#line 3170 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -3172,7 +3174,7 @@ int main() {
 struct stat s; s.st_blocks;
 ; return 0; }
 EOF
-if { (eval echo configure:3176: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3178: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_st_blocks=yes
 else
@@ -3195,12 +3197,12 @@ else
 fi
  
 echo $ac_n "checking for st_rdev in struct stat""... $ac_c" 1>&6
-echo "configure:3199: checking for st_rdev in struct stat" >&5
+echo "configure:3201: checking for st_rdev in struct stat" >&5
 if eval "test \"`echo '$''{'ac_cv_struct_st_rdev'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3204 "configure"
+#line 3206 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -3208,7 +3210,7 @@ int main() {
 struct stat s; s.st_rdev;
 ; return 0; }
 EOF
-if { (eval echo configure:3212: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3214: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_st_rdev=yes
 else
@@ -3229,12 +3231,12 @@ EOF
 fi
  
 echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:3233: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:3235: checking whether struct tm is in sys/time.h or time.h" >&5
 if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3238 "configure"
+#line 3240 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <time.h>
@@ -3242,7 +3244,7 @@ int main() {
 struct tm *tp; tp->tm_sec;
 ; return 0; }
 EOF
-if { (eval echo configure:3246: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3248: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_tm=time.h
 else
@@ -3263,12 +3265,12 @@ EOF
 fi
 
 echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
-echo "configure:3267: checking for tm_zone in struct tm" >&5
+echo "configure:3269: checking for tm_zone in struct tm" >&5
 if eval "test \"`echo '$''{'ac_cv_struct_tm_zone'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3272 "configure"
+#line 3274 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_cv_struct_tm>
@@ -3276,7 +3278,7 @@ int main() {
 struct tm tm; tm.tm_zone;
 ; return 0; }
 EOF
-if { (eval echo configure:3280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3282: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_tm_zone=yes
 else
@@ -3296,12 +3298,12 @@ EOF
 
 else
   echo $ac_n "checking for tzname""... $ac_c" 1>&6
-echo "configure:3300: checking for tzname" >&5
+echo "configure:3302: checking for tzname" >&5
 if eval "test \"`echo '$''{'ac_cv_var_tzname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3305 "configure"
+#line 3307 "configure"
 #include "confdefs.h"
 #include <time.h>
 #ifndef tzname /* For SGI.  */
@@ -3311,7 +3313,7 @@ int main() {
 atoi(*tzname);
 ; return 0; }
 EOF
-if { (eval echo configure:3315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_var_tzname=yes
 else
@@ -3335,12 +3337,12 @@ fi
 
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:3339: checking for working const" >&5
+echo "configure:3341: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3344 "configure"
+#line 3346 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -3389,7 +3391,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:3393: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3395: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -3410,21 +3412,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:3414: checking for inline" >&5
+echo "configure:3416: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 3421 "configure"
+#line 3423 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:3428: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -3450,14 +3452,14 @@ EOF
 esac
 
 echo $ac_n "checking whether char is unsigned""... $ac_c" 1>&6
-echo "configure:3454: checking whether char is unsigned" >&5
+echo "configure:3456: checking whether char is unsigned" >&5
 if eval "test \"`echo '$''{'ac_cv_c_char_unsigned'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   if test "$GCC" = yes; then
   # GCC predefines this symbol on systems where it applies.
 cat > conftest.$ac_ext <<EOF
-#line 3461 "configure"
+#line 3463 "configure"
 #include "confdefs.h"
 #ifdef __CHAR_UNSIGNED__
   yes
@@ -3479,7 +3481,7 @@ if test "$cross_compiling" = yes; then
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 3483 "configure"
+#line 3485 "configure"
 #include "confdefs.h"
 /* volatile prevents gcc2 from optimizing the test away on sparcs.  */
 #if !defined(__STDC__) || __STDC__ != 1
@@ -3489,7 +3491,7 @@ main() {
   volatile char c = 255; exit(c < 0);
 }
 EOF
-if { (eval echo configure:3493: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_char_unsigned=yes
 else
@@ -3513,7 +3515,7 @@ EOF
 fi
 
 echo $ac_n "checking for long double""... $ac_c" 1>&6
-echo "configure:3517: checking for long double" >&5
+echo "configure:3519: checking for long double" >&5
 if eval "test \"`echo '$''{'ac_cv_c_long_double'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3524,7 +3526,7 @@ if test "$cross_compiling" = yes; then
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 3528 "configure"
+#line 3530 "configure"
 #include "confdefs.h"
 int main() {
 /* The Stardent Vistra knows sizeof(long double), but does not support it.  */
@@ -3532,7 +3534,7 @@ long double foo = 0.0;
 /* On Ultrix 4.3 cc, long double is 4 and double is 8.  */
 exit(sizeof(long double) < sizeof(double)); }
 EOF
-if { (eval echo configure:3536: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3538: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_long_double=yes
 else
@@ -3557,14 +3559,14 @@ fi
 
 
 echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:3561: checking whether byte ordering is bigendian" >&5
+echo "configure:3563: checking whether byte ordering is bigendian" >&5
 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_bigendian=unknown
 # See if sys/param.h defines the BYTE_ORDER macro.
 cat > conftest.$ac_ext <<EOF
-#line 3568 "configure"
+#line 3570 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -3575,11 +3577,11 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:3579: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3581: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   # It does; now see whether it defined to BIG_ENDIAN or not.
 cat > conftest.$ac_ext <<EOF
-#line 3583 "configure"
+#line 3585 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -3590,7 +3592,7 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:3594: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3596: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_bigendian=yes
 else
@@ -3610,7 +3612,7 @@ if test "$cross_compiling" = yes; then
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 3614 "configure"
+#line 3616 "configure"
 #include "confdefs.h"
 main () {
   /* Are we little or big endian?  From Harbison&Steele.  */
@@ -3623,7 +3625,7 @@ main () {
   exit (u.c[sizeof (long) - 1] == 1);
 }
 EOF
-if { (eval echo configure:3627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3629: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_bigendian=no
 else
@@ -3648,7 +3650,7 @@ fi
 
 
 echo $ac_n "checking size of int *""... $ac_c" 1>&6
-echo "configure:3652: checking size of int *" >&5
+echo "configure:3654: checking size of int *" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_int_p'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3656,7 +3658,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 3660 "configure"
+#line 3662 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -3667,7 +3669,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:3671: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3673: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_int_p=`cat conftestval`
 else
@@ -3687,7 +3689,7 @@ EOF
 
 
 echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:3691: checking size of int" >&5
+echo "configure:3693: checking size of int" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3695,7 +3697,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 3699 "configure"
+#line 3701 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -3706,7 +3708,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:3710: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3712: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_int=`cat conftestval`
 else
@@ -3726,7 +3728,7 @@ EOF
 
 
 echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:3730: checking size of long" >&5
+echo "configure:3732: checking size of long" >&5
 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3734,7 +3736,7 @@ else
     { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
 else
   cat > conftest.$ac_ext <<EOF
-#line 3738 "configure"
+#line 3740 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -3745,7 +3747,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:3749: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3751: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   ac_cv_sizeof_long=`cat conftestval`
 else
@@ -3784,7 +3786,7 @@ if test "$USE_THREADS" = "1"; then
 
   
   echo $ac_n "checking for pthread_create in -lpthread-0.7""... $ac_c" 1>&6
-echo "configure:3788: checking for pthread_create in -lpthread-0.7" >&5
+echo "configure:3790: 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
@@ -3792,7 +3794,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthread-0.7  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3796 "configure"
+#line 3798 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3803,7 +3805,7 @@ int main() {
 pthread_create()
 ; return 0; }
 EOF
-if { (eval echo configure:3807: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3809: \"$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
@@ -3830,7 +3832,7 @@ else
   echo "$ac_t""no" 1>&6
 
     echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6
-echo "configure:3834: checking for pthread_create in -lpthread" >&5
+echo "configure:3836: checking for pthread_create in -lpthread" >&5
 ac_lib_var=`echo pthread'_'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
@@ -3838,7 +3840,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthread  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3842 "configure"
+#line 3844 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3849,7 +3851,7 @@ int main() {
 pthread_create()
 ; return 0; }
 EOF
-if { (eval echo configure:3853: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3855: \"$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
@@ -3880,7 +3882,7 @@ fi
 fi
 
   echo $ac_n "checking for pthread_create in -lpthreads""... $ac_c" 1>&6
-echo "configure:3884: checking for pthread_create in -lpthreads" >&5
+echo "configure:3886: checking for pthread_create in -lpthreads" >&5
 ac_lib_var=`echo pthreads'_'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
@@ -3888,7 +3890,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lpthreads  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3892 "configure"
+#line 3894 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3899,7 +3901,7 @@ int main() {
 pthread_create()
 ; return 0; }
 EOF
-if { (eval echo configure:3903: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:3905: \"$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
@@ -3928,17 +3930,17 @@ fi
 
   ac_safe=`echo "sys/prctl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/prctl.h""... $ac_c" 1>&6
-echo "configure:3932: checking for sys/prctl.h" >&5
+echo "configure:3934: checking for sys/prctl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3937 "configure"
+#line 3939 "configure"
 #include "confdefs.h"
 #include <sys/prctl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3942: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3944: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3971,7 +3973,7 @@ fi
 
 
 echo $ac_n "checking for long file names""... $ac_c" 1>&6
-echo "configure:3975: checking for long file names" >&5
+echo "configure:3977: checking for long file names" >&5
 if eval "test \"`echo '$''{'ac_cv_sys_long_file_names'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4022,7 +4024,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4026: checking for $ac_word" >&5
+echo "configure:4028: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4055,7 +4057,7 @@ test -n "$YACC" || YACC="yacc"
 # Extract the first word of "flex", so it can be a program name with args.
 set dummy flex; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4059: checking for $ac_word" >&5
+echo "configure:4061: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4088,7 +4090,7 @@ then
   *) ac_lib=l ;;
   esac
   echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
-echo "configure:4092: checking for yywrap in -l$ac_lib" >&5
+echo "configure:4094: checking for yywrap in -l$ac_lib" >&5
 ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4096,7 +4098,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4100 "configure"
+#line 4102 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4107,7 +4109,7 @@ int main() {
 yywrap()
 ; return 0; }
 EOF
-if { (eval echo configure:4111: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4113: \"$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
@@ -4130,7 +4132,7 @@ fi
 fi
 
 echo $ac_n "checking lex output file root""... $ac_c" 1>&6
-echo "configure:4134: checking lex output file root" >&5
+echo "configure:4136: checking lex output file root" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4151,7 +4153,7 @@ echo "$ac_t""$ac_cv_prog_lex_root" 1>&6
 LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
 
 echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6
-echo "configure:4155: checking whether yytext is a pointer" >&5
+echo "configure:4157: checking whether yytext is a pointer" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4163,14 +4165,14 @@ echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
 ac_save_LIBS="$LIBS"
 LIBS="$LIBS $LEXLIB"
 cat > conftest.$ac_ext <<EOF
-#line 4167 "configure"
+#line 4169 "configure"
 #include "confdefs.h"
 `cat $LEX_OUTPUT_ROOT.c`
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:4174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:4176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   ac_cv_prog_lex_yytext_pointer=yes
 else
@@ -4204,7 +4206,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:4208: checking host system type" >&5
+echo "configure:4210: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -4398,6 +4400,7 @@ DEFAULT_USE_MEM_TRACING=0
 DEFAULT_USE_ZLIB=1
 DEFAULT_USE_GDK_IMLIB=1
 DEFAULT_USE_LIBPNG=1
+DEFAULT_USE_ODBC=1
 
 DEFAULT_USE_APPLE_IEEE=1
 DEFAULT_USE_STORABLE_CLASSES=1
@@ -4438,7 +4441,7 @@ DEFAULT_USE_WX_RESOURCES=1
 
 
 echo $ac_n "checking "for shared"""... $ac_c" 1>&6
-echo "configure:4442: checking "for shared"" >&5
+echo "configure:4445: checking "for shared"" >&5
 # Check whether --with-shared or --without-shared was given.
 if test "${with_shared+set}" = set; then
   withval="$with_shared"
@@ -4468,7 +4471,7 @@ fi
 
 
 echo $ac_n "checking "for optimise"""... $ac_c" 1>&6
-echo "configure:4472: checking "for optimise"" >&5
+echo "configure:4475: checking "for optimise"" >&5
 # Check whether --with-optimise or --without-optimise was given.
 if test "${with_optimise+set}" = set; then
   withval="$with_optimise"
@@ -4498,7 +4501,7 @@ fi
 
 
 echo $ac_n "checking "for debug_flag"""... $ac_c" 1>&6
-echo "configure:4502: checking "for debug_flag"" >&5
+echo "configure:4505: 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"
@@ -4528,7 +4531,7 @@ fi
 
 
 echo $ac_n "checking "for debug_info"""... $ac_c" 1>&6
-echo "configure:4532: checking "for debug_info"" >&5
+echo "configure:4535: 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"
@@ -4558,7 +4561,7 @@ fi
 
 
 echo $ac_n "checking "for mem_tracing"""... $ac_c" 1>&6
-echo "configure:4562: checking "for mem_tracing"" >&5
+echo "configure:4565: 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"
@@ -4588,7 +4591,7 @@ fi
 
 
 echo $ac_n "checking "for profile"""... $ac_c" 1>&6
-echo "configure:4592: checking "for profile"" >&5
+echo "configure:4595: checking "for profile"" >&5
 # Check whether --with-profile or --without-profile was given.
 if test "${with_profile+set}" = set; then
   withval="$with_profile"
@@ -4619,7 +4622,7 @@ fi
 
 
 echo $ac_n "checking "for zlib"""... $ac_c" 1>&6
-echo "configure:4623: checking "for zlib"" >&5
+echo "configure:4626: checking "for zlib"" >&5
 # Check whether --with-zlib or --without-zlib was given.
 if test "${with_zlib+set}" = set; then
   withval="$with_zlib"
@@ -4649,7 +4652,7 @@ fi
 
 
 echo $ac_n "checking "for gdk_imlib"""... $ac_c" 1>&6
-echo "configure:4653: checking "for gdk_imlib"" >&5
+echo "configure:4656: checking "for gdk_imlib"" >&5
 # Check whether --with-gdk_imlib or --without-gdk_imlib was given.
 if test "${with_gdk_imlib+set}" = set; then
   withval="$with_gdk_imlib"
@@ -4679,7 +4682,7 @@ fi
 
 
 echo $ac_n "checking "for libpng"""... $ac_c" 1>&6
-echo "configure:4683: checking "for libpng"" >&5
+echo "configure:4686: checking "for libpng"" >&5
 # Check whether --with-libpng or --without-libpng was given.
 if test "${with_libpng+set}" = set; then
   withval="$with_libpng"
@@ -4708,8 +4711,38 @@ fi
 
 
 
+echo $ac_n "checking "for odbc"""... $ac_c" 1>&6
+echo "configure:4716: checking "for odbc"" >&5
+# Check whether --with-odbc or --without-odbc was given.
+if test "${with_odbc+set}" = set; then
+  withval="$with_odbc"
+  if test "x$with_odbc" = xyes; then
+  ac_cv_use_odbc='USE_ODBC="1"'
+else
+  ac_cv_use_odbc='USE_ODBC="0"'
+fi
+else
+  
+  LINE=`grep "USE_ODBC" ${OSTYPE}.system.cache`
+  if test "x$LINE" != x ; then
+    eval "DEFAULT_$LINE"
+  fi
+  ac_cv_use_odbc='USE_ODBC='$DEFAULT_USE_ODBC
+
+fi
+
+eval "$ac_cv_use_odbc"
+echo $ac_cv_use_odbc >> ${OSTYPE}.system.cache.tmp
+if test "$USE_ODBC" = 1; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+
 echo $ac_n "checking "for opengl"""... $ac_c" 1>&6
-echo "configure:4713: checking "for opengl"" >&5
+echo "configure:4746: checking "for opengl"" >&5
 # Check whether --with-opengl or --without-opengl was given.
 if test "${with_opengl+set}" = set; then
   withval="$with_opengl"
@@ -4740,7 +4773,7 @@ fi
 
 
 echo $ac_n "checking "for apple_ieee"""... $ac_c" 1>&6
-echo "configure:4744: checking "for apple_ieee"" >&5
+echo "configure:4777: 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"
@@ -4770,7 +4803,7 @@ fi
 
 
 echo $ac_n "checking "for storable"""... $ac_c" 1>&6
-echo "configure:4774: checking "for storable"" >&5
+echo "configure:4807: checking "for storable"" >&5
 # Check whether --with-storable or --without-storable was given.
 if test "${with_storable+set}" = set; then
   withval="$with_storable"
@@ -4800,7 +4833,7 @@ fi
 
 
 echo $ac_n "checking "for autotrans"""... $ac_c" 1>&6
-echo "configure:4804: checking "for autotrans"" >&5
+echo "configure:4837: checking "for autotrans"" >&5
 # Check whether --with-autotrans or --without-autotrans was given.
 if test "${with_autotrans+set}" = set; then
   withval="$with_autotrans"
@@ -4830,7 +4863,7 @@ fi
 
 
 echo $ac_n "checking "for afmfonts"""... $ac_c" 1>&6
-echo "configure:4834: checking "for afmfonts"" >&5
+echo "configure:4867: checking "for afmfonts"" >&5
 # Check whether --with-afmfonts or --without-afmfonts was given.
 if test "${with_afmfonts+set}" = set; then
   withval="$with_afmfonts"
@@ -4860,7 +4893,7 @@ fi
 
 
 echo $ac_n "checking "for normalized"""... $ac_c" 1>&6
-echo "configure:4864: checking "for normalized"" >&5
+echo "configure:4897: checking "for normalized"" >&5
 # Check whether --with-normalized or --without-normalized was given.
 if test "${with_normalized+set}" = set; then
   withval="$with_normalized"
@@ -4890,7 +4923,7 @@ fi
 
 
 echo $ac_n "checking "for RPC"""... $ac_c" 1>&6
-echo "configure:4894: checking "for RPC"" >&5
+echo "configure:4927: checking "for RPC"" >&5
 # Check whether --with-rpc or --without-rpc was given.
 if test "${with_rpc+set}" = set; then
   withval="$with_rpc"
@@ -4920,7 +4953,7 @@ fi
 
 
 echo $ac_n "checking "for wxresources"""... $ac_c" 1>&6
-echo "configure:4924: checking "for wxresources"" >&5
+echo "configure:4957: checking "for wxresources"" >&5
 # Check whether --with-wxresources or --without-wxresources was given.
 if test "${with_wxresources+set}" = set; then
   withval="$with_wxresources"
@@ -4950,7 +4983,7 @@ fi
 
 
 echo $ac_n "checking "for prologio"""... $ac_c" 1>&6
-echo "configure:4954: checking "for prologio"" >&5
+echo "configure:4987: checking "for prologio"" >&5
 # Check whether --with-prologio or --without-prologio was given.
 if test "${with_prologio+set}" = set; then
   withval="$with_prologio"
@@ -4980,7 +5013,7 @@ fi
 
 
 echo $ac_n "checking "for postscript"""... $ac_c" 1>&6
-echo "configure:4984: checking "for postscript"" >&5
+echo "configure:5017: checking "for postscript"" >&5
 # Check whether --with-postscript or --without-postscript was given.
 if test "${with_postscript+set}" = set; then
   withval="$with_postscript"
@@ -5010,7 +5043,7 @@ fi
 
 
 echo $ac_n "checking "for wxconfig"""... $ac_c" 1>&6
-echo "configure:5014: checking "for wxconfig"" >&5
+echo "configure:5047: checking "for wxconfig"" >&5
 # Check whether --with-wxconfig or --without-wxconfig was given.
 if test "${with_wxconfig+set}" = set; then
   withval="$with_wxconfig"
@@ -5040,7 +5073,7 @@ fi
 
 
 echo $ac_n "checking "for metafile"""... $ac_c" 1>&6
-echo "configure:5044: checking "for metafile"" >&5
+echo "configure:5077: checking "for metafile"" >&5
 # Check whether --with-metafile or --without-metafile was given.
 if test "${with_metafile+set}" = set; then
   withval="$with_metafile"
@@ -5070,7 +5103,7 @@ fi
 
 
 echo $ac_n "checking "for form"""... $ac_c" 1>&6
-echo "configure:5074: checking "for form"" >&5
+echo "configure:5107: checking "for form"" >&5
 # Check whether --with-form or --without-form was given.
 if test "${with_form+set}" = set; then
   withval="$with_form"
@@ -5100,7 +5133,7 @@ fi
 
 
 echo $ac_n "checking "for help"""... $ac_c" 1>&6
-echo "configure:5104: checking "for help"" >&5
+echo "configure:5137: checking "for help"" >&5
 # Check whether --with-help or --without-help was given.
 if test "${with_help+set}" = set; then
   withval="$with_help"
@@ -5130,7 +5163,7 @@ fi
 
 
 echo $ac_n "checking "for IPC"""... $ac_c" 1>&6
-echo "configure:5134: checking "for IPC"" >&5
+echo "configure:5167: checking "for IPC"" >&5
 # Check whether --with-ipc or --without-ipc was given.
 if test "${with_ipc+set}" = set; then
   withval="$with_ipc"
@@ -5160,7 +5193,7 @@ fi
 
 
 echo $ac_n "checking "for enhanced dialog"""... $ac_c" 1>&6
-echo "configure:5164: checking "for enhanced dialog"" >&5
+echo "configure:5197: checking "for enhanced dialog"" >&5
 # Check whether --with-enhanceddialog or --without-enhanceddialog was given.
 if test "${with_enhanceddialog+set}" = set; then
   withval="$with_enhanceddialog"
@@ -5190,7 +5223,7 @@ fi
 
 
 echo $ac_n "checking "for resources"""... $ac_c" 1>&6
-echo "configure:5194: checking "for resources"" >&5
+echo "configure:5227: checking "for resources"" >&5
 # Check whether --with-resources or --without-resources was given.
 if test "${with_resources+set}" = set; then
   withval="$with_resources"
@@ -5220,7 +5253,7 @@ fi
 
 
 echo $ac_n "checking "for clipboard"""... $ac_c" 1>&6
-echo "configure:5224: checking "for clipboard"" >&5
+echo "configure:5257: checking "for clipboard"" >&5
 # Check whether --with-clipboard or --without-clipboard was given.
 if test "${with_clipboard+set}" = set; then
   withval="$with_clipboard"
@@ -5250,7 +5283,7 @@ fi
 
 
 echo $ac_n "checking "for timedate"""... $ac_c" 1>&6
-echo "configure:5254: checking "for timedate"" >&5
+echo "configure:5287: checking "for timedate"" >&5
 # Check whether --with-timedate or --without-timedate was given.
 if test "${with_timedate+set}" = set; then
   withval="$with_timedate"
@@ -5280,7 +5313,7 @@ fi
 
 
 echo $ac_n "checking "for fraction"""... $ac_c" 1>&6
-echo "configure:5284: checking "for fraction"" >&5
+echo "configure:5317: checking "for fraction"" >&5
 # Check whether --with-fraction or --without-fraction was given.
 if test "${with_fraction+set}" = set; then
   withval="$with_fraction"
@@ -5310,7 +5343,7 @@ fi
 
 
 echo $ac_n "checking "for constrains"""... $ac_c" 1>&6
-echo "configure:5314: checking "for constrains"" >&5
+echo "configure:5347: checking "for constrains"" >&5
 # Check whether --with-constraints or --without-constraints was given.
 if test "${with_constraints+set}" = set; then
   withval="$with_constraints"
@@ -5340,7 +5373,7 @@ fi
 
 
 echo $ac_n "checking "for toolbar"""... $ac_c" 1>&6
-echo "configure:5344: checking "for toolbar"" >&5
+echo "configure:5377: checking "for toolbar"" >&5
 # Check whether --with-toolbar or --without-toolbar was given.
 if test "${with_toolbar+set}" = set; then
   withval="$with_toolbar"
@@ -5370,7 +5403,7 @@ fi
 
 
 echo $ac_n "checking "for gauge"""... $ac_c" 1>&6
-echo "configure:5374: checking "for gauge"" >&5
+echo "configure:5407: checking "for gauge"" >&5
 # Check whether --with-gauge or --without-gauge was given.
 if test "${with_gauge+set}" = set; then
   withval="$with_gauge"
@@ -5400,7 +5433,7 @@ fi
 
 
 echo $ac_n "checking "for vllist"""... $ac_c" 1>&6
-echo "configure:5404: checking "for vllist"" >&5
+echo "configure:5437: checking "for vllist"" >&5
 # Check whether --with-vllist or --without-vllist was given.
 if test "${with_vllist+set}" = set; then
   withval="$with_vllist"
@@ -5430,7 +5463,7 @@ fi
 
 
 echo $ac_n "checking "for scrollbar"""... $ac_c" 1>&6
-echo "configure:5434: checking "for scrollbar"" >&5
+echo "configure:5467: checking "for scrollbar"" >&5
 # Check whether --with-scrollbar or --without-scrollbar was given.
 if test "${with_scrollbar+set}" = set; then
   withval="$with_scrollbar"
@@ -5460,7 +5493,7 @@ fi
 
 
 echo $ac_n "checking "for docview"""... $ac_c" 1>&6
-echo "configure:5464: checking "for docview"" >&5
+echo "configure:5497: checking "for docview"" >&5
 # Check whether --with-docview or --without-docview was given.
 if test "${with_docview+set}" = set; then
   withval="$with_docview"
@@ -5490,7 +5523,7 @@ fi
 
 
 echo $ac_n "checking "for printarch"""... $ac_c" 1>&6
-echo "configure:5494: checking "for printarch"" >&5
+echo "configure:5527: checking "for printarch"" >&5
 # Check whether --with-printarch or --without-printarch was given.
 if test "${with_printarch+set}" = set; then
   withval="$with_printarch"
@@ -5520,7 +5553,7 @@ fi
 
 
 echo $ac_n "checking "for typetree"""... $ac_c" 1>&6
-echo "configure:5524: checking "for typetree"" >&5
+echo "configure:5557: checking "for typetree"" >&5
 # Check whether --with-typetree or --without-typetree was given.
 if test "${with_typetree+set}" = set; then
   withval="$with_typetree"
@@ -5550,7 +5583,7 @@ fi
 
 
 echo $ac_n "checking "for wxgraph"""... $ac_c" 1>&6
-echo "configure:5554: checking "for wxgraph"" >&5
+echo "configure:5587: checking "for wxgraph"" >&5
 # Check whether --with-wxgraph or --without-wxgraph was given.
 if test "${with_wxgraph+set}" = set; then
   withval="$with_wxgraph"
@@ -5580,7 +5613,7 @@ fi
 
 
 echo $ac_n "checking "for wxtree"""... $ac_c" 1>&6
-echo "configure:5584: checking "for wxtree"" >&5
+echo "configure:5617: checking "for wxtree"" >&5
 # Check whether --with-wxtree or --without-wxtree was given.
 if test "${with_wxtree+set}" = set; then
   withval="$with_wxtree"
@@ -5625,6 +5658,11 @@ if test "$USE_LIBPNG" = 1 ; then
   LIBPNG="LIBPNG"
 fi
 
+ODBC=NONE
+if test "$USE_ODBC" = 1 ; then
+  ODBC="ODBC"
+fi
+
 APPLE_IEEE=NONE
 if test "$USE_APPLE_IEEE" = 1 ; then
   APPLE_IEEE="APPLE_IEEE"
@@ -5661,10 +5699,6 @@ fi
 if test "$USE_DEBUG_FLAG" = 1 ; then
   cat >> confdefs.h <<EOF
 #define WXDEBUG $USE_DEBUG_FLAG
-EOF
-
-  cat >> confdefs.h <<EOF
-#define __WXDEBUG__ $USE_DEBUG_FLAG
 EOF
 
   WXDEBUG_DEFINE="-D__WXDEBUG__"
@@ -6018,7 +6052,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:6022: checking for $ac_word" >&5
+echo "configure:6056: 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
@@ -6049,7 +6083,7 @@ fi
 
   min_gtk_version=0.99.7
   echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
-echo "configure:6053: checking for GTK - version >= $min_gtk_version" >&5
+echo "configure:6087: checking for GTK - version >= $min_gtk_version" >&5
   no_gtk=""
   if test "$GTK_CONFIG" != "no" ; then
     GTK_CFLAGS=`$GTK_CONFIG --cflags`
@@ -6062,7 +6096,7 @@ echo "configure:6053: checking for GTK - version >= $min_gtk_version" >&5
   echo $ac_n "cross compiling; assumed OK... $ac_c"
 else
   cat > conftest.$ac_ext <<EOF
-#line 6066 "configure"
+#line 6100 "configure"
 #include "confdefs.h"
 
 #include <gtk/gtk.h>
@@ -6084,7 +6118,7 @@ main ()
 }
 
 EOF
-if { (eval echo configure:6088: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:6122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -6135,7 +6169,7 @@ OPENGL_LINK=
 
 if test "$USE_OPENGL" = 1; then
     echo $ac_n "checking for OpenGL includes""... $ac_c" 1>&6
-echo "configure:6139: checking for OpenGL includes" >&5
+echo "configure:6173: checking for OpenGL includes" >&5
   
 ac_find_includes=
 for ac_dir in $SEARCH_INCLUDE;
@@ -6150,7 +6184,7 @@ for ac_dir in $SEARCH_INCLUDE;
     OPENGL_INCLUDE="-I$ac_find_includes"
     echo "$ac_t""found $ac_find_includes" 1>&6
         echo $ac_n "checking for OpenGL library""... $ac_c" 1>&6
-echo "configure:6154: checking for OpenGL library" >&5
+echo "configure:6188: checking for OpenGL library" >&5
     
 ac_find_libraries=
 for ac_dir in $SEARCH_LIB;
@@ -6258,6 +6292,12 @@ EOF
  
     fi
 
+    if test "$USE_ODBC" = 1; then
+      cat >> confdefs.h <<EOF
+#define USE_ODBC $USE_ODBC
+EOF
+    fi
 
 
 
index d7db7f05e29940c05e82e100784838158b85691c..77032b17eb22ce0128373a321e3d27537446db32 100644 (file)
@@ -695,6 +695,7 @@ DEFAULT_USE_MEM_TRACING=0
 DEFAULT_USE_ZLIB=1
 DEFAULT_USE_GDK_IMLIB=1
 DEFAULT_USE_LIBPNG=1
+DEFAULT_USE_ODBC=1
 
 DEFAULT_USE_APPLE_IEEE=1
 DEFAULT_USE_STORABLE_CLASSES=1
@@ -776,6 +777,10 @@ AC_OVERRIDES(libpng,libpng,
 **--with-libpng           use libpng (PNG image format),
 USE_LIBPNG)
 
+AC_OVERRIDES(odbc,odbc,
+**--with-odbc           use iODBC,
+USE_ODBC)
+
 AC_OVERRIDES(opengl,opengl,
 **--with-opengl           use opengl (OpenGL or Mesa),
 USE_OPENGL)
@@ -921,6 +926,11 @@ if test "$USE_LIBPNG" = 1 ; then
   LIBPNG="LIBPNG"
 fi
 
+ODBC=NONE
+if test "$USE_ODBC" = 1 ; then
+  ODBC="ODBC"
+fi
+
 APPLE_IEEE=NONE
 if test "$USE_APPLE_IEEE" = 1 ; then
   APPLE_IEEE="APPLE_IEEE"
@@ -1346,11 +1356,15 @@ dnl AC_SUBST(LIBPNG_LIBRARY)
 dnl AC_SUBST(LIBPNG_LINK)
 
 dnl ----------------------------------------------------------------
-dnl search for Python
+dnl search for iODBC
 dnl ----------------------------------------------------------------
+dnl 
+    if test "$USE_ODBC" = 1; then
+      AC_DEFINE_UNQUOTED(USE_ODBC,$USE_ODBC) 
+    fi
 
 dnl ----------------------------------------------------------------
-dnl search for ODBC
+dnl search for Python
 dnl ----------------------------------------------------------------
 
 dnl ----------------------------------------------------------------
index 8f698375a8565edc84dd6dc52f6a951d817b78e8..6be1d72eecf069ce1a657728c8b0c9816d381c2a 100644 (file)
@@ -20,8 +20,8 @@ NONE =
 
 # define library name
 LIB_TARGET=wx_gtk
-LIB_MAJOR=0
-LIB_MINOR=12
+LIB_MAJOR=1
+LIB_MINOR=90
 
 # define library sources
 
@@ -48,6 +48,7 @@ LIB_CPP_SRC=\
  common/memory.cpp \
  common/module.cpp \
  common/object.cpp \
+ common/odbc.cpp \
  common/postscrp.cpp \
  common/prntbase.cpp \
  common/string.cpp \
@@ -167,8 +168,24 @@ LIB_C_SRC=\
  gdk_imlib/misc.c \
  gdk_imlib/rend.c \
  gdk_imlib/save.c \
- gdk_imlib/utils.c
-
+ gdk_imlib/utils.c \
+\
+ iodbc/dlf.c \
+ iodbc/dlproc.c \
+ iodbc/herr.c \
+ iodbc/henv.c \
+ iodbc/hdbc.c \
+ iodbc/hstmt.c \
+ iodbc/connect.c \
+ iodbc/prepare.c \
+ iodbc/execute.c \
+ iodbc/result.c \
+ iodbc/execute.c \
+ iodbc/fetch.c \
+ iodbc/info.c \
+ iodbc/catalog.c \
+ iodbc/misc.c \
+ iodbc/itrace.c
  
 #define library objects
 LIB_OBJ=\
@@ -185,6 +202,7 @@ clean::
        $(RM) -rf png
        $(RM) -rf zlib
        $(RM) -rf gdk_imlib
+       $(RM) -rf iodbc
 
 #additional things needed for compile
 ADD_COMPILE= \
index 8ff3bf5c60331c80bff16cc5bde9c8ef9fd645c9..2db13338a34b581cfc433fc57ab5ae38590b6ad8 100644 (file)
@@ -17,7 +17,6 @@
 #include <wx/stream.h>
 #include <wx/zstream.h>
 #include <wx/utils.h>
-#include "zlib.h"
 
 #ifdef __BORLANDC__
 #pragma hdrstop
index 1756334f0c46e9ebb092ca24e1016c9b7540c3e9..b38fedf80673729986e7e92dbe170ecb9232433f 100644 (file)
@@ -120,7 +120,9 @@ void wxDialog::OnApply( wxCommandEvent &WXUNUSED(event) )
 void wxDialog::OnCancel( wxCommandEvent &WXUNUSED(event) )
 {
   if (IsModal())
+  {
     EndModal(wxID_CANCEL);
+  }
   else
   {
     SetReturnCode(wxID_CANCEL);
@@ -133,14 +135,15 @@ void wxDialog::OnOk( wxCommandEvent &WXUNUSED(event) )
   if ( Validate() && TransferDataFromWindow())
   {
     if (IsModal()) 
+    {
       EndModal(wxID_OK);
+    }
     else
     {
       SetReturnCode(wxID_OK);
       this->Show(FALSE);
     };
   };
-  EndModal( wxID_OK );
 };
 
 void wxDialog::OnPaint( wxPaintEvent& WXUNUSED(event) )
@@ -153,7 +156,7 @@ bool wxDialog::OnClose(void)
   static wxList closing;
 
   if (closing.Member(this)) return FALSE;   // no loops
-
+  
   closing.Append(this);
 
   wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
index 8547dcf6ec9d2eccb6b05efb5e766bd791363a2a..442eb7070c9959983f253541e1f1e5d3425242f9 100644 (file)
  * Use libpng
  */
 #undef USE_LIBPNG
+/*
+ * Use iODBC
+ */
+#undef USE_ODBC
 /*
  * Use Threads
  */
index 74ab35d9c7a6a3af5f781417996d6f02ac3e21eb..daa0725468b2d9f49ac47d304c47e67892a1526a 100644 (file)
@@ -1055,10 +1055,24 @@ void wxWindow::ImplementSetSize(void)
 
 void wxWindow::ImplementSetPosition(void)
 {
+  if (!m_parent)
+  {
+    if (IsKindOf(CLASSINFO(wxFrame)) ||
+        IsKindOf(CLASSINFO(wxDialog)))
+    {
+      gtk_widget_set_uposition( m_widget, m_x, m_y );
+    }
+    else
+    {
+      printf( "wxWindow::SetSize error.\n" );
+    }
+    return;
+  }
+  
   if ((m_parent) && (m_parent->m_wxwindow))
     gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x, m_y );
-  else
-    gtk_widget_set_uposition( m_widget, m_x, m_y );
+    
+  // Don't do anything for children of wxNotebook and wxMDIChildFrame   
 };
 
 void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags )
index 1756334f0c46e9ebb092ca24e1016c9b7540c3e9..b38fedf80673729986e7e92dbe170ecb9232433f 100644 (file)
@@ -120,7 +120,9 @@ void wxDialog::OnApply( wxCommandEvent &WXUNUSED(event) )
 void wxDialog::OnCancel( wxCommandEvent &WXUNUSED(event) )
 {
   if (IsModal())
+  {
     EndModal(wxID_CANCEL);
+  }
   else
   {
     SetReturnCode(wxID_CANCEL);
@@ -133,14 +135,15 @@ void wxDialog::OnOk( wxCommandEvent &WXUNUSED(event) )
   if ( Validate() && TransferDataFromWindow())
   {
     if (IsModal()) 
+    {
       EndModal(wxID_OK);
+    }
     else
     {
       SetReturnCode(wxID_OK);
       this->Show(FALSE);
     };
   };
-  EndModal( wxID_OK );
 };
 
 void wxDialog::OnPaint( wxPaintEvent& WXUNUSED(event) )
@@ -153,7 +156,7 @@ bool wxDialog::OnClose(void)
   static wxList closing;
 
   if (closing.Member(this)) return FALSE;   // no loops
-
+  
   closing.Append(this);
 
   wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
index 8547dcf6ec9d2eccb6b05efb5e766bd791363a2a..442eb7070c9959983f253541e1f1e5d3425242f9 100644 (file)
  * Use libpng
  */
 #undef USE_LIBPNG
+/*
+ * Use iODBC
+ */
+#undef USE_ODBC
 /*
  * Use Threads
  */
index 74ab35d9c7a6a3af5f781417996d6f02ac3e21eb..daa0725468b2d9f49ac47d304c47e67892a1526a 100644 (file)
@@ -1055,10 +1055,24 @@ void wxWindow::ImplementSetSize(void)
 
 void wxWindow::ImplementSetPosition(void)
 {
+  if (!m_parent)
+  {
+    if (IsKindOf(CLASSINFO(wxFrame)) ||
+        IsKindOf(CLASSINFO(wxDialog)))
+    {
+      gtk_widget_set_uposition( m_widget, m_x, m_y );
+    }
+    else
+    {
+      printf( "wxWindow::SetSize error.\n" );
+    }
+    return;
+  }
+  
   if ((m_parent) && (m_parent->m_wxwindow))
     gtk_myfixed_move( GTK_MYFIXED(m_parent->m_wxwindow), m_widget, m_x, m_y );
-  else
-    gtk_widget_set_uposition( m_widget, m_x, m_y );
+    
+  // Don't do anything for children of wxNotebook and wxMDIChildFrame   
 };
 
 void wxWindow::SetSize( int x, int y, int width, int height, int sizeFlags )
diff --git a/src/iodbc/Changes.log b/src/iodbc/Changes.log
new file mode 100644 (file)
index 0000000..fd43047
--- /dev/null
@@ -0,0 +1,58 @@
+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.
+
+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
+
+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.
diff --git a/src/iodbc/Config.mk b/src/iodbc/Config.mk
new file mode 100644 (file)
index 0000000..35511a7
--- /dev/null
@@ -0,0 +1,21 @@
+#
+#  Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+#
+
+#============ Default for all system ==============
+SHELL   =
+SHELL   = /bin/sh
+DLDAPI  = DLDAPI_SVR4_DLFCN
+DLSUFFIX= so
+OUTFILE = iodbc
+OBJX    =
+
+#============= Linux ELF =========================
+#      Slackware 2.x,(kernel 1.3.x) on i386
+#      Red Hat   2.x (kernel 1.2.x) on i486
+#
+ANSI    = -ansi
+CC      = gcc
+PIC     = -fPIC
+LDFLAGS = -shared
+LIBS    = -ldl
diff --git a/src/iodbc/IAFA-PACKAGE b/src/iodbc/IAFA-PACKAGE
new file mode 100644 (file)
index 0000000..488ec4c
--- /dev/null
@@ -0,0 +1,37 @@
+Title:         iODBC Driver Manager for Unix
+
+Version:       2.12.0
+
+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 
+               iODBC driver manager will be able to simultaneously access 
+               different type of data sources within one process through 
+               suitable ODBC drivers. 
+               
+Author:                Jin, Ke <kejin@empress.com>
+
+Platforms:     SunOS (Sparc)           4.1.x
+               HP/UX (s700/s800)       9.x, 10.x
+               HP/UX (s300/s400)       9.x 
+               IBM AIX                 3.x, 4.x 
+               Solaris (Sparc)         2.x
+               Solaris (PCx86)         2.x
+               SGI Irix                5.x, 6.x
+               NCR SVR4                3.x
+               UnixWare SVR4.2         1.x, 2.x
+               DEC Unix (OSF/1)        3.x, 4.x
+               FreeBSD                 2.x
+               BSDI BSD/OS             2.x
+               Linux ELF               1.2.x
+               SCO OpenServer          5.x 
+               Concurrent MAX/OS       1.x 
+               DG/UX                   5.x
+
+Copying-Policy:        Freely Redistributable under GNU General Public License
+
+Keywords:      ODBC, database, SQL
diff --git a/src/iodbc/Makefile b/src/iodbc/Makefile
new file mode 100644 (file)
index 0000000..a92adfc
--- /dev/null
@@ -0,0 +1,32 @@
+include Version.mk
+include Config.mk
+
+
+
+
+
+
+
+
+
+
+
+INCDIR = .
+OUTDIR = $(HOME)
+
+CFLAGS  = -O $(PIC) $(ANSI) -I$(INCDIR) -D$(DLDAPI) $(CFLAGSX)\
+         -DVERSION=\"$(VERSION)$(EXTVER)\" 
+
+ODBCDM = $(OUTDIR)/$(OUTFILE)-$(VERSION).$(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)
+       @echo "Generating iODBC driver manager -->" $(ODBCDM)
+       @\rm -f $(ODBCDM)
+       @$(LD) $(LDFLAGS) $(OBJS) $(LIBS) -o $(ODBCDM)
+
+clean:
+       \rm -f $(OBJS) 
diff --git a/src/iodbc/README b/src/iodbc/README
new file mode 100644 (file)
index 0000000..23cb2a5
--- /dev/null
@@ -0,0 +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
+
+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
+
+   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 
+   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
+   
+   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
+
+3. odbc.ini( ~/.odbc.ini )
+
+   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).  
+   The format of odbc.ini( or ~/.odbc.ini ) is defined as:
+
+       odbc.ini(or .odbc.ini) ::= data_source_list
+
+       data_source_list ::= /* empty */
+                          | data_source '\n' data_source_list
+
+       data_source ::= '[' data_source_name ']' '\n' data_source_desc
+
+       data_source_name ::= 'default' | [A-Za-z]*[A-Za-z0-9_]*
+
+       data_source_desc ::= /* empty */
+                          | attrib_desc '\n' data_source_desc
+
+       addrib_desc ::= Attrib '=' attrib_value
+
+       Attrib ::= 'Driver' | 'PID' | 'UID' | driver_def_attrib
+
+       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_wp]
+       # white page of metro Toronto
+       Driver = /usr/lib/odbc/oracle.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
+
+       [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
+
+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 
+   file (under a data source section) as:
+
+       TraceFile = <optional_trace_file>
+       Trace = ON | On | on | 1 | OFF | Off | off | 0
+
+   If <optional_trace_file> is stderr or stdout, i.e.
+   
+        TraceFile = stderr 
+   
+   or
+
+       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 
+   tracing file(s). ODBC calls on connections without tuning tracing on
+   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 
diff --git a/src/iodbc/Version.mk b/src/iodbc/Version.mk
new file mode 100644 (file)
index 0000000..c61ab27
--- /dev/null
@@ -0,0 +1,2 @@
+VERSION = 2.12
+EXTVER  = .0
diff --git a/src/iodbc/autoconfig b/src/iodbc/autoconfig
new file mode 100755 (executable)
index 0000000..ac6de96
--- /dev/null
@@ -0,0 +1,230 @@
+#! /usr/bin/sh
+
+cat > Config.tmp << '@END'
+#
+#  Copyright (C) 1995 by Ke Jin <kejin@empress.com>
+#
+
+#============ Default for all system ==============
+SHELL   =
+SHELL   = /bin/sh
+DLDAPI  = DLDAPI_SVR4_DLFCN
+DLSUFFIX= so
+OUTFILE = iodbc
+OBJX    =
+@END
+
+\rm -f Makefile.tmp
+cat > Makefile.tmp <<'@END'
+include Version.mk
+include Config.mk
+@END
+
+case $1 in
+ sun4)
+       cat >> Config.tmp << '@END'
+
+#============ SunOS 4.1.x =========================
+PIC     = -pic
+CC      = acc
+LIBS    = -ldl
+@END
+       ;;
+
+ aix)
+       cat >> Config.tmp << '@END'
+
+#=========== AIX 3.x 4.x ==========================
+DLDAPI  = DLDAPI_AIX_LOAD
+ANSI    = -langlvl=ansi
+LDFLAGS = -H512 -T512 -bE:shrsub.exp -bM:SRE
+LIBS    = -lc
+OBJX    = main.o
+DLSUFFIX= s.o
+CFLAGSX = -DCLI_NAME_PREFIX=\".SQL\"
+@END
+       ;;
+
+ hp300 | hp400)
+       cat >> Config.tmp << '@END'
+
+#============ HP/UX (s300/s400) 9.x 10.x ==========
+DLDAPI  = DLDAPI_HP_SHL
+ANSI    = -Aa
+PIC     = +z
+LDFLAGS = -b
+DLSUFFIX= sl
+CFLAGSX = -D_INCLUDE_POSIX_SOURCE -DCLI_NAME_PREFIX=\"_SQL\"
+@END
+       ;;
+
+ hp700 | hp800)
+       cat >> Config.tmp << '@END'
+
+#============ HP/UX 9000(s700/s800) 9.x 10.x ======
+DLDAPI  = DLDAPI_HP_SHL
+ANSI    = -Aa
+PIC     = +z
+LDFLAGS = -b
+LIBS    = -lc -ldld
+DLSUFFIX= sl
+CFLAGSX = -D_INCLUDE_POSIX_SOURCE
+@END
+       ;;
+
+ solaris)
+       cat >> Config.tmp << '@END'
+
+#======= Solaris 2.x, SunOS 5.x (Sparc/x86) =======
+LDFLAGS = -G -z defs
+LIBS    = -lc -ldl -lnsl
+@END
+       ;;
+
+ ncr |gis)
+       cat >> Config.tmp << '@END'
+
+#============= NCR SVR4 3.x =======================
+PIC     = -KPIC
+LDFLAGS = -G -z defs
+LIBS    = -lc -ldl
+@END
+       ;;
+
+ unixware)
+       cat >> Config.tmp << '@END'
+
+#========= UnixWare SVR4 1.x, 2.x =================
+PIC     = -KPIC
+LDFLAGS = -G -z defs
+LIBS    = -lc -ldl
+@END
+       ;;
+
+ maxos)
+       cat >> Config.tmp << '@END'
+
+#============ Concurrent Maxion MAX/OS 1.x ========
+PIC     = -KPIC
+LDFLAGS = -G -z defs
+LIBS    = -lc -ldl
+@END
+       ;;
+
+ sco-opensrv | sco-osr5 )
+       cat >> Config.tmp << '@END'
+
+#============ SCO OpenServer 5.x ==================
+PIC     = -K PIC -b elf
+LDFLAGS = -G -z defs
+LIBS    = -lc -ldl
+@END
+       ;;
+
+ dgux) 
+       cat >> Config.tmp << '@END'
+
+#============ DG/UX 5.x ===========================
+PIC     = -K PIC
+LDFLAGS = -G -z defs
+LIBS    = -lc -ldl
+@END
+       ;;
+
+ freebsd)
+       cat >> Config.tmp << '@END'
+
+#============= FreeBSD 2.x ========================
+PIC     = -fPIC        
+CFLAGSX = -DCLI_NAME_PREFIX=\"_SQL\"
+LDFLAGS = -Bshareable
+LIBS    = -lc
+@END
+
+       \rm -f Makefile.tmp
+       cat > Makefile.tmp <<'@END'
+.include "Version.mk"
+.include "Config.mk"
+@END
+       ;;
+
+ bsd-os)
+       cat >> Config.tmp << '@END'
+
+#============ BSDI BSD/OS 2.x =====================
+#
+#      ported by: Stuart Hayton <stuey@clic.co.uk>
+#
+CC      = gcc
+LDFLAGS = -r
+LDSUFFIX= o
+LIBS    = -lc_s.2.0 -ldl
+@END
+       ;;
+
+ linux-elf)
+       cat >> Config.tmp << '@END'
+
+#============= 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
+@END
+       ;;
+
+ irix5| irix6)
+       cat >> Config.tmp << '@END'
+
+#============= SGI IRIX 5.x, 6.x =================
+LDFLAGS = -shared
+LIBS    = -lc
+@END
+       ;;
+
+ dec-osf1 | dec-unix)
+       cat >> Config.tmp << '@END'
+
+#============= DEC Unix(OSF/1) 3.x, 4.x ==========
+LDFLAGS = -shared
+LIBS    = -lc
+@END
+       ;;
+ *)
+       cat << '@END'
+
+  Usage: autoconfig <platform_opt>  or
+        build      <platform_opt>
+       
+  platform_opt:
+
+       sun4            -- SunOS 4.1.x
+       aix             -- IBM AIX 3.x, 4.x
+       hp300, hp400    -- HP/UX 9.x, 10.x on 9000 s300/s400
+       hp700, hp800    -- HP/UX 9.x, 10.x on 9000 s700/s800
+       solaris         -- Sun Solaris 2.x, SunOS 5.x
+       ncr, gis        -- NCR(GIS) SVR4 3.x
+       unixware        -- Novell UnixWare 1.x, 2.x
+       maxos           -- Concurrent MAX/OS SVR4  1.x
+       sco-osr5        -- SCO Open Server 5.x
+       dgux            -- DG/UX 5.x
+       freebsd         -- FreeBSD 2.x
+       bsd-os          -- BSDI BSD/OS 2.x
+       linux-elf       -- Linux ELF 1.2.x and up
+       irix5, irix6    -- SGI Irix 5.x, 6.x
+       dec-osf1        -- DEC Unix(OSF/1) 3.x, 4.x
+
+@END
+       \rm -f Config.tmp
+       \rm -f Makefile.tmp
+       exit 1
+       ;;
+esac
+       \mv -f Config.tmp Config.mk
+       sed -e 's/.include.*//' -e 's/include.*//' Makefile >> Makefile.tmp
+       \mv -f Makefile.tmp Makefile
+       exit 0
diff --git a/src/iodbc/build b/src/iodbc/build
new file mode 100755 (executable)
index 0000000..eb47c38
--- /dev/null
@@ -0,0 +1,9 @@
+#! /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
new file mode 100644 (file)
index 0000000..0d85940
--- /dev/null
@@ -0,0 +1,1092 @@
+/** Catalog functions of iODBC driver manager
+
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+#include       <../iodbc/hstmt.h>
+
+#include       <../iodbc/itrace.h>
+
+static RETCODE _iodbcdm_cata_state_ok ( 
+                               HSTMT   hstmt, 
+                               int     fidx )
+/* 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;
+}
+
+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;
+}
+
+RETCODE SQL_API SQLGetTypeInfo(
+                       HSTMT           hstmt,
+                       SWORD           fSqlType )
+{
+       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;
+               }
+
+               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 );
+}
+
+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   = 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 ) )
+
+#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 );
+}
+
+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   = 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 ) )
+
+#if 0
+       retcode = hproc(pstmt->dhstmt,
+                       szTableQualifier,
+                       cbTableQualifier,
+                       szTableOwner,
+                       cbTableOwner,
+                       szTableName,
+                       cbTableName,
+                       fUnique,
+                       fAccuracy );
+#endif
+
+       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 )
+{
+       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 ) )
+       
+#if 0
+       retcode = hproc(pstmt->dhstmt,
+                       szTableQualifier,
+                       cbTableQualifier,
+                       szTableOwner,
+                       cbTableOwner,
+                       szTableName,
+                       cbTableName,
+                       szTableType,
+                       cbTableType );
+#endif
+
+       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 )
+{
+       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 ) )
+
+#if 0
+       retcode = hproc(pstmt->dhstmt,
+                       szTableQualifier,
+                       cbTableQualifier,
+                       szTableOwner,
+                       cbTableOwner,
+                       szTableName,
+                       cbTableName,
+                       szColumnName,
+                       cbColumnName );
+#endif
+
+       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 )
+{
+       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 ) )
+
+#if 0
+       retcode = hproc(pstmt->dhstmt,
+                       szTableQualifier,
+                       cbTableQualifier,
+                       szTableOwner,
+                       cbTableOwner,
+                       szTableName,
+                       cbTableName,
+                       szColumnName,
+                       cbColumnName );
+#endif
+
+       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 )
+{
+       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 ) )
+
+#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 );
+}
+
+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   = 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 ) )
+
+#if 0 
+       retcode = hproc(pstmt->dhstmt,
+                       szTableQualifier,
+                       cbTableQualifier,
+                       szTableOwner,
+                       cbTableOwner,
+                       szTableName,
+                       cbTableName );
+#endif
+
+       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 )
+{
+       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 ) )
+
+#if 0
+       retcode = hproc(pstmt->dhstmt,
+                       szProcQualifier,
+                       cbProcQualifier,
+                       szProcOwner,
+                       cbProcOwner,
+                       szProcName,
+                       cbProcName,
+                       szColumnName,
+                       cbColumnName );
+#endif
+
+       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 )
+{
+       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 ) )
+
+#if 0  
+       retcode = hproc(pstmt->dhstmt,
+                       szProcQualifier,
+                       cbProcQualifier,
+                       szProcOwner,
+                       cbProcOwner,
+                       szProcName,
+                       cbProcName );
+#endif
+
+       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 )
+{
+
+       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 ) )
+
+#if 0
+       retcode = hproc(pstmt->dhstmt,
+                       szTableQualifier,
+                       cbTableQualifier,
+                       szTableOwner,
+                       cbTableOwner,
+                       szTableName,
+                       cbTableName );
+#endif
+
+       return _iodbcdm_cata_state_tr( hstmt, en_TablePrivileges, retcode );
+}
diff --git a/src/iodbc/config.h b/src/iodbc/config.h
new file mode 100644 (file)
index 0000000..da47f8c
--- /dev/null
@@ -0,0 +1,43 @@
+#ifndef _LINUX_CONFIG_H
+#define _LINUX_CONFIG_H
+
+#include <linux/autoconf.h>
+
+/*
+ * Defines for what uname() should return 
+ */
+#ifndef UTS_SYSNAME
+#define UTS_SYSNAME "Linux"
+#endif
+
+#ifndef UTS_MACHINE
+#define UTS_MACHINE "unknown"
+#endif
+
+#ifndef UTS_NODENAME
+#define UTS_NODENAME "(none)"  /* set by sethostname() */
+#endif
+
+#ifndef UTS_DOMAINNAME
+#define UTS_DOMAINNAME "(none)"        /* set by setdomainname() */
+#endif
+
+/*
+ * The definitions for UTS_RELEASE and UTS_VERSION are now defined
+ * in linux/version.h, and should only be used by linux/version.c
+ */
+
+/* Shouldn't these be defined somewhere in a i386 definition? */
+
+/* Don't touch these, unless you really know what you're doing. */
+#define DEF_INITSEG    0x9000
+#define DEF_SYSSEG     0x1000
+#define DEF_SETUPSEG   0x9020
+#define DEF_SYSSIZE    0x7F00
+
+/* internal svga startup constants */
+#define NORMAL_VGA     0xffff          /* 80x25 mode */
+#define EXTENDED_VGA   0xfffe          /* 80x50 mode */
+#define ASK_VGA                0xfffd          /* ask for it at bootup */
+
+#endif
diff --git a/src/iodbc/connect.c b/src/iodbc/connect.c
new file mode 100644 (file)
index 0000000..c2f37e9
--- /dev/null
@@ -0,0 +1,1260 @@
+/** Connect(load) driver
+
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#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>
+
+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 
+ *   violation.
+ */
+static char sccsid[] 
+       = "@(#)iODBC driver manager " "2.12" ", Copyright(c) 1995 by Ke Jin";
+
+static RETCODE _iodbcdm_driverload( 
+                       char FAR*       path,   
+                       HDBC            hdbc )
+/* - 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
+ */
+{
+       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;
+
+       hdll = _iodbcdm_dllopen( (char FAR*) path ); 
+                                /* This will either load the
+                                 * driver dll or increase its
+                                 * reference count */
+
+       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 )
+               {
+                       _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 (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() */
+#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 )
+               {
+#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
+#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;
+}
+
+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
+ *   count if it is not the last referenct )
+ * - decrease bookkeeping reference count
+ * - state transition to allocated
+ */
+{
+       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
+#endif
+       {
+               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;
+               }
+       }
+
+       penv->refcount --;
+
+       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
+#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;
+}
+
+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;
+}
+
+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 setopterr;
+}
+
+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            *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.
+                        */
+                       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
+
+       if( retcode != SQL_SUCCESS 
+        && retcode != SQL_SUCCESS_WITH_INFO )
+       {
+               /* not unload driver for retrive error 
+                * messge from driver */
+               /*********
+               _iodbcdm_driverunload( hdbc );
+               **********/
+
+               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 )
+{
+       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;
+       }
+
+       /* 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( (char FAR *)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;
+       }
+       
+       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
+
+       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;
+       }
+
+       /* 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        SQLBrowseConnect ( 
+                       HDBC            hdbc,
+                       HWND            hwnd,
+                       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
+
+       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;
+}
+
+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( 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
+
+       /* state transition */
+       if( retcode == SQL_SUCCESS )
+       {
+               pdbc->state = en_dbc_allocated;
+       }
+
+       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 ) )
+
+#if 0
+       retcode = hproc(pdbc->dhdbc,
+                       szSqlStrIn,
+                       cbSqlStrIn,
+                       szSqlStr,
+                       cbSqlStrMax,
+                       pcbSqlStr );
+#endif
+
+       return retcode;
+}
diff --git a/src/iodbc/dlf.c b/src/iodbc/dlf.c
new file mode 100644 (file)
index 0000000..5745f8f
--- /dev/null
@@ -0,0 +1,595 @@
+/** dynamic library loader (mapping to svr4)
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include  "wx/setup.h"
+
+#include       <../iodbc/dlf.h>
+#include       <errno.h>
+
+#ifdef DLDAPI_DEFINED  
+# undef DLDAPI_DEFINED
+#endif
+
+#ifdef DLDAPI_SVR4_DLFCN
+# define DLDAPI_DEFINED
+static char sccsid[] = "@(#)dynamic load interface -- SVR4 dlfcn";
+#endif
+
+/********************************* 
+ *
+ *     HP/UX 
+ *
+ *********************************/
+#ifdef DLDAPI_HP_SHL
+# define       DLDAPI_DEFINED
+# include      <dl.h>
+
+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);
+}
+
+void*  dlsym(void* hdll, char* sym)
+{
+       void*   symaddr = 0;
+       int     ret;
+
+       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);
+
+       if( ret == -1 )
+               return 0;
+
+       return symaddr;
+}
+
+char*  dlerror()
+{
+       extern char*    strerror();
+
+       return strerror(errno);
+}
+
+int    dlclose(void* hdll)
+{
+       return shl_unload((shl_t)hdll);
+}
+
+#endif /* end of HP/UX Seection */
+
+/*********************************
+ *
+ *     IBM AIX
+ *
+ *********************************/
+#ifdef DLDAPI_AIX_LOAD
+# define       DLDAPI_DEFINED
+# include      <sys/types.h>
+# include      <sys/ldr.h>
+# include      <sys/stat.h>
+# include      <nlist.h>
+
+/*
+ *   Following id sting is a copyright mark. Removing(i.e. use the 
+ *   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) 
+ *   are copyright violation.
+ */
+static  char sccsid[]
+       = "@(#)dynamic load interface, Copyright(c) 1995 by Ke Jin";
+
+# ifndef       HTAB_SIZE
+#  define      HTAB_SIZE       256
+# endif
+
+# define       FACTOR          0.618039887 /* i.e. (sqrt(5) - 1)/2 */
+
+# 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;
+
+/* 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 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 
+ * 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 
+ * 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). 
+ */
+
+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)
+/* initate a hashing table */
+{
+       int     i;
+
+       for(i=0; i<HTAB_SIZE; i++)
+               ht[i] = (slot_t*)0;
+
+       return;
+}
+
+static void clean_htab(hent_t* ht)
+/* free all slots */
+{
+       int     i;
+       slot_t* ent;
+       slot_t* tent;
+
+       for(i = 0; i< HTAB_SIZE; i++)
+       {
+               for( ent = ht[i]; ent; )
+               {
+                       tent = ent->next;
+                       
+                       free(ent->sym);
+                       free(ent);
+
+                       ent = tent;
+               }
+
+               ht[i] = 0;
+       }
+
+       return;
+}
+
+static int     hash(char* sym )
+{
+       int     a, key;
+       double  f;
+
+       if( !sym || !*sym )
+               return 0;
+
+       for(key=*sym;*sym;sym++)
+        {
+               key += *sym;
+                a = key;
+
+               key = (int)( (a<<8) + (key>>8) );
+               key = (key>0)? key:-key;
+        }
+
+       f = key*FACTOR;
+       a = (int)f;
+
+       return (int)((HTAB_SIZE - 1)*( f - a ));
+}
+
+static hent_t  search(hent_t* htab, char* sym)
+/* search hashing table to find a matched slot */
+{
+       int     key;
+       slot_t* ent;
+
+       key = hash(sym);
+
+       for(ent = htab[key]; ent; ent = ent->next )
+       {
+               if(!strcmp(ent->sym, sym))
+                       return ent;
+       }
+
+       return 0;       /* no match */
+}
+
+static void    insert(hent_t* htab, slot_t* ent)
+/* insert a new slot to hashing table */
+{
+       int     key;
+
+       key = hash(ent->sym);
+
+       ent->next = htab[key];
+       htab[key] = ent;
+
+       return;
+}
+
+static slot_t* slot_alloc(char* sym)
+/* allocate a new slot with symbol */
+{
+       slot_t* ent;
+
+       ent = (slot_t*)malloc(sizeof(slot_t));
+
+       ent->sym = (char*)malloc(strlen(sym)+1);
+
+       if( ! ent->sym )
+       {
+               free(ent);
+               return 0;
+       }
+
+       strcpy( ent->sym, sym );
+
+       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;
+       }
+
+       init_htab(pobj->htab);
+
+       pobj->next = obj_list;
+       obj_list = pobj;
+
+       return pobj;
+}
+
+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;
+}
+
+char*  dlerror()
+{
+       extern char*    sys_errlist[];
+
+       if( ! errmsg || ! errmsg[0] )
+       {
+               if( errno >= 0 )
+                       return sys_errlist[errno];
+               
+               return "";
+       }
+
+       return errmsg;
+}
+
+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;
+}
+
+#endif /* end of IBM AIX Section */
+
+
+/********************************* 
+ *
+ *     Windows 3.x, 95, NT
+ *
+ *********************************/
+#ifdef DLDAPI_WINDOWS
+# define       DLDAPI_DEFINED
+# include      <windows.h>
+
+void FAR*      dlopen(char FAR* dll, int mode)
+{
+       HINSTANCE       hint;
+
+       if( dll == NULL )
+       {
+               return GetWindowWord( NULL, GWW_HINSTANCE );
+       }
+
+       hint = LoadLibrary(dll);
+
+       if( hint < HINSTANCE_ERROR )
+       {
+               return NULL;
+       }
+
+       return (void FAR*)hint;
+}
+
+void FAR*      dlsym( void FAR* hdll, char FAR* sym )
+{
+       return (void FAR*)GetProcAddress(hdll, sym);
+}
+
+char FAR*      dlerror()
+{
+       return 0L; /* unimplemented yet */
+}
+
+int    dlclose(void FAR* hdll)
+{
+       FreeLibrary((HINSTANCE)hdll);
+}
+
+#endif /* end of Windows family */
+
+/***********************************
+ *
+ *     other platforms
+ *
+ ***********************************/
+#ifdef DLDAPI_OS2
+# define       DLDAPI_DEFINED
+/*
+ *     DosLoadModule(), DosQueryProcAddress(), DosFreeModule(), ...
+ */
+#endif
+
+#ifdef DLDAPI_MAC
+# define       DLDAPI_DEFINED
+#endif
+
+#ifdef DLDAPI_NEXT
+# define       DLDAPI_DEFINED
+#endif
+
+#ifndef DLDAPI_DEFINED
+# error        "dynamic load editor undefined"
+#endif
diff --git a/src/iodbc/dlf.h b/src/iodbc/dlf.h
new file mode 100644 (file)
index 0000000..185b478
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef        _DLF_H
+# define _DLF_H
+
+#define DLDAPI_SVR4_DLFCN
+
+#ifdef __HPUX__
+#define DLDAPI_HP_SHL
+#endif
+
+#ifdef __AIX__
+#define DLDAPI_AIX_LOAD
+#endif
+
+# include      <../iodbc/config.h>
+# include      <../iodbc/windows.h>
+
+# ifdef DLDAPI_SVR4_DLFCN
+#    include   <dlfcn.h>
+# else
+     extern void FAR*  dlopen(char FAR* path, int mode);
+     extern void FAR*  dlsym(void FAR* hdll, char FAR* sym);
+     extern char FAR*  dlerror();
+     extern int                dlclose(void FAR* hdll);
+# endif
+
+# ifndef       RTLD_LAZY
+#    define    RTLD_LAZY       1
+# endif
+
+# 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
new file mode 100644 (file)
index 0000000..ab102d2
--- /dev/null
@@ -0,0 +1,99 @@
+/** Load driver and resolve driver's function entry point 
+      
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+
+#include       <../iodbc/itrace.h>
+
+#include       "../iodbc/henv.ci"
+
+HPROC  _iodbcdm_getproc( HDBC hdbc, int idx )
+{
+       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 )
+{
+       return  (HDLL)DLL_OPEN( path );
+}
+
+HPROC  _iodbcdm_dllproc( HDLL hdll, char FAR* sym )
+{
+       return (HPROC)DLL_PROC( hdll, sym );
+}
+
+int    _iodbcdm_dllclose( HDLL hdll )
+{
+       DLL_CLOSE( hdll );
+
+       return 0;
+}
+
+char*  _iodbcdm_dllerror( )
+{
+       return DLL_ERROR();
+}
diff --git a/src/iodbc/dlproc.h b/src/iodbc/dlproc.h
new file mode 100644 (file)
index 0000000..127b0d4
--- /dev/null
@@ -0,0 +1,31 @@
+#ifndef        _DLPROC_H
+# define       _DLPROC_H
+
+# include      <../iodbc/dlf.h>
+
+  typedef      RETCODE         (FAR* HPROC)();
+
+# ifdef        DLDAPI_SVR4_DLFCN
+#  include     <dlfcn.h>
+   typedef void*       HDLL; 
+# endif
+
+# ifdef DLDAPI_HP_SHL
+#  include     <dl.h>
+   typedef shl_t       HDLL;
+# endif
+
+# ifdef        DLDAPI_AIX_LOAD
+   typedef void*       HDLL;
+# endif
+
+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
new file mode 100644 (file)
index 0000000..3cc1712
--- /dev/null
@@ -0,0 +1,789 @@
+/** Invoke a query 
+       
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+#include       <../iodbc/hstmt.h>
+
+#include       <../iodbc/itrace.h>
+
+static void    do_cursoropen(STMT_t FAR* pstmt)
+{
+       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 )
+{
+       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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
+
+
+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;
+}
+
+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;
+}
diff --git a/src/iodbc/fetch.c b/src/iodbc/fetch.c
new file mode 100644 (file)
index 0000000..85bd13e
--- /dev/null
@@ -0,0 +1,675 @@
+/** Fetch query result
+       
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../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        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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
diff --git a/src/iodbc/hdbc.c b/src/iodbc/hdbc.c
new file mode 100644 (file)
index 0000000..710a9b5
--- /dev/null
@@ -0,0 +1,804 @@
+/** data source connect object management functions
+
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+#include       <../iodbc/hstmt.h>
+
+#include       <../iodbc/itrace.h>
+#include       <stdio.h>
+
+RETCODE SQL_API        SQLAllocConnect( 
+                       HENV            henv,
+                       HDBC FAR*       phdbc )
+{
+       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 )
+#else
+       if( henv == SQL_NULL_HENV )
+#endif
+       {
+               return SQL_INVALID_HANDLE;
+       }
+
+       if( phdbc == NULL )
+       {
+               PUSHSQLERR ( genv->herr, en_S1009 );
+
+               return SQL_ERROR;
+       }
+
+       pdbc = (DBC_t FAR*)MEM_ALLOC (sizeof(DBC_t));
+
+       if( pdbc == NULL )
+       {
+               *phdbc = SQL_NULL_HDBC;
+
+               PUSHSQLERR ( genv->herr, en_S1001 );
+
+               return SQL_ERROR;
+       }
+
+#if (ODBCVER >= 0x0300)
+       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;
+}
+
+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;
+}
+
+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) )
+#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);
+#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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
diff --git a/src/iodbc/hdbc.h b/src/iodbc/hdbc.h
new file mode 100644 (file)
index 0000000..88f9539
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef        _HDBC_H
+#define        _HDBC_H
+
+typedef        struct DBC
+{
+       int     type;           /* must be 1st field */
+       struct DBC FAR* 
+               next;
+
+       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;
+
+       int     state;
+
+       /* 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;
+
+       char FAR*       
+               current_qualifier;
+
+       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 
+ *    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.
+ *
+ *  - Applications can get driver's connection object handle by
+ *    SQLGetInfo() with fInfoType equals to SQL_DRIVER_HDBC.
+ */
+
+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
new file mode 100644 (file)
index 0000000..be4b4ae
--- /dev/null
@@ -0,0 +1,75 @@
+/** Environment object managment functions
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include       <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+
+#include       <../iodbc/itrace.h>
+
+RETCODE SQL_API        SQLAllocEnv( HENV FAR* phenv )
+{
+       GENV_t FAR*     genv;
+
+       genv = (GENV_t*)MEM_ALLOC( sizeof(GENV_t) );
+
+       if( genv == NULL )
+       {
+               *phenv = SQL_NULL_HENV;
+
+               return SQL_ERROR;
+       }
+
+#if (ODBCVER >= 0x0300 )
+       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          */
+
+       *phenv = (HENV)genv;
+
+       return SQL_SUCCESS;
+}
+
+RETCODE SQL_API        SQLFreeEnv ( HENV henv )
+{
+       GENV_t FAR*     genv = (GENV_t*)henv;
+
+       if( henv == SQL_NULL_HENV ) 
+       {
+               return SQL_INVALID_HANDLE;
+       }
+
+       if( genv->hdbc != SQL_NULL_HDBC )
+       {
+               PUSHSQLERR ( genv->herr, en_S1010 );
+
+               return SQL_ERROR;
+       }
+
+       _iodbcdm_freesqlerrlist( genv->herr );
+
+       MEM_FREE( henv );
+
+       return SQL_SUCCESS;
+}
diff --git a/src/iodbc/henv.ci b/src/iodbc/henv.ci
new file mode 100644 (file)
index 0000000..639c6ec
--- /dev/null
@@ -0,0 +1,95 @@
+
+#ifdef __HPUX__
+#define CLI_NAME_PREFIX "_SQL"
+#endif
+
+#ifdef __AIX__
+#define CLI_NAME_PREFIX ".SQL"
+#endif
+
+#ifndef        CLI_NAME_PREFIX
+
+/* 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" 
+ */
+
+#  define CLI_NAME_PREFIX      "SQL"   /* using call by value prefix */ 
+#endif
+
+static struct {
+       int     en_idx;
+       char*   symbol;
+} odbcapi_symtab[] = {
+#if (ODBCVER >= 0x0300)
+       en_AllocHandle          CLI_NAME_PREFIX "AllocHandle",
+       en_FreeHandle           CLI_NAME_PREFIX "FreeHandle",
+#endif
+       en_AllocEnv,            CLI_NAME_PREFIX "AllocEnv",
+       en_AllocConnect,        CLI_NAME_PREFIX "AllocConnect",
+       en_Connect,             CLI_NAME_PREFIX "Connect",
+       en_DriverConnect,       CLI_NAME_PREFIX "DriverConnect",
+       en_BrowseConnect,       CLI_NAME_PREFIX "BrowseConnect",        
+
+       en_DataSources,         CLI_NAME_PREFIX "DataSources",
+       en_Drivers,             CLI_NAME_PREFIX "Driver",
+       en_GetInfo,             CLI_NAME_PREFIX "GetInfo",
+       en_GetFunctions,        CLI_NAME_PREFIX "GetFunctions",
+       en_GetTypeInfo,         CLI_NAME_PREFIX "GetTypeInfo",
+
+       en_SetConnectOption,    CLI_NAME_PREFIX "SetConnectOption",
+       en_GetConnectOption,    CLI_NAME_PREFIX "GetConnectOption",
+       en_SetStmtOption,       CLI_NAME_PREFIX "SetStmtOption",
+       en_GetStmtOption,       CLI_NAME_PREFIX "GetStmtOption",
+
+       en_AllocStmt,           CLI_NAME_PREFIX "AllocStmt",
+       en_Prepare,             CLI_NAME_PREFIX "Prepare",
+       en_BindParameter,       CLI_NAME_PREFIX "BindParameter",
+       en_ParamOptions,        CLI_NAME_PREFIX "ParamOptions",
+       en_GetCursorName,       CLI_NAME_PREFIX "GetCursorName",
+       en_SetCursorName,       CLI_NAME_PREFIX "SetCursorName",
+       en_SetScrollOptions,    CLI_NAME_PREFIX "SetScrollOptions",
+       en_SetParam,            CLI_NAME_PREFIX "SetParam",
+
+       en_Execute,             CLI_NAME_PREFIX "Execute",
+       en_ExecDirect,          CLI_NAME_PREFIX "ExecDirect",
+       en_NativeSql,           CLI_NAME_PREFIX "NativeSql",
+       en_DescribeParam,       CLI_NAME_PREFIX "DescribeParam",
+       en_NumParams,           CLI_NAME_PREFIX "NumParams",
+       en_ParamData,           CLI_NAME_PREFIX "ParamData",
+       en_PutData,             CLI_NAME_PREFIX "PutData",
+
+       en_RowCount,            CLI_NAME_PREFIX "RowCount",
+       en_NumResultCols,       CLI_NAME_PREFIX "NumResultCols",
+       en_DescribeCol,         CLI_NAME_PREFIX "DescribeCol",
+       en_ColAttributes,       CLI_NAME_PREFIX "ColAttributes",
+       en_BindCol,             CLI_NAME_PREFIX "BindCol",
+       en_Fetch,               CLI_NAME_PREFIX "Fetch",
+       en_ExtendedFetch,       CLI_NAME_PREFIX "ExtendedFetch",
+       en_GetData,             CLI_NAME_PREFIX "GetData",
+       en_SetPos,              CLI_NAME_PREFIX "SetPos",
+       en_MoreResults,         CLI_NAME_PREFIX "MoreResults",
+       en_Error,               CLI_NAME_PREFIX "Error",
+
+       en_ColumnPrivileges,    CLI_NAME_PREFIX "ColumnPrivileges",
+       en_Columns,             CLI_NAME_PREFIX "Columns",
+       en_ForeignKeys,         CLI_NAME_PREFIX "ForeignKeys",
+       en_PrimaryKeys,         CLI_NAME_PREFIX "PrimaryKeys",
+       en_ProcedureColumns,    CLI_NAME_PREFIX "ProcedureColumns",
+       en_Procedures,          CLI_NAME_PREFIX "Procedures",
+       en_SpecialColumns,      CLI_NAME_PREFIX "SpecialColumns",
+       en_Statistics,          CLI_NAME_PREFIX "Statistics",
+       en_TablePrivileges,     CLI_NAME_PREFIX "TablePrivileges",
+       en_Tables,              CLI_NAME_PREFIX "Tables",
+
+       en_FreeStmt,            CLI_NAME_PREFIX "FreeStmt",
+       en_Cancel,              CLI_NAME_PREFIX "Cancel",
+       en_Transact,            CLI_NAME_PREFIX "Transact",
+
+       en_Disconnect,          CLI_NAME_PREFIX "Disconnect",
+       en_FreeConnect,         CLI_NAME_PREFIX "FreeConnect",
+       en_FreeEnv,             CLI_NAME_PREFIX "FreeEnv",
+
+       en_NullProc,            NULL
+};
diff --git a/src/iodbc/henv.h b/src/iodbc/henv.h
new file mode 100644 (file)
index 0000000..8dc260c
--- /dev/null
@@ -0,0 +1,125 @@
+#ifndef        _HENV_H
+#define        _HENV_H
+
+# include      <../iodbc/config.h>
+# include      <../iodbc/dlproc.h>
+
+# include      <../iodbc/isql.h>
+# include      <../iodbc/isqlext.h>
+
+enum {
+#if (ODBCVER >= 0x0300)
+       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;                   /* drvier share library handle */
+} ENV_t;
+
+/* Note:
+ *
+ *  - 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 
+ *    address of this object and needn't care about its detail.
+ *
+ *  - ODBC driver manager knows about instance environment handles,
+ *    void pointers point to ENV_t objects. There are maybe more
+ *    than one this kind of objects per process. However, multiple
+ *    connections to a same data source(i.e. call same share library)
+ *    will share one instance environment object.
+ *
+ *  - ODBC drvier manager knows about their own environemnt handle,
+ *    a void pointer point to a driver defined object. Every driver
+ *    keeps one of its own environment object and driver manager
+ *    keeps address of it by the 'dhenv' field in the instance
+ *    environment object without care about its detail.
+ *
+ *  - 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
new file mode 100644 (file)
index 0000000..cffbdda
--- /dev/null
@@ -0,0 +1,364 @@
+/** Error stack management functions
+  
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include        <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+#include       <../iodbc/hstmt.h>
+
+#include       <../iodbc/itrace.h>
+
+#include       "../iodbc/herr.ci"
+
+static HERR    _iodbcdm_popsqlerr( HERR herr )
+{
+       sqlerr_t*       list = (sqlerr_t*)herr;
+       sqlerr_t*       next;
+
+       if( herr == SQL_NULL_HERR )
+       {
+               return herr;
+       }
+       
+       next = list->next;
+
+       MEM_FREE (list);
+
+       return next;
+}
+
+void   _iodbcdm_freesqlerrlist( HERR herrlist )
+{
+       HERR    list;
+
+       for(list = herrlist; list!= 0; )
+       {
+               list = _iodbcdm_popsqlerr(list);
+       }
+}
+
+HERR   _iodbcdm_pushsqlerr ( 
+               HERR            herr,
+               sqlstcode_t     code,
+               char*           msg )
+{
+       sqlerr_t*       ebuf;
+       sqlerr_t*       perr    = (sqlerr_t*)herr;
+       int             idx     = 0;
+
+       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;
+
+               return herr;
+       }
+
+       ebuf = (sqlerr_t*)MEM_ALLOC (sizeof(sqlerr_t)); 
+       
+       if( ebuf == NULL )
+       {
+               return NULL;
+       }
+
+       ebuf->msg       = msg;  
+       ebuf->code      = code;
+       ebuf->idx       = idx;
+       ebuf->next      = (sqlerr_t*)herr;
+
+       return (HERR)ebuf;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
diff --git a/src/iodbc/herr.ci b/src/iodbc/herr.ci
new file mode 100644 (file)
index 0000000..d502850
--- /dev/null
@@ -0,0 +1,98 @@
+static const sqlerrmsg_t sqlerrmsg_tab[] =
+{
+       en_00000, "00000", "",
+       en_01000, "01000", "General warning",
+       en_01002, "01002", "Disconnect error",
+       en_01004, "01004", "Data truncated",
+       en_01006, "01006", "Privilege not revoked",
+       en_01S00, "01S00", "Invalid connection string attribute",
+       en_01S01, "01S01", "Error in row",
+       en_01S02, "01S02", "Optional value changed",
+       en_01S03, "01S03", "No rows updated or deleted",
+       en_01S04, "01S04", "More than one row updated or deleted",
+       en_07001, "07001", "Wrong number of parameters",
+       en_07006, "07006", "Restricted data type attribute violation",
+       en_08001, "08001", "Unable to connect to data source",
+       en_08002, "08002", "Connection in use",
+       en_08003, "08003", "Connect not open",
+       en_08004, "08004", "Data source rejected establishment of connection",
+       en_08007, "08007", "Connection failure during transaction",
+       en_08S01, "08S01", "Communication link failure",
+       en_21S01, "21S01", "Insert value list does not match",
+       en_21S02, "21S02", "Degree of derived table does not match column list",
+       en_22001, "22001", "String data right truncation",
+       en_22003, "22003", "Numeric value out of range",
+       en_22005, "22005", "Error in assignment",
+       en_22008, "22008", "Datetime field overflow",
+       en_22012, "22012", "Division by zero",
+       en_22026, "22026", "String data, length mismatch",
+       en_23000, "23000", "Integrity constraint violation",
+       en_24000, "24000", "Invalid cursor state",
+       en_25000, "25000", "Invalid transaction state",
+       en_28000, "28000", "Invalid authorization specification",
+       en_34000, "34000", "Invalid cursor name",
+       en_37000, "37000", "Syntex error or access violation",
+       en_3C000, "3C000", "Duplicate cursor name",
+       en_40001, "40001", "Serialization failure",
+       en_42000, "42000", "Syntax error or access violation",
+       en_70100, "70100", "Operation aborted",
+       en_IM001, "IM001", "Driver does not support this function",
+       en_IM002, "IM002", "Data source name not found and no default "
+                          "driver specified. Driver could not be loaded",
+       en_IM003, "IM003", "Specified driver could not be loaded",
+       en_IM004, "IM004", "Driver's SQLAllocEnv() failed",
+       en_IM005, "IM005", "Driver's SQLAllocConnect() failed",
+       en_IM006, "IM006", "Driver's SQLSetConnectOption failed",
+       en_IM007, "IM007", "No data source or driver specified, dialog prohibited",
+       en_IM008, "IM008", "Dialog failed",
+       en_IM009, "IM009", "Unable to load translation DLL",
+       en_IM010, "IM010", "Data source name too long",
+       en_IM011, "IM011", "Driver name too long",
+       en_IM012, "IM012", "DRIVER keyword syntax error",
+       en_IM013, "IM013", "Trace file error",
+       en_IM014, "IM014", "Try to change tracing file while tracing is on",
+       en_S0001, "S0001", "Base table or view already exists",
+       en_S0002, "S0002", "Base table not found",
+       en_S0011, "S0011", "Index already exists",
+       en_S0012, "S0012", "Index not found",
+       en_S0021, "S0021", "Column already exists",
+       en_S0022, "S0022", "Column not found",
+       en_S0023, "S0023", "No default for column",
+       en_S1000, "S1000", "General error",
+       en_S1001, "S1001", "Memory allocation failure",
+       en_S1002, "S1002", "Invalid column number",
+       en_S1003, "S1003", "Program type out of range",
+       en_S1004, "S1004", "SQL data type out of range",
+       en_S1008, "S1008", "Operation canceled",
+       en_S1009, "S1009", "Invalid argument value",
+       en_S1010, "S1010", "Function sequence error",
+       en_S1011, "S1011", "Operation invalid at this time",
+       en_S1012, "S1012", "Invalid transaction operation code specified",
+       en_S1015, "S1015", "No cursor name available",
+       en_S1090, "S1090", "Invalid string or buffer length",
+       en_S1091, "S1091", "Descriptor type out of range",
+       en_S1092, "S1092", "Option type out of range",
+       en_S1093, "S1093", "Invalid parameter",
+       en_S1094, "S1094", "Invalid scale value",
+       en_S1095, "S1095", "Function type out of range",
+       en_S1096, "S1096", "Information type out of range",
+       en_S1097, "S1097", "Column type out of range",
+       en_S1098, "S1098", "Scope type out of range",
+       en_S1099, "S1099", "Nullable type out of range",
+       en_S1100, "S1100", "Uniquenss option type out of range",
+       en_S1101, "S1101", "Accuracy option type out of range",
+       en_S1103, "S1103", "Direction option out of range",
+       en_S1104, "S1104", "Invalid precision value",
+       en_S1105, "S1105", "Invalid parameter type",
+       en_S1106, "S1106", "Fetch type out of range",
+       en_S1107, "S1107", "Row value out of range",
+       en_S1108, "S1108", "Concurrency option out of range",
+       en_S1109, "S1109", "Invalid cursor position",
+       en_S1110, "S1110", "Invalid driver completion",
+       en_S1111, "S1111", "Invalid bookmark value",
+       en_S1C00, "S1C00", "Driver not capable",
+       en_S1T00, "S1T00", "Timeout expired",
+       en_sqlstat_total,   NULL,            NULL 
+};
+
+static char FAR*       sqlerrhd = "[iODBC][Driver Manager]";
diff --git a/src/iodbc/herr.h b/src/iodbc/herr.h
new file mode 100644 (file)
index 0000000..e01941d
--- /dev/null
@@ -0,0 +1,125 @@
+#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        void FAR*       HERR;
+# define SQL_NULL_HERR ((HERR)NULL)
+
+typedef struct
+{
+       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;
+
+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 */
diff --git a/src/iodbc/hstmt.c b/src/iodbc/hstmt.c
new file mode 100644 (file)
index 0000000..a336f03
--- /dev/null
@@ -0,0 +1,598 @@
+/** Query statement object management functions
+       
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+#include       <../iodbc/hstmt.h>
+
+#include       <../iodbc/itrace.h>
+
+RETCODE SQL_API        SQLAllocStmt (
+                       HDBC            hdbc,
+                       HSTMT FAR*      phstmt )
+{
+       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 )
+#else
+       if( hdbc == SQL_NULL_HDBC )
+#endif
+       {
+               return SQL_INVALID_HANDLE;
+       }
+
+       if( phstmt == NULL )
+       {
+               PUSHSQLERR ( pdbc->herr, en_S1009 );
+
+               return SQL_ERROR;
+       }
+
+       /* 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;
+
+               default:
+                       return SQL_INVALID_HANDLE;
+       }
+
+       pstmt = (STMT_t FAR*)MEM_ALLOC(sizeof(STMT_t));
+
+       if( pstmt == NULL )
+       {
+               PUSHSQLERR ( pdbc->herr, en_S1001 );
+               *phstmt = SQL_NULL_HSTMT;
+               
+               return SQL_ERROR;
+       }
+
+#if (ODBCVER >= 0x0300)
+       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 */
+#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
+#endif
+       {
+               hproc = _iodbcdm_getproc( hdbc, en_AllocStmt );
+
+               if( hproc == SQL_NULL_HPROC )
+               {
+                       PUSHSQLERR ( pstmt->herr, en_IM001 );
+                       *phstmt = SQL_NULL_HSTMT;
+                       MEM_FREE ( pstmt );
+
+                       return SQL_ERROR;
+               }
+
+               CALL_DRIVER ( hdbc, retcode, hproc, en_AllocStmt, (
+                               pdbc->dhdbc, &(pstmt->dhstmt) ) )
+       }
+
+       if( retcode != SQL_SUCCESS 
+        && retcode != SQL_SUCCESS_WITH_INFO )
+       {
+               *phstmt = SQL_NULL_HSTMT;
+               MEM_FREE ( pstmt );
+
+               return retcode;
+       }
+
+       /* insert into list */
+       pstmt->next = pdbc->hstmt;
+       pdbc->hstmt = pstmt;
+
+       *phstmt = (HSTMT)pstmt;
+
+       /* state transition */
+       pdbc->state = en_dbc_hstmt;     
+
+       return SQL_SUCCESS;
+}
+
+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;
+}
+
+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;
+
+#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
+
+       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;
+}
+
+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
+
+       return retcode;
+}
+
+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
+       
+       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) )
+
+#if 0
+       retcode = hproc ( pstmt->dhstmt );
+#endif
+
+       /* 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
new file mode 100644 (file)
index 0000000..68403e4
--- /dev/null
@@ -0,0 +1,48 @@
+#ifndef        _HSTMT_H
+#define        _HSTMT_H
+
+#include       <../iodbc/config.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+typedef        struct STMT
+{
+       int     type;           /* must be 1st field */
+
+       struct STMT*  next;
+
+       HERR    herr;
+       HDBC    hdbc;           /* back point to connection object */
+       HSTMT   dhstmt;         /* driver's stmt handle */
+
+       int     state;
+       int     cursor_state;
+       int     prep_state;      
+       int     asyn_on;        /* async executing which odbc call */
+       int     need_on;        /* which call return SQL_NEED_DATA */
+} STMT_t;
+
+enum   {
+       en_stmt_allocated = 0,
+       en_stmt_prepared,
+       en_stmt_executed, 
+       en_stmt_cursoropen,
+       en_stmt_fetched,
+       en_stmt_xfetched,
+       en_stmt_needdata,       /* not call SQLParamData() yet */
+       en_stmt_mustput,        /* not call SQLPutData() yet */
+       en_stmt_canput  /* SQLPutData() called */
+};     /* for statement handle state */
+
+enum   {
+       en_stmt_cursor_no = 0,
+       en_stmt_cursor_named,
+       en_stmt_cursor_opened,
+       en_stmt_cursor_fetched,
+       en_stmt_cursor_xfetched
+};     /* for statement cursor state */
+
+extern RETCODE _iodbcdm_dropstmt();
+
+#endif
diff --git a/src/iodbc/info.c b/src/iodbc/info.c
new file mode 100644 (file)
index 0000000..8004184
--- /dev/null
@@ -0,0 +1,389 @@
+/** Information functions
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+#include       <../iodbc/hstmt.h>
+
+#include       <../iodbc/itrace.h>
+
+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;
+       
+       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;
+       }
+
+       /*************************/
+
+       return SQL_NO_DATA_FOUND;
+} 
+
+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;
+
+       if( henv == SQL_NULL_HENV )
+       {
+               return SQL_INVALID_HANDLE;
+       }
+
+       if( cbDrvDescMax <  0
+        || cbDrvAttrMax <  0 
+        || cbDrvAttrMax == 1 )
+       {
+               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;
+       }
+       
+       /*********************/
+       return SQL_SUCCESS;
+}
+
+
+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;
+}      
+
+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;
+}
diff --git a/src/iodbc/iodbc.h b/src/iodbc/iodbc.h
new file mode 100644 (file)
index 0000000..e60123d
--- /dev/null
@@ -0,0 +1,66 @@
+#ifndef        _CONFIG_H
+#define        _CONFIG_H
+
+# if   !defined(WINDOWS) && !defined(WIN32_SYSTEM) 
+#  define      _UNIX_
+
+#  include     <stdlib.h>
+#  include     <sys/types.h>
+
+#  define      MEM_ALLOC(size) (malloc((size_t)(size)))
+#  define      MEM_FREE(ptr)   {if(ptr) free(ptr);}
+
+#  define      STRCPY(t, s)    (strcpy((char*)(t), (char*)(s)))        
+#  define      STRNCPY(t,s,n)  (strncpy((char*)(t), (char*)(s), (size_t)(n)))
+#  define      STRCAT(t, s)    (strcat((char*)(t), (char*)(s)))
+#  define      STRNCAT(t,s,n)  (strncat((char*)(t), (char*)(s), (size_t)(n)))
+#  define      STREQ(a, b)     (strcmp((char*)(a), (char*)(b)) == 0)
+#  define      STRLEN(str)     ((str)? strlen((char*)(str)):0)
+
+#  define      EXPORT
+#  define      CALLBACK
+#  define      FAR
+
+   typedef     signed short    SSHOR;
+   typedef     short           WORD;
+   typedef     long            DWORD;
+
+   typedef     WORD            WPARAM;
+   typedef     DWORD           LPARAM;
+   typedef     void*           HWND;
+   typedef     int             BOOL;
+
+# endif        /* _UNIX_ */
+
+# if   defined(WINDOWS) || defined(WIN32_SYSTEM)
+
+#  include     <windows.h>
+#  include     <windowsx.h>
+
+#  ifdef       _MSVC_
+#   define     MEM_ALLOC(size) (fmalloc((size_t)(size)))
+#   define     MEM_FREE(ptr)   ((ptr)? ffree((PTR)(ptr)):0))
+#   define     STRCPY(t, s)    (fstrcpy((char FAR*)(t), (char FAR*)(s)))
+#   define     STRNCPY(t,s,n)  (fstrncpy((char FAR*)(t), (char FAR*)(s), (size_t)(n)))
+#   define     STRLEN(str)     ((str)? fstrlen((char FAR*)(str)):0)
+#   define     STREQ(a, b)     (fstrcmp((char FAR*)(a), (char FAR*)(b) == 0)
+#  endif
+
+#  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 */
+
+# define       SYSERR          (-1)
+
+# ifndef       NULL
+#   define     NULL            ((void FAR*)0UL)
+# endif
+
+#endif
diff --git a/src/iodbc/isql.h b/src/iodbc/isql.h
new file mode 100644 (file)
index 0000000..d26cbe8
--- /dev/null
@@ -0,0 +1,91 @@
+#ifndef _INTRINSIC_SQL_H
+# define _INTRINSIC_SQL_H
+
+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;
+
+# ifdef WIN32
+#   define SQL_API                     __stdcall
+# else
+#   define SQL_API                     EXPORT CALLBACK
+# endif
+
+# define ODBCVER                       0x0200
+
+# 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
+
+#endif  
diff --git a/src/iodbc/isqlext.h b/src/iodbc/isqlext.h
new file mode 100644 (file)
index 0000000..a4bae14
--- /dev/null
@@ -0,0 +1,307 @@
+#ifndef        _INTRINSIC_SQLEXT_H
+# define _INTRINSIC_SQLEXT_H
+
+# include      <../iodbc/isql.h>
+
+# define SQL_STILL_EXECUTING           2
+# define SQL_NEED_DATA                 99
+
+/* extend SQL datatypes */
+# define SQL_DATE                      9
+# define SQL_TIME                      10
+# define SQL_TIMESTAMP                 11
+# define SQL_LONGVARCHAR               (-1)
+# define SQL_BINARY                    (-2)
+# define SQL_VARBINARY                 (-3)
+# define SQL_LONGVARBINARY             (-4)
+# define SQL_BIGINT                    (-5)
+# define SQL_TINYINT                   (-6)
+# define SQL_BIT                       (-7)    /* conflict with SQL3 ??? */
+# define SQL_TYPE_DRIVER_START         (-80)
+
+/* C to SQL datatype mapping */
+# define SQL_C_DATE                    SQL_DATE
+# define SQL_C_TIME                    SQL_TIME
+# define SQL_C_TIMESTAMP               SQL_TIMESTAMP
+# define SQL_C_BINARY                  SQL_BINARY
+# define SQL_C_BIT                     SQL_BIT
+# define SQL_C_TINYINT                 SQL_TINYINT
+
+# define SQL_SIGNED_OFFSET             (-20)
+# define SQL_UNSIGNED_OFFSET           (-22)
+
+# define SQL_C_SLONG                   (SQL_C_LONG  + SQL_SIGNED_OFFSET)
+# define SQL_C_SSHORT                  (SQL_C_SHORT + SQL_SIGNED_OFFSET)
+# define SQL_C_STINYINT                        (SQL_TINYINT + SQL_SIGNED_OFFSET)
+# define SQL_C_ULONG                   (SQL_C_LONG  + SQL_UNSIGNED_OFFSET)
+# define SQL_C_USHORT                  (SQL_C_SHORT + SQL_UNSIGNED_OFFSET)
+# define SQL_C_UTINYINT                        (SQL_TINYINT + SQL_UNSIGNED_OFFSET)
+# define SQL_C_BOOKMARK                        SQL_C_ULONG                     
+
+# if defined(SQL_TYPE_MIN)
+#   undef  SQL_TYPE_MIN  
+#   define SQL_TYPE_MIN                        SQL_BIT 
+/* Note:If SQL_BIT uses SQL3 value (i.e. 14) then, 
+ *     SQL_TYPE_MIN need to be defined as SQL_TINYINT 
+ *     (i.e. -6).
+ */
+# endif
+
+# define SQL_ALL_TYPES                 0
+
+/* SQLDriverConnect flag values */
+# define SQL_DRIVER_NOPROMPT           0
+# define SQL_DRIVER_COMPLETE           1
+# define SQL_DRIVER_PROMPT             2
+# define SQL_DRIVER_COMPLETE_REQUIRED  3
+
+/* SQLSetParam extensions */
+# define SQL_DEFAULT_PARAM             (-5)
+# define SQL_IGNORE                    (-6)
+
+/* function number for SQLGetFunctions and _iodbcdm_getproc */
+# define SQL_API_SQLALLOCCONNECT       1   
+# define SQL_API_SQLALLOCENV           2
+# define SQL_API_SQLALLOCSTMT          3
+# define SQL_API_SQLBINDCOL            4
+# define SQL_API_SQLCANCEL             5
+# define SQL_API_SQLCOLATTRIBUTES      6
+# define SQL_API_SQLCONNECT            7
+# define SQL_API_SQLDESCRIBECOL                8
+# define SQL_API_SQLDISCONNECT         9
+# define SQL_API_SQLERROR              10
+# define SQL_API_SQLEXECDIRECT         11
+# define SQL_API_SQLEXECUTE            12
+# define SQL_API_SQLFETCH              13
+# define SQL_API_SQLFREECONNECT                14
+# define SQL_API_SQLFREEENV            15
+# define SQL_API_SQLFREESTMT           16 
+# define SQL_API_SQLGETCURSORNAME      17
+# define SQL_API_SQLNUMRESULTCOLS      18
+# define SQL_API_SQLPREPARE            19
+# define SQL_API_SQLROWCOUNT           20
+# define SQL_API_SQLSETCURSORNAME      21
+# define SQL_API_SQLSETPARAM           22
+# define SQL_API_SQLTRANSACT           23
+
+# define SQL_NUM_FUNCTIONS             23
+
+# define SQL_EXT_API_START             40
+
+# define SQL_API_SQLCOLUMNS            40
+
+# define SQL_API_SQLDRIVERCONNECT      41
+# define SQL_API_SQLGETCONNECTOPTION   42
+# define SQL_API_SQLGETDATA            43
+# define SQL_API_SQLGETFUNCTIONS       44
+# define SQL_API_SQLGETINFO            45
+# define SQL_API_SQLGETSTMTOPTION      46
+# define SQL_API_SQLGETTYPEINFO                47
+# define SQL_API_SQLPARAMDATA          48
+# define SQL_API_SQLPUTDATA            49
+# define SQL_API_SQLSETCONNECTOPTION   50
+# define SQL_API_SQLSETSTMTOPTION      51
+# define SQL_API_SQLSPECIALCOLUMNS     52
+# define SQL_API_SQLSTATISTICS         53
+# define SQL_API_SQLTABLES             54
+
+# define SQL_API_SQLBROWSECONNECT      55
+# define SQL_API_SQLCOLUMNPRIVILEGES   56
+# define SQL_API_SQLDATASOURCES                57
+# define SQL_API_SQLDESCRIBEPARAM      58
+# define SQL_API_SQLEXTENDEDFETCH      59
+# define SQL_API_SQLFOREIGNKEYS                60
+# define SQL_API_SQLMORERESULTS                61
+# define SQL_API_SQLNATIVESQL          62
+# define SQL_API_SQLNUMPARAMS          63
+# define SQL_API_SQLPARAMOPTIONS       64
+# define SQL_API_SQLPRIMARYKEYS                65
+# define SQL_API_SQLPROCEDURECOLUMNS   66
+# define SQL_API_SQLPROCEDURES         67
+# define SQL_API_SQLSETPOS             68
+# define SQL_API_SQLSETSCROLLOPTIONS   69
+# define SQL_API_SQLTABLEPRIVILEGES    70
+
+# define SQL_API_SQLDRIVERS            71
+# define SQL_API_SQLBINDPARAMETER      72
+# define SQL_EXT_API_LAST              SQL_API_SQLBINDPARAMETER
+
+# define SQL_API_ALL_FUNCTIONS         0
+
+/* SQLGetInfo infor number */
+# define SQL_INFO_FIRST                        0
+# define SQL_DRIVER_HDBC               3
+# define SQL_DRIVER_HENV               4
+# define SQL_DRIVER_HSTMT              5
+# define SQL_DRIVER_NAME               6
+# define SQL_ODBC_VER                  10
+# define SQL_CURSOR_COMMIT_BEHAVIOR    23
+# define SQL_CURSOR_ROLLBACK_BEHAVIOR  24
+# define SQL_DEFAULT_TXN_ISOLATION     26
+
+# define SQL_TXN_ISOLATION_OPTION      72
+# define SQL_NON_NULLABLE_COLUMNS      75
+
+# define SQL_DRIVER_HLIB               76
+# define SQL_DRIVER_ODBC_VER           77
+
+# define SQL_QUALIFIER_LOCATION                114
+
+# define SQL_INFO_LAST                 SQL_QUALIFIER_LOCATION
+
+# define SQL_INFO_DRIVER_START         1000
+
+
+/* SQL_TXN_ISOLATION_OPTION masks */
+# define SQL_TXN_READ_UNCOMMITTED      0x00000001L
+# define SQL_TXN_READ_COMMITTED                0x00000002L
+# define SQL_TXN_REPEATABLE_READ       0x00000004L
+# define SQL_TXN_SERIALIZABLE          0x00000008L
+# define SQL_TXN_VERSIONING            0x00000010L
+
+/* SQL_CURSOR_COMMIT_BEHAVIOR and SQL_CURSOR_ROLLBACK_BEHAVIOR values */
+
+# define SQL_CB_DELETE                 0x0000
+# define SQL_CB_CLOSE                  0x0001
+# define SQL_CB_PRESERVE               0x0002
+
+/* options for SQLGetStmtOption/SQLSetStmtOption */
+# define SQL_QUERY_TIMEOUT             0
+# define SQL_MAX_ROWS                  1
+# define SQL_NOSCAN                    2
+# define SQL_MAX_LENGTH                        3
+# define SQL_ASYNC_ENABLE              4
+# define SQL_BIND_TYPE                 5
+# define SQL_CURSOR_TYPE               6
+# define SQL_CONCURRENCY               7
+# define SQL_KEYSET_SIZE               8
+# define SQL_ROWSET_SIZE               9
+# define SQL_SIMULATE_CURSOR           10
+# define SQL_RETRIEVE_DATA             11
+# define SQL_USE_BOOKMARKS             12
+# define SQL_GET_BOOKMARK              13      /* GetStmtOption Only */
+# define SQL_ROW_NUMBER                        14      /* GetStmtOption Only */
+# define SQL_STMT_OPT_MAX              SQL_ROW_NUMBER
+
+# define SQL_STMT_OPT_MIN              SQL_QUERY_TIMEOUT
+
+
+/* SQL_QUERY_TIMEOUT options */
+# define SQL_QUERY_TIMEOUT_DEFAULT     0UL
+
+/* SQL_MAX_ROWS options */
+# define SQL_MAX_ROWS_DEFAULT          0UL
+
+/* SQL_MAX_LENGTH options */
+# define SQL_MAX_LENGTH_DEFAULT                0UL
+
+/* SQL_CONCURRENCY options */
+# define SQL_CONCUR_READ_ONLY          1
+# define SQL_CONCUR_LOCK               2
+# define SQL_CONCUR_ROWVER             3
+# define SQL_CONCUR_VALUES             4
+
+/* 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) 
+
+# ifdef __cplusplus
+       extern  "C" {
+# endif
+
+RETCODE SQL_API SQLSetConnectOption (HDBC, UWORD, UDWORD);
+RETCODE SQL_API SQLNumResultCols ( HSTMT, SWORD FAR* );
+
+# ifdef __cplusplus
+       }
+# endif
+
+#endif
diff --git a/src/iodbc/itrace.c b/src/iodbc/itrace.c
new file mode 100644 (file)
index 0000000..106d7a3
--- /dev/null
@@ -0,0 +1,104 @@
+/** trace functions
+       
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/itrace.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       "../iodbc/henv.ci"
+
+#include       <stdio.h>
+
+static  int printreturn(void FAR* istm, int ret )
+{
+       FILE FAR*       stm = (FILE FAR*)istm;
+       char FAR*       ptr = "Invalid return value";
+
+       switch( ret )
+       {
+               case SQL_SUCCESS:
+                       ptr = "SQL_SUCCESS";
+                       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_NEED_DATA:
+                       ptr = "SQL_NEED_DATA";
+                       break;
+
+               case SQL_INVALID_HANDLE:
+                       ptr = "SQL_INVALID_HANDLE";
+                       break;
+
+               case SQL_ERROR:
+                       ptr = "SQL_ERROR";
+                       break;
+
+               case SQL_STILL_EXECUTING:
+                       ptr = "SQL_STILL_EXECUTING";
+                       break;
+
+               default:
+                       break;
+       }
+
+       fprintf( stm, "%s\n", ptr);
+       fflush( stm );
+
+       return 0;
+}
+
+HPROC  _iodbcdm_gettrproc(void FAR* istm, int procid, int type)
+{
+       FILE FAR*       stm = (FILE FAR*)istm;
+
+       if( type == TRACE_TYPE_DM2DRV )
+       {
+               int i,j = 0;
+
+               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);
+
+                               fflush( stm );
+                       }
+               }
+       }
+
+       if( type == TRACE_TYPE_RETURN )
+       {
+               return (HPROC)printreturn;
+       }
+
+       return SQL_NULL_HPROC;
+}
diff --git a/src/iodbc/itrace.h b/src/iodbc/itrace.h
new file mode 100644 (file)
index 0000000..6b4e850
--- /dev/null
@@ -0,0 +1,97 @@
+#ifndef        _ITRACE_H
+# define _ITRACE_H
+
+# 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_RETURN     4
+
+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;\
+\
+                       hproc = _iodbcdm_gettrproc(stm, procid, TRACE_TYPE_APP2DM);\
+\
+                       if( hproc )\
+                               hproc plist;\
+               }\
+       }
+# endif
+
+# 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);\
+\
+               if( hproc )\
+                       hproc plist;\
+       }
+# endif
+
+# 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);\
+\
+               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;\
+\
+                       hproc = _iodbcdm_gettrproc( stm, 0, TRACE_TYPE_RETURN);\
+\
+                       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);\
+\
+               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
new file mode 100644 (file)
index 0000000..d6062de
--- /dev/null
@@ -0,0 +1,7 @@
+#include       <iodbc.h>
+
+/* 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
new file mode 100644 (file)
index 0000000..76becac
--- /dev/null
@@ -0,0 +1,379 @@
+/** miscellaneous functions
+       
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include       <stdio.h>
+
+static int     
+upper_strneq( 
+       char*   s1,
+       char*   s2,
+       int     n )
+{
+       int     i;
+       char    c1, c2;
+
+       for(i=1;i<n;i++)
+       {
+               c1 = s1[i];
+               c2 = s2[i];
+
+               if( c1 >= 'a' && c1 <= 'z' )
+               {
+                       c1 += ('A' - 'a');
+               }
+               else if( c1 == '\n' )
+               {
+                       c1 = '\0';
+               }
+
+               if( c2 >= 'a' && c2 <= 'z' )
+               {
+                       c2 += ('A' - 'a');
+               }
+               else if( c2 == '\n' )
+               {
+                       c2 = '\0';
+               }
+
+               if( (c1 - c2) || !c1 || !c2 )
+               {
+                       break;
+               }
+       }
+
+       return (int)!(c1 - c2);
+}
+
+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 ++;
+
+               if( c == ';' || c == '=' )
+               {
+                       istr ++;
+                       break;
+               }
+
+               if( nx == ' ' || nx == '\t' || nx == ';' || nx == '=' )
+               {
+                       istr ++;
+                       break;
+               }
+       }
+
+       *obuf = '\0'; 
+
+       return istr;
+}
+
+#if    !defined(WINDOWS) && !defined(WIN32) && !defined(OS2)
+# include      <pwd.h>
+# define       UNIX_PWD
+#endif
+
+static char*
+getinitfile(char* buf, int size)       
+{
+       int     i, j;
+       char*   ptr;
+
+       j = STRLEN("/odbc.ini") + 1;
+
+       if( size < j )
+       {
+               return NULL;
+       }
+
+#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 ~/.odbc.ini */ 
+#endif
+
+       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 
+ */
+{
+       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;
+               }
+
+               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    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/postgres/isql.h b/src/iodbc/postgres/isql.h
new file mode 100644 (file)
index 0000000..4b62249
--- /dev/null
@@ -0,0 +1,188 @@
+#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;
+
+#ifndef FAR
+#  define FAR
+#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
+{
+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
+
+# define ODBCVER                        0x0200
+
+# 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
+
+#endif
+
diff --git a/src/iodbc/postgres/isqlext.h b/src/iodbc/postgres/isqlext.h
new file mode 100644 (file)
index 0000000..164ea16
--- /dev/null
@@ -0,0 +1,321 @@
+#ifndef _INTRINSIC_SQLEXT_H
+# define _INTRINSIC_SQLEXT_H
+
+# include       <../iodbc/postgres/isql.h>
+
+# define SQL_STILL_EXECUTING            2
+# define SQL_NEED_DATA                  99
+
+/* extend SQL datatypes */
+# define SQL_DATE                       9
+# define SQL_TIME                       10
+# define SQL_TIMESTAMP                  11
+# define SQL_LONGVARCHAR                (-1)
+# define SQL_BINARY                     (-2)
+# define SQL_VARBINARY                  (-3)
+# define SQL_LONGVARBINARY              (-4)
+# define SQL_BIGINT                     (-5)
+# define SQL_TINYINT                    (-6)
+# define SQL_BIT                        (-7)    /* conflict with SQL3 ??? */
+# define SQL_TYPE_DRIVER_START          (-80)
+
+/* C to SQL datatype mapping */
+# define SQL_C_DATE                     SQL_DATE
+# define SQL_C_TIME                     SQL_TIME
+# define SQL_C_TIMESTAMP                SQL_TIMESTAMP
+# define SQL_C_BINARY                   SQL_BINARY
+# define SQL_C_BIT                      SQL_BIT
+# define SQL_C_TINYINT                  SQL_TINYINT
+
+# define SQL_SIGNED_OFFSET              (-20)
+# define SQL_UNSIGNED_OFFSET            (-22)
+
+# define SQL_C_SLONG                    (SQL_C_LONG  + SQL_SIGNED_OFFSET)
+# define SQL_C_SSHORT                   (SQL_C_SHORT + SQL_SIGNED_OFFSET)
+# define SQL_C_STINYINT                 (SQL_TINYINT + SQL_SIGNED_OFFSET)
+# define SQL_C_ULONG                    (SQL_C_LONG  + SQL_UNSIGNED_OFFSET)
+# define SQL_C_USHORT                   (SQL_C_SHORT + SQL_UNSIGNED_OFFSET)
+# define SQL_C_UTINYINT                 (SQL_TINYINT + SQL_UNSIGNED_OFFSET)
+# define SQL_C_BOOKMARK                 SQL_C_ULONG
+
+# if defined(SQL_TYPE_MIN)
+#   undef  SQL_TYPE_MIN
+#   define SQL_TYPE_MIN                 SQL_BIT
+/* Note:If SQL_BIT uses SQL3 value (i.e. 14) then,
+ *      SQL_TYPE_MIN need to be defined as SQL_TINYINT
+ *      (i.e. -6).
+ */
+# endif
+
+# define SQL_ALL_TYPES                  0
+
+/* SQLDriverConnect flag values */
+# define SQL_DRIVER_NOPROMPT            0
+# define SQL_DRIVER_COMPLETE            1
+# define SQL_DRIVER_PROMPT              2
+# define SQL_DRIVER_COMPLETE_REQUIRED   3
+
+/* SQLSetParam extensions */
+# define SQL_DEFAULT_PARAM              (-5)
+# define SQL_IGNORE                     (-6)
+
+/* function number for SQLGetFunctions and _iodbcdm_getproc */
+# define SQL_API_SQLALLOCCONNECT        1
+# define SQL_API_SQLALLOCENV            2
+# define SQL_API_SQLALLOCSTMT           3
+# define SQL_API_SQLBINDCOL             4
+# define SQL_API_SQLCANCEL              5
+# define SQL_API_SQLCOLATTRIBUTES       6
+# define SQL_API_SQLCONNECT             7
+# define SQL_API_SQLDESCRIBECOL         8
+# define SQL_API_SQLDISCONNECT          9
+# define SQL_API_SQLERROR               10
+# define SQL_API_SQLEXECDIRECT          11
+# define SQL_API_SQLEXECUTE             12
+# define SQL_API_SQLFETCH               13
+# define SQL_API_SQLFREECONNECT         14
+# define SQL_API_SQLFREEENV             15
+# define SQL_API_SQLFREESTMT            16
+# define SQL_API_SQLGETCURSORNAME       17
+# define SQL_API_SQLNUMRESULTCOLS       18
+# define SQL_API_SQLPREPARE             19
+# define SQL_API_SQLROWCOUNT            20
+# define SQL_API_SQLSETCURSORNAME       21
+# define SQL_API_SQLSETPARAM            22
+# define SQL_API_SQLTRANSACT            23
+
+# define SQL_NUM_FUNCTIONS              23
+
+# define SQL_EXT_API_START              40
+
+# define SQL_API_SQLCOLUMNS             40
+
+# define SQL_API_SQLDRIVERCONNECT       41
+# define SQL_API_SQLGETCONNECTOPTION    42
+# define SQL_API_SQLGETDATA             43
+# define SQL_API_SQLGETFUNCTIONS        44
+# define SQL_API_SQLGETINFO             45
+# define SQL_API_SQLGETSTMTOPTION       46
+# define SQL_API_SQLGETTYPEINFO         47
+# define SQL_API_SQLPARAMDATA           48
+# define SQL_API_SQLPUTDATA             49
+# define SQL_API_SQLSETCONNECTOPTION    50
+# define SQL_API_SQLSETSTMTOPTION       51
+# define SQL_API_SQLSPECIALCOLUMNS      52
+# define SQL_API_SQLSTATISTICS          53
+# define SQL_API_SQLTABLES              54
+
+# define SQL_API_SQLBROWSECONNECT       55
+# define SQL_API_SQLCOLUMNPRIVILEGES    56
+# define SQL_API_SQLDATASOURCES         57
+# define SQL_API_SQLDESCRIBEPARAM       58
+# define SQL_API_SQLEXTENDEDFETCH       59
+# define SQL_API_SQLFOREIGNKEYS         60
+# define SQL_API_SQLMORERESULTS         61
+# define SQL_API_SQLNATIVESQL           62
+# define SQL_API_SQLNUMPARAMS           63
+# define SQL_API_SQLPARAMOPTIONS        64
+# define SQL_API_SQLPRIMARYKEYS         65
+# define SQL_API_SQLPROCEDURECOLUMNS    66
+# define SQL_API_SQLPROCEDURES          67
+# define SQL_API_SQLSETPOS              68
+# define SQL_API_SQLSETSCROLLOPTIONS    69
+# define SQL_API_SQLTABLEPRIVILEGES     70
+
+# define SQL_API_SQLDRIVERS             71
+# define SQL_API_SQLBINDPARAMETER       72
+# define SQL_EXT_API_LAST               SQL_API_SQLBINDPARAMETER
+
+# define SQL_API_ALL_FUNCTIONS          0
+
+/* SQLGetInfo infor number */
+# define SQL_INFO_FIRST                 0
+# define SQL_DRIVER_HDBC                3
+# define SQL_DRIVER_HENV                4
+# define SQL_DRIVER_HSTMT               5
+# define SQL_DRIVER_NAME                6
+# define SQL_ODBC_VER                   10
+# define SQL_CURSOR_COMMIT_BEHAVIOR     23
+# define SQL_CURSOR_ROLLBACK_BEHAVIOR   24
+# define SQL_DEFAULT_TXN_ISOLATION      26
+
+# define SQL_TXN_ISOLATION_OPTION       72
+# define SQL_NON_NULLABLE_COLUMNS       75
+
+# define SQL_DRIVER_HLIB                76
+# define SQL_DRIVER_ODBC_VER            77
+
+# define SQL_QUALIFIER_LOCATION         114
+
+# define SQL_INFO_LAST                  SQL_QUALIFIER_LOCATION
+
+# define SQL_INFO_DRIVER_START          1000
+
+
+/* SQL_TXN_ISOLATION_OPTION masks */
+# define SQL_TXN_READ_UNCOMMITTED       0x00000001L
+# define SQL_TXN_READ_COMMITTED         0x00000002L
+# define SQL_TXN_REPEATABLE_READ        0x00000004L
+# define SQL_TXN_SERIALIZABLE           0x00000008L
+# define SQL_TXN_VERSIONING             0x00000010L
+
+/* SQL_CURSOR_COMMIT_BEHAVIOR and SQL_CURSOR_ROLLBACK_BEHAVIOR values */
+
+# define SQL_CB_DELETE                  0x0000
+# define SQL_CB_CLOSE                   0x0001
+# define SQL_CB_PRESERVE                0x0002
+
+/* options for SQLGetStmtOption/SQLSetStmtOption */
+# define SQL_QUERY_TIMEOUT              0
+# define SQL_MAX_ROWS                   1
+# define SQL_NOSCAN                     2
+# define SQL_MAX_LENGTH                 3
+# define SQL_ASYNC_ENABLE               4
+# define SQL_BIND_TYPE                  5
+# define SQL_CURSOR_TYPE                6
+# define SQL_CONCURRENCY                7
+# define SQL_KEYSET_SIZE                8
+# define SQL_ROWSET_SIZE                9
+# define SQL_SIMULATE_CURSOR            10
+# define SQL_RETRIEVE_DATA              11
+# define SQL_USE_BOOKMARKS              12
+# define SQL_GET_BOOKMARK               13      /* GetStmtOption Only */
+# define SQL_ROW_NUMBER                 14      /* GetStmtOption Only */
+# define SQL_STMT_OPT_MAX               SQL_ROW_NUMBER
+
+# define SQL_STMT_OPT_MIN               SQL_QUERY_TIMEOUT
+
+
+/* SQL_QUERY_TIMEOUT options */
+# define SQL_QUERY_TIMEOUT_DEFAULT      0UL
+
+/* SQL_MAX_ROWS options */
+# define SQL_MAX_ROWS_DEFAULT           0UL
+
+/* SQL_MAX_LENGTH options */
+# define SQL_MAX_LENGTH_DEFAULT         0UL
+
+/* SQL_CONCURRENCY options */
+# define SQL_CONCUR_READ_ONLY           1
+# define SQL_CONCUR_LOCK                2
+# define SQL_CONCUR_ROWVER              3
+# define SQL_CONCUR_VALUES              4
+
+/* 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
+
+
+/* SQL CONVERT_FUNCTIONS function */
+#define SQL_FN_CVT_CONVERT             0x00000001L
+
+/* SQL_SUBQUERIES masks */
+
+#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
+
+
+
+RETCODE SQL_API SQLSetConnectOption (HDBC, UWORD, UDWORD);
+RETCODE SQL_API SQLNumResultCols ( HSTMT, SWORD FAR* );
+
+# if defined(__cplusplus) || defined(__IBMCPP__)
+        }
+# endif
+
+#endif
diff --git a/src/iodbc/postgres/odbc_funcs.h b/src/iodbc/postgres/odbc_funcs.h
new file mode 100644 (file)
index 0000000..508d5bd
--- /dev/null
@@ -0,0 +1,380 @@
+#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/postgres/odbc_types.h b/src/iodbc/postgres/odbc_types.h
new file mode 100644 (file)
index 0000000..3633312
--- /dev/null
@@ -0,0 +1,298 @@
+#define SQL_SPEC_STRING         "02.00"         /* 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_FN_NUM_ABS                      0x00000001L
+#define SQL_FN_NUM_FLOOR                    0x00000200L
+#define SQL_FN_NUM_MOD                      0x00000800L
+#define SQL_FN_NUM_SIGN                     0x00001000L
+#define SQL_STRING_FUNCTIONS                50
+#define SQL_FN_STR_CONCAT                   0x00000001L
+#define SQL_FN_STR_LEFT                     0x00000004L
+#define SQL_FN_STR_LENGTH                   0x00000010L
+#define SQL_FN_STR_LOCATE                   0x00000020L
+#define SQL_FN_STR_LOCATE_2                 0x00010000L
+#define SQL_FN_STR_RIGHT                    0x00000200L
+#define SQL_FN_STR_SUBSTRING                0x00000800L
+#define SQL_FN_STR_REPLACE                  0x00000100L
+#define SQL_FN_STR_LCASE                    0x00000040L
+#define SQL_FN_STR_UCASE                    0x00001000L
+#define SQL_TIMEDATE_FUNCTIONS              52
+#define SQL_FN_TD_CURDATE                   0x00000002L
+#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_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_FN_SYS_DBNAME                   0x00000002L
+#define SQL_FN_SYS_IFNULL                   0x00000004L
+#define SQL_FN_SYS_USERNAME                 0x00000001L
+#define SQL_FN_NUM_CEILING                  0x00000020L
+#define SQL_FN_NUM_EXP                      0x00000100L
+#define SQL_FN_NUM_LOG                      0x00000400L
+#define SQL_FN_NUM_LOG10                    0x00080000L
+#define SQL_FN_NUM_LOG10                    0x00080000L
+#define SQL_FN_NUM_POWER                    0x00100000L
+#define SQL_FN_NUM_SQRT                     0x00004000L
+#define SQL_FN_NUM_ROUND                    0x00400000L
+#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_FN_NUM_RAND                     0x00020000L
+#define SQL_NOSCAN_OFF                  0UL     
+#define SQL_ASYNC_ENABLE_OFF            0UL
+#define SQL_CURSOR_STATIC               3UL
+#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
+
+/*
+ * Following constants are missed in original odbc_types.h
+ * Added by serg@informika.ru
+ */
+
+#define SQL_UNKNOWN_TYPE               0
+
+/* SQLColAttributes subdefines for SQL_COLUMN_SEARCHABLE */
+/* These are also used by SQLGetInfo                     */
+#define SQL_UNSEARCHABLE                0
+#define SQL_LIKE_ONLY                   1
+#define SQL_ALL_EXCEPT_LIKE             2
+#define SQL_SEARCHABLE                  3
+#define SQL_PRED_SEARCHABLE                            SQL_SEARCHABLE
+
+/* Special return values for SQLGetData */
+#define SQL_NO_TOTAL                    (-4)
+
+/* SQL_CORRELATION_NAME values */
+
+#define SQL_CN_NONE                         0x0000
+#define SQL_CN_DIFFERENT                    0x0001
+#define SQL_CN_ANY                          0x0002
+
+/* SQL_NULL_COLLATION values */
+
+#define SQL_NC_HIGH                         0
+#define SQL_NC_LOW                          1
+#define SQL_NC_START                        0x0002
+#define SQL_NC_END                          0x0004
+
+/* SQL_GROUP_BY values */
+
+#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_IDENTIFIER_CASE values */
+#define SQL_IC_UPPER                        1
+#define SQL_IC_LOWER                        2
+#define SQL_IC_SENSITIVE                    3
+#define SQL_IC_MIXED                        4
+
+/* SQL_ODBC_SQL_CONFORMANCE values */
+
+#define SQL_OSC_MINIMUM                     0x0000
+#define SQL_OSC_CORE                        0x0001
+#define SQL_OSC_EXTENDED                    0x0002
+
+/* SQL_SCROLL_OPTIONS masks */
+
+#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_TXN_CAPABLE values */
+
+#define SQL_TC_NONE                         0
+#define SQL_TC_DML                          1
+#define SQL_TC_ALL                          2
+#define SQL_TC_DDL_COMMIT                   3
+#define SQL_TC_DDL_IGNORE                   4
+
+/* SQL_ALTER_TABLE bitmasks */
+
+#if (ODBCVER >= 0x0200)
+#define SQL_AT_ADD_COLUMN                      0x00000001L
+#define SQL_AT_DROP_COLUMN                     0x00000002L
+#endif /* ODBCVER >= 0x0200 */
+
+#define SQL_MAX_USER_NAME_LEN               107
+
+/* SQLColAttributes subdefines for SQL_COLUMN_UPDATABLE */
+
+#define SQL_ATTR_READONLY               0
+#define SQL_ATTR_WRITE                  1
+#define SQL_ATTR_READWRITE_UNKNOWN      2
+
+/* SQLExtendedFetch "rgfRowStatus" element values */
+
+#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
+
+/* SQL_TIMEDATE_FUNCTIONS */
+
+#define SQL_FN_TD_NOW                  0x00000001L
+#define SQL_FN_TD_CURTIME              0x00000200L
diff --git a/src/iodbc/prepare.c b/src/iodbc/prepare.c
new file mode 100644 (file)
index 0000000..b4a1371
--- /dev/null
@@ -0,0 +1,537 @@
+/** Prepare a query
+
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../iodbc/iodbc.h>
+
+#include       <../iodbc/isql.h>
+#include       <../iodbc/isqlext.h>
+
+#include        <../iodbc/dlproc.h>
+
+#include       <../iodbc/herr.h>
+#include       <../iodbc/henv.h>
+#include       <../iodbc/hdbc.h>
+#include       <../iodbc/hstmt.h>
+
+#include       <../iodbc/itrace.h>
+
+RETCODE SQL_API        SQLprepare (
+                       HSTMT           hstmt,
+                       UCHAR FAR*      szSqlStr,
+                       SDWORD          cbSqlStr )
+{
+       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;
+}
+
+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;
+}
+
+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. 
+                */ 
+       }
+/**********
+       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;
+}
+
+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;
+       }
+
+       if( crow == (UDWORD)0UL )
+       {
+               PUSHSQLERR ( pstmt->herr, en_S1107 );
+
+               return SQL_ERROR;
+       }
+
+       if( pstmt->state >= en_stmt_needdata
+        || pstmt->asyn_on != en_NullProc )
+       {
+               PUSHSQLERR ( pstmt->herr, en_S1010 );
+
+               return SQL_ERROR;
+       }
+
+       hproc = _iodbcdm_getproc ( pstmt->hdbc, en_ParamOptions );
+
+       if( hproc == SQL_NULL_HPROC )
+       {
+               PUSHSQLERR ( pstmt->herr, en_IM001 );
+
+               return SQL_ERROR;
+       }
+
+       CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_ParamOptions, (
+                       pstmt->dhstmt, crow, pirow) )
+
+#if 0
+       retcode = hproc ( pstmt->dhstmt, crow, pirow );
+#endif
+
+       return retcode;
+}
+
+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;
+}
+
+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 );
+}
diff --git a/src/iodbc/result.c b/src/iodbc/result.c
new file mode 100644 (file)
index 0000000..1060d40
--- /dev/null
@@ -0,0 +1,575 @@
+/** Prepare for getting query result
+      
+    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+**/
+
+#include       <../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        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;
+}
+
+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;
+}
+
+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;
+       }
+
+       /* check state */
+       if( pstmt->state >= en_stmt_needdata
+        || pstmt->state <= en_stmt_prepared
+        || pstmt->asyn_on != en_NullProc )
+       {
+               PUSHSQLERR ( pstmt->herr, en_S1010 );
+
+               return SQL_ERROR;
+       }
+
+       /* call driver */
+       hproc = _iodbcdm_getproc( pstmt->hdbc, en_RowCount );
+
+       if( hproc == SQL_NULL_HPROC )
+       {
+               PUSHSQLERR ( pstmt->herr, en_IM001 );
+
+               return SQL_ERROR;
+       }
+
+       CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_RowCount, (
+                       pstmt->dhstmt, pcrow) )
+
+#if 0
+       retcode = hproc ( pstmt->dhstmt, pcrow );
+#endif
+
+       return retcode;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}
diff --git a/src/iodbc/shrsub.exp b/src/iodbc/shrsub.exp
new file mode 100644 (file)
index 0000000..bf32323
--- /dev/null
@@ -0,0 +1,64 @@
+SQLAllocEnv
+SQLAllocConnect
+SQLConnect
+SQLDriverConnect
+SQLBrowseConnect
+
+SQLDataSources
+SQLDrivers
+SQLGetInfo
+SQLGetFunctions
+SQLGetTypeInfo
+
+SQLSetConnectOption
+SQLGetConnectOption
+SQLSetStmtOption
+SQLGetStmtOption
+
+SQLAllocStmt
+SQLPrepare
+SQLBindParameter
+SQLParamOptions
+SQLGetCursorName
+SQLSetCursorName
+SQLSetScrollOptions
+SQLSetParam
+
+SQLExecute
+SQLExecDirect
+SQLNativeSql
+SQLDescribeParam
+SQLNumParams
+SQLParamData
+SQLPutData
+
+SQLRowCount
+SQLNumResultCols
+SQLDescribeCol
+SQLColAttributes
+SQLBindCol
+SQLFetch
+SQLExtendedFetch
+SQLGetData
+SQLSetPos
+SQLMoreResults         
+SQLError
+
+SQLColumnPrivileges
+SQLColumns
+SQLForeignKeys
+SQLPrimaryKeys
+SQLProcedureColumns
+SQLProcedures
+SQLSpecialColumns
+SQLStatistics
+SQLTablePrivileges
+SQLTables
+
+SQLFreeStmt
+SQLCancel
+SQLTransact
+
+SQLDisconnect
+SQLFreeConnect
+SQLFreeEnv
diff --git a/src/iodbc/windows.h b/src/iodbc/windows.h
new file mode 100644 (file)
index 0000000..ab92116
--- /dev/null
@@ -0,0 +1,145 @@
+#ifndef DEBUG
+
+#endif
+#ifndef APWIN                     /* don't reinclude    */
+#define APWIN
+#ifndef DEBUG
+
+#endif
+
+#ifdef WININC
+#  include <windows.h>              /* normal windows.h    */
+#  ifdef WIN32
+#    include <windowsx.h>         /* windows extensions  */
+#    define GetCurrentTask     (HTASK)GetCurrentProcess
+#    define GetDOSEnvironment  GetEnvironmentStrings
+#    define PCALL
+#  else
+#    define PCALL PASCAL
+#  endif
+#else                             /* not windows         */
+/******* Common definitions and typedefs **********************/
+#ifdef HPUX
+#  ifndef _VOID
+#    define    VOID    int
+#  endif
+#  ifndef _UCHAR
+     typedef   char    UCHAR;
+#    define _UCHAR
+#  endif
+#  ifndef _SCHAR
+     typedef   char    SCHAR;
+#    define _SCHAR
+#  endif
+#endif /* HPUX */
+
+#ifdef OSF1
+#  ifndef _UCHAR
+     typedef   char    UCHAR;
+#    define _UCHAR
+#  endif
+#  ifndef _SDWORD
+#    define _SDWORD
+     typedef   int     SDWORD;
+#  endif
+#  ifndef _UDWORD
+#    define _UDWORD
+     typedef   unsigned int   UDWORD;
+#  endif
+#  ifndef _LDOUBLE
+#    define _LDOUBLE
+     typedef   double  LDOUBLE;
+#  endif
+#  ifndef _DWORD
+#    define _DWORD
+     typedef   int     DWORD;
+#  endif
+#endif /* OSF1 */
+
+#if defined (SVR4) && defined(I386)
+#  ifndef _UCHAR
+     typedef   char    UCHAR;
+#    define _UCHAR
+#  endif
+#  ifndef _LDOUBLE
+#    define _LDOUBLE
+     typedef   double  LDOUBLE;
+#  endif
+#endif /* SVR4 && I386 */
+
+#ifndef _VOID
+#  define _VOID
+#  define VOID                void
+#endif
+
+#ifdef WIN
+#  define LONG long
+#endif
+
+#ifndef _DWORD
+#  define _DWORD
+/*   typedef unsigned long       DWORD; */
+#endif
+
+#ifndef _UINT
+#  define _UINT
+   typedef unsigned int        UINT;
+#endif
+
+#ifdef PC
+#  define FAR                 _far
+#  define NEAR                _near
+#  define PASCAL              _pascal
+#  define CDECL               _cdecl
+#  define WINAPI              _far _pascal
+#  define CALLBACK            _far _pascal
+#  define EXPORT             _export
+#else
+#  define FAR
+#  define NEAR
+#  define PASCAL
+#  define CDECL
+#  define WINAPI
+#  define CALLBACK
+#  define EXPORT
+#endif
+#define PCALL PASCAL
+
+/****** Simple types & common helper macros ********************/
+
+/* typedef int                 BOOL; */
+#define FALSE               0
+#define TRUE                1
+
+typedef unsigned char       BYTE;
+/* typedef unsigned short      WORD; */
+
+#define LOBYTE(w)           ((BYTE)(w))
+#define HIBYTE(w)           ((BYTE)(((UINT)(w) >> 8) & 0xFF))
+
+#define LOWORD(l)           ((WORD)(DWORD)(l))
+#define HIWORD(l)           ((WORD)((((DWORD)(l)) >> 16) & 0xFFFF))
+
+#define MAKELONG(low, high) ((LONG)(((WORD)(low)) |\
+                           (((DWORD)((WORD)(high))) << 16)))
+
+#define max(a,b)           (((a) > (b)) ? (a) : (b))
+#define min(a,b)            (((a) < (b)) ? (a) : (b))
+
+/****** Common pointer types **********************************/
+
+#ifndef NULL
+#define NULL                0
+#endif
+
+/****** Common handle types *************************************/
+
+typedef UINT                    HANDLE;
+/* typedef UINT                    HWND; */
+
+
+#endif /* ifdef not WIN */
+
+#endif /* ifdef APWIN */
+
+/* end of apwin.h */
index c36a698965cee95b8f78b84063a4b1b095363c4a..7b2f5f8770146e69d6a9d27c4f77eea05ceef62e 100755 (executable)
@@ -30,3 +30,7 @@ if test ! -d gdk_imlib; then
     mkdir gdk_imlib
 fi
 
+# create "/iodbc" if not present
+if test ! -d iodbc; then
+    mkdir iodbc
+fi
index e6e58613dd838689baebd8abe547124f2bf9a88d..c0f67e22c36d68e4ebe7f269d00d13e4d9c9bfbf 100644 (file)
@@ -289,7 +289,7 @@ void MyDialog::OnHelloButton( wxCommandEvent &WXUNUSED(event) )
 {
   wxMessageDialog *dialog;
   dialog = new wxMessageDialog( this, "Now, I will paint on Screen.", "wxGTK" );
-  dialog->ShowModal();
+      dialog->ShowModal();
   delete dialog;
   
   wxScreenDC dc;
@@ -496,8 +496,9 @@ void MyFrame::OnSize( wxSizeEvent &WXUNUSED(event) )
 
 void MyFrame::OnDialog( wxCommandEvent &WXUNUSED(event) )
 {
-  MyDialog dialog( this );
-  dialog.ShowModal();
+  MyDialog *dialog = new MyDialog( this );
+  dialog->ShowModal();
+  dialog->Close( TRUE );
 };
 
 void MyFrame::OnFontDialog( wxCommandEvent &WXUNUSED(event) )