]> git.saurik.com Git - wxWidgets.git/blobdiff - src/iodbc/connect.c
OnExit() is called for modules which were initialized even if the init of
[wxWidgets.git] / src / iodbc / connect.c
index c2f37e9f286c197aa2f6d9cbdd0e187dfe4d8365..11a5bbd0c9a79568995ad76c7e9fa9ad81d4dff6 100644 (file)
@@ -1,6 +1,6 @@
 /** Connect(load) driver
 
-    Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+    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
 
 #include       <../iodbc/itrace.h>
 
-extern char*   _iodbcdm_getkeyvalbydsn();
-extern char*   _iodbcdm_getkeyvalinstr();
-extern RETCODE _iodbcdm_driverunload();
+#include        <strings.h>
+#include        <stdio.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 
+ *   Following id string is a copyright mark. Removing(i.e. use
+ *   souce code of this package without it or make it not appear
+ *   in the final object file) or modifing it without permission
+ *   from original author(kejin@empress.com) are copyright
  *   violation.
  */
-static char sccsid[] 
-       = "@(#)iODBC driver manager " "2.12" ", Copyright(c) 1995 by Ke Jin";
+static  char sccsid[]
+        = "@(#)iODBC driver manager " "2.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 
+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()
@@ -52,232 +55,242 @@ static RETCODE    _iodbcdm_driverload(
  * - 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() */
+        DBC_t  FAR*     pdbc = (DBC_t FAR*)hdbc;
+        GENV_t FAR*     genv;
+        ENV_t  FAR*     penv = NULL;
+        HDLL            hdll;
+        HPROC           hproc;
+        RETCODE         retcode = SQL_SUCCESS;
+        int             sqlstat = en_00000;
+
+       if(pdbc->trace)
+       {
+         fprintf(pdbc->tstm, "_iodbcdm_driverload(%s, 0x%x)\n", path, (int)hdbc);
+       }
+
+        if( path == NULL || path[0] == '\0' )
+        {
+                PUSHSQLERR ( pdbc->herr, en_IM002 );
+
+                return SQL_ERROR;
+        }
+
+        if( hdbc == SQL_NULL_HDBC
+         || pdbc->genv == SQL_NULL_HENV )
+        {
+                return SQL_INVALID_HANDLE;
+        }
+
+        genv = (GENV_t FAR*)pdbc->genv;
+
+        hdll = _iodbcdm_dllopen( (char FAR*) path );
+                                 /* This will either load the
+                                  * driver dll or increase its
+                                  * reference count */
+
+        if( hdll == SQL_NULL_HDLL )
+        {
+         if(pdbc->trace)
+         {
+           fprintf(pdbc->tstm, "ERROR: _iodbcdm_driverload cannot load driver - '%s'\n", _iodbcdm_dllerror());
+         }
+
+                PUSHSYSERR ( pdbc->herr, _iodbcdm_dllerror() );
+                PUSHSQLERR ( pdbc->herr, en_IM003 );
+                return SQL_ERROR;
+        }
+
+        penv = (ENV_t FAR*)(pdbc->henv);
+
+        if( penv != NULL )
+        {
+                if( penv->hdll != hdll )
+                {
+                        _iodbcdm_driverunload(hdbc);
+                }
+                else
+                {
+                        _iodbcdm_dllclose( hdll );
+                        /* this will not unload the driver
+                         * but only decrease its internal
+                         * reference count
+                         */
+                }
+        }
+
+        if(penv == NULL )
+        {
+                /* find out whether this dll has already
+                 * been loaded on another connection */
+                for( penv  = (ENV_t FAR*)genv->henv;
+                     penv != NULL;
+                     penv  = (ENV_t FAR*)penv->next )
+                {
+                        if( penv->hdll == hdll )
+                        {
+                                _iodbcdm_dllclose( hdll );
+                                /* this will not unload the driver
+                                 * but only decrease its internal
+                                 * reference count
+                                 */
+                                break;
+                        }
+                }
+
+                if( penv == NULL )
+                /* no connection attaching with this dll */
+                {
+                        int     i;
+
+                        /* create a new dll env instance */
+                        penv = (ENV_t FAR*)MEM_ALLOC ( sizeof(ENV_t) );
+
+                        if( penv == NULL )
+                        {
+                                _iodbcdm_dllclose(hdll);
+
+                                PUSHSQLERR ( pdbc->herr, en_S1001 );
+
+                                return SQL_ERROR;
+                        }
+
+                        for( i = 0; i< SQL_EXT_API_LAST + 1; i++)
+                        {
+                                (penv->dllproc_tab)[i] = SQL_NULL_HPROC;
+                        }
+
+                        pdbc->henv = penv;
+                        penv->hdll = hdll;
+
+                        /* call driver's SQLAllocHandle() or SQLAllocEnv() */
 #if (ODBCVER >= 0x0300)
-                       hproc = _iodbcdm_getproc( hdbc, en_AllocHandle );
-
-                       if( hproc )
-                       {
-                               CALL_DRIVER ( hdbc, retcode, hproc, en_AllocHandle, 
-                                       ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(penv->dhenv) )
-                       }
-                       else /* try driver's SQLAllocEnv() */
+                        hproc = _iodbcdm_getproc( hdbc, en_AllocHandle );
+
+                        if( hproc )
+                        {
+                                CALL_DRIVER ( hdbc, retcode, hproc, en_AllocHandle,
+                                        ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(penv->dhenv) )
+                        }
+                        else /* try driver's SQLAllocEnv() */
 #endif
-                       {
-                               hproc = _iodbcdm_getproc( hdbc, en_AllocEnv );
-
-                               if( hproc == SQL_NULL_HPROC)
-                               {
-                                       sqlstat = en_IM004;
-                               }
-                               else
-                               {
-                                       CALL_DRIVER ( hdbc, retcode, hproc, 
-                                       en_AllocEnv, (&(penv->dhenv)) ) 
-                               }
-                       }
-
-                       if( retcode == SQL_ERROR )
-                       {
-                               sqlstat = en_IM004;
-                       }
-
-                       if( sqlstat != en_00000 )
-                       {
-                               _iodbcdm_dllclose ( hdll );
-                               MEM_FREE ( penv );
-                               PUSHSQLERR ( pdbc->herr, en_IM004 );
-       
-                               return SQL_ERROR;
-                       }
-       
-                       /* insert into dll env list */
-                       penv->next = (ENV_t FAR*)genv->henv;
-                       genv->henv = penv;
-       
-                       /* initiate this new env entry */
-                       penv->refcount = 0;     /* we will increase it after
-                                                * driver's SQLAllocConnect()
-                                                * success
-                                                */
-               }
-       
-               pdbc->henv = penv;
-       
-               if( pdbc->dhdbc == SQL_NULL_HDBC )
-               {
+                        {
+                                hproc = _iodbcdm_getproc( hdbc, en_AllocEnv );
+
+                                if( hproc == SQL_NULL_HPROC)
+                                {
+                                        sqlstat = en_IM004;
+                                }
+                                else
+                                {
+                                        CALL_DRIVER ( hdbc, retcode, hproc,
+                                        en_AllocEnv, (&(penv->dhenv)) )
+                                }
+                        }
+
+                        if( retcode == SQL_ERROR )
+                        {
+                                sqlstat = en_IM004;
+                        }
+
+                        if( sqlstat != en_00000 )
+                        {
+                                _iodbcdm_dllclose ( hdll );
+                                MEM_FREE ( penv );
+                                PUSHSQLERR ( pdbc->herr, en_IM004 );
+
+                                return SQL_ERROR;
+                        }
+
+                        /* insert into dll env list */
+                        penv->next = (ENV_t FAR*)genv->henv;
+                        genv->henv = penv;
+
+                        /* initiate this new env entry */
+                        penv->refcount = 0;     /* we will increase it after
+                                                 * driver's SQLAllocConnect()
+                                                 * success
+                                                 */
+                }
+
+                pdbc->henv = penv;
+
+                if( pdbc->dhdbc == SQL_NULL_HDBC )
+                {
 #if (ODBCVER >= 0x0300)
-                       hproc = _iodbcdm_getproc( hdbc, en_AllocHandle );
-
-                       if( hproc )
-                       {
-                               CALL_DRIVER( hdbc, retcode, hproc, en_AllocHandle,
-                               (SQL_HANDLE_DBC, penv->dhenv, &(pdbc->dhdbc)) )
-                       }
-                       else
+                        hproc = _iodbcdm_getproc( hdbc, en_AllocHandle );
+
+                        if( hproc )
+                        {
+                                CALL_DRIVER( hdbc, retcode, hproc, en_AllocHandle,
+                                (SQL_HANDLE_DBC, penv->dhenv, &(pdbc->dhdbc)) )
+                        }
+                        else
 #endif
-                       {
-                               hproc = _iodbcdm_getproc( hdbc, en_AllocConnect );
-       
-                               if( hproc == SQL_NULL_HPROC )
-                               {
-                                       sqlstat = en_IM005;
-                               }
-                               else
-                               {
-                                       CALL_DRIVER ( hdbc, retcode, hproc, 
-                                       en_AllocConnect, (penv->dhenv, &(pdbc->dhdbc)) )
-                               }
-                       }
-
-                       if( retcode == SQL_ERROR )
-                       {
-                               sqlstat = en_IM005;
-                       }
-
-                       if( sqlstat != en_00000 )
-                       {
-                               _iodbcdm_driverunload(hdbc);
-       
-                               pdbc->dhdbc = SQL_NULL_HDBC;
-                               PUSHSQLERR ( pdbc->herr, en_IM005 );
-       
-                               return SQL_ERROR;
-                       }
-               }
-       
-               pdbc->henv = penv;
-               penv->refcount ++;  /* bookkeeping reference count on this driver */
-       }
-
-       /* driver's login timeout option must been set before 
-        * its SQLConnect() call */
-       if( pdbc->login_timeout != 0UL )
-       {
-               hproc = _iodbcdm_getproc( hdbc, en_SetConnectOption );
-
-               if( hproc == SQL_NULL_HPROC )
-               {
-                       sqlstat = en_IM004;
-               }
-               else
-               {
-                       CALL_DRIVER ( hdbc, retcode, hproc, 
-                       en_SetConnectOption, ( 
-                               pdbc->dhdbc, 
-                               SQL_LOGIN_TIMEOUT,
-                               pdbc->login_timeout ) )
-               
-                       if( retcode == SQL_ERROR )
-                       {
-                               PUSHSQLERR ( pdbc->herr, en_IM006 );
-
-                               return SQL_SUCCESS_WITH_INFO;
-                       }
-               }
-       }
-
-       return SQL_SUCCESS;
+                        {
+                                hproc = _iodbcdm_getproc( hdbc, en_AllocConnect );
+
+                                if( hproc == SQL_NULL_HPROC )
+                                {
+                                        sqlstat = en_IM005;
+                                }
+                                else
+                                {
+                                        CALL_DRIVER ( hdbc, retcode, hproc,
+                                        en_AllocConnect, (penv->dhenv, &(pdbc->dhdbc)) )
+                                }
+                        }
+
+                        if( retcode == SQL_ERROR )
+                        {
+                                sqlstat = en_IM005;
+                        }
+
+                        if( sqlstat != en_00000 )
+                        {
+                                _iodbcdm_driverunload(hdbc);
+
+                                pdbc->dhdbc = SQL_NULL_HDBC;
+                                PUSHSQLERR ( pdbc->herr, en_IM005 );
+
+                                return SQL_ERROR;
+                        }
+                }
+
+                pdbc->henv = penv;
+                penv->refcount ++;  /* bookkeeping reference count on this driver */
+        }
+
+        /* driver's login timeout option must been set before
+         * its SQLConnect() call */
+        if( pdbc->login_timeout != 0UL )
+        {
+                hproc = _iodbcdm_getproc( hdbc, en_SetConnectOption );
+
+                if( hproc == SQL_NULL_HPROC )
+                {
+                        sqlstat = en_IM004;
+                }
+                else
+                {
+                        CALL_DRIVER ( hdbc, retcode, hproc,
+                        en_SetConnectOption, (
+                                pdbc->dhdbc,
+                                SQL_LOGIN_TIMEOUT,
+                                pdbc->login_timeout ) )
+
+                        if( retcode == SQL_ERROR )
+                        {
+                                PUSHSQLERR ( pdbc->herr, en_IM006 );
+
+                                return SQL_SUCCESS_WITH_INFO;
+                        }
+                }
+        }
+
+        return SQL_SUCCESS;
 }
 
