in src/odbc/rsodbc/rsoptions.cpp [663:911]
SQLRETURN SQL_API RsOptions::RS_SQLGetStmtAttr(SQLHSTMT phstmt,
SQLINTEGER iAttribute,
SQLPOINTER pValue,
SQLINTEGER cbLen,
SQLINTEGER *pcbLen)
{
SQLRETURN rc = SQL_SUCCESS;
int *piVal = (int *)pValue;
RS_STMT_INFO *pStmt = (RS_STMT_INFO *)phstmt;
RS_STMT_ATTR_INFO *pStmtAttr;
// Validate the handle
if(!VALID_HSTMT(phstmt))
{
rc = SQL_INVALID_HANDLE;
goto error;
}
// Clear error list
pStmt->pErrorList = clearErrorList(pStmt->pErrorList);
if(!pValue)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY000", "Output buffer is NULL", 0, NULL);
goto error;
}
pStmtAttr = pStmt->pStmtAttr;
switch(iAttribute)
{
case SQL_ATTR_APP_PARAM_DESC:
{
*(void **) pValue = pStmtAttr->pAPD;
if(pcbLen)
*pcbLen = sizeof(void *);
break;
}
case SQL_ATTR_APP_ROW_DESC:
{
*(void **) pValue = pStmtAttr->pARD;
if(pcbLen)
*pcbLen = sizeof(void *);
break;
}
case SQL_ATTR_ASYNC_ENABLE:
{
*piVal = pStmtAttr->iAsyncEnable;
break;
}
case SQL_ATTR_CONCURRENCY:
{
*piVal = pStmtAttr->iConcurrency;
break;
}
case SQL_ATTR_CURSOR_SCROLLABLE:
{
*piVal = pStmtAttr->iCursorScrollable;
break;
}
case SQL_ATTR_CURSOR_SENSITIVITY:
{
*piVal = pStmtAttr->iCursorSensitivity;
break;
}
case SQL_ATTR_CURSOR_TYPE:
{
*piVal = pStmtAttr->iCursorType;
break;
}
case SQL_ATTR_FETCH_BOOKMARK_PTR:
{
*(void **)pValue = pStmtAttr->pFetchBookmarkPtr;
if(pcbLen)
*pcbLen = sizeof(void *);
break;
}
case SQL_ATTR_IMP_PARAM_DESC:
{
*(void **)pValue = pStmt->pIPD;
if(pcbLen)
*pcbLen = sizeof(void *);
break;
}
case SQL_ATTR_IMP_ROW_DESC:
{
*(void **)pValue = pStmt->pIRD;
if(pcbLen)
*pcbLen = sizeof(void *);
break;
}
case SQL_ATTR_KEYSET_SIZE:
{
*piVal = pStmtAttr->iKeysetSize;
break;
}
case SQL_ATTR_MAX_LENGTH:
{
*piVal = pStmtAttr->iMaxLength;
break;
}
case SQL_ATTR_MAX_ROWS:
{
*piVal = pStmtAttr->iMaxRows;
break;
}
case SQL_ATTR_METADATA_ID:
{
*piVal = pStmtAttr->iMetaDataId;
break;
}
case SQL_ATTR_NOSCAN:
{
*piVal = pStmtAttr->iNoScan;
break;
}
case SQL_ATTR_PARAM_BIND_OFFSET_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmtAttr->pAPD, 0, SQL_DESC_BIND_OFFSET_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_PARAM_BIND_TYPE:
{
rc = RsDesc::RS_SQLGetDescField(pStmtAttr->pAPD, 0, SQL_DESC_BIND_TYPE, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_PARAM_OPERATION_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmtAttr->pAPD, 0, SQL_DESC_ARRAY_STATUS_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_PARAM_STATUS_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmt->pIPD, 0, SQL_DESC_ARRAY_STATUS_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_PARAMS_PROCESSED_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmt->pIPD, 0, SQL_DESC_ROWS_PROCESSED_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_PARAMSET_SIZE:
{
rc = RsDesc::RS_SQLGetDescField(pStmt->pAPD, 0, SQL_DESC_ARRAY_SIZE, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_QUERY_TIMEOUT:
{
*piVal = pStmtAttr->iQueryTimeout;
break;
}
case SQL_ATTR_RETRIEVE_DATA:
{
*piVal = pStmtAttr->iRetrieveData;
break;
}
case SQL_ATTR_ROW_ARRAY_SIZE:
case SQL_ROWSET_SIZE:
{
rc = RsDesc::RS_SQLGetDescField(pStmtAttr->pARD, 0, SQL_DESC_ARRAY_SIZE, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_ROW_BIND_OFFSET_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmtAttr->pARD, 0, SQL_DESC_BIND_OFFSET_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_ROW_BIND_TYPE:
{
rc = RsDesc::RS_SQLGetDescField(pStmtAttr->pARD, 0, SQL_DESC_BIND_TYPE, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_ROW_NUMBER:
{
*piVal = pStmtAttr->iRowNumber;
break;
}
case SQL_ATTR_ROW_OPERATION_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmtAttr->pARD, 0, SQL_DESC_ARRAY_STATUS_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_ROW_STATUS_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmt->pIRD, 0, SQL_DESC_ARRAY_STATUS_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_ROWS_FETCHED_PTR:
{
rc = RsDesc::RS_SQLGetDescField(pStmt->pIRD, 0, SQL_DESC_ROWS_PROCESSED_PTR, pValue, cbLen, pcbLen, TRUE);
break;
}
case SQL_ATTR_SIMULATE_CURSOR:
{
*piVal = pStmtAttr->iSimulateCursor;
break;
}
case SQL_ATTR_USE_BOOKMARKS:
{
*piVal = pStmtAttr->iUseBookmark;
break;
}
case SQL_ATTR_ENABLE_AUTO_IPD:
default:
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HYC00", "Optional feature not implemented::RS_SQLGetStmtAttr", 0, NULL);
goto error;
}
} // Switch
error:
return rc;
}