SQLRETURN SQL_API RsOptions::RS_SQLSetStmtAttr()

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;
}