-RETCODE        _iodbcdm_driverunload( HDBC     hdbc )
+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
@@ -286,975 +299,1078 @@ RETCODE        _iodbcdm_driverunload( HDBC     hdbc )
  * - 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;
-       }
+        DBC_t  FAR*     pdbc = (DBC_t FAR*)hdbc;
+        ENV_t  FAR*     penv;
+        ENV_t  FAR*     tpenv;
+        GENV_t FAR*     genv;
+        HPROC           hproc;
+        RETCODE         retcode = SQL_SUCCESS;
+        int             sqlstat = en_00000;
+
+        if( hdbc == SQL_NULL_HDBC )
+        {
+                return SQL_INVALID_HANDLE;
+        }
+
+        /* no pointer check will be performed in this function */
+        penv = (ENV_t  FAR*)pdbc->henv;
+        genv = (GENV_t FAR*)pdbc->genv;
+
+        if( penv == NULL
+         || penv->hdll == SQL_NULL_HDLL )
+        {
+                return SQL_SUCCESS;
+        }
 
 #if (ODBCVER >= 0x0300)
-       hproc = _iodbcdm_getproc( hdbc, en_FreeHandle );
-
-       if( hproc )
-       {
-               CALL_DRIVER ( hdbc, retcode, hproc, en_FreeHandle,
-                       ( SQL_HANDLE_DBC, pdbc->dhdbc ) )
-       }
-       else
+        hproc = _iodbcdm_getproc( hdbc, en_FreeHandle );
+
+        if( hproc )
+        {
+                CALL_DRIVER ( hdbc, retcode, hproc, en_FreeHandle,
+                        ( SQL_HANDLE_DBC, pdbc->dhdbc ) )
+        }
+        else
 #endif
