#include <iodbc.h>
#include <sql.h>
#include <sqlext.h>
#include <dlproc.h>
#include <herr.h>
#include <henv.h>
#include <hdbc.h>
#include <hstmt.h>
#include <itrace.h>
SQLRETURN SQL_API
SQLFetch (SQLHSTMT hstmt)
{
STMT (pstmt, hstmt);
HPROC hproc = SQL_NULL_HPROC;
SQLRETURN retcode;
ENTER_STMT (pstmt);
if (pstmt->asyn_on == en_NullProc)
{
switch (pstmt->state)
{
case en_stmt_allocated:
case en_stmt_prepared:
case en_stmt_xfetched:
case en_stmt_needdata:
case en_stmt_mustput:
case en_stmt_canput:
PUSHSQLERR (pstmt->herr, en_S1010);
LEAVE_STMT (pstmt, SQL_ERROR);
default:
break;
}
}
else if (pstmt->asyn_on != en_Fetch)
{
PUSHSQLERR (pstmt->herr, en_S1010);
LEAVE_STMT (pstmt, SQL_ERROR);
}
#if (ODBCVER >= 0x0300)
if (((ENV_t FAR *) ((DBC_t FAR *) pstmt->hdbc)->henv)->dodbc_ver ==
SQL_OV_ODBC2
&& ((GENV_t FAR *) ((DBC_t FAR *) pstmt->hdbc)->genv)->odbc_ver ==
SQL_OV_ODBC3)
{
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ExtendedFetch);
if (hproc)
{
CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_ExtendedFetch,
(pstmt->dhstmt, SQL_FETCH_NEXT, 0, pstmt->rows_fetched_ptr,
pstmt->row_status_ptr));
}
}
#endif
if (hproc == SQL_NULL_HPROC)
{
hproc = _iodbcdm_getproc (pstmt->hdbc, en_Fetch);
if (hproc == SQL_NULL_HPROC)
{
PUSHSQLERR (pstmt->herr, en_IM001);
LEAVE_STMT (pstmt, SQL_ERROR);
}
CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_Fetch,
(pstmt->dhstmt));
}
if (pstmt->asyn_on == en_Fetch)
{
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
case SQL_NO_DATA_FOUND:
case SQL_ERROR:
pstmt->asyn_on = en_NullProc;
break;
case SQL_STILL_EXECUTING:
default:
LEAVE_STMT (pstmt, retcode);
}
}
switch (pstmt->state)
{
case en_stmt_cursoropen:
case en_stmt_fetched:
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
pstmt->state = en_stmt_fetched;
pstmt->cursor_state = en_stmt_cursor_fetched;
break;
case SQL_NO_DATA_FOUND:
if (pstmt->prep_state)
{
pstmt->state = en_stmt_prepared;
}
else
{
pstmt->state = en_stmt_allocated;
}
pstmt->cursor_state = en_stmt_cursor_no;
break;
case SQL_STILL_EXECUTING:
pstmt->asyn_on = en_Fetch;
break;
default:
break;
}
break;
default:
break;
}
LEAVE_STMT (pstmt, retcode);
}
SQLRETURN SQL_API
_iodbcdm_ExtendedFetch (
SQLHSTMT hstmt,
SQLUSMALLINT fFetchType,
SQLINTEGER irow,
SQLUINTEGER FAR * pcrow,
SQLUSMALLINT FAR * rgfRowStatus)
{
STMT (pstmt, hstmt);
HPROC hproc = SQL_NULL_HPROC;
SQLRETURN retcode;
if (fFetchType < SQL_FETCH_NEXT || fFetchType > SQL_FETCH_BOOKMARK)
{
PUSHSQLERR (pstmt->herr, en_S1106);
return SQL_ERROR;
}
if (pstmt->asyn_on == en_NullProc)
{
switch (pstmt->state)
{
case en_stmt_allocated:
case en_stmt_prepared:
case en_stmt_fetched:
case en_stmt_needdata:
case en_stmt_mustput:
case en_stmt_canput:
PUSHSQLERR (pstmt->herr, en_S1010);
return SQL_ERROR;
default:
break;
}
}
else if (pstmt->asyn_on != en_ExtendedFetch)
{
PUSHSQLERR (pstmt->herr, en_S1010);
return SQL_ERROR;
}
if (fFetchType == SQL_FETCH_NEXT ||
fFetchType == SQL_FETCH_PRIOR ||
fFetchType == SQL_FETCH_FIRST || fFetchType == SQL_FETCH_LAST)
{
irow = 0;
}
hproc = _iodbcdm_getproc (pstmt->hdbc, en_ExtendedFetch);
if (hproc == SQL_NULL_HPROC)
{
PUSHSQLERR (pstmt->herr, en_IM001);
return SQL_ERROR;
}
CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_ExtendedFetch,
(pstmt->dhstmt, fFetchType, irow, pcrow, rgfRowStatus));
if (pstmt->asyn_on == en_ExtendedFetch)
{
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
case SQL_NO_DATA_FOUND:
case SQL_ERROR:
pstmt->asyn_on = en_NullProc;
break;
case SQL_STILL_EXECUTING:
default:
return retcode;
}
}
switch (pstmt->state)
{
case en_stmt_cursoropen:
case en_stmt_xfetched:
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
case SQL_NO_DATA_FOUND:
pstmt->state = en_stmt_xfetched;
pstmt->cursor_state = en_stmt_cursor_xfetched;
break;
case SQL_STILL_EXECUTING:
pstmt->asyn_on = en_ExtendedFetch;
break;
default:
break;
}
break;
default:
break;
}
return retcode;
}
SQLRETURN SQL_API
SQLExtendedFetch (SQLHSTMT hstmt,
SQLUSMALLINT fFetchType,
SQLINTEGER irow, SQLUINTEGER FAR * pcrow, SQLUSMALLINT FAR * rgfRowStatus)
{
STMT (pstmt, hstmt);
SQLRETURN retcode;
ENTER_STMT (pstmt);
retcode =
_iodbcdm_ExtendedFetch (hstmt, fFetchType, irow, pcrow, rgfRowStatus);
LEAVE_STMT (pstmt, retcode);
}
SQLRETURN SQL_API
SQLGetData (SQLHSTMT hstmt,
SQLUSMALLINT icol,
SQLSMALLINT fCType,
SQLPOINTER rgbValue, SQLINTEGER cbValueMax, SQLINTEGER FAR * pcbValue)
{
STMT (pstmt, hstmt);
HPROC hproc;
SQLRETURN retcode;
int sqlstat = en_00000;
ENTER_STMT (pstmt);
if (rgbValue == NULL)
{
sqlstat = en_S1009;
}
else if (cbValueMax < 0)
{
sqlstat = en_S1090;
}
else
{
switch (fCType)
{
case SQL_C_DEFAULT:
case SQL_C_BINARY:
case SQL_C_BIT:
case SQL_C_CHAR:
case SQL_C_DATE:
case SQL_C_DOUBLE:
case SQL_C_FLOAT:
case SQL_C_LONG:
case SQL_C_SHORT:
case SQL_C_SLONG:
case SQL_C_SSHORT:
case SQL_C_STINYINT:
case SQL_C_TIME:
case SQL_C_TIMESTAMP:
case SQL_C_TINYINT:
case SQL_C_ULONG:
case SQL_C_USHORT:
case SQL_C_UTINYINT:
#if (ODBCVER >= 0x0300)
case SQL_C_GUID:
case SQL_C_INTERVAL_DAY:
case SQL_C_INTERVAL_DAY_TO_HOUR:
case SQL_C_INTERVAL_DAY_TO_MINUTE:
case SQL_C_INTERVAL_DAY_TO_SECOND:
case SQL_C_INTERVAL_HOUR:
case SQL_C_INTERVAL_HOUR_TO_MINUTE:
case SQL_C_INTERVAL_HOUR_TO_SECOND:
case SQL_C_INTERVAL_MINUTE:
case SQL_C_INTERVAL_MINUTE_TO_SECOND:
case SQL_C_INTERVAL_MONTH:
case SQL_C_INTERVAL_SECOND:
case SQL_C_INTERVAL_YEAR:
case SQL_C_INTERVAL_YEAR_TO_MONTH:
case SQL_C_NUMERIC:
case SQL_C_SBIGINT:
case SQL_C_TYPE_DATE:
case SQL_C_TYPE_TIME:
case SQL_C_TYPE_TIMESTAMP:
case SQL_C_UBIGINT:
#endif
break;
default:
sqlstat = en_S1003;
break;
}
}
if (sqlstat != en_00000)
{
PUSHSQLERR (pstmt->herr, sqlstat);
LEAVE_STMT (pstmt, SQL_ERROR);
}
if (pstmt->asyn_on == en_NullProc)
{
switch (pstmt->state)
{
case en_stmt_allocated:
case en_stmt_prepared:
case en_stmt_needdata:
case en_stmt_mustput:
case en_stmt_canput:
sqlstat = en_S1010;
break;
case en_stmt_executed:
case en_stmt_cursoropen:
sqlstat = en_24000;
break;
default:
break;
}
}
else if (pstmt->asyn_on != en_GetData)
{
sqlstat = en_S1010;
}
if (sqlstat != en_00000)
{
PUSHSQLERR (pstmt->herr, sqlstat);
LEAVE_STMT (pstmt, SQL_ERROR);
}
hproc = _iodbcdm_getproc (pstmt->hdbc, en_GetData);
if (hproc == SQL_NULL_HPROC)
{
PUSHSQLERR (pstmt->herr, en_IM001);
LEAVE_STMT (pstmt, SQL_ERROR);
}
CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_GetData,
(pstmt->dhstmt, icol, fCType, rgbValue, cbValueMax, pcbValue));
if (pstmt->asyn_on == en_GetData)
{
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
case SQL_NO_DATA_FOUND:
case SQL_ERROR:
pstmt->asyn_on = en_NullProc;
break;
case SQL_STILL_EXECUTING:
default:
LEAVE_STMT (pstmt, retcode);
}
}
switch (pstmt->state)
{
case en_stmt_fetched:
case en_stmt_xfetched:
if (retcode == SQL_STILL_EXECUTING)
{
pstmt->asyn_on = en_GetData;
break;
}
break;
default:
break;
}
LEAVE_STMT (pstmt, retcode);
}
SQLRETURN SQL_API
SQLMoreResults (SQLHSTMT hstmt)
{
STMT (pstmt, hstmt);
HPROC hproc;
SQLRETURN retcode;
ENTER_STMT (pstmt);
if (pstmt->asyn_on == en_NullProc)
{
switch (pstmt->state)
{
#if 0
case en_stmt_allocated:
case en_stmt_prepared:
LEAVE_STMT (pstmt, SQL_NO_DATA_FOUND);
#endif
case en_stmt_needdata:
case en_stmt_mustput:
case en_stmt_canput:
PUSHSQLERR (pstmt->herr, en_S1010);
LEAVE_STMT (pstmt, SQL_ERROR);
default:
break;
}
}
else if (pstmt->asyn_on != en_MoreResults)
{
PUSHSQLERR (pstmt->herr, en_S1010);
LEAVE_STMT (pstmt, SQL_ERROR);
}
hproc = _iodbcdm_getproc (pstmt->hdbc, en_MoreResults);
if (hproc == SQL_NULL_HPROC)
{
PUSHSQLERR (pstmt->herr, en_IM001);
LEAVE_STMT (pstmt, SQL_ERROR);
}
CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_MoreResults,
(pstmt->dhstmt));
if (pstmt->asyn_on == en_MoreResults)
{
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
case SQL_NO_DATA_FOUND:
case SQL_ERROR:
pstmt->asyn_on = en_NullProc;
break;
case SQL_STILL_EXECUTING:
default:
LEAVE_STMT (pstmt, retcode);
}
}
switch (pstmt->state)
{
case en_stmt_allocated:
case en_stmt_prepared:
if (pstmt->prep_state)
{
pstmt->state = en_stmt_cursoropen;
}
else
{
pstmt->state = en_stmt_prepared;
}
break;
case en_stmt_executed:
if (retcode == SQL_NO_DATA_FOUND)
{
if (pstmt->prep_state)
{
pstmt->state = en_stmt_prepared;
}
else
{
pstmt->state = en_stmt_cursoropen;
}
}
else if (retcode == SQL_STILL_EXECUTING)
{
pstmt->asyn_on = en_MoreResults;
}
break;
case en_stmt_cursoropen:
case en_stmt_fetched:
case en_stmt_xfetched:
if (retcode == SQL_SUCCESS)
{
break;
}
else if (retcode == SQL_NO_DATA_FOUND)
{
if (pstmt->prep_state)
{
pstmt->state = en_stmt_prepared;
}
else
{
pstmt->state = en_stmt_allocated;
}
}
else if (retcode == SQL_STILL_EXECUTING)
{
pstmt->asyn_on = en_MoreResults;
}
break;
default:
break;
}
LEAVE_STMT (pstmt, retcode);
}
SQLRETURN SQL_API
_iodbcdm_SetPos (SQLHSTMT hstmt,
SQLUSMALLINT irow, SQLUSMALLINT fOption, SQLUSMALLINT fLock)
{
STMT (pstmt, hstmt);
HPROC hproc;
SQLRETURN retcode;
int sqlstat = en_00000;
if (fOption > SQL_ADD || fLock > SQL_LOCK_UNLOCK)
{
PUSHSQLERR (pstmt->herr, en_S1009);
return SQL_ERROR;
}
if (pstmt->asyn_on == en_NullProc)
{
switch (pstmt->state)
{
case en_stmt_allocated:
case en_stmt_prepared:
case en_stmt_fetched:
case en_stmt_needdata:
case en_stmt_mustput:
case en_stmt_canput:
sqlstat = en_S1010;
break;
case en_stmt_executed:
case en_stmt_cursoropen:
sqlstat = en_24000;
break;
default:
break;
}
}
else if (pstmt->asyn_on != en_SetPos)
{
sqlstat = en_S1010;
}
if (sqlstat != en_00000)
{
PUSHSQLERR (pstmt->herr, sqlstat);
return SQL_ERROR;
}
hproc = _iodbcdm_getproc (pstmt->hdbc, en_SetPos);
if (hproc == SQL_NULL_HPROC)
{
PUSHSQLERR (pstmt->herr, en_IM001);
return SQL_ERROR;
}
CALL_DRIVER (pstmt->hdbc, pstmt, retcode, hproc, en_SetPos,
(pstmt->dhstmt, irow, fOption, fLock));
if (pstmt->asyn_on == en_SetPos)
{
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
case SQL_NEED_DATA:
case SQL_ERROR:
pstmt->asyn_on = en_NullProc;
break;
case SQL_STILL_EXECUTING:
default:
return retcode;
}
}
switch (retcode)
{
case SQL_SUCCESS:
case SQL_SUCCESS_WITH_INFO:
break;
case SQL_NEED_DATA:
pstmt->state = en_stmt_needdata;
pstmt->need_on = en_SetPos;
break;
case SQL_STILL_EXECUTING:
pstmt->asyn_on = en_SetPos;
break;
default:
break;
}
return retcode;
}
SQLRETURN SQL_API
SQLSetPos (SQLHSTMT hstmt,
SQLUSMALLINT irow, SQLUSMALLINT fOption, SQLUSMALLINT fLock)
{
STMT (pstmt, hstmt);
SQLRETURN retcode;
ENTER_STMT (pstmt);
retcode = _iodbcdm_SetPos (hstmt, irow, fOption, fLock);
LEAVE_STMT (pstmt, retcode);
}