SQLRETURN SQL_API SQLGetInfoW()

in src/odbc/rsodbc/rsdrvinfo.cpp [21:122]


SQLRETURN SQL_API SQLGetInfoW(SQLHDBC   phdbc,
                                SQLUSMALLINT    hInfoType,
                                SQLPOINTER        pwInfoValue,
                                SQLSMALLINT     cbLen,
                                SQLSMALLINT*    pcbLen)
{
    SQLRETURN rc;
    SQLPOINTER pInfoValue = NULL;
    int iRetType;
    int allocFlag = FALSE;
    SQLSMALLINT cchLen = cbLen/sizeof(WCHAR);

    beginApiMutex(NULL, phdbc);

    if(IS_TRACE_LEVEL_API_CALL())
        TraceSQLGetInfoW(FUNC_CALL, 0, phdbc, hInfoType, pwInfoValue, cbLen, pcbLen);

    switch(hInfoType)
    {
        case SQL_ACCESSIBLE_PROCEDURES:
        case SQL_ACCESSIBLE_TABLES:
        case SQL_CATALOG_NAME:
        case SQL_DATA_SOURCE_READ_ONLY:
        case SQL_ODBC_SQL_OPT_IEF: /* SQL_INTEGRITY */
        case SQL_COLLATION_SEQ:
        case SQL_COLUMN_ALIAS:
        case SQL_DESCRIBE_PARAMETER:
        case SQL_EXPRESSIONS_IN_ORDERBY:
        case SQL_LIKE_ESCAPE_CLAUSE:
        case SQL_DATA_SOURCE_NAME:
        case SQL_DATABASE_NAME:
        case SQL_DBMS_NAME:
        case SQL_DBMS_VER:
        case SQL_DM_VER:
        case SQL_DRIVER_NAME:
        case SQL_DRIVER_ODBC_VER:
        case SQL_DRIVER_VER:
        case SQL_IDENTIFIER_QUOTE_CHAR:
        case SQL_KEYWORDS:
        case SQL_ORDER_BY_COLUMNS_IN_SELECT:
        case SQL_ROW_UPDATES:
        case SQL_QUALIFIER_NAME_SEPARATOR:     /* SQL_CATALOG_NAME_SEPARATOR */
        case SQL_QUALIFIER_TERM:             /*  SQL_CATALOG_TERM */
        case SQL_SPECIAL_CHARACTERS:
        case SQL_MAX_ROW_SIZE_INCLUDES_LONG:
        case SQL_MULT_RESULT_SETS:
        case SQL_MULTIPLE_ACTIVE_TXN:
        case SQL_NEED_LONG_DATA_LEN:
        case SQL_OUTER_JOINS:
        case SQL_PROCEDURES:
        case SQL_OWNER_TERM:                /* SQL_SCHEMA_TERM  */
        case SQL_PROCEDURE_TERM:
        case SQL_SEARCH_PATTERN_ESCAPE:
        case SQL_SERVER_NAME:
        case SQL_TABLE_TERM:
        case SQL_USER_NAME:
        case SQL_XOPEN_CLI_YEAR:
        {
            if(pwInfoValue != NULL)
            {
                if(cbLen >= 0)
                {
                    pInfoValue = rs_calloc(sizeof(char), cchLen + 1);
                    allocFlag = TRUE;
                }
            }

            break;
        }

        default:
        {
            // int/short.
            pInfoValue = pwInfoValue;
            break;
        }
    }

    rc = RsDrvInfo::RS_SQLGetInfo(phdbc, hInfoType, pInfoValue, cchLen, pcbLen, &iRetType);

    if(SQL_SUCCEEDED(rc))
    {
        if(iRetType == SQL_C_CHAR)
        {
            if(pwInfoValue)
                utf8_to_wchar((char *)pInfoValue, SQL_NTS, (WCHAR *)pwInfoValue, cchLen);

            if(pcbLen)
                *pcbLen = (*pcbLen) * sizeof(WCHAR);
        }
    }

    if(allocFlag && pInfoValue)
        pInfoValue = rs_free(pInfoValue);

    if(IS_TRACE_LEVEL_API_CALL())
        TraceSQLGetInfoW(FUNC_RETURN, rc, phdbc, hInfoType, pwInfoValue, cbLen, pcbLen);

    endApiMutex(NULL, phdbc);

    return rc;
}