-       {
-               hproc = _iodbcdm_getproc( hdbc, en_FreeConnect );
+        {
+                hproc = _iodbcdm_getproc( hdbc, en_FreeConnect );
 
-               if( hproc != SQL_NULL_HPROC )
-               {
-                       CALL_DRIVER ( hdbc, retcode, hproc, 
-                       en_FreeConnect, ( pdbc->dhdbc ) )
+                if( hproc != SQL_NULL_HPROC )
+                {
+                        CALL_DRIVER ( hdbc, retcode, hproc,
+                        en_FreeConnect, ( pdbc->dhdbc ) )
 
-                       pdbc->dhdbc = SQL_NULL_HDBC;
-               }
-       }
+                        pdbc->dhdbc = SQL_NULL_HDBC;
+                }
+        }
 
-       penv->refcount --;
+        penv->refcount --;
 
-       if( ! penv->refcount )
-       /* no other connections still attaching with this driver */
-       {
+        if( ! penv->refcount )
+        /* no other connections still attaching with this driver */
+        {
 #if (ODBCVER >= 0x0300)
-               hproc = _iodbcdm_getproc( hdbc, en_FreeHandle );
-
-               if( hproc )
-               {
-                       CALL_DRIVER ( hdbc, retcode, hproc, en_FreeHandle,
-                               ( SQL_HANDLE_ENV, penv->dhenv ) )
-               }
-               else
+                hproc = _iodbcdm_getproc( hdbc, en_FreeHandle );
+
+                if( hproc )
+                {
+                        CALL_DRIVER ( hdbc, retcode, hproc, en_FreeHandle,
+                                ( SQL_HANDLE_ENV, penv->dhenv ) )
+                }
+                else
 #endif
-               {
-                       hproc = _iodbcdm_getproc( hdbc, en_FreeEnv );
-
-                       if( hproc != SQL_NULL_HPROC )
-                       {
-                               CALL_DRIVER ( hdbc, retcode, hproc, en_FreeEnv, 
-                                               ( penv->dhenv ) )
-
-                               penv->dhenv = SQL_NULL_HENV;
-                       }
-               }
-
-               _iodbcdm_dllclose ( penv->hdll );
-
-               penv->hdll = SQL_NULL_HDLL; 
-
-               for( tpenv  = (ENV_t FAR*)genv->henv;
-                    tpenv != NULL;
-                    tpenv  = (ENV_t FAR*)penv->next )
-               {
-                       if( tpenv == penv )
-                       {
-                               genv->henv = penv->next;
-                               break;
-                       }
-       
-                       if( tpenv->next == penv )
-                       {
-                               tpenv->next = penv->next;
-                               break;
-                       }
-               }
-
-               MEM_FREE( penv );
-       }
-
-       pdbc->henv = SQL_NULL_HENV;     
-       pdbc->hstmt= SQL_NULL_HSTMT;
-       /* pdbc->herr = SQL_NULL_HERR; 
-               -- delay to DM's SQLFreeConnect() */ 
-       pdbc->dhdbc= SQL_NULL_HDBC;     
-       pdbc->state= en_dbc_allocated;  
-
-       /* set connect options to default values */
-       /**********
-       pdbc->access_mode       = SQL_MODE_DEFAULT;
-       pdbc->autocommit        = SQL_AUTOCOMMIT_DEFAULT;
-       pdbc->login_timeout     = 0UL;
-       **********/
-       pdbc->odbc_cursors      = SQL_CUR_DEFAULT;
-       pdbc->packet_size       = 0UL;
-       pdbc->quiet_mode        = (UDWORD)NULL;
-       pdbc->txn_isolation     = SQL_TXN_READ_UNCOMMITTED;
-
-       if( pdbc->current_qualifier != NULL )
-       {
-               MEM_FREE ( pdbc->current_qualifier );
-               pdbc->current_qualifier = NULL;
-       }
-
-       return SQL_SUCCESS;
+                {
+                        hproc = _iodbcdm_getproc( hdbc, en_FreeEnv );
+
+                        if( hproc != SQL_NULL_HPROC )
+                        {
+                                CALL_DRIVER ( hdbc, retcode, hproc, en_FreeEnv,
+                                                ( penv->dhenv ) )
+
+                                penv->dhenv = SQL_NULL_HENV;
+                        }
+                }
+
+                _iodbcdm_dllclose ( penv->hdll );
+
+                penv->hdll == SQL_NULL_HDLL;
+
+                for( tpenv  = (ENV_t FAR*)genv->henv;
+                     tpenv != NULL;
+                     tpenv  = (ENV_t FAR*)penv->next )
+                {
+                        if( tpenv == penv )
+                        {
+                                genv->henv = penv->next;
+                                break;
+                        }
+
+                        if( tpenv->next == penv )
+                        {
+                                tpenv->next = penv->next;
+                                break;
+                        }
+                }
+
+                MEM_FREE( penv );
+        }
+
+        pdbc->henv = SQL_NULL_HENV;
+        pdbc->hstmt= SQL_NULL_HSTMT;
+        /* pdbc->herr = SQL_NULL_HERR;
+                -- delay to DM's SQLFreeConnect() */
+        pdbc->dhdbc= SQL_NULL_HDBC;
+        pdbc->state= en_dbc_allocated;
+
+        /* set connect options to default values */
+        /**********
+        pdbc->access_mode       = SQL_MODE_DEFAULT;
+        pdbc->autocommit        = SQL_AUTOCOMMIT_DEFAULT;
+        pdbc->login_timeout     = 0UL;
+        **********/
+        pdbc->odbc_cursors      = SQL_CUR_DEFAULT;
+        pdbc->packet_size       = 0UL;
+        pdbc->quiet_mode        = (UDWORD)NULL;
+        pdbc->txn_isolation     = SQL_TXN_READ_UNCOMMITTED;
+
+        if( pdbc->current_qualifier != NULL )
+        {
+                MEM_FREE ( pdbc->current_qualifier );
+                pdbc->current_qualifier = NULL;
+        }
+
+        return SQL_SUCCESS;
 }
 
