+static int SQLColAttributes_KnownStringAttribute(SQLUSMALLINT fDescType)
+{
+ static const SQLUSMALLINT attrList[] =
+ {
+ SQL_COLUMN_OWNER_NAME,
+ SQL_COLUMN_QUALIFIER_NAME,
+ SQL_COLUMN_LABEL,
+ SQL_COLUMN_NAME,
+ SQL_COLUMN_TABLE_NAME,
+ SQL_COLUMN_TYPE_NAME,
+ SQL_DESC_BASE_COLUMN_NAME,
+ SQL_DESC_BASE_TABLE_NAME,
+ SQL_DESC_CATALOG_NAME,
+ SQL_DESC_LABEL,
+ SQL_DESC_LITERAL_PREFIX,
+ SQL_DESC_LITERAL_SUFFIX,
+ SQL_DESC_LOCAL_TYPE_NAME,
+ SQL_DESC_NAME,
+ SQL_DESC_SCHEMA_NAME,
+ SQL_DESC_TABLE_NAME,
+ SQL_DESC_TYPE_NAME,
+ };
+ unsigned int i;
+
+ for (i = 0; i < sizeof(attrList) / sizeof(SQLUSMALLINT); i++) {
+ if (attrList[i] == fDescType) return 1;
+ }
+ return 0;
+}
+
+/*************************************************************************
+ * SQLColAttributesW [ODBC32.106]
+ */
+SQLRETURN WINAPI SQLColAttributesW(
+ SQLHSTMT hstmt,
+ SQLUSMALLINT icol,
+ SQLUSMALLINT fDescType,
+ SQLPOINTER rgbDesc,
+ SQLSMALLINT cbDescMax,
+ SQLSMALLINT *pcbDesc,
+ SQLLEN *pfDesc)
+{
+ SQLRETURN iResult;
+
+ TRACE("hstmt=0x%08lx icol=%d fDescType=%d rgbDesc=%p cbDescMax=%d pcbDesc=%p pfDesc=%p\n",
+ hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc);
+
+ CHECK_dmHandle();
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTES].funcW);
+ iResult = (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTES].funcW)
+ (hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc);
+ if (iResult == SQL_SUCCESS && rgbDesc != NULL && SQLColAttributes_KnownStringAttribute(fDescType)) {
+ /*
+ TRACE("Dumping values fetched via SQLColAttributesW:\n");
+ TRACE(" Attribute name : %s\n", debugstr_w(rgbDesc));
+ TRACE(" Declared length: %d\n", *pcbDesc);
+ */
+ if (*pcbDesc != lstrlenW(rgbDesc) * 2) {
+ TRACE("CHEAT: resetting name length for ADO\n");
+ *pcbDesc = lstrlenW(rgbDesc) * 2;
+ }
+ }
+ return iResult;
+}
+
+/*************************************************************************
+ * SQLConnectW [ODBC32.107]
+ */
+SQLRETURN WINAPI SQLConnectW(SQLHDBC ConnectionHandle,
+ WCHAR *ServerName, SQLSMALLINT NameLength1,
+ WCHAR *UserName, SQLSMALLINT NameLength2,
+ WCHAR *Authentication, SQLSMALLINT NameLength3)
+{
+ SQLRETURN ret;
+ TRACE("(Server=%.*s)\n",NameLength1+3, debugstr_w(ServerName));
+
+ CHECK_READY_AND_dmHandle();
+
+ WideCharToMultiByte(
+ CP_UTF8, 0,
+ ServerName, NameLength1,
+ gProxyHandle.ServerName, sizeof(gProxyHandle.ServerName),
+ NULL, NULL);
+ WideCharToMultiByte(
+ CP_UTF8, 0,
+ UserName, NameLength2,
+ gProxyHandle.UserName, sizeof(gProxyHandle.UserName),
+ NULL, NULL);
+
+ assert(gProxyHandle.functions[SQLAPI_INDEX_SQLCONNECT].funcW);
+ ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLCONNECT].funcW)
+ (ConnectionHandle, ServerName, NameLength1,
+ UserName, NameLength2, Authentication, NameLength3);
+
+ TRACE("returns %d\n",ret);
+ return ret;
+}
+
+/*************************************************************************
+ * SQLDescribeColW [ODBC32.108]
+ */
+SQLRETURN WINAPI SQLDescribeColW(SQLHSTMT StatementHandle,
+ SQLUSMALLINT ColumnNumber, SQLWCHAR *ColumnName,
+ SQLSMALLINT BufferLength, SQLSMALLINT *NameLength,
+ SQLSMALLINT *DataType, SQLULEN *ColumnSize,
+ SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable)
+{
+ SQLRETURN iResult;
+ TRACE("\n");
+
+ CHECK_READY_AND_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLDESCRIBECOL].funcW);
+ iResult = (gProxyHandle.functions[SQLAPI_INDEX_SQLDESCRIBECOL].funcW)
+ (StatementHandle, ColumnNumber, ColumnName,
+ BufferLength, NameLength, DataType, ColumnSize, DecimalDigits, Nullable);
+ if (iResult >= 0) {
+ TRACE("Successfully recovered the following column information:\n");
+ TRACE("\tRequested column index: %d\n", ColumnNumber);
+ TRACE("\tAvailable length for column name: %d\n", BufferLength);
+ if (NameLength != NULL)
+ TRACE("\tActual length for column name: %d\n", *NameLength);
+ else TRACE("\tActual length for column name: (null)\n");
+ TRACE("\tReturned column name: %s\n", debugstr_w(ColumnName));
+ }
+ return iResult;
+}
+
+/*************************************************************************
+ * SQLErrorW [ODBC32.110]
+ */
+SQLRETURN WINAPI SQLErrorW(SQLHENV EnvironmentHandle,
+ SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle,
+ WCHAR *Sqlstate, SQLINTEGER *NativeError,
+ WCHAR *MessageText, SQLSMALLINT BufferLength,
+ SQLSMALLINT *TextLength)
+{
+ TRACE("\n");
+
+ CHECK_READY_AND_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLERROR].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLERROR].funcW)
+ (EnvironmentHandle, ConnectionHandle, StatementHandle,
+ Sqlstate, NativeError, MessageText, BufferLength, TextLength);
+}
+
+/*************************************************************************
+ * SQLExecDirectW [ODBC32.111]
+ */
+SQLRETURN WINAPI SQLExecDirectW(SQLHSTMT StatementHandle,
+ WCHAR *StatementText, SQLINTEGER TextLength)
+{
+ TRACE("\n");
+
+ CHECK_READY_AND_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLEXECDIRECT].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLEXECDIRECT].funcW)
+ (StatementHandle, StatementText, TextLength);
+}
+
+/*************************************************************************
+ * SQLGetCursorNameW [ODBC32.117]
+ */
+SQLRETURN WINAPI SQLGetCursorNameW(SQLHSTMT StatementHandle,
+ WCHAR *CursorName, SQLSMALLINT BufferLength,
+ SQLSMALLINT *NameLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCURSORNAME].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCURSORNAME].funcW)
+ (StatementHandle, CursorName, BufferLength, NameLength);
+}
+
+/*************************************************************************
+ * SQLPrepareW [ODBC32.119]
+ */
+SQLRETURN WINAPI SQLPrepareW(SQLHSTMT StatementHandle,
+ WCHAR *StatementText, SQLINTEGER TextLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPREPARE].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLPREPARE].funcW)
+ (StatementHandle, StatementText, TextLength);
+}
+
+/*************************************************************************
+ * SQLSetCursorNameW [ODBC32.121]
+ */
+SQLRETURN WINAPI SQLSetCursorNameW(SQLHSTMT StatementHandle, WCHAR *CursorName, SQLSMALLINT NameLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCURSORNAME].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCURSORNAME].funcW)
+ (StatementHandle, CursorName, NameLength);
+}
+
+/*************************************************************************
+ * SQLColAttributeW [ODBC32.127]
+ */
+SQLRETURN WINAPI SQLColAttributeW (SQLHSTMT StatementHandle,
+ SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier,
+ SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength,
+ SQLSMALLINT *StringLength, SQLPOINTER NumericAttribute)
+{
+ SQLRETURN iResult;
+
+ TRACE("StatementHandle=0x%08lx ColumnNumber=%d FieldIdentifier=%d CharacterAttribute=%p BufferLength=%d StringLength=%p NumericAttribute=%p\n",
+ StatementHandle, ColumnNumber, FieldIdentifier,
+ CharacterAttribute, BufferLength, StringLength, NumericAttribute);
+
+ CHECK_READY_AND_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTE].funcW);
+ iResult = (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLATTRIBUTE].funcW)
+ (StatementHandle, ColumnNumber, FieldIdentifier,
+ CharacterAttribute, BufferLength, StringLength, NumericAttribute);
+ if (iResult == SQL_SUCCESS && CharacterAttribute != NULL && SQLColAttributes_KnownStringAttribute(FieldIdentifier)) {
+ /*
+ TRACE("Dumping values fetched via SQLColAttributeW:\n");
+ TRACE(" Attribute name : %s\n", debugstr_w(rgbDesc));
+ TRACE(" Declared length: %d\n", *pcbDesc);
+ */
+ if (*StringLength != lstrlenW(CharacterAttribute) * 2) {
+ TRACE("CHEAT: resetting name length for ADO\n");
+ *StringLength = lstrlenW(CharacterAttribute) * 2;
+ }
+ }
+ return iResult;
+}
+
+/*************************************************************************
+ * SQLGetConnectAttrW [ODBC32.132]
+ */
+SQLRETURN WINAPI SQLGetConnectAttrW(SQLHDBC ConnectionHandle,
+ SQLINTEGER Attribute, SQLPOINTER Value,
+ SQLINTEGER BufferLength, SQLINTEGER *StringLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTATTR].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTATTR].funcW)
+ (ConnectionHandle, Attribute, Value,
+ BufferLength, StringLength);
+}
+
+/*************************************************************************
+ * SQLGetDescFieldW [ODBC32.133]
+ */
+SQLRETURN WINAPI SQLGetDescFieldW(SQLHDESC DescriptorHandle,
+ SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier,
+ SQLPOINTER Value, SQLINTEGER BufferLength,
+ SQLINTEGER *StringLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCFIELD].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCFIELD].funcW)
+ (DescriptorHandle, RecNumber, FieldIdentifier,
+ Value, BufferLength, StringLength);
+}
+
+/*************************************************************************
+ * SQLGetDescRecW [ODBC32.134]
+ */
+SQLRETURN WINAPI SQLGetDescRecW(SQLHDESC DescriptorHandle,
+ SQLSMALLINT RecNumber, SQLWCHAR *Name,
+ SQLSMALLINT BufferLength, SQLSMALLINT *StringLength,
+ SQLSMALLINT *Type, SQLSMALLINT *SubType,
+ SQLLEN *Length, SQLSMALLINT *Precision,
+ SQLSMALLINT *Scale, SQLSMALLINT *Nullable)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCREC].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDESCREC].funcW)
+ (DescriptorHandle, RecNumber, Name, BufferLength,
+ StringLength, Type, SubType, Length, Precision, Scale, Nullable);
+}
+
+/*************************************************************************
+ * SQLGetDiagFieldW [ODBC32.135]
+ */
+SQLRETURN WINAPI SQLGetDiagFieldW(SQLSMALLINT HandleType, SQLHANDLE Handle,
+ SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier,
+ SQLPOINTER DiagInfo, SQLSMALLINT BufferLength,
+ SQLSMALLINT *StringLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGFIELD].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGFIELD].funcW)
+ (HandleType, Handle, RecNumber, DiagIdentifier,
+ DiagInfo, BufferLength, StringLength);
+}
+
+/*************************************************************************
+ * SQLGetDiagRecW [ODBC32.136]
+ */
+SQLRETURN WINAPI SQLGetDiagRecW(SQLSMALLINT HandleType, SQLHANDLE Handle,
+ SQLSMALLINT RecNumber, WCHAR *Sqlstate,
+ SQLINTEGER *NativeError, WCHAR *MessageText,
+ SQLSMALLINT BufferLength, SQLSMALLINT *TextLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGREC].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETDIAGREC].funcW)
+ (HandleType, Handle, RecNumber, Sqlstate, NativeError,
+ MessageText, BufferLength, TextLength);
+}
+
+/*************************************************************************
+ * SQLGetStmtAttrW [ODBC32.138]
+ */
+SQLRETURN WINAPI SQLGetStmtAttrW(SQLHSTMT StatementHandle,
+ SQLINTEGER Attribute, SQLPOINTER Value,
+ SQLINTEGER BufferLength, SQLINTEGER *StringLength)
+{
+ SQLRETURN iResult;
+
+ TRACE("Attribute = (%02ld) Value = %p BufferLength = (%ld) StringLength = %p\n",
+ Attribute, Value, BufferLength, StringLength);
+
+ if (Value == NULL) {
+ WARN("Unexpected NULL in Value return address\n");
+ iResult = SQL_ERROR;
+/*
+ } else if (StringLength == NULL) {
+ WARN("Unexpected NULL in StringLength return address\n");
+ iResult = SQL_ERROR;
+*/
+ } else {
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETSTMTATTR].funcW);
+ iResult = (gProxyHandle.functions[SQLAPI_INDEX_SQLGETSTMTATTR].funcW)
+ (StatementHandle, Attribute, Value, BufferLength, StringLength);
+ TRACE("returning %d...\n", iResult);
+ }
+ return iResult;
+}
+
+/*************************************************************************
+ * SQLSetConnectAttrW [ODBC32.139]
+ */
+SQLRETURN WINAPI SQLSetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribute,
+ SQLPOINTER Value, SQLINTEGER StringLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTATTR].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTATTR].funcW)
+ (ConnectionHandle, Attribute, Value, StringLength);
+}
+
+/*************************************************************************
+ * SQLColumnsW [ODBC32.140]
+ */
+SQLRETURN WINAPI SQLColumnsW(SQLHSTMT StatementHandle,
+ WCHAR *CatalogName, SQLSMALLINT NameLength1,
+ WCHAR *SchemaName, SQLSMALLINT NameLength2,
+ WCHAR *TableName, SQLSMALLINT NameLength3,
+ WCHAR *ColumnName, SQLSMALLINT NameLength4)
+{
+ TRACE("\n");
+
+ CHECK_READY_AND_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNS].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNS].funcW)
+ (StatementHandle, CatalogName, NameLength1,
+ SchemaName, NameLength2, TableName, NameLength3, ColumnName, NameLength4);
+}
+
+/*************************************************************************
+ * SQLDriverConnectW [ODBC32.141]
+ */
+SQLRETURN WINAPI SQLDriverConnectW(
+ SQLHDBC hdbc,
+ SQLHWND hwnd,
+ WCHAR *conn_str_in,
+ SQLSMALLINT len_conn_str_in,
+ WCHAR *conn_str_out,
+ SQLSMALLINT conn_str_out_max,
+ SQLSMALLINT *ptr_conn_str_out,
+ SQLUSMALLINT driver_completion )
+{
+ TRACE("ConnStrIn (%d bytes) --> %s\n", len_conn_str_in, debugstr_w(conn_str_in));
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERCONNECT].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERCONNECT].funcW)
+ (hdbc, hwnd, conn_str_in, len_conn_str_in, conn_str_out,
+ conn_str_out_max, ptr_conn_str_out, driver_completion);
+}
+
+/*************************************************************************
+ * SQLGetConnectOptionW [ODBC32.142]
+ */
+SQLRETURN WINAPI SQLGetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLPOINTER Value)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTOPTION].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETCONNECTOPTION].funcW)
+ (ConnectionHandle, Option, Value);
+}
+
+/*************************************************************************
+ * SQLGetInfoW [ODBC32.145]
+ */
+SQLRETURN WINAPI SQLGetInfoW(SQLHDBC ConnectionHandle,
+ SQLUSMALLINT InfoType, SQLPOINTER InfoValue,
+ SQLSMALLINT BufferLength, SQLSMALLINT *StringLength)
+{
+ SQLRETURN iResult;
+
+ TRACE("InfoType = (%02u), InfoValue = %p, BufferLength = %d bytes\n", InfoType, InfoValue, BufferLength);
+ if (InfoValue == NULL) {
+ WARN("Unexpected NULL in InfoValue address\n");
+ iResult = SQL_ERROR;
+ } else {
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETINFO].funcW);
+ iResult = (gProxyHandle.functions[SQLAPI_INDEX_SQLGETINFO].funcW)
+ (ConnectionHandle, InfoType, InfoValue, BufferLength, StringLength);
+ TRACE("returning %d...\n", iResult);
+ }
+ return iResult;
+}
+
+/*************************************************************************
+ * SQLGetTypeInfoW [ODBC32.147]
+ */
+SQLRETURN WINAPI SQLGetTypeInfoW(SQLHSTMT StatementHandle, SQLSMALLINT DataType)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLGETTYPEINFO].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLGETTYPEINFO].funcW)
+ (StatementHandle, DataType);
+}
+
+/*************************************************************************
+ * SQLSetConnectOptionW [ODBC32.150]
+ */
+SQLRETURN WINAPI SQLSetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLULEN Value)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTOPTION].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETCONNECTOPTION].funcW)
+ (ConnectionHandle, Option, Value);
+}
+
+/*************************************************************************
+ * SQLSpecialColumnsW [ODBC32.152]
+ */
+SQLRETURN WINAPI SQLSpecialColumnsW(SQLHSTMT StatementHandle,
+ SQLUSMALLINT IdentifierType, SQLWCHAR *CatalogName,
+ SQLSMALLINT NameLength1, SQLWCHAR *SchemaName,
+ SQLSMALLINT NameLength2, SQLWCHAR *TableName,
+ SQLSMALLINT NameLength3, SQLUSMALLINT Scope,
+ SQLUSMALLINT Nullable)
+{
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSPECIALCOLUMNS].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLSPECIALCOLUMNS].funcW)
+ (StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName,
+ NameLength2, TableName, NameLength3, Scope, Nullable);
+}
+
+/*************************************************************************
+ * SQLStatisticsW [ODBC32.153]
+ */
+SQLRETURN WINAPI SQLStatisticsW(SQLHSTMT StatementHandle,
+ SQLWCHAR *CatalogName, SQLSMALLINT NameLength1,
+ SQLWCHAR *SchemaName, SQLSMALLINT NameLength2,
+ SQLWCHAR *TableName, SQLSMALLINT NameLength3,
+ SQLUSMALLINT Unique, SQLUSMALLINT Reserved)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSTATISTICS].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLSTATISTICS].funcW)
+ (StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2,
+ TableName, NameLength3, Unique, Reserved);
+}
+
+/*************************************************************************
+ * SQLTablesW [ODBC32.154]
+ */
+SQLRETURN WINAPI SQLTablesW(SQLHSTMT StatementHandle,
+ SQLWCHAR *CatalogName, SQLSMALLINT NameLength1,
+ SQLWCHAR *SchemaName, SQLSMALLINT NameLength2,
+ SQLWCHAR *TableName, SQLSMALLINT NameLength3,
+ SQLWCHAR *TableType, SQLSMALLINT NameLength4)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLES].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLES].funcW)
+ (StatementHandle, CatalogName, NameLength1,
+ SchemaName, NameLength2, TableName, NameLength3, TableType, NameLength4);
+}
+
+/*************************************************************************
+ * SQLBrowseConnectW [ODBC32.155]
+ */
+SQLRETURN WINAPI SQLBrowseConnectW(
+ SQLHDBC hdbc,
+ SQLWCHAR *szConnStrIn,
+ SQLSMALLINT cbConnStrIn,
+ SQLWCHAR *szConnStrOut,
+ SQLSMALLINT cbConnStrOutMax,
+ SQLSMALLINT *pcbConnStrOut)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLBROWSECONNECT].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLBROWSECONNECT].funcW)
+ (hdbc, szConnStrIn, cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut);
+}
+
+/*************************************************************************
+ * SQLColumnPrivilegesW [ODBC32.156]
+ */
+SQLRETURN WINAPI SQLColumnPrivilegesW(
+ SQLHSTMT hstmt,
+ SQLWCHAR *szCatalogName,
+ SQLSMALLINT cbCatalogName,
+ SQLWCHAR *szSchemaName,
+ SQLSMALLINT cbSchemaName,
+ SQLWCHAR *szTableName,
+ SQLSMALLINT cbTableName,
+ SQLWCHAR *szColumnName,
+ SQLSMALLINT cbColumnName)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNPRIVILEGES].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLCOLUMNPRIVILEGES].funcW)
+ (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName,
+ szTableName, cbTableName, szColumnName, cbColumnName);
+}
+
+/*************************************************************************
+ * SQLDataSourcesW [ODBC32.157]
+ */
+SQLRETURN WINAPI SQLDataSourcesW(SQLHENV EnvironmentHandle,
+ SQLUSMALLINT Direction, WCHAR *ServerName,
+ SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1,
+ WCHAR *Description, SQLSMALLINT BufferLength2,
+ SQLSMALLINT *NameLength2)
+{
+ SQLRETURN ret;
+
+ TRACE("EnvironmentHandle = %p\n", (LPVOID)EnvironmentHandle);
+
+ if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL)
+ {
+ ERR("Error: empty dm handle (gProxyHandle.dmHandle == NULL)\n");
+ return SQL_ERROR;
+ }
+
+ assert(gProxyHandle.functions[SQLAPI_INDEX_SQLDATASOURCES].funcW);
+ ret = (gProxyHandle.functions[SQLAPI_INDEX_SQLDATASOURCES].funcW)
+ (EnvironmentHandle, Direction, ServerName,
+ BufferLength1, NameLength1, Description, BufferLength2, NameLength2);
+
+ if (TRACE_ON(odbc))
+ {
+ TRACE("returns: %d \t", ret);
+ if (*NameLength1 > 0)
+ TRACE("DataSource = %s,", debugstr_w(ServerName));
+ if (*NameLength2 > 0)
+ TRACE(" Description = %s", debugstr_w(Description));
+ TRACE("\n");
+ }
+
+ return ret;
+}
+
+/*************************************************************************
+ * SQLForeignKeysW [ODBC32.160]
+ */
+SQLRETURN WINAPI SQLForeignKeysW(
+ SQLHSTMT hstmt,
+ SQLWCHAR *szPkCatalogName,
+ SQLSMALLINT cbPkCatalogName,
+ SQLWCHAR *szPkSchemaName,
+ SQLSMALLINT cbPkSchemaName,
+ SQLWCHAR *szPkTableName,
+ SQLSMALLINT cbPkTableName,
+ SQLWCHAR *szFkCatalogName,
+ SQLSMALLINT cbFkCatalogName,
+ SQLWCHAR *szFkSchemaName,
+ SQLSMALLINT cbFkSchemaName,
+ SQLWCHAR *szFkTableName,
+ SQLSMALLINT cbFkTableName)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLFOREIGNKEYS].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLFOREIGNKEYS].funcW)
+ (hstmt, szPkCatalogName, cbPkCatalogName, szPkSchemaName, cbPkSchemaName,
+ szPkTableName, cbPkTableName, szFkCatalogName, cbFkCatalogName, szFkSchemaName,
+ cbFkSchemaName, szFkTableName, cbFkTableName);
+}
+
+/*************************************************************************
+ * SQLNativeSqlW [ODBC32.162]
+ */
+SQLRETURN WINAPI SQLNativeSqlW(
+ SQLHDBC hdbc,
+ SQLWCHAR *szSqlStrIn,
+ SQLINTEGER cbSqlStrIn,
+ SQLWCHAR *szSqlStr,
+ SQLINTEGER cbSqlStrMax,
+ SQLINTEGER *pcbSqlStr)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLNATIVESQL].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLNATIVESQL].funcW)
+ (hdbc, szSqlStrIn, cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr);
+}
+
+/*************************************************************************
+ * SQLPrimaryKeysW [ODBC32.165]
+ */
+SQLRETURN WINAPI SQLPrimaryKeysW(
+ SQLHSTMT hstmt,
+ SQLWCHAR *szCatalogName,
+ SQLSMALLINT cbCatalogName,
+ SQLWCHAR *szSchemaName,
+ SQLSMALLINT cbSchemaName,
+ SQLWCHAR *szTableName,
+ SQLSMALLINT cbTableName)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPRIMARYKEYS].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLPRIMARYKEYS].funcW)
+ (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName,
+ szTableName, cbTableName);
+}
+
+/*************************************************************************
+ * SQLProcedureColumnsW [ODBC32.166]
+ */
+SQLRETURN WINAPI SQLProcedureColumnsW(
+ SQLHSTMT hstmt,
+ SQLWCHAR *szCatalogName,
+ SQLSMALLINT cbCatalogName,
+ SQLWCHAR *szSchemaName,
+ SQLSMALLINT cbSchemaName,
+ SQLWCHAR *szProcName,
+ SQLSMALLINT cbProcName,
+ SQLWCHAR *szColumnName,
+ SQLSMALLINT cbColumnName)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURECOLUMNS].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURECOLUMNS].funcW)
+ (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName,
+ szProcName, cbProcName, szColumnName, cbColumnName);
+}
+
+/*************************************************************************
+ * SQLProceduresW [ODBC32.167]
+ */
+SQLRETURN WINAPI SQLProceduresW(
+ SQLHSTMT hstmt,
+ SQLWCHAR *szCatalogName,
+ SQLSMALLINT cbCatalogName,
+ SQLWCHAR *szSchemaName,
+ SQLSMALLINT cbSchemaName,
+ SQLWCHAR *szProcName,
+ SQLSMALLINT cbProcName)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURES].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLPROCEDURES].funcW)
+ (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName,
+ szProcName, cbProcName);
+}
+
+/*************************************************************************
+ * SQLTablePrivilegesW [ODBC32.170]
+ */
+SQLRETURN WINAPI SQLTablePrivilegesW(
+ SQLHSTMT hstmt,
+ SQLWCHAR *szCatalogName,
+ SQLSMALLINT cbCatalogName,
+ SQLWCHAR *szSchemaName,
+ SQLSMALLINT cbSchemaName,
+ SQLWCHAR *szTableName,
+ SQLSMALLINT cbTableName)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLEPRIVILEGES].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLTABLEPRIVILEGES].funcW)
+ (hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName,
+ szTableName, cbTableName);
+}
+
+/*************************************************************************
+ * SQLDriversW [ODBC32.171]
+ */
+SQLRETURN WINAPI SQLDriversW(
+ SQLHENV henv,
+ SQLUSMALLINT fDirection,
+ SQLWCHAR *szDriverDesc,
+ SQLSMALLINT cbDriverDescMax,
+ SQLSMALLINT *pcbDriverDesc,
+ SQLWCHAR *szDriverAttributes,
+ SQLSMALLINT cbDriverAttrMax,
+ SQLSMALLINT *pcbDriverAttr)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERS].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLDRIVERS].funcW)
+ (henv, fDirection, szDriverDesc, cbDriverDescMax, pcbDriverDesc,
+ szDriverAttributes, cbDriverAttrMax, pcbDriverAttr);
+}
+
+/*************************************************************************
+ * SQLSetDescFieldW [ODBC32.173]
+ */
+SQLRETURN WINAPI SQLSetDescFieldW(SQLHDESC DescriptorHandle,
+ SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier,
+ SQLPOINTER Value, SQLINTEGER BufferLength)
+{
+ TRACE("\n");
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETDESCFIELD].funcW);
+ return (gProxyHandle.functions[SQLAPI_INDEX_SQLSETDESCFIELD].funcW)
+ (DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength);
+}
+
+/*************************************************************************
+ * SQLSetStmtAttrW [ODBC32.176]
+ */
+SQLRETURN WINAPI SQLSetStmtAttrW(SQLHSTMT StatementHandle,
+ SQLINTEGER Attribute, SQLPOINTER Value,
+ SQLINTEGER StringLength)
+{
+ SQLRETURN iResult;
+ TRACE("Attribute = (%02ld) Value = %p StringLength = (%ld)\n",
+ Attribute, Value, StringLength);
+
+ CHECK_dmHandle();
+
+ assert (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSTMTATTR].funcW);
+ iResult = (gProxyHandle.functions[SQLAPI_INDEX_SQLSETSTMTATTR].funcW)
+ (StatementHandle, Attribute, Value, StringLength);
+ if (iResult == SQL_ERROR && (Attribute == SQL_ROWSET_SIZE || Attribute == SQL_ATTR_ROW_ARRAY_SIZE)) {
+ TRACE("CHEAT: returning SQL_SUCCESS to ADO...\n");
+ iResult = SQL_SUCCESS;
+ } else {
+ TRACE("returning %d...\n", iResult);
+ }
+ return iResult;
+}
+
+