X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d73e5a104a6c61d942c223d053a38626599b893..a7c8e710e944fc12a81a19d06fe415a92e86bb13:/src/iodbc/execute.c

diff --git a/src/iodbc/execute.c b/src/iodbc/execute.c
index eb2633a6ed..64d71d6ba5 100644
--- a/src/iodbc/execute.c
+++ b/src/iodbc/execute.c
@@ -1,789 +1,768 @@
-/** 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 )
+/*
+ *  execute.c
+ *
+ *  $Id$
+ *
+ *  Invoke a query
+ *
+ *  The iODBC driver manager.
+ *  
+ *  Copyright (C) 1995 by Ke Jin <kejin@empress.com> 
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public
+ *  License along with this library; if not, write to the Free
+ *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include	"config.h"
+
+#include	"isql.h"
+#include	"isqlext.h"
+
+#include        "dlproc.h"
+
+#include	"herr.h"
+#include	"henv.h"
+#include	"hdbc.h"
+#include	"hstmt.h"
+
+#include	"itrace.h"
+
+static void 
+do_cursoropen (STMT_t FAR * pstmt)
 {
-	STMT_t FAR*	pstmt	= (STMT_t FAR*)hstmt;
-	HPROC		hproc	= SQL_NULL_HPROC;
-	RETCODE		retcode;
+  RETCODE retcode;
+  SWORD ncol;
 
-	int		sqlstat	= en_00000;
+  pstmt->state = en_stmt_executed;
 
-	if( hstmt == SQL_NULL_HSTMT 
-	 || pstmt->hdbc == SQL_NULL_HDBC )
-	{
-		return SQL_INVALID_HANDLE;
-	} 
+  retcode = SQLNumResultCols (pstmt, &ncol);
 
-	/* check state */
-	if( pstmt->asyn_on == en_NullProc )
+  if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
+    {
+      if (ncol)
 	{
-		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;
-		}
+	  pstmt->state = en_stmt_cursoropen;
+	  pstmt->cursor_state = en_stmt_cursor_opened;
 	}
-	else if( pstmt->asyn_on != en_Execute )
+      else
 	{
-		sqlstat = en_S1010;
+	  pstmt->state = en_stmt_executed;
+	  pstmt->cursor_state = en_stmt_cursor_no;
 	}