-static RETCODE _iodbcdm_dbcdelayset( HDBC hdbc )
+static RETCODE  _iodbcdm_dbcdelayset( HDBC hdbc )
 {
-       DBC_t FAR*      pdbc    = (DBC_t FAR*)hdbc;
-       ENV_t FAR*      penv;
-       HPROC           hproc;
-       RETCODE         retcode = SQL_SUCCESS;
-       RETCODE         ret;
-
-       penv = pdbc->henv;
-
-       hproc = _iodbcdm_getproc( hdbc, en_SetConnectOption );
-
-       if( hproc == SQL_NULL_HPROC )
-       {
-               PUSHSQLERR ( pdbc->herr, en_IM006 );
-
-               return SQL_SUCCESS_WITH_INFO;
-       }
-
-       if( pdbc->access_mode != SQL_MODE_DEFAULT )
-       {
-               CALL_DRIVER ( hdbc, ret, hproc, 
-                       en_SetConnectOption, ( 
-                               SQL_ACCESS_MODE, 
-                               pdbc->access_mode) )
-
-               retcode |= ret;
-       }
-
-       if( pdbc->autocommit != SQL_AUTOCOMMIT_DEFAULT )
-       {
-               CALL_DRIVER ( hdbc, ret, hproc, 
-                       en_SetConnectOption, (
-                               pdbc->dhdbc,
-                               SQL_AUTOCOMMIT,
-                               pdbc->autocommit ) )
-
-               retcode |= ret;
-       }
-
-       if( pdbc->current_qualifier != NULL )
-       {
-               CALL_DRIVER ( hdbc, ret, hproc, 
-                       en_SetConnectOption, (
-                               pdbc->dhdbc,
-                               SQL_CURRENT_QUALIFIER,
-                               pdbc->current_qualifier ) )
-
-               retcode |= ret;
-       }
-
-       if( pdbc->packet_size != 0UL )
-       {
-               CALL_DRIVER ( hdbc, ret, hproc,
-                       en_SetConnectOption, (
-                               pdbc->dhdbc,
-                               SQL_PACKET_SIZE,
-                               pdbc->packet_size ) )
-
-               retcode |= ret;
-       }
-
-       if( pdbc->quiet_mode != (UDWORD)NULL )
-       {
-               CALL_DRIVER ( hdbc, ret, hproc, 
-                       en_SetConnectOption, (
-                               pdbc->dhdbc,
-                               SQL_QUIET_MODE,
-                               pdbc->quiet_mode ) )
-
-               retcode |= ret;
-       }
-
-       if( pdbc->txn_isolation != SQL_TXN_READ_UNCOMMITTED )
-       {
-               CALL_DRIVER ( hdbc, ret, hproc,
-                       en_SetConnectOption, (
-                               pdbc->dhdbc,
-                               SQL_TXN_ISOLATION,
-                               pdbc->txn_isolation ) )
-       }
-
-       /* check error code for driver's SQLSetConnectOption() call */
-       if( retcode != SQL_SUCCESS 
-        && retcode != SQL_SUCCESS_WITH_INFO )
-       {
-               PUSHSQLERR ( pdbc->herr, en_IM006 );
-
-               retcode = SQL_ERROR;
-       }
-
-       /* get cursor behavior on transaction commit or rollback */
-       hproc = _iodbcdm_getproc( hdbc, en_GetInfo );
-
-       if( hproc == SQL_NULL_HPROC )
-       {
-               PUSHSQLERR ( pdbc->herr, en_01000 );
-
-               return retcode;
-       }
-
-       CALL_DRIVER ( hdbc, ret, hproc,
-               en_GetInfo, (
-                       pdbc->dhdbc, 
-                       SQL_CURSOR_COMMIT_BEHAVIOR,
-                       (PTR)&(pdbc->cb_commit),
-                       sizeof(pdbc->cb_commit),
-                       NULL ) )
-
-       retcode |= ret;
-
-       CALL_DRIVER ( hdbc, ret, hproc,
-               en_GetInfo, (
-                       pdbc->dhdbc,
-                       SQL_CURSOR_ROLLBACK_BEHAVIOR,
-                       (PTR)&(pdbc->cb_rollback),
-                       sizeof(pdbc->cb_rollback),
-                       NULL ) )
-
-       retcode |= ret;
-
-       if( retcode != SQL_SUCCESS
-        && retcode != SQL_SUCCESS_WITH_INFO )
-       {
-               return SQL_ERROR;
-       }
-
-       return retcode;
+        DBC_t FAR*      pdbc    = (DBC_t FAR*)hdbc;
+        ENV_t FAR*      penv;
+        HPROC           hproc;
+        RETCODE         retcode = SQL_SUCCESS;
+        RETCODE         ret;
+
+        penv = pdbc->henv;
+
+        hproc = _iodbcdm_getproc( hdbc, en_SetConnectOption );
+
+        if( hproc == SQL_NULL_HPROC )
+        {
+                PUSHSQLERR ( pdbc->herr, en_IM006 );
+
+                return SQL_SUCCESS_WITH_INFO;
+        }
+
+        if( pdbc->access_mode != SQL_MODE_DEFAULT )
+        {
+                CALL_DRIVER ( hdbc, ret, hproc,
+                        en_SetConnectOption, (
+                                SQL_ACCESS_MODE,
+                                pdbc->access_mode) )
+
+                retcode |= ret;
+        }
+
+        if( pdbc->autocommit != SQL_AUTOCOMMIT_DEFAULT )
+        {
+                CALL_DRIVER ( hdbc, ret, hproc,
+                        en_SetConnectOption, (
+                                pdbc->dhdbc,
+                                SQL_AUTOCOMMIT,
+                                pdbc->autocommit ) )
+
+                retcode |= ret;
+        }
+
+        if( pdbc->current_qualifier != NULL )
+        {
+                CALL_DRIVER ( hdbc, ret, hproc,
+                        en_SetConnectOption, (
+                                pdbc->dhdbc,
+                                SQL_CURRENT_QUALIFIER,
+                                pdbc->current_qualifier ) )
+
+                retcode |= ret;
+        }
+
+        if( pdbc->packet_size != 0UL )
+        {
+                CALL_DRIVER ( hdbc, ret, hproc,
+                        en_SetConnectOption, (
+                                pdbc->dhdbc,
+                                SQL_PACKET_SIZE,
+                                pdbc->packet_size ) )
+
+                retcode |= ret;
+        }
+
+        if( pdbc->quiet_mode != (UDWORD)NULL )
+        {
+                CALL_DRIVER ( hdbc, ret, hproc,
+                        en_SetConnectOption, (
+                                pdbc->dhdbc,
+                                SQL_QUIET_MODE,
+                                pdbc->quiet_mode ) )
+
+                retcode |= ret;
+        }
+
+        if( pdbc->txn_isolation != SQL_TXN_READ_UNCOMMITTED )
+        {
+                CALL_DRIVER ( hdbc, ret, hproc,
+                        en_SetConnectOption, (
+                                pdbc->dhdbc,
+                                SQL_TXN_ISOLATION,
+                                pdbc->txn_isolation ) )
+        }
+
+        /* check error code for driver's SQLSetConnectOption() call */
+        if( retcode != SQL_SUCCESS
+         && retcode != SQL_SUCCESS_WITH_INFO )
+        {
+                PUSHSQLERR ( pdbc->herr, en_IM006 );
+
+                retcode = SQL_ERROR;
+        }
+
+        /* get cursor behavior on transaction commit or rollback */
+        hproc = _iodbcdm_getproc( hdbc, en_GetInfo );
+
+        if( hproc == SQL_NULL_HPROC )
+        {
+                PUSHSQLERR ( pdbc->herr, en_01000 );
+
+                return retcode;
+        }
+
+        CALL_DRIVER ( hdbc, ret, hproc,
+                en_GetInfo, (
+                        pdbc->dhdbc,
+                        SQL_CURSOR_COMMIT_BEHAVIOR,
+                        (PTR)&(pdbc->cb_commit),
+                        sizeof(pdbc->cb_commit),
+                        NULL ) )
+
+        retcode |= ret;
+
+        CALL_DRIVER ( hdbc, ret, hproc,
+                en_GetInfo, (
+                        pdbc->dhdbc,
+                        SQL_CURSOR_ROLLBACK_BEHAVIOR,
+                        (PTR)&(pdbc->cb_rollback),
+                        sizeof(pdbc->cb_rollback),
+                        NULL ) )
+
+        retcode |= ret;
+
+        if( retcode != SQL_SUCCESS
+         && retcode != SQL_SUCCESS_WITH_INFO )
+        {
+                return SQL_ERROR;
+        }
+
+        return retcode;
 }
 
