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