-	
-	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 )
+RETCODE SQL_API 
+SQLExecute (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 value */
-	if( rgbValue == NULL
-	 && ( cbValue != SQL_DEFAULT_PARAM
-	   && cbValue != SQL_NULL_DATA ) )
-	{
-		PUSHSQLERR ( pstmt->herr, en_S1009 );
-
-		return SQL_ERROR;
-	}
-
-	/* check state */
-	if( pstmt->asyn_on == en_NullProc )
-	{
-		if( pstmt->state <= en_stmt_xfetched )
-		{
-			PUSHSQLERR( pstmt->herr, en_S1010 );
-
-			return SQL_ERROR;
-		}
-	}
-	else if( pstmt->asyn_on != en_PutData )
-	{
-		PUSHSQLERR ( pstmt->herr, en_S1010 );
-
-		return SQL_ERROR;
-	}
-
-	/* call driver */
-	hproc = _iodbcdm_getproc( pstmt->hdbc, en_PutData );
-
-	if( hproc == SQL_NULL_HPROC )
-	{
-		PUSHSQLERR ( pstmt->herr, en_IM001 );
-
-		return SQL_ERROR;
-	}
-	
-	CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_PutData, (
-			pstmt->dhstmt, rgbValue, cbValue ) )
-
-#if 0
-	retcode = hproc(pstmt->dhstmt, rgbValue, cbValue );
-#endif
-
-	/* state transition */
-	if( pstmt->asyn_on == en_PutData )
-	{
-		switch( retcode )
-		{
-			case SQL_SUCCESS:
-			case SQL_SUCCESS_WITH_INFO:
-			case SQL_ERROR:
-				pstmt->asyn_on = en_NullProc;
-				break;
-
-			case SQL_STILL_EXECUTING:
-			default:
-				return retcode;
-		}
-	}
-
-	/* must in mustput or canput states */
-	switch( retcode )
-	{
-		case SQL_SUCCESS:
-		case SQL_SUCCESS_WITH_INFO:
-			pstmt->state = en_stmt_canput;
-			break;
-
-		case SQL_ERROR:
-			switch( pstmt->need_on )
-			{
-				case en_ExecDirect:
-					pstmt->state = en_stmt_allocated;
-					pstmt->need_on = en_NullProc;
-					break;
-
-				case en_Execute:
-					if( pstmt->prep_state )
-					{
-						pstmt->state = en_stmt_prepared;
-						pstmt->need_on = en_NullProc;
-					}
-					break;
-
-				case en_SetPos:
-					/* Is this possible ???? */
-					pstmt->state = en_stmt_xfetched;
-					break;
-
-				default:
-					break;
-			}
-			break;
-
-		case SQL_STILL_EXECUTING:
-			pstmt->asyn_on = en_PutData;
-			break;
-
-		default:
-			break;
-	}
-
-	return retcode;
+  STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+  HPROC hproc = SQL_NULL_HPROC;
+  RETCODE retcode;
+
+  int sqlstat = en_00000;
+
+  if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+    {
+      return SQL_INVALID_HANDLE;
+    }
+
+  /* check state */
+  if (pstmt->asyn_on == en_NullProc)
+    {
+      switch (pstmt->state)
+	 {
+	 case en_stmt_allocated:
+	   sqlstat = en_S1010;
+	   break;
+
+	 case en_stmt_executed:
+	   if (!pstmt->prep_state)
+	     {
+	       sqlstat = en_S1010;
+	     }
+	   break;
+
+	 case en_stmt_cursoropen:
+	   if (!pstmt->prep_state)
+	     {
+	       sqlstat = en_S1010;
+	     }
+	   break;
+
+	 case en_stmt_fetched:
+	 case en_stmt_xfetched:
+	   if (!pstmt->prep_state)
+	     {
+	       sqlstat = en_S1010;
+	     }
+	   else
+	     {
+	       sqlstat = en_24000;
+	     }
+	   break;
+
+	 case en_stmt_needdata:
+	 case en_stmt_mustput:
+	 case en_stmt_canput:
+	   sqlstat = en_S1010;
+	   break;
+
+	 default:
+	   break;
+	 }
+    }
+  else if (pstmt->asyn_on != en_Execute)
+    {
+      sqlstat = en_S1010;
+    }
+
+  if (sqlstat == en_00000)
+    {
+      hproc = _iodbcdm_getproc (pstmt->hdbc, en_Execute);
+
+      if (hproc == SQL_NULL_HPROC)
+	{
+	  sqlstat = en_IM001;
+	}
+    }
+
+  if (sqlstat != en_00000)
+    {
+      PUSHSQLERR (pstmt->herr, sqlstat);
+
+      return SQL_ERROR;
+    }
+
+  CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_Execute,
+    (pstmt->dhstmt))
+
+  /* stmt state transition */
+  if (pstmt->asyn_on == en_Execute)
+    {
+      switch (retcode)
+	 {
+	 case SQL_SUCCESS:
+	 case SQL_SUCCESS_WITH_INFO:
+	 case SQL_NEED_DATA:
+	 case SQL_ERROR:
+	   pstmt->asyn_on = en_NullProc;
+	   break;
+
+	 case SQL_STILL_EXECUTING:
+	 default:
+	   return retcode;
+	 }
+    }
+
+  switch (pstmt->state)
+     {
+     case en_stmt_prepared:
+       switch (retcode)
+	  {
+	  case SQL_SUCCESS:
+	  case SQL_SUCCESS_WITH_INFO:
+	    do_cursoropen (hstmt);
+	    break;
+
+	  case SQL_NEED_DATA:
+	    pstmt->state = en_stmt_needdata;
+	    pstmt->need_on = en_Execute;
+	    break;
+
+	  case SQL_STILL_EXECUTING:
+	    pstmt->asyn_on = en_Execute;
+	    break;
+
+	  default:
+	    break;
+	  }
+       break;
+
+     case en_stmt_executed:
+       switch (retcode)
+	  {
+	  case SQL_ERROR:
+	    pstmt->state = en_stmt_allocated;
+	    pstmt->cursor_state = en_stmt_cursor_no;
+	    pstmt->prep_state = 0;
+	    break;
+
+	  case SQL_NEED_DATA:
+	    pstmt->state = en_stmt_needdata;
+	    pstmt->need_on = en_Execute;
+	    break;
+
+	  case SQL_STILL_EXECUTING:
+	    pstmt->asyn_on = en_Execute;
+	    break;
+
+	  default:
+	    break;
+	  }
+       break;
+
+     default:
+       break;
+     }
+
+  return retcode;
 }
 