-static RETCODE _iodbcdm_settracing( HDBC hdbc, char* dsn, int dsnlen )
+static RETCODE  _iodbcdm_settracing( HDBC hdbc, char* dsn, int dsnlen )
 {
-       char    buf[256];
-       char*   ptr;
-       RETCODE setopterr = SQL_SUCCESS;
-
-       /* Get Driver's DLL path from specificed or default dsn section */
-       ptr = _iodbcdm_getkeyvalbydsn( dsn, dsnlen, "TraceFile",
-                               (char FAR*)buf, sizeof(buf));
-
-       if( ptr == NULL || ptr[0] == '\0' )
-       {
-               ptr = (char FAR*)(SQL_OPT_TRACE_FILE_DEFAULT);
-       }
-
-       setopterr |= SQLSetConnectOption( hdbc, 
-               SQL_OPT_TRACEFILE, (UDWORD)(ptr));
-
-       ptr = _iodbcdm_getkeyvalbydsn( dsn, dsnlen, "Trace",
-                               (char FAR*)buf, sizeof(buf));
-
-       if( ptr != NULL )
-       {
-               UDWORD  opt = (UDWORD)(-1L);
-
-               if( STREQ(ptr, "ON") 
-                || STREQ(ptr, "On") 
-                || STREQ(ptr, "on") 
-                || STREQ(ptr, "1" ) )
-               {
-                       opt = SQL_OPT_TRACE_ON;
-               }
-
-               if( STREQ(ptr, "OFF") 
-                || STREQ(ptr, "Off")
-                || STREQ(ptr, "off") 
-                || STREQ(ptr, "0"  ) )
-               {
-                       opt = SQL_OPT_TRACE_OFF;
-               }
-
-               if( opt != (UDWORD)(-1L) )
-               {
-                       setopterr |= SQLSetConnectOption( hdbc, 
-                               SQL_OPT_TRACE, opt);
-               }
-       }
-
-    return setopterr;
+        char    buf[256];
+        char*   ptr;
+        RETCODE setopterr = SQL_SUCCESS;
+
+        /* Get Driver's DLL path from specificed or default dsn section */
+        ptr = _iodbcdm_getkeyvalbydsn( dsn, dsnlen, "TraceFile",
+                                (char FAR*)buf, sizeof(buf));
+
+        if( ptr == NULL || ptr[0] == '\0' )
+        {
+                ptr = (char FAR*)(SQL_OPT_TRACE_FILE_DEFAULT);
+        }
+
+        setopterr |= SQLSetConnectOption( hdbc,
+                SQL_OPT_TRACEFILE, (UDWORD)(ptr));
+
+        ptr = _iodbcdm_getkeyvalbydsn( dsn, dsnlen, "Trace",
+                                (char FAR*)buf, sizeof(buf));
+
+        if( ptr != NULL )
+        {
+                UDWORD  opt = (UDWORD)(-1L);
+
+                if( STREQ(ptr, "ON")
+                 || STREQ(ptr, "On")
+                 || STREQ(ptr, "on")
+                 || STREQ(ptr, "1" ) )
+                {
+                        opt = SQL_OPT_TRACE_ON;
+                }
+
+                if( STREQ(ptr, "OFF")
+                 || STREQ(ptr, "Off")
+                 || STREQ(ptr, "off")
+                 || STREQ(ptr, "0"  ) )
+                {
+                        opt = SQL_OPT_TRACE_OFF;
+                }
+
+                if( opt != (UDWORD)(-1L) )
+                {
+                        setopterr |= SQLSetConnectOption( hdbc,
+                                SQL_OPT_TRACE, opt);
+                }
+        }
+       return SQL_SUCCESS;
 }
 
