in src/odbc/rsodbc/rsoptions.cpp [1296:1651]
SQLRETURN SQL_API RsOptions::RS_SQLSetStmtAttr(SQLHSTMT phstmt,
SQLINTEGER iAttribute,
SQLPOINTER pValue,
SQLINTEGER cbLen)
{
SQLRETURN rc = SQL_SUCCESS;
RS_STMT_INFO *pStmt = (RS_STMT_INFO *)phstmt;
RS_STMT_ATTR_INFO *pStmtAttr;
int iVal = (int)(long)pValue;
if(!VALID_HSTMT(phstmt))
{
rc = SQL_INVALID_HANDLE;
goto error;
}
// Clear error list
pStmt->pErrorList = clearErrorList(pStmt->pErrorList);
pStmtAttr = pStmt->pStmtAttr;
switch(iAttribute)
{
case SQL_ATTR_APP_PARAM_DESC:
{
if(pValue)
{
pStmtAttr->pAPD = (RS_DESC_INFO *) pValue;
pStmtAttr->pAPD->iType = RS_APD;
}
else
pStmtAttr->pAPD = pStmt->pAPD;
break;
}
case SQL_ATTR_APP_ROW_DESC:
{
if(pValue)
{
pStmtAttr->pARD = (RS_DESC_INFO *) pValue;
pStmtAttr->pARD->iType = RS_ARD;
}
else
pStmtAttr->pARD = pStmt->pARD;
break;
}
case SQL_ATTR_ASYNC_ENABLE:
{
// Check valid values
if(iVal != SQL_ASYNC_ENABLE_OFF
&& iVal != SQL_ASYNC_ENABLE_ON)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
pStmtAttr->iAsyncEnable = iVal;
break;
}
case SQL_ATTR_CONCURRENCY:
{
if(iVal != SQL_CONCUR_READ_ONLY
&& iVal != SQL_CONCUR_LOCK
&& iVal != SQL_CONCUR_ROWVER
&& iVal != SQL_CONCUR_VALUES)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
if(iVal == SQL_CONCUR_LOCK
|| iVal == SQL_CONCUR_ROWVER)
{
rc = SQL_SUCCESS_WITH_INFO;
addError(&pStmt->pErrorList,"01S02", "Option value changed", 0, NULL);
goto error;
}
pStmtAttr->iConcurrency = iVal;
break;
}
case SQL_ATTR_CURSOR_SCROLLABLE:
{
if(iVal != SQL_NONSCROLLABLE
&& iVal != SQL_SCROLLABLE)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
pStmtAttr->iCursorScrollable = iVal;
break;
}
case SQL_ATTR_CURSOR_SENSITIVITY:
{
if(iVal != SQL_UNSPECIFIED
&& iVal != SQL_INSENSITIVE
&& iVal != SQL_SENSITIVE)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
if(iVal == SQL_SENSITIVE)
{
rc = SQL_SUCCESS_WITH_INFO;
addError(&pStmt->pErrorList,"01S02", "Option value changed", 0, NULL);
goto error;
}
pStmtAttr->iCursorSensitivity = iVal;
break;
}
case SQL_ATTR_CURSOR_TYPE:
{
if(iVal != SQL_CURSOR_FORWARD_ONLY
&& iVal != SQL_CURSOR_KEYSET_DRIVEN
&& iVal != SQL_CURSOR_DYNAMIC
&& iVal != SQL_CURSOR_STATIC)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
if(iVal == SQL_CURSOR_KEYSET_DRIVEN
|| iVal == SQL_CURSOR_DYNAMIC)
{
rc = SQL_SUCCESS_WITH_INFO;
addError(&pStmt->pErrorList,"01S02", "Option value changed", 0, NULL);
goto error;
}
pStmtAttr->iCursorType = iVal;
break;
}
case SQL_ATTR_FETCH_BOOKMARK_PTR:
{
pStmtAttr->pFetchBookmarkPtr = pValue;
break;
}
case SQL_ATTR_KEYSET_SIZE:
{
if(iVal != 0)
{
rc = SQL_SUCCESS_WITH_INFO;
addError(&pStmt->pErrorList,"01S02", "Option value changed", 0, NULL);
goto error;
}
pStmtAttr->iKeysetSize = iVal;
break;
}
case SQL_ATTR_MAX_LENGTH:
{
pStmtAttr->iMaxLength = iVal;
break;
}
case SQL_ATTR_MAX_ROWS:
{
pStmtAttr->iMaxRows = iVal;
break;
}
case SQL_ATTR_METADATA_ID:
{
if(iVal != SQL_TRUE && iVal != SQL_FALSE)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
pStmtAttr->iMetaDataId = iVal;
break;
}
case SQL_ATTR_NOSCAN:
{
if(iVal != SQL_NOSCAN_OFF
&& iVal != SQL_NOSCAN_ON)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
pStmtAttr->iNoScan = iVal;
break;
}
case SQL_ATTR_PARAM_BIND_OFFSET_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pAPD,0,SQL_DESC_BIND_OFFSET_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_PARAM_BIND_TYPE:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pAPD,0,SQL_DESC_BIND_TYPE,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_PARAM_OPERATION_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pAPD,0,SQL_DESC_ARRAY_STATUS_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_PARAM_STATUS_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmt->pIPD,0,SQL_DESC_ARRAY_STATUS_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_PARAMS_PROCESSED_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmt->pIPD,0,SQL_DESC_ROWS_PROCESSED_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_PARAMSET_SIZE:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pAPD,0,SQL_DESC_ARRAY_SIZE,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_QUERY_TIMEOUT:
{
if(iVal < 0)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
pStmtAttr->iQueryTimeout = iVal;
break;
}
case SQL_ATTR_RETRIEVE_DATA:
{
if(iVal != SQL_RD_OFF
&& iVal != SQL_RD_ON)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
pStmtAttr->iRetrieveData = iVal;
break;
}
case SQL_ATTR_ROW_ARRAY_SIZE:
case SQL_ROWSET_SIZE:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pARD,0,SQL_DESC_ARRAY_SIZE,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_ROW_BIND_OFFSET_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pARD,0,SQL_DESC_BIND_OFFSET_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_ROW_BIND_TYPE:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pARD,0,SQL_DESC_BIND_TYPE,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_ROW_OPERATION_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmtAttr->pARD,0,SQL_DESC_ARRAY_STATUS_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_ROW_STATUS_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmt->pIRD,0,SQL_DESC_ARRAY_STATUS_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_ROWS_FETCHED_PTR:
{
rc = RsDesc::RS_SQLSetDescField(pStmt->pIRD,0,SQL_DESC_ROWS_PROCESSED_PTR,pValue,cbLen,TRUE);
break;
}
case SQL_ATTR_SIMULATE_CURSOR:
{
if(iVal != SQL_SC_NON_UNIQUE
&& iVal != SQL_SC_TRY_UNIQUE
&& iVal != SQL_SC_UNIQUE)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
if(iVal != SQL_SC_NON_UNIQUE)
{
rc = SQL_SUCCESS_WITH_INFO;
addError(&pStmt->pErrorList,"01S02", "Option value changed", 0, NULL);
goto error;
}
pStmtAttr->iSimulateCursor = iVal;
break;
}
case SQL_ATTR_USE_BOOKMARKS:
{
if(iVal != SQL_UB_OFF
&& iVal != SQL_UB_ON)
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HY024", "Invalid attribute value", 0, NULL);
goto error;
}
pStmtAttr->iUseBookmark = iVal;
break;
}
case SQL_ATTR_ENABLE_AUTO_IPD:
default:
{
rc = SQL_ERROR;
addError(&pStmt->pErrorList,"HYC00", "Optional feature not implemented::RS_SQLSetStmtAttr", 0, NULL);
goto error;
}
} // Switch
error:
return rc;
}