From 34b41a733c33b8a10938ca0b86eff25700ab7de6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 21 Jun 2010 23:14:01 +0000 Subject: [PATCH] [ODBC32] Merge 41027, 41028, 44611 from amd64 branch Update odbc32 to Wine-1.1.21. svn path=/trunk/; revision=47824 --- reactos/dll/win32/odbc32/odbc32.rbuild | 3 +- reactos/dll/win32/odbc32/odbc32.spec | 74 +- reactos/dll/win32/odbc32/odbc32_ros.diff | 395 ++++++ reactos/dll/win32/odbc32/proxyodbc.c | 1419 +++++++++++++++++++--- reactos/dll/win32/odbc32/proxyodbc.h | 2 +- 5 files changed, 1707 insertions(+), 186 deletions(-) create mode 100644 reactos/dll/win32/odbc32/odbc32_ros.diff diff --git a/reactos/dll/win32/odbc32/odbc32.rbuild b/reactos/dll/win32/odbc32/odbc32.rbuild index 0539f4abfbe..30d8de7cea1 100644 --- a/reactos/dll/win32/odbc32/odbc32.rbuild +++ b/reactos/dll/win32/odbc32/odbc32.rbuild @@ -7,6 +7,7 @@ include/reactos/wine wine + advapi32 proxyodbc.c - + \ No newline at end of file diff --git a/reactos/dll/win32/odbc32/odbc32.spec b/reactos/dll/win32/odbc32/odbc32.spec index 8c5ac336b56..8e54e2bb3ec 100644 --- a/reactos/dll/win32/odbc32/odbc32.spec +++ b/reactos/dll/win32/odbc32/odbc32.spec @@ -86,43 +86,43 @@ 86 stub ODBSetTryWaitValue 89 stub ODBCSharedPerfMon 90 stub ODBCSharedVSFlag -106 stub SQLColAttributesW -107 stub SQLConnectW -108 stub SQLDescribeColW -110 stub SQLErrorW -111 stub SQLExecDirectW -117 stub SQLGetCursorNameW -119 stub SQLPrepareW -121 stub SQLSetCursorNameW -127 stub SQLColAttributeW -132 stub SQLGetConnectAttrW -133 stub SQLGetDescFieldW -134 stub SQLGetDescRecW -135 stub SQLGetDiagFieldW -136 stub SQLGetDiagRecW -138 stub SQLGetStmtAttrW -139 stub SQLSetConnectAttrW -140 stub SQLColumnsW -141 stub SQLDriverConnectW -142 stub SQLGetConnectOptionW -145 stub SQLGetInfoW -147 stub SQLGetTypeInfoW -150 stub SQLSetConnectOptionW -152 stub SQLSpecialColumnsW -153 stub SQLStatisticsW -154 stub SQLTablesW -155 stub SQLBrowseConnectW -156 stub SQLColumnPrivilegesW -157 stub SQLDataSourcesW -160 stub SQLForeignKeysW -162 stub SQLNativeSqlW -165 stub SQLPrimaryKeysW -166 stub SQLProcedureColumnsW -167 stub SQLProceduresW -170 stub SQLTablePrivilegesW -171 stub SQLDriversW -173 stub SQLSetDescFieldW -176 stub SQLSetStmtAttrW +106 stdcall SQLColAttributesW(long long long ptr long ptr ptr) +107 stdcall SQLConnectW(long wstr long wstr long wstr long) +108 stdcall SQLDescribeColW(long long wstr long ptr ptr ptr ptr ptr) +110 stdcall SQLErrorW(long long long wstr ptr wstr long ptr) +111 stdcall SQLExecDirectW(long wstr long) +117 stdcall SQLGetCursorNameW(long wstr long ptr) +119 stdcall SQLPrepareW(long wstr long) +121 stdcall SQLSetCursorNameW(long wstr long) +127 stdcall SQLColAttributeW(long long long ptr long ptr ptr) +132 stdcall SQLGetConnectAttrW(long long ptr long ptr) +133 stdcall SQLGetDescFieldW(long long long ptr long ptr) +134 stdcall SQLGetDescRecW(long long wstr long ptr ptr ptr ptr ptr ptr ptr) +135 stdcall SQLGetDiagFieldW(long long long long ptr long ptr) +136 stdcall SQLGetDiagRecW(long long long wstr ptr wstr long ptr) +138 stdcall SQLGetStmtAttrW(long long ptr long ptr) +139 stdcall SQLSetConnectAttrW(long long ptr long) +140 stdcall SQLColumnsW(long wstr long wstr long wstr long wstr long) +141 stdcall SQLDriverConnectW(long long wstr long wstr long wstr long) +142 stdcall SQLGetConnectOptionW(long long ptr) +145 stdcall SQLGetInfoW(long long ptr long ptr) +147 stdcall SQLGetTypeInfoW(long long) +150 stdcall SQLSetConnectOptionW(long long long) +152 stdcall SQLSpecialColumnsW(long long wstr long wstr long wstr long long long) +153 stdcall SQLStatisticsW(long wstr long wstr long wstr long long long) +154 stdcall SQLTablesW(long wstr long wstr long wstr long wstr long) +155 stdcall SQLBrowseConnectW(long wstr long wstr long ptr) +156 stdcall SQLColumnPrivilegesW(long wstr long wstr long wstr long wstr long) +157 stdcall SQLDataSourcesW(long long wstr long ptr wstr long ptr) +160 stdcall SQLForeignKeysW(long wstr long wstr long wstr long wstr long wstr long wstr long) +162 stdcall SQLNativeSqlW(long wstr long wstr long ptr) +165 stdcall SQLPrimaryKeysW(long wstr long wstr long wstr long) +166 stdcall SQLProcedureColumnsW(long wstr long wstr long wstr long wstr long) +167 stdcall SQLProceduresW(long wstr long wstr long wstr long) +170 stdcall SQLTablePrivilegesW(long wstr long wstr long wstr long) +171 stdcall SQLDriversW(long long wstr long ptr wstr long ptr) +173 stdcall SQLSetDescFieldW(long long long ptr long) +176 stdcall SQLSetStmtAttrW(long long ptr long) 206 stub SQLColAttributesA 207 stub SQLConnectA 208 stub SQLDescribeColA diff --git a/reactos/dll/win32/odbc32/odbc32_ros.diff b/reactos/dll/win32/odbc32/odbc32_ros.diff new file mode 100644 index 00000000000..f39e563ce62 --- /dev/null +++ b/reactos/dll/win32/odbc32/odbc32_ros.diff @@ -0,0 +1,395 @@ +Index: proxyodbc.c +=================================================================== +--- proxyodbc.c (Revision 41027) ++++ proxyodbc.c (Arbeitskopie) +@@ -733,8 +733,8 @@ + */ + SQLRETURN WINAPI SQLBindCol(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, +- SQLPOINTER TargetValue, SQLINTEGER BufferLength, +- SQLINTEGER *StrLen_or_Ind) ++ SQLPOINTER TargetValue, SQLLEN BufferLength, ++ SQLLEN *StrLen_or_Ind) + { + TRACE("\n"); + +@@ -756,9 +756,9 @@ + */ + SQLRETURN WINAPI SQLBindParam(SQLHSTMT StatementHandle, + SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, +- SQLSMALLINT ParameterType, SQLUINTEGER LengthPrecision, ++ SQLSMALLINT ParameterType, SQLULEN LengthPrecision, + SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, +- SQLINTEGER *StrLen_or_Ind) ++ SQLLEN *StrLen_or_Ind) + { + TRACE("\n"); + +@@ -926,7 +926,7 @@ + SQLRETURN WINAPI SQLDescribeCol(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, + SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, +- SQLSMALLINT *DataType, SQLUINTEGER *ColumnSize, ++ SQLSMALLINT *DataType, SQLULEN *ColumnSize, + SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) + { + TRACE("\n"); +@@ -1040,7 +1040,7 @@ + /************************************************************************* + * SQLFetchScroll [ODBC32.030] + */ +-SQLRETURN WINAPI SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLINTEGER FetchOffset) ++SQLRETURN WINAPI SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLLEN FetchOffset) + { + TRACE("\n"); + +@@ -1177,8 +1177,8 @@ + */ + SQLRETURN WINAPI SQLGetData(SQLHSTMT StatementHandle, + SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, +- SQLPOINTER TargetValue, SQLINTEGER BufferLength, +- SQLINTEGER *StrLen_or_Ind) ++ SQLPOINTER TargetValue, SQLLEN BufferLength, ++ SQLLEN *StrLen_or_Ind) + { + TRACE("\n"); + +@@ -1217,7 +1217,7 @@ + SQLSMALLINT RecNumber, SQLCHAR *Name, + SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, + SQLSMALLINT *Type, SQLSMALLINT *SubType, +- SQLINTEGER *Length, SQLSMALLINT *Precision, ++ SQLLEN *Length, SQLSMALLINT *Precision, + SQLSMALLINT *Scale, SQLSMALLINT *Nullable) + { + TRACE("\n"); +@@ -1413,7 +1413,7 @@ + /************************************************************************* + * SQLPutData [ODBC32.049] + */ +-SQLRETURN WINAPI SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLINTEGER StrLen_or_Ind) ++SQLRETURN WINAPI SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLLEN StrLen_or_Ind) + { + TRACE("\n"); + +@@ -1428,7 +1428,7 @@ + /************************************************************************* + * SQLRowCount [ODBC32.020] + */ +-SQLRETURN WINAPI SQLRowCount(SQLHSTMT StatementHandle, SQLINTEGER *RowCount) ++SQLRETURN WINAPI SQLRowCount(SQLHSTMT StatementHandle, SQLLEN *RowCount) + { + TRACE("\n"); + +@@ -1459,7 +1459,7 @@ + /************************************************************************* + * SQLSetConnectOption [ODBC32.050] + */ +-SQLRETURN WINAPI SQLSetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLUINTEGER Value) ++SQLRETURN WINAPI SQLSetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLULEN Value) + { + TRACE("\n"); + +@@ -1508,10 +1508,10 @@ + */ + SQLRETURN WINAPI SQLSetDescRec(SQLHDESC DescriptorHandle, + SQLSMALLINT RecNumber, SQLSMALLINT Type, +- SQLSMALLINT SubType, SQLINTEGER Length, ++ SQLSMALLINT SubType, SQLLEN Length, + SQLSMALLINT Precision, SQLSMALLINT Scale, +- SQLPOINTER Data, SQLINTEGER *StringLength, +- SQLINTEGER *Indicator) ++ SQLPOINTER Data, SQLLEN *StringLength, ++ SQLLEN *Indicator) + { + TRACE("\n"); + +@@ -1546,9 +1546,9 @@ + */ + SQLRETURN WINAPI SQLSetParam(SQLHSTMT StatementHandle, + SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, +- SQLSMALLINT ParameterType, SQLUINTEGER LengthPrecision, ++ SQLSMALLINT ParameterType, SQLULEN LengthPrecision, + SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, +- SQLINTEGER *StrLen_or_Ind) ++ SQLLEN *StrLen_or_Ind) + { + TRACE("\n"); + +@@ -1581,7 +1581,7 @@ + /************************************************************************* + * SQLSetStmtOption [ODBC32.051] + */ +-SQLRETURN WINAPI SQLSetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLUINTEGER Value) ++SQLRETURN WINAPI SQLSetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLULEN Value) + { + TRACE("\n"); + +@@ -1717,7 +1717,7 @@ + SQLPOINTER rgbDesc, + SQLSMALLINT cbDescMax, + SQLSMALLINT *pcbDesc, +- SQLINTEGER *pfDesc) ++ SQLLEN *pfDesc) + { + TRACE("\n"); + +@@ -1761,7 +1761,7 @@ + SQLHSTMT hstmt, + SQLUSMALLINT ipar, + SQLSMALLINT *pfSqlType, +- SQLUINTEGER *pcbParamDef, ++ SQLULEN *pcbParamDef, + SQLSMALLINT *pibScale, + SQLSMALLINT *pfNullable) + { +@@ -2039,11 +2039,11 @@ + SQLSMALLINT fParamType, + SQLSMALLINT fCType, + SQLSMALLINT fSqlType, +- SQLUINTEGER cbColDef, ++ SQLULEN cbColDef, + SQLSMALLINT ibScale, + SQLPOINTER rgbValue, +- SQLINTEGER cbValueMax, +- SQLINTEGER *pcbValue) ++ SQLLEN cbValueMax, ++ SQLLEN *pcbValue) + { + TRACE("\n"); + +@@ -2086,7 +2086,7 @@ + SQLRETURN WINAPI SQLSetScrollOptions( + SQLHSTMT statement_handle, + SQLUSMALLINT f_concurrency, +- SQLINTEGER crow_keyset, ++ SQLLEN crow_keyset, + SQLUSMALLINT crow_rowset ) + { + TRACE("\n"); +@@ -2138,7 +2138,7 @@ + SQLPOINTER rgbDesc, + SQLSMALLINT cbDescMax, + SQLSMALLINT *pcbDesc, +- SQLINTEGER *pfDesc) ++ SQLLEN *pfDesc) + { + SQLRETURN iResult; + +@@ -2200,9 +2200,9 @@ + * SQLDescribeColW [ODBC32.108] + */ + SQLRETURN WINAPI SQLDescribeColW(SQLHSTMT StatementHandle, +- SQLUSMALLINT ColumnNumber, WCHAR *ColumnName, ++ SQLUSMALLINT ColumnNumber, SQLWCHAR *ColumnName, + SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, +- SQLSMALLINT *DataType, SQLUINTEGER *ColumnSize, ++ SQLSMALLINT *DataType, SQLULEN *ColumnSize, + SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) + { + SQLRETURN iResult; +@@ -2378,10 +2378,10 @@ + * SQLGetDescRecW [ODBC32.134] + */ + SQLRETURN WINAPI SQLGetDescRecW(SQLHDESC DescriptorHandle, +- SQLSMALLINT RecNumber, WCHAR *Name, ++ SQLSMALLINT RecNumber, SQLWCHAR *Name, + SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, + SQLSMALLINT *Type, SQLSMALLINT *SubType, +- SQLINTEGER *Length, SQLSMALLINT *Precision, ++ SQLLEN *Length, SQLSMALLINT *Precision, + SQLSMALLINT *Scale, SQLSMALLINT *Nullable) + { + TRACE("\n"); +@@ -2573,7 +2573,7 @@ + /************************************************************************* + * SQLSetConnectOptionW [ODBC32.150] + */ +-SQLRETURN WINAPI SQLSetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLUINTEGER Value) ++SQLRETURN WINAPI SQLSetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLULEN Value) + { + TRACE("\n"); + +@@ -2588,9 +2588,9 @@ + * SQLSpecialColumnsW [ODBC32.152] + */ + SQLRETURN WINAPI SQLSpecialColumnsW(SQLHSTMT StatementHandle, +- SQLUSMALLINT IdentifierType, SQLCHAR *CatalogName, +- SQLSMALLINT NameLength1, SQLCHAR *SchemaName, +- SQLSMALLINT NameLength2, SQLCHAR *TableName, ++ SQLUSMALLINT IdentifierType, SQLWCHAR *CatalogName, ++ SQLSMALLINT NameLength1, SQLWCHAR *SchemaName, ++ SQLSMALLINT NameLength2, SQLWCHAR *TableName, + SQLSMALLINT NameLength3, SQLUSMALLINT Scope, + SQLUSMALLINT Nullable) + { +@@ -2607,9 +2607,9 @@ + * SQLStatisticsW [ODBC32.153] + */ + SQLRETURN WINAPI SQLStatisticsW(SQLHSTMT StatementHandle, +- SQLCHAR *CatalogName, SQLSMALLINT NameLength1, +- SQLCHAR *SchemaName, SQLSMALLINT NameLength2, +- SQLCHAR *TableName, SQLSMALLINT NameLength3, ++ SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, ++ SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, ++ SQLWCHAR *TableName, SQLSMALLINT NameLength3, + SQLUSMALLINT Unique, SQLUSMALLINT Reserved) + { + TRACE("\n"); +@@ -2626,10 +2626,10 @@ + * SQLTablesW [ODBC32.154] + */ + SQLRETURN WINAPI SQLTablesW(SQLHSTMT StatementHandle, +- SQLCHAR *CatalogName, SQLSMALLINT NameLength1, +- SQLCHAR *SchemaName, SQLSMALLINT NameLength2, +- SQLCHAR *TableName, SQLSMALLINT NameLength3, +- SQLCHAR *TableType, SQLSMALLINT NameLength4) ++ SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, ++ SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, ++ SQLWCHAR *TableName, SQLSMALLINT NameLength3, ++ SQLWCHAR *TableType, SQLSMALLINT NameLength4) + { + TRACE("\n"); + +@@ -2646,9 +2646,9 @@ + */ + SQLRETURN WINAPI SQLBrowseConnectW( + SQLHDBC hdbc, +- SQLCHAR *szConnStrIn, ++ SQLWCHAR *szConnStrIn, + SQLSMALLINT cbConnStrIn, +- SQLCHAR *szConnStrOut, ++ SQLWCHAR *szConnStrOut, + SQLSMALLINT cbConnStrOutMax, + SQLSMALLINT *pcbConnStrOut) + { +@@ -2666,13 +2666,13 @@ + */ + SQLRETURN WINAPI SQLColumnPrivilegesW( + SQLHSTMT hstmt, +- SQLCHAR *szCatalogName, ++ SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, +- SQLCHAR *szSchemaName, ++ SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, +- SQLCHAR *szTableName, ++ SQLWCHAR *szTableName, + SQLSMALLINT cbTableName, +- SQLCHAR *szColumnName, ++ SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName) + { + TRACE("\n"); +@@ -2727,17 +2727,17 @@ + */ + SQLRETURN WINAPI SQLForeignKeysW( + SQLHSTMT hstmt, +- SQLCHAR *szPkCatalogName, ++ SQLWCHAR *szPkCatalogName, + SQLSMALLINT cbPkCatalogName, +- SQLCHAR *szPkSchemaName, ++ SQLWCHAR *szPkSchemaName, + SQLSMALLINT cbPkSchemaName, +- SQLCHAR *szPkTableName, ++ SQLWCHAR *szPkTableName, + SQLSMALLINT cbPkTableName, +- SQLCHAR *szFkCatalogName, ++ SQLWCHAR *szFkCatalogName, + SQLSMALLINT cbFkCatalogName, +- SQLCHAR *szFkSchemaName, ++ SQLWCHAR *szFkSchemaName, + SQLSMALLINT cbFkSchemaName, +- SQLCHAR *szFkTableName, ++ SQLWCHAR *szFkTableName, + SQLSMALLINT cbFkTableName) + { + TRACE("\n"); +@@ -2756,9 +2756,9 @@ + */ + SQLRETURN WINAPI SQLNativeSqlW( + SQLHDBC hdbc, +- SQLCHAR *szSqlStrIn, ++ SQLWCHAR *szSqlStrIn, + SQLINTEGER cbSqlStrIn, +- SQLCHAR *szSqlStr, ++ SQLWCHAR *szSqlStr, + SQLINTEGER cbSqlStrMax, + SQLINTEGER *pcbSqlStr) + { +@@ -2776,11 +2776,11 @@ + */ + SQLRETURN WINAPI SQLPrimaryKeysW( + SQLHSTMT hstmt, +- SQLCHAR *szCatalogName, ++ SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, +- SQLCHAR *szSchemaName, ++ SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, +- SQLCHAR *szTableName, ++ SQLWCHAR *szTableName, + SQLSMALLINT cbTableName) + { + TRACE("\n"); +@@ -2798,13 +2798,13 @@ + */ + SQLRETURN WINAPI SQLProcedureColumnsW( + SQLHSTMT hstmt, +- SQLCHAR *szCatalogName, ++ SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, +- SQLCHAR *szSchemaName, ++ SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, +- SQLCHAR *szProcName, ++ SQLWCHAR *szProcName, + SQLSMALLINT cbProcName, +- SQLCHAR *szColumnName, ++ SQLWCHAR *szColumnName, + SQLSMALLINT cbColumnName) + { + TRACE("\n"); +@@ -2822,11 +2822,11 @@ + */ + SQLRETURN WINAPI SQLProceduresW( + SQLHSTMT hstmt, +- SQLCHAR *szCatalogName, ++ SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, +- SQLCHAR *szSchemaName, ++ SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, +- SQLCHAR *szProcName, ++ SQLWCHAR *szProcName, + SQLSMALLINT cbProcName) + { + TRACE("\n"); +@@ -2844,11 +2844,11 @@ + */ + SQLRETURN WINAPI SQLTablePrivilegesW( + SQLHSTMT hstmt, +- SQLCHAR *szCatalogName, ++ SQLWCHAR *szCatalogName, + SQLSMALLINT cbCatalogName, +- SQLCHAR *szSchemaName, ++ SQLWCHAR *szSchemaName, + SQLSMALLINT cbSchemaName, +- SQLCHAR *szTableName, ++ SQLWCHAR *szTableName, + SQLSMALLINT cbTableName) + { + TRACE("\n"); +@@ -2867,10 +2867,10 @@ + SQLRETURN WINAPI SQLDriversW( + SQLHENV henv, + SQLUSMALLINT fDirection, +- SQLCHAR *szDriverDesc, ++ SQLWCHAR *szDriverDesc, + SQLSMALLINT cbDriverDescMax, + SQLSMALLINT *pcbDriverDesc, +- SQLCHAR *szDriverAttributes, ++ SQLWCHAR *szDriverAttributes, + SQLSMALLINT cbDriverAttrMax, + SQLSMALLINT *pcbDriverAttr) + { diff --git a/reactos/dll/win32/odbc32/proxyodbc.c b/reactos/dll/win32/odbc32/proxyodbc.c index 58d587082f5..a5d5615b54a 100644 --- a/reactos/dll/win32/odbc32/proxyodbc.c +++ b/reactos/dll/win32/odbc32/proxyodbc.c @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * NOTES: - * Proxy ODBC driver manager. This manager delegates all ODBC - * calls to a real ODBC driver manager named by the environment + * Proxy ODBC driver manager. This manager delegates all ODBC + * calls to a real ODBC driver manager named by the environment * variable LIB_ODBC_DRIVER_MANAGER, or to libodbc.so if the * variable is not set. * @@ -36,15 +36,18 @@ #include "windef.h" #include "winbase.h" -#include "wine/debug.h" -//#include "wine/library.h" - -#undef TRACE_ON +#include "winreg.h" #include "sql.h" #include "sqltypes.h" #include "sqlext.h" +#undef TRACE_ON + +#include "wine/debug.h" +#include "wine/library.h" +#include "wine/unicode.h" + #include "proxyodbc.h" static BOOL ODBC_LoadDriverManager(void); @@ -54,84 +57,84 @@ WINE_DEFAULT_DEBUG_CHANNEL(odbc); static const DM_FUNC template_func[] = { - /* 00 */ { SQL_API_SQLALLOCCONNECT, "SQLAllocConnect", SQLAllocConnect, NULL }, - /* 01 */ { SQL_API_SQLALLOCENV, "SQLAllocEnv", SQLAllocEnv, NULL }, - /* 02 */ { SQL_API_SQLALLOCHANDLE, "SQLAllocHandle", SQLAllocHandle, NULL }, - /* 03 */ { SQL_API_SQLALLOCSTMT, "SQLAllocStmt", SQLAllocStmt, NULL }, - /* 04 */ { SQL_API_SQLALLOCHANDLESTD, "SQLAllocHandleStd", SQLAllocHandleStd, NULL }, - /* 05 */ { SQL_API_SQLBINDCOL, "SQLBindCol", SQLBindCol, NULL }, - /* 06 */ { SQL_API_SQLBINDPARAM, "SQLBindParam", SQLBindParam, NULL }, - /* 07 */ { SQL_API_SQLBINDPARAMETER, "SQLBindParameter", SQLBindParameter, NULL }, - /* 08 */ { SQL_API_SQLBROWSECONNECT, "SQLBrowseConnect", SQLBrowseConnect, NULL }, - /* 09 */ { SQL_API_SQLBULKOPERATIONS, "SQLBulkOperations", SQLBulkOperations, NULL }, - /* 10 */ { SQL_API_SQLCANCEL, "SQLCancel", SQLCancel, NULL }, - /* 11 */ { SQL_API_SQLCLOSECURSOR, "SQLCloseCursor", SQLCloseCursor, NULL }, - /* 12 */ { SQL_API_SQLCOLATTRIBUTE, "SQLColAttribute", SQLColAttribute, NULL }, - /* 13 */ { SQL_API_SQLCOLATTRIBUTES, "SQLColAttributes", SQLColAttributes, NULL }, - /* 14 */ { SQL_API_SQLCOLUMNPRIVILEGES, "SQLColumnPrivileges", SQLColumnPrivileges, NULL }, - /* 15 */ { SQL_API_SQLCOLUMNS, "SQLColumns", SQLColumns, NULL }, - /* 16 */ { SQL_API_SQLCONNECT, "SQLConnect", SQLConnect, NULL }, - /* 17 */ { SQL_API_SQLCOPYDESC, "SQLCopyDesc", SQLCopyDesc, NULL }, - /* 18 */ { SQL_API_SQLDATASOURCES, "SQLDataSources", SQLDataSources, NULL }, - /* 19 */ { SQL_API_SQLDESCRIBECOL, "SQLDescribeCol", SQLDescribeCol, NULL }, - /* 20 */ { SQL_API_SQLDESCRIBEPARAM, "SQLDescribeParam", SQLDescribeParam, NULL }, - /* 21 */ { SQL_API_SQLDISCONNECT, "SQLDisconnect", SQLDisconnect, NULL }, - /* 22 */ { SQL_API_SQLDRIVERCONNECT, "SQLDriverConnect", SQLDriverConnect, NULL }, - /* 23 */ { SQL_API_SQLDRIVERS, "SQLDrivers", SQLDrivers, NULL }, - /* 24 */ { SQL_API_SQLENDTRAN, "SQLEndTran", SQLEndTran, NULL }, - /* 25 */ { SQL_API_SQLERROR, "SQLError", SQLError, NULL }, - /* 26 */ { SQL_API_SQLEXECDIRECT, "SQLExecDirect", SQLExecDirect, NULL }, - /* 27 */ { SQL_API_SQLEXECUTE, "SQLExecute", SQLExecute, NULL }, - /* 28 */ { SQL_API_SQLEXTENDEDFETCH, "SQLExtendedFetch", SQLExtendedFetch, NULL }, - /* 29 */ { SQL_API_SQLFETCH, "SQLFetch", SQLFetch, NULL }, - /* 30 */ { SQL_API_SQLFETCHSCROLL, "SQLFetchScroll", SQLFetchScroll, NULL }, - /* 31 */ { SQL_API_SQLFOREIGNKEYS, "SQLForeignKeys", SQLForeignKeys, NULL }, - /* 32 */ { SQL_API_SQLFREEENV, "SQLFreeEnv", SQLFreeEnv, NULL }, - /* 33 */ { SQL_API_SQLFREEHANDLE, "SQLFreeHandle", SQLFreeHandle, NULL }, - /* 34 */ { SQL_API_SQLFREESTMT, "SQLFreeStmt", SQLFreeStmt, NULL }, - /* 35 */ { SQL_API_SQLFREECONNECT, "SQLFreeConnect", SQLFreeConnect, NULL }, - /* 36 */ { SQL_API_SQLGETCONNECTATTR, "SQLGetConnectAttr", SQLGetConnectAttr, NULL }, - /* 37 */ { SQL_API_SQLGETCONNECTOPTION, "SQLGetConnectOption", SQLGetConnectOption, NULL }, - /* 38 */ { SQL_API_SQLGETCURSORNAME, "SQLGetCursorName", SQLGetCursorName, NULL }, - /* 39 */ { SQL_API_SQLGETDATA, "SQLGetData", SQLGetData, NULL }, - /* 40 */ { SQL_API_SQLGETDESCFIELD, "SQLGetDescField", SQLGetDescField, NULL }, - /* 41 */ { SQL_API_SQLGETDESCREC, "SQLGetDescRec", SQLGetDescRec, NULL }, - /* 42 */ { SQL_API_SQLGETDIAGFIELD, "SQLGetDiagField", SQLGetDiagField, NULL }, - /* 43 */ { SQL_API_SQLGETENVATTR, "SQLGetEnvAttr", SQLGetEnvAttr, NULL }, - /* 44 */ { SQL_API_SQLGETFUNCTIONS, "SQLGetFunctions", SQLGetFunctions, NULL }, - /* 45 */ { SQL_API_SQLGETINFO, "SQLGetInfo", SQLGetInfo, NULL }, - /* 46 */ { SQL_API_SQLGETSTMTATTR, "SQLGetStmtAttr", SQLGetStmtAttr, NULL }, - /* 47 */ { SQL_API_SQLGETSTMTOPTION, "SQLGetStmtOption", SQLGetStmtOption, NULL }, - /* 48 */ { SQL_API_SQLGETTYPEINFO, "SQLGetTypeInfo", SQLGetTypeInfo, NULL }, - /* 49 */ { SQL_API_SQLMORERESULTS, "SQLMoreResults", SQLMoreResults, NULL }, - /* 50 */ { SQL_API_SQLNATIVESQL, "SQLNativeSql", SQLNativeSql, NULL }, - /* 51 */ { SQL_API_SQLNUMPARAMS, "SQLNumParams", SQLNumParams, NULL }, - /* 52 */ { SQL_API_SQLNUMRESULTCOLS, "SQLNumResultCols", SQLNumResultCols, NULL }, - /* 53 */ { SQL_API_SQLPARAMDATA, "SQLParamData", SQLParamData, NULL }, - /* 54 */ { SQL_API_SQLPARAMOPTIONS, "SQLParamOptions", SQLParamOptions, NULL }, - /* 55 */ { SQL_API_SQLPREPARE, "SQLPrepare", SQLPrepare, NULL }, - /* 56 */ { SQL_API_SQLPRIMARYKEYS, "SQLPrimaryKeys", SQLPrimaryKeys, NULL }, - /* 57 */ { SQL_API_SQLPROCEDURECOLUMNS, "SQLProcedureColumns", SQLProcedureColumns, NULL }, - /* 58 */ { SQL_API_SQLPROCEDURES, "SQLProcedures", SQLProcedures, NULL }, - /* 59 */ { SQL_API_SQLPUTDATA, "SQLPutData", SQLPutData, NULL }, - /* 60 */ { SQL_API_SQLROWCOUNT, "SQLRowCount", SQLRowCount, NULL }, - /* 61 */ { SQL_API_SQLSETCONNECTATTR, "SQLSetConnectAttr", SQLSetConnectAttr, NULL }, - /* 62 */ { SQL_API_SQLSETCONNECTOPTION, "SQLSetConnectOption", SQLSetConnectOption, NULL }, - /* 63 */ { SQL_API_SQLSETCURSORNAME, "SQLSetCursorName", SQLSetCursorName, NULL }, - /* 64 */ { SQL_API_SQLSETDESCFIELD, "SQLSetDescField", SQLSetDescField, NULL }, - /* 65 */ { SQL_API_SQLSETDESCREC, "SQLSetDescRec", SQLSetDescRec, NULL }, - /* 66 */ { SQL_API_SQLSETENVATTR, "SQLSetEnvAttr", SQLSetEnvAttr, NULL }, - /* 67 */ { SQL_API_SQLSETPARAM, "SQLSetParam", SQLSetParam, NULL }, - /* 68 */ { SQL_API_SQLSETPOS, "SQLSetPos", SQLSetPos, NULL }, - /* 69 */ { SQL_API_SQLSETSCROLLOPTIONS, "SQLSetScrollOptions", SQLSetScrollOptions, NULL }, - /* 70 */ { SQL_API_SQLSETSTMTATTR, "SQLSetStmtAttr", SQLSetStmtAttr, NULL }, - /* 71 */ { SQL_API_SQLSETSTMTOPTION, "SQLSetStmtOption", SQLSetStmtOption, NULL }, - /* 72 */ { SQL_API_SQLSPECIALCOLUMNS, "SQLSpecialColumns", SQLSpecialColumns, NULL }, - /* 73 */ { SQL_API_SQLSTATISTICS, "SQLStatistics", SQLStatistics, NULL }, - /* 74 */ { SQL_API_SQLTABLEPRIVILEGES, "SQLTablePrivileges", SQLTablePrivileges, NULL }, - /* 75 */ { SQL_API_SQLTABLES, "SQLTables", SQLTables, NULL }, - /* 76 */ { SQL_API_SQLTRANSACT, "SQLTransact", SQLTransact, NULL }, - /* 77 */ { SQL_API_SQLGETDIAGREC, "SQLGetDiagRec", SQLGetDiagRec, NULL }, + /* 00 */ { SQL_API_SQLALLOCCONNECT, "SQLAllocConnect", SQLAllocConnect, NULL, NULL }, + /* 01 */ { SQL_API_SQLALLOCENV, "SQLAllocEnv", SQLAllocEnv, NULL, NULL }, + /* 02 */ { SQL_API_SQLALLOCHANDLE, "SQLAllocHandle", SQLAllocHandle, NULL, NULL }, + /* 03 */ { SQL_API_SQLALLOCSTMT, "SQLAllocStmt", SQLAllocStmt, NULL, NULL }, + /* 04 */ { SQL_API_SQLALLOCHANDLESTD, "SQLAllocHandleStd", SQLAllocHandleStd, NULL, NULL }, + /* 05 */ { SQL_API_SQLBINDCOL, "SQLBindCol", SQLBindCol, NULL, NULL }, + /* 06 */ { SQL_API_SQLBINDPARAM, "SQLBindParam", SQLBindParam, NULL, NULL }, + /* 07 */ { SQL_API_SQLBINDPARAMETER, "SQLBindParameter", SQLBindParameter, NULL, NULL }, + /* 08 */ { SQL_API_SQLBROWSECONNECT, "SQLBrowseConnect", SQLBrowseConnect, NULL, NULL }, + /* 09 */ { SQL_API_SQLBULKOPERATIONS, "SQLBulkOperations", SQLBulkOperations, NULL, NULL }, + /* 10 */ { SQL_API_SQLCANCEL, "SQLCancel", SQLCancel, NULL, NULL }, + /* 11 */ { SQL_API_SQLCLOSECURSOR, "SQLCloseCursor", SQLCloseCursor, NULL, NULL }, + /* 12 */ { SQL_API_SQLCOLATTRIBUTE, "SQLColAttribute", SQLColAttribute, NULL, NULL }, + /* 13 */ { SQL_API_SQLCOLATTRIBUTES, "SQLColAttributes", SQLColAttributes, NULL, NULL }, + /* 14 */ { SQL_API_SQLCOLUMNPRIVILEGES, "SQLColumnPrivileges", SQLColumnPrivileges, NULL, NULL }, + /* 15 */ { SQL_API_SQLCOLUMNS, "SQLColumns", SQLColumns, NULL, NULL }, + /* 16 */ { SQL_API_SQLCONNECT, "SQLConnect", SQLConnect, NULL, NULL }, + /* 17 */ { SQL_API_SQLCOPYDESC, "SQLCopyDesc", SQLCopyDesc, NULL, NULL }, + /* 18 */ { SQL_API_SQLDATASOURCES, "SQLDataSources", SQLDataSources, NULL, NULL }, + /* 19 */ { SQL_API_SQLDESCRIBECOL, "SQLDescribeCol", SQLDescribeCol, NULL, NULL }, + /* 20 */ { SQL_API_SQLDESCRIBEPARAM, "SQLDescribeParam", SQLDescribeParam, NULL, NULL }, + /* 21 */ { SQL_API_SQLDISCONNECT, "SQLDisconnect", SQLDisconnect, NULL, NULL }, + /* 22 */ { SQL_API_SQLDRIVERCONNECT, "SQLDriverConnect", SQLDriverConnect, NULL, NULL }, + /* 23 */ { SQL_API_SQLDRIVERS, "SQLDrivers", SQLDrivers, NULL, NULL }, + /* 24 */ { SQL_API_SQLENDTRAN, "SQLEndTran", SQLEndTran, NULL, NULL }, + /* 25 */ { SQL_API_SQLERROR, "SQLError", SQLError, NULL, NULL }, + /* 26 */ { SQL_API_SQLEXECDIRECT, "SQLExecDirect", SQLExecDirect, NULL, NULL }, + /* 27 */ { SQL_API_SQLEXECUTE, "SQLExecute", SQLExecute, NULL, NULL }, + /* 28 */ { SQL_API_SQLEXTENDEDFETCH, "SQLExtendedFetch", SQLExtendedFetch, NULL, NULL }, + /* 29 */ { SQL_API_SQLFETCH, "SQLFetch", SQLFetch, NULL, NULL }, + /* 30 */ { SQL_API_SQLFETCHSCROLL, "SQLFetchScroll", SQLFetchScroll, NULL, NULL }, + /* 31 */ { SQL_API_SQLFOREIGNKEYS, "SQLForeignKeys", SQLForeignKeys, NULL, NULL }, + /* 32 */ { SQL_API_SQLFREEENV, "SQLFreeEnv", SQLFreeEnv, NULL, NULL }, + /* 33 */ { SQL_API_SQLFREEHANDLE, "SQLFreeHandle", SQLFreeHandle, NULL, NULL }, + /* 34 */ { SQL_API_SQLFREESTMT, "SQLFreeStmt", SQLFreeStmt, NULL, NULL }, + /* 35 */ { SQL_API_SQLFREECONNECT, "SQLFreeConnect", SQLFreeConnect, NULL, NULL }, + /* 36 */ { SQL_API_SQLGETCONNECTATTR, "SQLGetConnectAttr", SQLGetConnectAttr, NULL, NULL }, + /* 37 */ { SQL_API_SQLGETCONNECTOPTION, "SQLGetConnectOption", SQLGetConnectOption, NULL, NULL }, + /* 38 */ { SQL_API_SQLGETCURSORNAME, "SQLGetCursorName", SQLGetCursorName, NULL, NULL }, + /* 39 */ { SQL_API_SQLGETDATA, "SQLGetData", SQLGetData, NULL, NULL }, + /* 40 */ { SQL_API_SQLGETDESCFIELD, "SQLGetDescField", SQLGetDescField, NULL, NULL }, + /* 41 */ { SQL_API_SQLGETDESCREC, "SQLGetDescRec", SQLGetDescRec, NULL, NULL }, + /* 42 */ { SQL_API_SQLGETDIAGFIELD, "SQLGetDiagField", SQLGetDiagField, NULL, NULL }, + /* 43 */ { SQL_API_SQLGETENVATTR, "SQLGetEnvAttr", SQLGetEnvAttr, NULL, NULL }, + /* 44 */ { SQL_API_SQLGETFUNCTIONS, "SQLGetFunctions", SQLGetFunctions, NULL, NULL }, + /* 45 */ { SQL_API_SQLGETINFO, "SQLGetInfo", SQLGetInfo, NULL, NULL }, + /* 46 */ { SQL_API_SQLGETSTMTATTR, "SQLGetStmtAttr", SQLGetStmtAttr, NULL, NULL }, + /* 47 */ { SQL_API_SQLGETSTMTOPTION, "SQLGetStmtOption", SQLGetStmtOption, NULL, NULL }, + /* 48 */ { SQL_API_SQLGETTYPEINFO, "SQLGetTypeInfo", SQLGetTypeInfo, NULL, NULL }, + /* 49 */ { SQL_API_SQLMORERESULTS, "SQLMoreResults", SQLMoreResults, NULL, NULL }, + /* 50 */ { SQL_API_SQLNATIVESQL, "SQLNativeSql", SQLNativeSql, NULL, NULL }, + /* 51 */ { SQL_API_SQLNUMPARAMS, "SQLNumParams", SQLNumParams, NULL, NULL }, + /* 52 */ { SQL_API_SQLNUMRESULTCOLS, "SQLNumResultCols", SQLNumResultCols, NULL, NULL }, + /* 53 */ { SQL_API_SQLPARAMDATA, "SQLParamData", SQLParamData, NULL, NULL }, + /* 54 */ { SQL_API_SQLPARAMOPTIONS, "SQLParamOptions", SQLParamOptions, NULL, NULL }, + /* 55 */ { SQL_API_SQLPREPARE, "SQLPrepare", SQLPrepare, NULL, NULL }, + /* 56 */ { SQL_API_SQLPRIMARYKEYS, "SQLPrimaryKeys", SQLPrimaryKeys, NULL, NULL }, + /* 57 */ { SQL_API_SQLPROCEDURECOLUMNS, "SQLProcedureColumns", SQLProcedureColumns, NULL, NULL }, + /* 58 */ { SQL_API_SQLPROCEDURES, "SQLProcedures", SQLProcedures, NULL, NULL }, + /* 59 */ { SQL_API_SQLPUTDATA, "SQLPutData", SQLPutData, NULL, NULL }, + /* 60 */ { SQL_API_SQLROWCOUNT, "SQLRowCount", SQLRowCount, NULL, NULL }, + /* 61 */ { SQL_API_SQLSETCONNECTATTR, "SQLSetConnectAttr", SQLSetConnectAttr, NULL, NULL }, + /* 62 */ { SQL_API_SQLSETCONNECTOPTION, "SQLSetConnectOption", SQLSetConnectOption, NULL, NULL }, + /* 63 */ { SQL_API_SQLSETCURSORNAME, "SQLSetCursorName", SQLSetCursorName, NULL, NULL }, + /* 64 */ { SQL_API_SQLSETDESCFIELD, "SQLSetDescField", SQLSetDescField, NULL, NULL }, + /* 65 */ { SQL_API_SQLSETDESCREC, "SQLSetDescRec", SQLSetDescRec, NULL, NULL }, + /* 66 */ { SQL_API_SQLSETENVATTR, "SQLSetEnvAttr", SQLSetEnvAttr, NULL, NULL }, + /* 67 */ { SQL_API_SQLSETPARAM, "SQLSetParam", SQLSetParam, NULL, NULL }, + /* 68 */ { SQL_API_SQLSETPOS, "SQLSetPos", SQLSetPos, NULL, NULL }, + /* 69 */ { SQL_API_SQLSETSCROLLOPTIONS, "SQLSetScrollOptions", SQLSetScrollOptions, NULL, NULL }, + /* 70 */ { SQL_API_SQLSETSTMTATTR, "SQLSetStmtAttr", SQLSetStmtAttr, NULL, NULL }, + /* 71 */ { SQL_API_SQLSETSTMTOPTION, "SQLSetStmtOption", SQLSetStmtOption, NULL, NULL }, + /* 72 */ { SQL_API_SQLSPECIALCOLUMNS, "SQLSpecialColumns", SQLSpecialColumns, NULL, NULL }, + /* 73 */ { SQL_API_SQLSTATISTICS, "SQLStatistics", SQLStatistics, NULL, NULL }, + /* 74 */ { SQL_API_SQLTABLEPRIVILEGES, "SQLTablePrivileges", SQLTablePrivileges, NULL, NULL }, + /* 75 */ { SQL_API_SQLTABLES, "SQLTables", SQLTables, NULL, NULL }, + /* 76 */ { SQL_API_SQLTRANSACT, "SQLTransact", SQLTransact, NULL, NULL }, + /* 77 */ { SQL_API_SQLGETDIAGREC, "SQLGetDiagRec", SQLGetDiagRec, NULL, NULL }, }; static PROXYHANDLE gProxyHandle; @@ -156,12 +159,301 @@ static PROXYHANDLE gProxyHandle; } \ } -SQLRETURN SQLDummyFunc() +static SQLRETURN SQLDummyFunc(void) { - TRACE("SQLDummyFunc: \n"); + TRACE("SQLDummyFunc:\n"); return SQL_SUCCESS; } +/*********************************************************************** + * ODBC_ReplicateODBCInstToRegistry + * + * PARAMS + * + * RETURNS + * + * Utility to ODBC_ReplicateToRegistry to replicate the drivers of the + * ODBCINST.INI settings + * + * The driver settings are not replicated to the registry. If we were to + * replicate them we would need to decide whether to replicate all settings + * or to do some translation; whether to remove any entries present only in + * the windows registry, etc. + */ + +static void ODBC_ReplicateODBCInstToRegistry (SQLHENV hEnv) +{ + HKEY hODBCInst; + LONG reg_ret; + int success; + + success = 0; + TRACE ("Driver settings are not currently replicated to the registry\n"); + if ((reg_ret = RegCreateKeyExA (HKEY_LOCAL_MACHINE, + "Software\\ODBC\\ODBCINST.INI", 0, NULL, + REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS /* a couple more than we need */, NULL, + &hODBCInst, NULL)) == ERROR_SUCCESS) + { + HKEY hDrivers; + if ((reg_ret = RegCreateKeyExA (hODBCInst, "ODBC Drivers", 0, + NULL, REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS /* overkill */, NULL, &hDrivers, NULL)) + == ERROR_SUCCESS) + { + SQLRETURN sql_ret; + SQLUSMALLINT dirn; + CHAR desc [256]; + SQLSMALLINT sizedesc; + + success = 1; + dirn = SQL_FETCH_FIRST; + while ((sql_ret = SQLDrivers (hEnv, dirn, (SQLCHAR*)desc, sizeof(desc), + &sizedesc, NULL, 0, NULL)) == SQL_SUCCESS || + sql_ret == SQL_SUCCESS_WITH_INFO) + { + /* FIXME Do some proper handling of the SUCCESS_WITH_INFO */ + dirn = SQL_FETCH_NEXT; + if (sizedesc == lstrlenA(desc)) + { + HKEY hThis; + if ((reg_ret = RegQueryValueExA (hDrivers, desc, NULL, + NULL, NULL, NULL)) == ERROR_FILE_NOT_FOUND) + { + if ((reg_ret = RegSetValueExA (hDrivers, desc, 0, + REG_SZ, (const BYTE *)"Installed", 10)) != ERROR_SUCCESS) + { + TRACE ("Error %d replicating driver %s\n", + reg_ret, desc); + success = 0; + } + } + else if (reg_ret != ERROR_SUCCESS) + { + TRACE ("Error %d checking for %s in drivers\n", + reg_ret, desc); + success = 0; + } + if ((reg_ret = RegCreateKeyExA (hODBCInst, desc, 0, + NULL, REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS, NULL, &hThis, NULL)) + == ERROR_SUCCESS) + { + /* FIXME This is where the settings go. + * I suggest that if the disposition says it + * exists then we leave it alone. Alternatively + * include an extra value to flag that it is + * a replication of the unixODBC/iODBC/... + */ + if ((reg_ret = RegCloseKey (hThis)) != + ERROR_SUCCESS) + TRACE ("Error %d closing %s key\n", reg_ret, + desc); + } + else + { + TRACE ("Error %d ensuring driver key %s\n", + reg_ret, desc); + success = 0; + } + } + else + { + WARN ("Unusually long driver name %s not replicated\n", + desc); + success = 0; + } + } + if (sql_ret != SQL_NO_DATA) + { + TRACE ("Error %d enumerating drivers\n", (int)sql_ret); + success = 0; + } + if ((reg_ret = RegCloseKey (hDrivers)) != ERROR_SUCCESS) + { + TRACE ("Error %d closing hDrivers\n", reg_ret); + } + } + else + { + TRACE ("Error %d opening HKLM\\S\\O\\OI\\Drivers\n", reg_ret); + } + if ((reg_ret = RegCloseKey (hODBCInst)) != ERROR_SUCCESS) + { + TRACE ("Error %d closing HKLM\\S\\O\\ODBCINST.INI\n", reg_ret); + } + } + else + { + TRACE ("Error %d opening HKLM\\S\\O\\ODBCINST.INI\n", reg_ret); + } + if (!success) + { + WARN ("May not have replicated all ODBC drivers to the registry\n"); + } +} + +/*********************************************************************** + * ODBC_ReplicateODBCToRegistry + * + * PARAMS + * + * RETURNS + * + * Utility to ODBC_ReplicateToRegistry to replicate either the USER or + * SYSTEM dsns + * + * For now simply place the "Driver description" (as returned by SQLDataSources) + * into the registry as the driver. This is enough to satisfy Crystal's + * requirement that there be a driver entry. (It doesn't seem to care what + * the setting is). + * A slightly more accurate setting would be to access the registry to find + * the actual driver library for the given description (which appears to map + * to one of the HKLM/Software/ODBC/ODBCINST.INI keys). (If you do this note + * that this will add a requirement that this function be called after + * ODBC_ReplicateODBCInstToRegistry) + */ +static void ODBC_ReplicateODBCToRegistry (int is_user, SQLHENV hEnv) +{ + HKEY hODBC; + LONG reg_ret; + SQLRETURN sql_ret; + SQLUSMALLINT dirn; + CHAR dsn [SQL_MAX_DSN_LENGTH + 1]; + SQLSMALLINT sizedsn; + CHAR desc [256]; + SQLSMALLINT sizedesc; + int success; + const char *which = is_user ? "user" : "system"; + + success = 0; + if ((reg_ret = RegCreateKeyExA ( + is_user ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE, + "Software\\ODBC\\ODBC.INI", 0, NULL, REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS /* a couple more than we need */, NULL, &hODBC, + NULL)) == ERROR_SUCCESS) + { + success = 1; + dirn = is_user ? SQL_FETCH_FIRST_USER : SQL_FETCH_FIRST_SYSTEM; + while ((sql_ret = SQLDataSources (hEnv, dirn, + (SQLCHAR*)dsn, sizeof(dsn), &sizedsn, + (SQLCHAR*)desc, sizeof(desc), &sizedesc)) == SQL_SUCCESS + || sql_ret == SQL_SUCCESS_WITH_INFO) + { + /* FIXME Do some proper handling of the SUCCESS_WITH_INFO */ + dirn = SQL_FETCH_NEXT; + if (sizedsn == lstrlenA(dsn) && sizedesc == lstrlenA(desc)) + { + HKEY hDSN; + if ((reg_ret = RegCreateKeyExA (hODBC, dsn, 0, + NULL, REG_OPTION_NON_VOLATILE, + KEY_ALL_ACCESS, NULL, &hDSN, NULL)) + == ERROR_SUCCESS) + { + static const char DRIVERKEY[] = "Driver"; + if ((reg_ret = RegQueryValueExA (hDSN, DRIVERKEY, + NULL, NULL, NULL, NULL)) + == ERROR_FILE_NOT_FOUND) + { + if ((reg_ret = RegSetValueExA (hDSN, DRIVERKEY, 0, + REG_SZ, (LPBYTE)desc, sizedesc)) != ERROR_SUCCESS) + { + TRACE ("Error %d replicating description of " + "%s(%s)\n", reg_ret, dsn, desc); + success = 0; + } + } + else if (reg_ret != ERROR_SUCCESS) + { + TRACE ("Error %d checking for description of %s\n", + reg_ret, dsn); + success = 0; + } + if ((reg_ret = RegCloseKey (hDSN)) != ERROR_SUCCESS) + { + TRACE ("Error %d closing %s DSN key %s\n", + reg_ret, which, dsn); + } + } + else + { + TRACE ("Error %d opening %s DSN key %s\n", + reg_ret, which, dsn); + success = 0; + } + } + else + { + WARN ("Unusually long %s data source name %s (%s) not " + "replicated\n", which, dsn, desc); + success = 0; + } + } + if (sql_ret != SQL_NO_DATA) + { + TRACE ("Error %d enumerating %s datasources\n", + (int)sql_ret, which); + success = 0; + } + if ((reg_ret = RegCloseKey (hODBC)) != ERROR_SUCCESS) + { + TRACE ("Error %d closing %s ODBC.INI registry key\n", reg_ret, + which); + } + } + else + { + TRACE ("Error %d creating/opening %s ODBC.INI registry key\n", + reg_ret, which); + } + if (!success) + { + WARN ("May not have replicated all %s ODBC DSNs to the registry\n", + which); + } +} + +/*********************************************************************** + * ODBC_ReplicateToRegistry + * + * PARAMS + * + * RETURNS + * + * Unfortunately some of the functions that Windows documents as being part + * of the ODBC API it implements directly during compilation or something + * in terms of registry access functions. + * e.g. SQLGetInstalledDrivers queries the list at + * HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC Drivers + * + * This function is called when the driver manager is loaded and is used + * to replicate the appropriate details into the Wine registry + */ + +static void ODBC_ReplicateToRegistry (void) +{ + SQLRETURN sql_ret; + SQLHENV hEnv; + + if ((sql_ret = SQLAllocEnv (&hEnv)) == SQL_SUCCESS) + { + ODBC_ReplicateODBCInstToRegistry (hEnv); + ODBC_ReplicateODBCToRegistry (0 /* system dsns */, hEnv); + ODBC_ReplicateODBCToRegistry (1 /* user dsns */, hEnv); + + if ((sql_ret = SQLFreeEnv (hEnv)) != SQL_SUCCESS) + { + TRACE ("Error %d freeing the SQL environment.\n", (int)sql_ret); + } + } + else + { + TRACE ("Error %d opening an SQL environment.\n", (int)sql_ret); + WARN ("The external ODBC settings have not been replicated to the" + " Wine registry\n"); + } +} + /*********************************************************************** * DllMain [Internal] Initializes the internal 'ODBC32.DLL'. * @@ -178,14 +470,17 @@ SQLRETURN SQLDummyFunc() BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { int i; - TRACE("Initializing or Finalizing proxy ODBC: %p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved); + TRACE("Initializing or Finalizing proxy ODBC: %p,%x,%p\n", hinstDLL, fdwReason, lpvReserved); if (fdwReason == DLL_PROCESS_ATTACH) { TRACE("Loading ODBC...\n"); DisableThreadLibraryCalls(hinstDLL); if (ODBC_LoadDriverManager()) + { ODBC_LoadDMFunctions(); + ODBC_ReplicateToRegistry(); + } } else if (fdwReason == DLL_PROCESS_DETACH) { @@ -197,19 +492,17 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) gProxyHandle.functions[i].func = SQLDummyFunc; } } -#ifndef __REACTOS__ + if (gProxyHandle.dmHandle) { wine_dlclose(gProxyHandle.dmHandle,NULL,0); gProxyHandle.dmHandle = NULL; } -#endif } return TRUE; } - /*********************************************************************** * ODBC_LoadDriverManager [Internal] Load ODBC library. * @@ -223,41 +516,28 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) static BOOL ODBC_LoadDriverManager(void) { const char *s = getenv("LIB_ODBC_DRIVER_MANAGER"); -#ifndef __REACTOS__ char error[256]; -#endif TRACE("\n"); gProxyHandle.bFunctionReady = FALSE; - gProxyHandle.nErrorType = ERROR_LIBRARY_NOT_FOUND; - if (s!= NULL && strlen (s) >= sizeof(gProxyHandle.dmLibName)) - { - ERR("Driver name too long (%s)\n",s); - return FALSE; - } - if (s == NULL || strlen(s) == 0) - s = "libodbc.so"; - strcpy(gProxyHandle.dmLibName, s); -#ifndef __REACTOS__ - gProxyHandle.dmHandle = wine_dlopen(gProxyHandle.dmLibName, RTLD_LAZY, error, sizeof(error)); +#ifdef SONAME_LIBODBC + if (!s || !s[0]) s = SONAME_LIBODBC; +#endif + if (!s || !s[0]) goto failed; - if (gProxyHandle.dmHandle == NULL) /* fail to load unixODBC driver manager */ - { - WARN("failed to open library %s: %s\n", gProxyHandle.dmLibName, error); - gProxyHandle.dmLibName[0] = '\0'; - gProxyHandle.nErrorType = ERROR_LIBRARY_NOT_FOUND; - return FALSE; - } - else + gProxyHandle.dmHandle = wine_dlopen(s, RTLD_LAZY | RTLD_GLOBAL, error, sizeof(error)); + + if (gProxyHandle.dmHandle != NULL) { gProxyHandle.nErrorType = ERROR_FREE; return TRUE; } -#else +failed: + WARN("failed to open library %s: %s\n", debugstr_a(s), error); + gProxyHandle.nErrorType = ERROR_LIBRARY_NOT_FOUND; return FALSE; -#endif } @@ -273,16 +553,16 @@ static BOOL ODBC_LoadDriverManager(void) static BOOL ODBC_LoadDMFunctions(void) { -#ifndef __REACTOS__ int i; char error[256]; -#endif if (gProxyHandle.dmHandle == NULL) return FALSE; -#ifndef __REACTOS__ + for ( i = 0; i < NUM_SQLFUNC; i ++ ) { + char * pFuncNameW; + gProxyHandle.functions[i] = template_func[i]; gProxyHandle.functions[i].func = wine_dlsym(gProxyHandle.dmHandle, gProxyHandle.functions[i].name, error, sizeof(error)); @@ -292,10 +572,27 @@ static BOOL ODBC_LoadDMFunctions(void) ERR("Failed to load function %s\n",gProxyHandle.functions[i].name); gProxyHandle.functions[i].func = SQLDummyFunc; } + else + { + /* Build Unicode function name for this function */ + pFuncNameW = HeapAlloc(GetProcessHeap(), 0, strlen(gProxyHandle.functions[i].name) + 2); + strcpy(pFuncNameW, gProxyHandle.functions[i].name); + pFuncNameW[strlen(gProxyHandle.functions[i].name) + 1] = '\0'; + pFuncNameW[strlen(gProxyHandle.functions[i].name)] = 'W'; + + gProxyHandle.functions[i].funcW = wine_dlsym(gProxyHandle.dmHandle, + pFuncNameW, error, sizeof(error)); + if (error[0]) + { +/* TRACE("Failed to load function %s, possibly no Unicode version is required\n", pFuncNameW); */ + gProxyHandle.functions[i].funcW = NULL; + } + HeapFree(GetProcessHeap(), 0, pFuncNameW); + } } gProxyHandle.bFunctionReady = TRUE; -#endif + return TRUE; } @@ -356,7 +653,7 @@ SQLRETURN WINAPI SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, S if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) { if (gProxyHandle.nErrorType == ERROR_LIBRARY_NOT_FOUND) - WARN("ProxyODBC: Can not load ODBC driver manager library.\n"); + WARN("ProxyODBC: Cannot load ODBC driver manager library.\n"); if (HandleType == SQL_HANDLE_ENV) *OutputHandle = SQL_NULL_HENV; @@ -409,12 +706,12 @@ SQLRETURN WINAPI SQLAllocStmt(SQLHDBC ConnectionHandle, SQLHSTMT *StatementHandl SQLRETURN WINAPI SQLAllocHandleStd( SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) { - TRACE("ProxyODBC: SQLAllocHandelStd.\n"); + TRACE("ProxyODBC: SQLAllocHandleStd.\n"); if (!gProxyHandle.bFunctionReady || gProxyHandle.dmHandle == NULL) { if (gProxyHandle.nErrorType == ERROR_LIBRARY_NOT_FOUND) - WARN("ProxyODBC: Can not load ODBC driver manager library.\n"); + WARN("ProxyODBC: Cannot load ODBC driver manager library.\n"); if (HandleType == SQL_HANDLE_ENV) *OutputHandle = SQL_NULL_HENV; @@ -439,8 +736,8 @@ SQLRETURN WINAPI SQLAllocHandleStd( SQLSMALLINT HandleType, */ SQLRETURN WINAPI SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, - SQLPOINTER TargetValue, SQLINTEGER BufferLength, - SQLINTEGER *StrLen_or_Ind) + SQLPOINTER TargetValue, SQLLEN BufferLength, + SQLLEN *StrLen_or_Ind) { TRACE("\n"); @@ -462,9 +759,9 @@ SQLRETURN WINAPI SQLBindCol(SQLHSTMT StatementHandle, */ SQLRETURN WINAPI SQLBindParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, - SQLSMALLINT ParameterType, SQLUINTEGER LengthPrecision, + SQLSMALLINT ParameterType, SQLULEN LengthPrecision, SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, - SQLINTEGER *StrLen_or_Ind) + SQLLEN *StrLen_or_Ind) { TRACE("\n"); @@ -560,8 +857,8 @@ SQLRETURN WINAPI SQLConnect(SQLHDBC ConnectionHandle, CHECK_READY_AND_dmHandle(); - strcpy(gProxyHandle.ServerName, (const char*)ServerName); - strcpy(gProxyHandle.UserName, (const char*)UserName); + strcpy( (LPSTR)gProxyHandle.ServerName, (LPSTR)ServerName ); + strcpy( (LPSTR)gProxyHandle.UserName, (LPSTR)UserName ); assert(gProxyHandle.functions[SQLAPI_INDEX_SQLCONNECT].func); ret=(gProxyHandle.functions[SQLAPI_INDEX_SQLCONNECT].func) @@ -612,7 +909,7 @@ SQLRETURN WINAPI SQLDataSources(SQLHENV EnvironmentHandle, (EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, BufferLength2, NameLength2); - if (WINE_TRACE_ON(odbc)) + if (TRACE_ON(odbc)) { TRACE("returns: %d \t", ret); if (*NameLength1 > 0) @@ -632,7 +929,7 @@ SQLRETURN WINAPI SQLDataSources(SQLHENV EnvironmentHandle, SQLRETURN WINAPI SQLDescribeCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, - SQLSMALLINT *DataType, SQLUINTEGER *ColumnSize, + SQLSMALLINT *DataType, SQLULEN *ColumnSize, SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) { TRACE("\n"); @@ -746,7 +1043,7 @@ SQLRETURN WINAPI SQLFetch(SQLHSTMT StatementHandle) /************************************************************************* * SQLFetchScroll [ODBC32.030] */ -SQLRETURN WINAPI SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLINTEGER FetchOffset) +SQLRETURN WINAPI SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLLEN FetchOffset) { TRACE("\n"); @@ -883,8 +1180,8 @@ SQLRETURN WINAPI SQLGetCursorName(SQLHSTMT StatementHandle, */ SQLRETURN WINAPI SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, - SQLPOINTER TargetValue, SQLINTEGER BufferLength, - SQLINTEGER *StrLen_or_Ind) + SQLPOINTER TargetValue, SQLLEN BufferLength, + SQLLEN *StrLen_or_Ind) { TRACE("\n"); @@ -923,7 +1220,7 @@ SQLRETURN WINAPI SQLGetDescRec(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLCHAR *Name, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLSMALLINT *Type, SQLSMALLINT *SubType, - SQLINTEGER *Length, SQLSMALLINT *Precision, + SQLLEN *Length, SQLSMALLINT *Precision, SQLSMALLINT *Scale, SQLSMALLINT *Nullable) { TRACE("\n"); @@ -1119,7 +1416,7 @@ SQLRETURN WINAPI SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQ /************************************************************************* * SQLPutData [ODBC32.049] */ -SQLRETURN WINAPI SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLINTEGER StrLen_or_Ind) +SQLRETURN WINAPI SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLLEN StrLen_or_Ind) { TRACE("\n"); @@ -1134,7 +1431,7 @@ SQLRETURN WINAPI SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLINTEGE /************************************************************************* * SQLRowCount [ODBC32.020] */ -SQLRETURN WINAPI SQLRowCount(SQLHSTMT StatementHandle, SQLINTEGER *RowCount) +SQLRETURN WINAPI SQLRowCount(SQLHSTMT StatementHandle, SQLLEN *RowCount) { TRACE("\n"); @@ -1165,7 +1462,7 @@ SQLRETURN WINAPI SQLSetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribut /************************************************************************* * SQLSetConnectOption [ODBC32.050] */ -SQLRETURN WINAPI SQLSetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLUINTEGER Value) +SQLRETURN WINAPI SQLSetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLULEN Value) { TRACE("\n"); @@ -1214,10 +1511,10 @@ SQLRETURN WINAPI SQLSetDescField(SQLHDESC DescriptorHandle, */ SQLRETURN WINAPI SQLSetDescRec(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT Type, - SQLSMALLINT SubType, SQLINTEGER Length, + SQLSMALLINT SubType, SQLLEN Length, SQLSMALLINT Precision, SQLSMALLINT Scale, - SQLPOINTER Data, SQLINTEGER *StringLength, - SQLINTEGER *Indicator) + SQLPOINTER Data, SQLLEN *StringLength, + SQLLEN *Indicator) { TRACE("\n"); @@ -1252,9 +1549,9 @@ SQLRETURN WINAPI SQLSetEnvAttr(SQLHENV EnvironmentHandle, */ SQLRETURN WINAPI SQLSetParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, - SQLSMALLINT ParameterType, SQLUINTEGER LengthPrecision, + SQLSMALLINT ParameterType, SQLULEN LengthPrecision, SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, - SQLINTEGER *StrLen_or_Ind) + SQLLEN *StrLen_or_Ind) { TRACE("\n"); @@ -1287,7 +1584,7 @@ SQLRETURN WINAPI SQLSetStmtAttr(SQLHSTMT StatementHandle, /************************************************************************* * SQLSetStmtOption [ODBC32.051] */ -SQLRETURN WINAPI SQLSetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLUINTEGER Value) +SQLRETURN WINAPI SQLSetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLULEN Value) { TRACE("\n"); @@ -1423,7 +1720,7 @@ SQLRETURN WINAPI SQLColAttributes( SQLPOINTER rgbDesc, SQLSMALLINT cbDescMax, SQLSMALLINT *pcbDesc, - SQLINTEGER *pfDesc) + SQLLEN *pfDesc) { TRACE("\n"); @@ -1467,7 +1764,7 @@ SQLRETURN WINAPI SQLDescribeParam( SQLHSTMT hstmt, SQLUSMALLINT ipar, SQLSMALLINT *pfSqlType, - SQLUINTEGER *pcbParamDef, + SQLULEN *pcbParamDef, SQLSMALLINT *pibScale, SQLSMALLINT *pfNullable) { @@ -1745,11 +2042,11 @@ SQLRETURN WINAPI SQLBindParameter( SQLSMALLINT fParamType, SQLSMALLINT fCType, SQLSMALLINT fSqlType, - SQLUINTEGER cbColDef, + SQLULEN cbColDef, SQLSMALLINT ibScale, SQLPOINTER rgbValue, - SQLINTEGER cbValueMax, - SQLINTEGER *pcbValue) + SQLLEN cbValueMax, + SQLLEN *pcbValue) { TRACE("\n"); @@ -1792,7 +2089,7 @@ SQLRETURN WINAPI SQLDriverConnect( SQLRETURN WINAPI SQLSetScrollOptions( SQLHSTMT statement_handle, SQLUSMALLINT f_concurrency, - SQLINTEGER crow_keyset, + SQLLEN crow_keyset, SQLUSMALLINT crow_rowset ) { TRACE("\n"); @@ -1804,4 +2101,832 @@ SQLRETURN WINAPI SQLSetScrollOptions( (statement_handle, f_concurrency, crow_keyset, crow_rowset); } +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; +} + + /* End of file */ diff --git a/reactos/dll/win32/odbc32/proxyodbc.h b/reactos/dll/win32/odbc32/proxyodbc.h index ec884e64248..ee45691eee6 100644 --- a/reactos/dll/win32/odbc32/proxyodbc.h +++ b/reactos/dll/win32/odbc32/proxyodbc.h @@ -33,6 +33,7 @@ typedef struct dm_func /* driver manager functions */ const char *name; void *d_func; SQLRETURN (*func)(); + SQLRETURN (*funcW)(); } DM_FUNC; typedef struct proxyhandle @@ -44,7 +45,6 @@ typedef struct proxyhandle int nErrorType; DM_FUNC functions[NUM_SQLFUNC]; /* entry point for driver manager functions */ char driverLibName[200]; /* ODBC driver SO name */ - char dmLibName[200]; /* driver manager library name */ char ServerName[200]; /* keep server name */ char UserName[50]; /* keep username */ } PROXYHANDLE;