-RETCODE SQL_API        SQLConnect (
-                       HDBC            hdbc,
-                       UCHAR FAR*      szDSN,
-                       SWORD           cbDSN,
-                       UCHAR FAR*      szUID,
-                       SWORD           cbUID,
-                       UCHAR FAR*      szAuthStr,
-                       SWORD           cbAuthStr)
+RETCODE SQL_API SQLConnect (
+                        HDBC            hdbc,
+                        UCHAR FAR*      szDSN,
+                        SWORD           cbDSN,
+                        UCHAR FAR*      szUID,
+                        SWORD           cbUID,
+                        UCHAR FAR*      szAuthStr,
+                        SWORD           cbAuthStr)
 {
-       DBC_t  FAR*     pdbc    = (DBC_t FAR*)hdbc;
-       RETCODE         retcode = SQL_SUCCESS;
-       RETCODE         setopterr = SQL_SUCCESS;
-       char            driver[1024] = { '\0' }; /* MS SDK Guide 
-                                                 * specifies driver
-                                                 * path can't longer
-                                                 * than 255. */
-       char            *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 ) )
+        DBC_t  FAR*     pdbc    = (DBC_t FAR*)hdbc;
+        RETCODE         retcode = SQL_SUCCESS;
+        RETCODE         setopterr = SQL_SUCCESS;
+        char            driver[1024] = { '\0' }; /* MS SDK Guide
+                                                  * specifies driver
+                                                  * path can't longer
+                                                  * than 255. */
+        char            szNewDSN[256];                  /* OS/2 !!! */
+        char            *ptr;
+        HPROC           hproc;
+
+        if( hdbc == SQL_NULL_HDBC )
+        {
+                return SQL_INVALID_HANDLE;
+        }
+
+        /* check arguments */
+        if( ( cbDSN < 0 && cbDSN != SQL_NTS )
+         || ( cbUID < 0 && cbUID != SQL_NTS )
+         || ( cbAuthStr < 0 && cbAuthStr != SQL_NTS )
+         || ( cbDSN > SQL_MAX_DSN_LENGTH ) )
+        {
+                PUSHSQLERR ( pdbc->herr, en_S1090 );
+
+                return SQL_ERROR;
+        }
+
+        if( szDSN == NULL || cbDSN == 0 )
+        {
+                PUSHSQLERR ( pdbc->herr, en_IM002 );
+
+                return SQL_ERROR;
+        }
+
+        /* check state */
+        if( pdbc->state != en_dbc_allocated )
+        {
+                PUSHSQLERR ( pdbc->herr, en_08002 );
+
+                return SQL_ERROR;
+        }
+
+        setopterr |= _iodbcdm_settracing( hdbc,
+                                (char*)szDSN, cbDSN );
+
+        ptr = _iodbcdm_getkeyvalbydsn( szDSN, cbDSN, "Driver",
+                                (char FAR*)driver, sizeof(driver));
+
+        if( ptr == NULL )
+        /* No specified or default dsn section or
+         * no driver specification in this dsn section */
+        {
+                PUSHSQLERR ( pdbc->herr, en_IM002 );
+
+                return SQL_ERROR;
+        }
+
+        /*
+        ** OS/2 !!!
+        **
+        ** get new szDSN from INI file, if existing
+        */
+        if( NULL != _iodbcdm_getkeyvalbydsn( szDSN, cbDSN, "DSN",
+                                             (char FAR*) &szNewDSN,
+                                             sizeof(szNewDSN) ) )
+        {
+                szDSN = &szNewDSN[0];
+                cbDSN = SQL_NTS;
+        }
+
+        retcode = _iodbcdm_driverload( driver, hdbc );
+
+        switch( retcode )
+        {
+                case SQL_SUCCESS:
+                        break;
+
+                case SQL_SUCCESS_WITH_INFO:
+                        setopterr = SQL_ERROR;
+                        /* unsuccessed in calling driver's
+                         * SQLSetConnectOption() to set login
+                         * timeout.
+                         */
+                        break;
+
+                default:
+                        return retcode;
+        }
+
+        hproc = _iodbcdm_getproc( hdbc, en_Connect );
+
+        if( hproc == SQL_NULL_HPROC )
+        {
+                _iodbcdm_driverunload( hdbc );
+
+                PUSHSQLERR ( pdbc->herr, en_IM001 );
+
+                return SQL_ERROR;
+        }
+
+        CALL_DRIVER ( hdbc, retcode, hproc, en_Connect, (
+                        pdbc->dhdbc,
+                        szDSN,     cbDSN,
+                        szUID,     cbUID,
+                        szAuthStr, cbAuthStr ) )
 
 #if 0
-       retcode = hproc(pdbc->dhdbc, 
-                       szDSN,     cbDSN,
-                       szUID,     cbUID,
-                       szAuthStr, cbAuthStr );
+        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 );
-               **********/
+        if( retcode != SQL_SUCCESS
+         && retcode != SQL_SUCCESS_WITH_INFO )
+        {
+                /* not unload driver for retrive error
+                 * messge from driver */
+                /*********
+                _iodbcdm_driverunload( hdbc );
+                **********/
 
-               return retcode;
-       }
+                return retcode;
+        }
 
-       /* state transition */
-       pdbc->state = en_dbc_connected;
+        /* state transition */
+        pdbc->state = en_dbc_connected;
 
-       /* do delaid option setting */
-       setopterr |= _iodbcdm_dbcdelayset( hdbc );
+        /* do delaid option setting */
+        setopterr |= _iodbcdm_dbcdelayset( hdbc );
 