-RETCODE SQL_API	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 
+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))
+
+  /* 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	SQLNumParams (
-			HSTMT		hstmt,
-			SWORD FAR*	pcpar )
+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 */
-
-	/* check state */
-	if( pstmt->asyn_on == en_NullProc )
-	{
-		switch( pstmt->state )
-		{
-			case en_stmt_allocated:
-			case en_stmt_needdata:
-			case en_stmt_mustput:
-			case en_stmt_canput:
-				PUSHSQLERR ( pstmt->herr, en_S1010 );
-				return SQL_ERROR;
-	
-			default:
-				break;
-		}
-	}
-	else if( pstmt->asyn_on != en_NumParams )
-	{
-		PUSHSQLERR ( pstmt->herr, en_S1010 );
-		
-		return SQL_ERROR;
-	}
-
-	/* call driver */
-	hproc = _iodbcdm_getproc ( pstmt->hdbc, en_NumParams );
-
-	if( hproc == SQL_NULL_HPROC )
-	{
-		PUSHSQLERR ( pstmt->herr, en_IM001 );
-
-		return SQL_ERROR;
-	}
-	
-	CALL_DRIVER ( pstmt->hdbc, retcode, hproc, en_NumParams, (
-			pstmt->dhstmt, pcpar) )
-
-
-#if 0
-	retcode = hproc ( pstmt->dhstmt, pcpar );
-#endif
-
-	/* state transition */
-	if( pstmt->asyn_on == en_NumParams )
-	{
-		switch ( retcode )
-		{
-			case SQL_SUCCESS:
-			case SQL_SUCCESS_WITH_INFO:
-			case SQL_ERROR:
-				break;
-
-			default:
-				return retcode;
-		}
-	}
-
-	if( retcode == SQL_STILL_EXECUTING )
-	{
-		pstmt->asyn_on = en_NumParams;
-	}
-
-	return retcode;
+  STMT_t FAR *pstmt = (STMT_t FAR *) hstmt;
+  HPROC hproc;
+  RETCODE retcode;
+
+  if (hstmt == SQL_NULL_HSTMT || pstmt->hdbc == SQL_NULL_HDBC)
+    {
+      return SQL_INVALID_HANDLE;
+    }
+
+  /* check argument value */
+  if (rgbValue == NULL && 
+	(cbValue != SQL_DEFAULT_PARAM && cbValue != SQL_NULL_DATA))
+    {
+      PUSHSQLERR (pstmt->herr, en_S1009);
+
+      return SQL_ERROR;
+    }
+
+  /* check state */
+  if (pstmt->asyn_on == en_NullProc)
+    {
+      if (pstmt->state <= en_stmt_xfetched)
+	{
+	  PUSHSQLERR (pstmt->herr, en_S1010);
+
+	  return SQL_ERROR;
+	}
+    }
+  else if (pstmt->asyn_on != en_PutData)
+    {
+      PUSHSQLERR (pstmt->herr, en_S1010);
+
+      return SQL_ERROR;
+    }
+
+  /* call driver */
+  hproc = _iodbcdm_getproc (pstmt->hdbc, en_PutData);
+
+  if (hproc == SQL_NULL_HPROC)
+    {
+      PUSHSQLERR (pstmt->herr, en_IM001);
+
+      return SQL_ERROR;
+    }
+
+  CALL_DRIVER (pstmt->hdbc, retcode, hproc, en_PutData,
+    (pstmt->dhstmt, rgbValue, cbValue))
+
+  /* state transition */
+  if (pstmt->asyn_on == en_PutData)
+    {
+      switch (retcode)
+	 {
+	 case SQL_SUCCESS:
+	 case SQL_SUCCESS_WITH_INFO:
+	 case SQL_ERROR:
+	   pstmt->asyn_on = en_NullProc;
+	   break;
+
+	 case SQL_STILL_EXECUTING:
+	 default:
+	   return retcode;
+	 }
+    }
+
+  /* must in mustput or canput states */
+  switch (retcode)
+     {
+     case SQL_SUCCESS:
+     case SQL_SUCCESS_WITH_INFO:
+       pstmt->state = en_stmt_canput;
+       break;
+
+     case SQL_ERROR:
+       switch (pstmt->need_on)
+	  {
+	  case en_ExecDirect:
+	    pstmt->state = en_stmt_allocated;
+	    pstmt->need_on = en_NullProc;
+	    break;
+
+	  case en_Execute:
+	    if (pstmt->prep_state)
+	      {
+		pstmt->state = en_stmt_prepared;
+		pstmt->need_on = en_NullProc;
+	      }
+	    break;
+
+	  case en_SetPos:
+	    /* Is this possible ???? */
+	    pstmt->state = en_stmt_xfetched;
+	    break;
+
+	  default:
+	    break;
+	  }
+       break;
+
+     case SQL_STILL_EXECUTING:
+       pstmt->asyn_on = en_PutData;
+       break;
+
+     default:
+       break;
+     }
+
+  return retcode;
 }
 
-RETCODE SQL_API	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 );
+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))
+
+  /* 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;
+}
 
-		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;
-		}
-	}
+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))
+
+  /* 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;
+}
 
-	if( retcode == SQL_STILL_EXECUTING )
-	{
-		pstmt->asyn_on = en_DescribeParam;
-	}
 
-	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))
+
+  /* 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;
 }