SQLRETURN SQL_API RsOptions::RS_SQLGetConnectAttr()

in src/odbc/rsodbc/rsoptions.cpp [462:632]


SQLRETURN  SQL_API RsOptions::RS_SQLGetConnectAttr(SQLHDBC phdbc,
                                       SQLINTEGER    iAttribute, 
                                       SQLPOINTER    pValue,
                                       SQLINTEGER    cbLen, 
                                       SQLINTEGER  *pcbLen)
{
    SQLRETURN rc = SQL_SUCCESS;
    int *piVal = (int *)pValue;
    void **ppVal = (void **)pValue;
    RS_CONN_INFO *pConn = (RS_CONN_INFO *)phdbc;
    RS_CONN_ATTR_INFO *pConnAttr;
    RS_CONNECT_PROPS_INFO *pConnectProps;

    // Check valid HDBC
    if(!VALID_HDBC(phdbc))
    {
        rc = SQL_INVALID_HANDLE;
        goto error;
    }

    // Clear error list
    pConn->pErrorList = clearErrorList(pConn->pErrorList);

    if(!pValue)
    {
        rc = SQL_ERROR;
        addError(&pConn->pErrorList,"HY000", "Output buffer is NULL", 0, NULL);
        goto error;
    }

    pConnAttr = pConn->pConnAttr;
    pConnectProps = pConn->pConnectProps;

    // Attribute operation
    switch(iAttribute)
    {
        case SQL_ATTR_ACCESS_MODE:
        {
            *piVal = pConnAttr->iAccessMode;
            break;
        }

        case SQL_ATTR_ASYNC_ENABLE:
        {
            *piVal = pConnAttr->iAsyncEnable;
            break;
        }

        case SQL_ATTR_AUTO_IPD:
        {
            *piVal = pConnAttr->iAutoIPD;
            break;
        }

        case SQL_ATTR_AUTOCOMMIT:
        {
            *piVal = pConnAttr->iAutoCommit;
            break;
        }

        case SQL_ATTR_CONNECTION_DEAD:
        {
            *piVal = pConn->isConnectionDead() ? SQL_CD_TRUE : SQL_CD_FALSE;
            break;
        }
        
        case SQL_ATTR_CONNECTION_TIMEOUT:
        {
            *piVal = pConnAttr->iConnectionTimeout;
            break;
        }

        case SQL_ATTR_CURRENT_CATALOG:
        {
            rc = copyStrDataLargeLen((pConnAttr->pCurrentCatalog) ? pConnAttr->pCurrentCatalog : pConn->pConnectProps->szDatabase, SQL_NTS,
                                    (char *)pValue, cbLen, pcbLen);

            break;
        }

        case SQL_ATTR_LOGIN_TIMEOUT:
        {
            *piVal = pConnAttr->iLoginTimeout;
            break;
        }

        case SQL_ATTR_METADATA_ID:
        {
            *piVal = pConnAttr->iMetaDataId;
            break;
        }

        case SQL_ATTR_ODBC_CURSORS:
        {
            *piVal = pConnAttr->iOdbcCursors;
            break;
        }

        case SQL_ATTR_PACKET_SIZE:
        {
            *piVal = pConnAttr->iPacketSize;
            break;
        }

        case SQL_ATTR_QUIET_MODE:
        {
            *ppVal = pConnAttr->hQuietMode;
            break;
        }

        case SQL_ATTR_TRACE:
        {
            *piVal = pConnAttr->iTrace;
            break;
        }

        case SQL_ATTR_TRACEFILE:
        {
            rc = copyStrDataLargeLen(pConnAttr->pTraceFile, SQL_NTS, (char *)pValue, cbLen, pcbLen);
            break;
        }

        case SQL_ATTR_TRANSLATE_LIB:
        {
            rc = copyStrDataLargeLen(pConnAttr->pTranslateLib, SQL_NTS, (char *)pValue, cbLen, pcbLen);
            break;
        }

        case SQL_ATTR_TRANSLATE_OPTION:
        {
            *piVal = pConnAttr->iTranslateOption;
            break;
        }

        case SQL_ATTR_TXN_ISOLATION:
        {
            *piVal = pConnAttr->iTxnIsolation;
            break;
        }

        case SQL_ATTR_IGNORE_UNICODE_FUNCTIONS: // DD DM Linux
        {
            *piVal = 1;
            break;
        }

        case SQL_ATTR_APP_WCHAR_TYPE: // DD DM specific attribute.
        {
            *piVal = SQL_DD_CP_UTF16;
            break;
        }

        case SQL_ATTR_QUERY_TIMEOUT:
        {
            *piVal = pConnectProps->iQueryTimeout;
            break;
        }

        default:
        {
            rc = SQL_ERROR;
            addError(&pConn->pErrorList,"HYC00", "Optional feature not implemented::RS_SQLGetConnectAttr", 0, NULL);
            goto error;
        }

    } // Switch

error:

    return rc;
}