-       if( setopterr != SQL_SUCCESS )
-       {
-               return SQL_SUCCESS_WITH_INFO;
-       }
+        if( setopterr != SQL_SUCCESS )
+        {
+                return SQL_SUCCESS_WITH_INFO;
+        }
 
-       return retcode;
+        return retcode;
 }
-       
-RETCODE SQL_API        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 ) )
+RETCODE SQL_API SQLDriverConnect (
+                        HDBC            hdbc,
+                        HWND            hwnd,
+                        UCHAR FAR*      szConnStrIn,
+                        SWORD           cbConnStrIn,
+                        UCHAR FAR*      szConnStrOut,
+                        SWORD           cbConnStrOutMax,
+                        SWORD FAR*      pcbConnStrOut,
+                        UWORD           fDriverCompletion )
+{
+        DBC_t FAR*      pdbc    = (DBC_t FAR*)hdbc;
+        HDLL            hdll;
+        char  FAR*      drv;
+        char            drvbuf[1024];
+        char  FAR*      dsn;
+        char            dsnbuf[SQL_MAX_DSN_LENGTH + 1];
+        char            szNewDSN[256];                    /* OS/2 !!! */
+        UCHAR           cnstr2drv[1024];
+
+        HPROC           hproc, dialproc;
+
+        int             sqlstat = en_00000;
+        RETCODE         retcode = SQL_SUCCESS;
+        RETCODE         setopterr = SQL_SUCCESS;
+
+        if( hdbc == SQL_NULL_HDBC )
+        {
+                return SQL_INVALID_HANDLE;
+        }
+
+        /* check arguments */
+        if( ( cbConnStrIn < 0 && cbConnStrIn != SQL_NTS )
+         || cbConnStrOutMax < 0 )
+        {
+                PUSHSQLERR (pdbc->herr, en_S1090 );
+
+                return SQL_ERROR;
+        }
+
+        /* check state */
+        if( pdbc->state != en_dbc_allocated )
+        {
+                PUSHSQLERR (pdbc->herr, en_08002 );
+
+                return SQL_ERROR;
+        }
+
+        drv = _iodbcdm_getkeyvalinstr(szConnStrIn, cbConnStrIn,
+                                "DRIVER", drvbuf, sizeof(drvbuf));
+
+        dsn = _iodbcdm_getkeyvalinstr(szConnStrIn, cbConnStrIn,
+                                "DSN",    dsnbuf, sizeof(dsnbuf));
+
+        switch( fDriverCompletion )
+        {
+                case SQL_DRIVER_NOPROMPT:
+                        break;
+
+                case SQL_DRIVER_COMPLETE:
+                case SQL_DRIVER_COMPLETE_REQUIRED:
+                        if( dsn != NULL )
+                        {
+                                break;
+                        }
+                        /* fall to next case */
+                case SQL_DRIVER_PROMPT:
+                        /* Get data source dialog box function from
+                         * current executable */
+                        hdll = _iodbcdm_dllopen((char FAR*)NULL);
+                        dialproc = _iodbcdm_dllproc( hdll,
+                                        "_iodbcdm_drvconn_dialbox");
+
+                        if( dialproc == SQL_NULL_HPROC )
+                        {
+                                sqlstat = en_IM008;
+                                break;
+                        }
+
+                        retcode = dialproc(
+                                        hwnd,   /* window or display handle */
+                                        dsnbuf, /* input/output dsn buf */
+                                        sizeof(dsnbuf), /* buf size */
+                                        &sqlstat);      /* error code */
+
+                        if( retcode != SQL_SUCCESS )
+                        {
+                                break;
+                        }
+
+                        if( cbConnStrIn == SQL_NTS )
+                        {
+                                cbConnStrIn = STRLEN(szConnStrIn );
+                        }
+
+                        dsn = dsnbuf;
+
+                        if( dsn[0] == '\0' )
+                        {
+                                dsn = "default";
+                        }
+
+                        if( cbConnStrIn > sizeof(cnstr2drv)
+                                        - STRLEN(dsn) - STRLEN("DSN=;") -1 )
+                        {
+                                sqlstat = en_S1001; /* a lazy way to avoid
+                                                     * using heap memory */
+                                break;
+                        }
+
+                        sprintf(cnstr2drv, "DSN=%s;", dsn);
+                        cbConnStrIn += STRLEN(cnstr2drv);
+                        STRNCAT( cnstr2drv, szConnStrIn, cbConnStrIn );
+                        szConnStrIn = cnstr2drv;
+                        break;
+
+                default:
+                        sqlstat = en_S1110;
+                        break;
+        }
+
+        if( sqlstat != en_00000 )
+        {
+                PUSHSQLERR( pdbc->herr, sqlstat );
+
+                return SQL_ERROR;
+        }
+
+        if( dsn == NULL || dsn[0] == '\0' )
+        {
+                dsn = "default";
+        }
+        else    /* if you want tracing, you must use a DSN */
+        {
+                setopterr |= _iodbcdm_settracing( hdbc,
+                                        (char*)dsn, SQL_NTS );
+        }
+
+        if( drv == NULL || drv[0] == '\0' )
+        {
+                drv = _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS, "Driver",
+                                        drvbuf, sizeof(drvbuf));
+        }
+
+        if( drv == NULL )
+        {
+                PUSHSQLERR( pdbc->herr, en_IM002 );
+
+                return SQL_ERROR;
+        }
+
+        retcode = _iodbcdm_driverload( drv, hdbc );
+
+        switch( retcode )
+        {
+                case SQL_SUCCESS:
+                        break;
+
+                case SQL_SUCCESS_WITH_INFO:
+                        setopterr = SQL_ERROR;
+                        /* unsuccessed in calling driver's
+                         * SQLSetConnectOption() to set login
+                         * timeout.
+                         */
+                        break;
+
+                default:
+                        return retcode;
+        }
+
+        hproc = _iodbcdm_getproc( hdbc, en_DriverConnect );
+
+        if( hproc == SQL_NULL_HPROC )
+        {
+                _iodbcdm_driverunload( hdbc );
+
+                PUSHSQLERR ( pdbc->herr, en_IM001 );
+
+                return SQL_ERROR;
+        }
+ /* giovanni */
+        /*
+        ** OS/2 !!!
+        **
+        ** get new szDSN from INI file, if existing
+        */
+        strcpy( szNewDSN, "DSN=" );
+        if( NULL != _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS, "DSN",
+                                             (char FAR*) &szNewDSN[4],
+                                             sizeof(szNewDSN) - 4 ) )
+        {
+                char   *psz;
+
+                strcat( szNewDSN, ";UID=" );
+                psz = strtok( szNewDSN, "\0" );
+
+
+
+
+       if(NULL ==  _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
+                                       /*
+                                         "UID", psz, sizeof(szNewDSN) ))
+                                        */
+                                         "UID", (char FAR*) &szNewDSN[strlen(psz)],
+                                         (sizeof(szNewDSN) - strlen(psz)) ) )
+               {
+                _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS,
+                                         "UID", (char FAR*) &szNewDSN[strlen(psz)],
+                                         (sizeof(szNewDSN) - strlen(psz)) );
+               }
+                strcat( szNewDSN, ";PWD=" );
+                psz = strtok( szNewDSN, "\0" );
+       if(NULL ==  _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
+                                        /*
+                                         "PWD", psz, sizeof(szNewDSN) ))
+                                        */
+                                         "PWD", (char FAR*) &szNewDSN[strlen(psz)],
+                                         (sizeof(szNewDSN) - strlen(psz)) ) )
+               {
 
+                _iodbcdm_getkeyvalbydsn( dsn, SQL_NTS,
+                                         "PWD", (char FAR*) &szNewDSN[strlen(psz)],
+                                         (sizeof(szNewDSN) - strlen(psz)) );
+               }
+/*
+new from dirk
+       {
+                register char   *psz;
+
+                strcat( szNewDSN, ";UID=" );
+                psz = strtok( szNewDSN, "\0" );
+                _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
+                                         "UID", psz, sizeof(szNewDSN) );
+                strcat( szNewDSN, ";PWD=" );
+                psz = strtok( szNewDSN, "\0" );
+                _iodbcdm_getkeyvalinstr( szConnStrIn, cbConnStrIn,
+                                         "PWD", psz, sizeof(szNewDSN) );
+                szConnStrIn = &szNewDSN[0];
+                cbConnStrIn = SQL_NTS;
+        }
+
+
+*/
+       /******** giovanni & monty ********/
+       /* Add a lot of optional keywords */
+       {
+         static char *keywords[]= { "SERVER","PORT","SOCKET","OPTION","DB",0 };
+         char buff[80],**key,*end;
+
+         psz= szNewDSN+strlen(szNewDSN);
+         end= szNewDSN+sizeof(szNewDSN);
+         for (key=keywords ; *key ; key++)
+         {
+           if (_iodbcdm_getkeyvalbydsn(dsn, SQL_NTS,
+                                       *key, (char FAR*) buff,
+                                       sizeof(buff)) &&
+               strlen(*key)+strlen(buff)+2 < (int) (end - psz))
+           {
+             *psz++=';';
+             strcpy(psz,*key); psz+=strlen(*key);
+             *psz++='=';
+             strcpy(psz,buff); psz+=strlen(buff);            
+           }
+         }
+       }
+       *psz=0;
+       /******** giovanni */
+       szConnStrIn = szNewDSN;  /*giovanni, era &szNewDSN */
+       cbConnStrIn = SQL_NTS;
+        }
+ /* giovanni */
+        CALL_DRIVER ( hdbc, retcode, hproc, en_DriverConnect, (
+                        pdbc->dhdbc, hwnd,
+                        szConnStrIn, cbConnStrIn,
+                        szConnStrOut, cbConnStrOutMax,
+                        pcbConnStrOut, fDriverCompletion ) )
 #if 0
