SQLRETURN SQL_API RsOptions::RS_SQLGetStmtAttr()

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