-       retcode = hproc(pdbc->dhdbc, hwnd,
-                       szConnStrIn, cbConnStrIn,
-                       szConnStrOut, cbConnStrOutMax,
-                       pcbConnStrOut, fDriverCompletion );
+        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 );
-               *********/
+        if( retcode != SQL_SUCCESS
+         && retcode != SQL_SUCCESS_WITH_INFO )
+        {
+                /* don't unload driver here for retrive
+                 * error message from driver */
+                /********
+                _iodbcdm_driverunload( hdbc );
+                *********/
 
-               return retcode;
-       }
+                return retcode;
+        }
 
-       /* state transition */
-       pdbc->state = en_dbc_connected;
+        /* state transition */
+        pdbc->state = en_dbc_connected;
 
-       /* do delaid option setting */
-       setopterr |= _iodbcdm_dbcdelayset( hdbc );
+        /* do delaid option setting */
+        setopterr |= _iodbcdm_dbcdelayset( hdbc );
 
-       if( setopterr != SQL_SUCCESS )
-       {
-               return SQL_SUCCESS_WITH_INFO;
-       }
+        if( setopterr != SQL_SUCCESS )
+        {
+                return SQL_SUCCESS_WITH_INFO;
+        }
 
-       return retcode;
+        return retcode;
 }
 
-RETCODE SQL_API        SQLBrowseConnect ( 
-                       HDBC            hdbc,
-                       HWND            hwnd,
-                       UCHAR FAR*      szConnStrIn,
-                       SWORD           cbConnStrIn,
-                       UCHAR FAR*      szConnStrOut,
-                       SWORD           cbConnStrOutMax,
-                       SWORD FAR*      pcbConnStrOut )
+RETCODE SQL_API SQLBrowseConnect (
+                        HDBC            hdbc,
+                        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 );
+        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 ) )
 
-               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 );
+#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;
+        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 )
+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 ) )
+        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 );
+        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( 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 );
+        retcode = _iodbcdm_driverunload( hdbc );
 #endif
 
-       /* state transition */
-       if( retcode == SQL_SUCCESS )
-       {
-               pdbc->state = en_dbc_allocated;
-       }
+        /* state transition */
+        if( retcode == SQL_SUCCESS )
+        {
+                pdbc->state = en_dbc_allocated;
+        }
 
-       return retcode;
+        return retcode;
 }
 
-RETCODE SQL_API        SQLNativeSql(
-                       HDBC            hdbc,
-                       UCHAR  FAR*     szSqlStrIn,
-                       SDWORD          cbSqlStrIn,
-                       UCHAR  FAR*     szSqlStr,
-                       SDWORD          cbSqlStrMax,
-                       SDWORD FAR*     pcbSqlStr )
+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 ) )
+        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 );
+        retcode = hproc(pdbc->dhdbc,
+                        szSqlStrIn,
+                        cbSqlStrIn,
+                        szSqlStr,
+                        cbSqlStrMax,
+                        pcbSqlStr );
 #endif
 
-       return retcode;
+        return retcode;
 }