/* * Win32 ODBC functions * * Copyright 1999 Xiang Li, Corel Corporation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, 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 * variable LIB_ODBC_DRIVER_MANAGER, or to libodbc.so if the * variable is not set. * */ #include #include #include #include #include #include "windef.h" #include "winbase.h" #include "winternl.h" #include "winreg.h" #include "wine/debug.h" #include "sql.h" #include "sqltypes.h" #include "sqlext.h" #include "unixlib.h" WINE_DEFAULT_DEBUG_CHANNEL(odbc); WINE_DECLARE_DEBUG_CHANNEL(winediag); static SQLRETURN WINAPI null_SQLAllocConnect(SQLHENV EnvironmentHandle, SQLHDBC *ConnectionHandle) { *ConnectionHandle = SQL_NULL_HDBC; TRACE("Not ready\n"); return SQL_ERROR; } static SQLRETURN WINAPI null_SQLAllocEnv(SQLHENV *EnvironmentHandle) { *EnvironmentHandle = SQL_NULL_HENV; TRACE("Not ready\n"); return SQL_ERROR; } static SQLRETURN WINAPI null_SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) { WARN("ProxyODBC: Cannot load ODBC driver manager library.\n"); if (HandleType == SQL_HANDLE_ENV) *OutputHandle = SQL_NULL_HENV; else if (HandleType == SQL_HANDLE_DBC) *OutputHandle = SQL_NULL_HDBC; else if (HandleType == SQL_HANDLE_STMT) *OutputHandle = SQL_NULL_HSTMT; else if (HandleType == SQL_HANDLE_DESC) *OutputHandle = SQL_NULL_HDESC; return SQL_ERROR; } static SQLRETURN WINAPI null_SQLAllocHandleStd(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) { WARN("ProxyODBC: Cannot load ODBC driver manager library.\n"); if (HandleType == SQL_HANDLE_ENV) *OutputHandle = SQL_NULL_HENV; else if (HandleType == SQL_HANDLE_DBC) *OutputHandle = SQL_NULL_HDBC; else if (HandleType == SQL_HANDLE_STMT) *OutputHandle = SQL_NULL_HSTMT; else if (HandleType == SQL_HANDLE_DESC) *OutputHandle = SQL_NULL_HDESC; return SQL_ERROR; } static SQLRETURN WINAPI null_SQLAllocStmt(SQLHDBC ConnectionHandle, SQLHSTMT *StatementHandle) { *StatementHandle = SQL_NULL_HSTMT; TRACE("Not ready\n"); return SQL_ERROR; } static SQLRETURN WINAPI null_SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLBindParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLULEN LengthPrecision, SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, SQLLEN *StrLen_or_Ind) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLBindParameter(SQLHSTMT hstmt, SQLUSMALLINT ipar, SQLSMALLINT fParamType, SQLSMALLINT fCType, SQLSMALLINT fSqlType, SQLULEN cbColDef, SQLSMALLINT ibScale, SQLPOINTER rgbValue, SQLLEN cbValueMax, SQLLEN *pcbValue) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLBrowseConnect(SQLHDBC hdbc, SQLCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn, SQLCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLBrowseConnectW(SQLHDBC hdbc, SQLWCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn, SQLWCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLBulkOperations(SQLHSTMT StatementHandle, SQLSMALLINT Operation) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLCancel(SQLHSTMT StatementHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLCloseCursor(SQLHSTMT StatementHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColAttribute(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLLEN *NumericAttribute) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColAttributeW(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLLEN *NumericAttribute) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColAttributes(SQLHSTMT hstmt, SQLUSMALLINT icol, SQLUSMALLINT fDescType, SQLPOINTER rgbDesc, SQLSMALLINT cbDescMax, SQLSMALLINT *pcbDesc, SQLLEN *pfDesc) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColAttributesW(SQLHSTMT hstmt, SQLUSMALLINT icol, SQLUSMALLINT fDescType, SQLPOINTER rgbDesc, SQLSMALLINT cbDescMax, SQLSMALLINT *pcbDesc, SQLLEN *pfDesc) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColumnPrivileges(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szTableName, SQLSMALLINT cbTableName, SQLCHAR *szColumnName, SQLSMALLINT cbColumnName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColumnPrivilegesW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szTableName, SQLSMALLINT cbTableName, SQLWCHAR *szColumnName, SQLSMALLINT cbColumnName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColumns(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLCHAR *ColumnName, SQLSMALLINT NameLength4) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLColumnsW(SQLHSTMT StatementHandle, WCHAR *CatalogName, SQLSMALLINT NameLength1, WCHAR *SchemaName, SQLSMALLINT NameLength2, WCHAR *TableName, SQLSMALLINT NameLength3, WCHAR *ColumnName, SQLSMALLINT NameLength4) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR *ServerName, SQLSMALLINT NameLength1, SQLCHAR *UserName, SQLSMALLINT NameLength2, SQLCHAR *Authentication, SQLSMALLINT NameLength3) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLConnectW(SQLHDBC ConnectionHandle, WCHAR *ServerName, SQLSMALLINT NameLength1, WCHAR *UserName, SQLSMALLINT NameLength2, WCHAR *Authentication, SQLSMALLINT NameLength3) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLCopyDesc(SQLHDESC SourceDescHandle, SQLHDESC TargetDescHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDataSources(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, SQLCHAR *ServerName, SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, SQLCHAR *Description, SQLSMALLINT BufferLength2, SQLSMALLINT *NameLength2) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDataSourcesA(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, SQLCHAR *ServerName, SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, SQLCHAR *Description, SQLSMALLINT BufferLength2, SQLSMALLINT *NameLength2) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDataSourcesW(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, WCHAR *ServerName, SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, WCHAR *Description, SQLSMALLINT BufferLength2, SQLSMALLINT *NameLength2) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDescribeCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, SQLSMALLINT *DataType, SQLULEN *ColumnSize, SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDescribeColW(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, WCHAR *ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, SQLSMALLINT *DataType, SQLULEN *ColumnSize, SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDescribeParam(SQLHSTMT hstmt, SQLUSMALLINT ipar, SQLSMALLINT *pfSqlType, SQLULEN *pcbParamDef, SQLSMALLINT *pibScale, SQLSMALLINT *pfNullable) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDisconnect(SQLHDBC ConnectionHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDriverConnect(SQLHDBC hdbc, SQLHWND hwnd, SQLCHAR *ConnectionString, SQLSMALLINT Length, SQLCHAR *conn_str_out, SQLSMALLINT conn_str_out_max, SQLSMALLINT *ptr_conn_str_out, SQLUSMALLINT driver_completion) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDriverConnectW(SQLHDBC ConnectionHandle, SQLHWND WindowHandle, WCHAR *InConnectionString, SQLSMALLINT Length, WCHAR *OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT *Length2, SQLUSMALLINT DriverCompletion) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDrivers(SQLHENV EnvironmentHandle, SQLUSMALLINT fDirection, SQLCHAR *szDriverDesc, SQLSMALLINT cbDriverDescMax, SQLSMALLINT *pcbDriverDesc, SQLCHAR *szDriverAttributes, SQLSMALLINT cbDriverAttrMax, SQLSMALLINT *pcbDriverAttr) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLDriversW(SQLHENV EnvironmentHandle, SQLUSMALLINT fDirection, SQLWCHAR *szDriverDesc, SQLSMALLINT cbDriverDescMax, SQLSMALLINT *pcbDriverDesc, SQLWCHAR *szDriverAttributes, SQLSMALLINT cbDriverAttrMax, SQLSMALLINT *pcbDriverAttr) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLError(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLErrorW(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, WCHAR *Sqlstate, SQLINTEGER *NativeError, WCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLExecDirectW(SQLHSTMT StatementHandle, WCHAR *StatementText, SQLINTEGER TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLExecute(SQLHSTMT StatementHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLExtendedFetch(SQLHSTMT hstmt, SQLUSMALLINT fFetchType, SQLLEN irow, SQLULEN *pcrow, SQLUSMALLINT *rgfRowStatus) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLFetch(SQLHSTMT StatementHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLLEN FetchOffset) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLForeignKeys(SQLHSTMT hstmt, SQLCHAR *szPkCatalogName, SQLSMALLINT cbPkCatalogName, SQLCHAR *szPkSchemaName, SQLSMALLINT cbPkSchemaName, SQLCHAR *szPkTableName, SQLSMALLINT cbPkTableName, SQLCHAR *szFkCatalogName, SQLSMALLINT cbFkCatalogName, SQLCHAR *szFkSchemaName, SQLSMALLINT cbFkSchemaName, SQLCHAR *szFkTableName, SQLSMALLINT cbFkTableName) { return SQL_ERROR; } static SQLRETURN WINAPI null_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) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLFreeConnect(SQLHDBC ConnectionHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLFreeEnv(SQLHENV EnvironmentHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLFreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLPOINTER Value) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLPOINTER Value) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetCursorName(SQLHSTMT StatementHandle, SQLCHAR *CursorName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetCursorNameW(SQLHSTMT StatementHandle, WCHAR *CursorName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDescField(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDescFieldW(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDescRec(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLCHAR *Name, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLSMALLINT *Type, SQLSMALLINT *SubType, SQLLEN *Length, SQLSMALLINT *Precision, SQLSMALLINT *Scale, SQLSMALLINT *Nullable) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDescRecW(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, WCHAR *Name, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLSMALLINT *Type, SQLSMALLINT *SubType, SQLLEN *Length, SQLSMALLINT *Precision, SQLSMALLINT *Scale, SQLSMALLINT *Nullable) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, SQLPOINTER DiagInfo, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDiagFieldW(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, SQLPOINTER DiagInfo, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDiagRecA(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetDiagRecW(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, WCHAR *Sqlstate, SQLINTEGER *NativeError, WCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetFunctions(SQLHDBC ConnectionHandle, SQLUSMALLINT FunctionId, SQLUSMALLINT *Supported) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetInfo(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValue, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetInfoW(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValue, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetStmtAttrW(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLPOINTER Value) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetTypeInfo(SQLHSTMT StatementHandle, SQLSMALLINT DataType) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLGetTypeInfoW(SQLHSTMT StatementHandle, SQLSMALLINT DataType) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLMoreResults(SQLHSTMT StatementHandle) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLNativeSql(SQLHDBC hdbc, SQLCHAR *szSqlStrIn, SQLINTEGER cbSqlStrIn, SQLCHAR *szSqlStr, SQLINTEGER cbSqlStrMax, SQLINTEGER *pcbSqlStr) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLNativeSqlW(SQLHDBC hdbc, SQLWCHAR *szSqlStrIn, SQLINTEGER cbSqlStrIn, SQLWCHAR *szSqlStr, SQLINTEGER cbSqlStrMax, SQLINTEGER *pcbSqlStr) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLNumParams(SQLHSTMT hstmt, SQLSMALLINT *pcpar) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLNumResultCols(SQLHSTMT StatementHandle, SQLSMALLINT *ColumnCount) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLParamData(SQLHSTMT StatementHandle, SQLPOINTER *Value) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN *pirow) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLPrepareW(SQLHSTMT StatementHandle, WCHAR *StatementText, SQLINTEGER TextLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLPrimaryKeys(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szTableName, SQLSMALLINT cbTableName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLPrimaryKeysW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szTableName, SQLSMALLINT cbTableName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLProcedureColumns(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szProcName, SQLSMALLINT cbProcName, SQLCHAR *szColumnName, SQLSMALLINT cbColumnName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLProcedureColumnsW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szProcName, SQLSMALLINT cbProcName, SQLWCHAR *szColumnName, SQLSMALLINT cbColumnName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLProcedures(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szProcName, SQLSMALLINT cbProcName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLProceduresW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szProcName, SQLSMALLINT cbProcName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLLEN StrLen_or_Ind) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLRowCount(SQLHSTMT StatementHandle, SQLLEN *RowCount) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLULEN Value) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLULEN Value) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetCursorName(SQLHSTMT StatementHandle, SQLCHAR *CursorName, SQLSMALLINT NameLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetCursorNameW(SQLHSTMT StatementHandle, WCHAR *CursorName, SQLSMALLINT NameLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetDescField(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetDescFieldW(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetDescRec(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT Type, SQLSMALLINT SubType, SQLLEN Length, SQLSMALLINT Precision, SQLSMALLINT Scale, SQLPOINTER Data, SQLLEN *StringLength, SQLLEN *Indicator) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLULEN LengthPrecision, SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, SQLLEN *StrLen_or_Ind) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetPos(SQLHSTMT hstmt, SQLSETPOSIROW irow, SQLUSMALLINT fOption, SQLUSMALLINT fLock) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetScrollOptions(SQLHSTMT statement_handle, SQLUSMALLINT f_concurrency, SQLLEN crow_keyset, SQLUSMALLINT crow_rowset) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetStmtAttrW(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLULEN Value) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSpecialColumns(SQLHSTMT StatementHandle, SQLUSMALLINT IdentifierType, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Scope, SQLUSMALLINT Nullable) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLSpecialColumnsW(SQLHSTMT StatementHandle, SQLUSMALLINT IdentifierType, SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, SQLWCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Scope, SQLUSMALLINT Nullable) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLStatistics(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Unique, SQLUSMALLINT Reserved) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLStatisticsW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, SQLWCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Unique, SQLUSMALLINT Reserved) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLTablePrivileges(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szTableName, SQLSMALLINT cbTableName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLTablePrivilegesW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szTableName, SQLSMALLINT cbTableName) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLTables(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLCHAR *TableType, SQLSMALLINT NameLength4) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLTablesW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, SQLWCHAR *TableName, SQLSMALLINT NameLength3, SQLWCHAR *TableType, SQLSMALLINT NameLength4) { return SQL_ERROR; } static SQLRETURN WINAPI null_SQLTransact(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLUSMALLINT CompletionType) { return SQL_ERROR; } static struct sql_funcs sql_funcs = { null_SQLAllocConnect, null_SQLAllocEnv, null_SQLAllocHandle, null_SQLAllocHandleStd, null_SQLAllocStmt, null_SQLBindCol, null_SQLBindParam, null_SQLBindParameter, null_SQLBrowseConnect, null_SQLBrowseConnectW, null_SQLBulkOperations, null_SQLCancel, null_SQLCloseCursor, null_SQLColAttribute, null_SQLColAttributeW, null_SQLColAttributes, null_SQLColAttributesW, null_SQLColumnPrivileges, null_SQLColumnPrivilegesW, null_SQLColumns, null_SQLColumnsW, null_SQLConnect, null_SQLConnectW, null_SQLCopyDesc, null_SQLDataSources, null_SQLDataSourcesA, null_SQLDataSourcesW, null_SQLDescribeCol, null_SQLDescribeColW, null_SQLDescribeParam, null_SQLDisconnect, null_SQLDriverConnect, null_SQLDriverConnectW, null_SQLDrivers, null_SQLDriversW, null_SQLEndTran, null_SQLError, null_SQLErrorW, null_SQLExecDirect, null_SQLExecDirectW, null_SQLExecute, null_SQLExtendedFetch, null_SQLFetch, null_SQLFetchScroll, null_SQLForeignKeys, null_SQLForeignKeysW, null_SQLFreeConnect, null_SQLFreeEnv, null_SQLFreeHandle, null_SQLFreeStmt, null_SQLGetConnectAttr, null_SQLGetConnectAttrW, null_SQLGetConnectOption, null_SQLGetConnectOptionW, null_SQLGetCursorName, null_SQLGetCursorNameW, null_SQLGetData, null_SQLGetDescField, null_SQLGetDescFieldW, null_SQLGetDescRec, null_SQLGetDescRecW, null_SQLGetDiagField, null_SQLGetDiagFieldW, null_SQLGetDiagRec, null_SQLGetDiagRecA, null_SQLGetDiagRecW, null_SQLGetEnvAttr, null_SQLGetFunctions, null_SQLGetInfo, null_SQLGetInfoW, null_SQLGetStmtAttr, null_SQLGetStmtAttrW, null_SQLGetStmtOption, null_SQLGetTypeInfo, null_SQLGetTypeInfoW, null_SQLMoreResults, null_SQLNativeSql, null_SQLNativeSqlW, null_SQLNumParams, null_SQLNumResultCols, null_SQLParamData, null_SQLParamOptions, null_SQLPrepare, null_SQLPrepareW, null_SQLPrimaryKeys, null_SQLPrimaryKeysW, null_SQLProcedureColumns, null_SQLProcedureColumnsW, null_SQLProcedures, null_SQLProceduresW, null_SQLPutData, null_SQLRowCount, null_SQLSetConnectAttr, null_SQLSetConnectAttrW, null_SQLSetConnectOption, null_SQLSetConnectOptionW, null_SQLSetCursorName, null_SQLSetCursorNameW, null_SQLSetDescField, null_SQLSetDescFieldW, null_SQLSetDescRec, null_SQLSetEnvAttr, null_SQLSetParam, null_SQLSetPos, null_SQLSetScrollOptions, null_SQLSetStmtAttr, null_SQLSetStmtAttrW, null_SQLSetStmtOption, null_SQLSpecialColumns, null_SQLSpecialColumnsW, null_SQLStatistics, null_SQLStatisticsW, null_SQLTablePrivileges, null_SQLTablePrivilegesW, null_SQLTables, null_SQLTablesW, null_SQLTransact }; /*********************************************************************** * 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; BOOL success; success = FALSE; 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 = TRUE; 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 = FALSE; } } else if (reg_ret != ERROR_SUCCESS) { TRACE ("Error %d checking for %s in drivers\n", reg_ret, desc); success = FALSE; } 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 = FALSE; } } else { WARN ("Unusually long driver name %s not replicated\n", desc); success = FALSE; } } if (sql_ret != SQL_NO_DATA) { TRACE ("Error %d enumerating drivers\n", (int)sql_ret); success = FALSE; } 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 (BOOL 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; BOOL success; const char *which = is_user ? "user" : "system"; success = FALSE; 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 = TRUE; 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 = FALSE; } } else if (reg_ret != ERROR_SUCCESS) { TRACE ("Error %d checking for description of %s\n", reg_ret, dsn); success = FALSE; } 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 = FALSE; } } else { WARN ("Unusually long %s data source name %s (%s) not " "replicated\n", which, dsn, desc); success = FALSE; } } if (sql_ret != SQL_NO_DATA) { TRACE ("Error %d enumerating %s datasources\n", (int)sql_ret, which); success = FALSE; } 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 (FALSE /* system dsns */, hEnv); ODBC_ReplicateODBCToRegistry (TRUE /* 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"); } } /************************************************************************* * SQLAllocConnect [ODBC32.001] */ SQLRETURN WINAPI SQLAllocConnect(SQLHENV EnvironmentHandle, SQLHDBC *ConnectionHandle) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, ConnectionHandle %p)\n", EnvironmentHandle, ConnectionHandle); ret = sql_funcs.pSQLAllocConnect(EnvironmentHandle, ConnectionHandle); TRACE("Returning %d, ConnectionHandle %p\n", ret, *ConnectionHandle); return ret; } /************************************************************************* * SQLAllocEnv [ODBC32.002] */ SQLRETURN WINAPI SQLAllocEnv(SQLHENV *EnvironmentHandle) { SQLRETURN ret; TRACE("(EnvironmentHandle %p)\n", EnvironmentHandle); ret = sql_funcs.pSQLAllocEnv(EnvironmentHandle); TRACE("Returning %d, EnvironmentHandle %p\n", ret, *EnvironmentHandle); return ret; } /************************************************************************* * SQLAllocHandle [ODBC32.024] */ SQLRETURN WINAPI SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) { SQLRETURN ret; TRACE("(HandleType %d, InputHandle %p, OutputHandle %p)\n", HandleType, InputHandle, OutputHandle); ret = sql_funcs.pSQLAllocHandle(HandleType, InputHandle, OutputHandle); TRACE("Returning %d, Handle %p\n", ret, *OutputHandle); return ret; } /************************************************************************* * SQLAllocStmt [ODBC32.003] */ SQLRETURN WINAPI SQLAllocStmt(SQLHDBC ConnectionHandle, SQLHSTMT *StatementHandle) { SQLRETURN ret; TRACE("(ConnectionHandle %p, StatementHandle %p)\n", ConnectionHandle, StatementHandle); ret = sql_funcs.pSQLAllocStmt(ConnectionHandle, StatementHandle); TRACE ("Returning %d, StatementHandle %p\n", ret, *StatementHandle); return ret; } /************************************************************************* * SQLAllocHandleStd [ODBC32.077] */ SQLRETURN WINAPI SQLAllocHandleStd(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle) { SQLRETURN ret; TRACE("(HandleType %d, InputHandle %p, OutputHandle %p)\n", HandleType, InputHandle, OutputHandle); ret = sql_funcs.pSQLAllocHandleStd(HandleType, InputHandle, OutputHandle); TRACE ("Returning %d, OutputHandle %p\n", ret, *OutputHandle); return ret; } static const char *debugstr_sqllen( SQLLEN len ) { #ifdef _WIN64 return wine_dbg_sprintf( "%ld", len ); #else return wine_dbg_sprintf( "%d", len ); #endif } /************************************************************************* * SQLBindCol [ODBC32.004] */ SQLRETURN WINAPI SQLBindCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind) { SQLRETURN ret; TRACE("(StatementHandle %p, ColumnNumber %d, TargetType %d, TargetValue %p, BufferLength %s, StrLen_or_Ind %p)\n", StatementHandle, ColumnNumber, TargetType, TargetValue, debugstr_sqllen(BufferLength), StrLen_or_Ind); ret = sql_funcs.pSQLBindCol(StatementHandle, ColumnNumber, TargetType, TargetValue, BufferLength, StrLen_or_Ind); TRACE ("Returning %d\n", ret); return ret; } static const char *debugstr_sqlulen( SQLULEN len ) { #ifdef _WIN64 return wine_dbg_sprintf( "%lu", len ); #else return wine_dbg_sprintf( "%u", len ); #endif } /************************************************************************* * SQLBindParam [ODBC32.025] */ SQLRETURN WINAPI SQLBindParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLULEN LengthPrecision, SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, SQLLEN *StrLen_or_Ind) { SQLRETURN ret; TRACE("(StatementHandle %p, ParameterNumber %d, ValueType %d, ParameterType %d, LengthPrecision %s," " ParameterScale %d, ParameterValue %p, StrLen_or_Ind %p)\n", StatementHandle, ParameterNumber, ValueType, ParameterType, debugstr_sqlulen(LengthPrecision), ParameterScale, ParameterValue, StrLen_or_Ind); ret = sql_funcs.pSQLBindParam(StatementHandle, ParameterNumber, ValueType, ParameterType, LengthPrecision, ParameterScale, ParameterValue, StrLen_or_Ind); TRACE ("Returning %d\n", ret); return ret; } /************************************************************************* * SQLCancel [ODBC32.005] */ SQLRETURN WINAPI SQLCancel(SQLHSTMT StatementHandle) { SQLRETURN ret; TRACE("(StatementHandle %p)\n", StatementHandle); ret = sql_funcs.pSQLCancel(StatementHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLCloseCursor [ODBC32.026] */ SQLRETURN WINAPI SQLCloseCursor(SQLHSTMT StatementHandle) { SQLRETURN ret; TRACE("(StatementHandle %p)\n", StatementHandle); ret = sql_funcs.pSQLCloseCursor(StatementHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLColAttribute [ODBC32.027] */ SQLRETURN WINAPI SQLColAttribute(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLLEN *NumericAttribute) { SQLRETURN ret; TRACE("(StatementHandle %p, ColumnNumber %d, FieldIdentifier %d, CharacterAttribute %p, BufferLength %d," " StringLength %p, NumericAttribute %p)\n", StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, StringLength, NumericAttribute); ret = sql_funcs.pSQLColAttribute(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, StringLength, NumericAttribute); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLColumns [ODBC32.040] */ SQLRETURN WINAPI SQLColumns(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLCHAR *ColumnName, SQLSMALLINT NameLength4) { SQLRETURN ret; TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, ColumnName %s, NameLength4 %d)\n", StatementHandle, debugstr_an((const char *)CatalogName, NameLength1), NameLength1, debugstr_an((const char *)SchemaName, NameLength2), NameLength2, debugstr_an((const char *)TableName, NameLength3), NameLength3, debugstr_an((const char *)ColumnName, NameLength4), NameLength4); ret = sql_funcs.pSQLColumns(StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, ColumnName, NameLength4); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLConnect [ODBC32.007] */ SQLRETURN WINAPI SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR *ServerName, SQLSMALLINT NameLength1, SQLCHAR *UserName, SQLSMALLINT NameLength2, SQLCHAR *Authentication, SQLSMALLINT NameLength3) { SQLRETURN ret; TRACE("(ConnectionHandle %p, ServerName %s, NameLength1 %d, UserName %s, NameLength2 %d, Authentication %s," " NameLength3 %d)\n", ConnectionHandle, debugstr_an((const char *)ServerName, NameLength1), NameLength1, debugstr_an((const char *)UserName, NameLength2), NameLength2, debugstr_an((const char *)Authentication, NameLength3), NameLength3); ret = sql_funcs.pSQLConnect(ConnectionHandle, ServerName, NameLength1, UserName, NameLength2, Authentication, NameLength3); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLCopyDesc [ODBC32.028] */ SQLRETURN WINAPI SQLCopyDesc(SQLHDESC SourceDescHandle, SQLHDESC TargetDescHandle) { SQLRETURN ret; TRACE("(SourceDescHandle %p, TargetDescHandle %p)\n", SourceDescHandle, TargetDescHandle); ret = sql_funcs.pSQLCopyDesc(SourceDescHandle, TargetDescHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDataSources [ODBC32.057] */ SQLRETURN WINAPI SQLDataSources(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, SQLCHAR *ServerName, SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, SQLCHAR *Description, SQLSMALLINT BufferLength2, SQLSMALLINT *NameLength2) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, Direction %d, ServerName %p, BufferLength1 %d, NameLength1 %p, Description %p," " BufferLength2 %d, NameLength2 %p)\n", EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, BufferLength2, NameLength2); ret = sql_funcs.pSQLDataSources(EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, BufferLength2, NameLength2); if (ret >= 0 && TRACE_ON(odbc)) { if (ServerName && NameLength1 && *NameLength1 > 0) TRACE(" DataSource %s", debugstr_an((const char *)ServerName, *NameLength1)); if (Description && NameLength2 && *NameLength2 > 0) TRACE(" Description %s", debugstr_an((const char *)Description, *NameLength2)); TRACE("\n"); } TRACE("Returning %d\n", ret); return ret; } SQLRETURN WINAPI SQLDataSourcesA(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, SQLCHAR *ServerName, SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, SQLCHAR *Description, SQLSMALLINT BufferLength2, SQLSMALLINT *NameLength2) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, Direction %d, ServerName %p, BufferLength1 %d, NameLength1 %p, Description %p," " BufferLength2 %d, NameLength2 %p)\n", EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, BufferLength2, NameLength2); ret = sql_funcs.pSQLDataSourcesA(EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, BufferLength2, NameLength2); if (TRACE_ON(odbc)) { if (ServerName && NameLength1 && *NameLength1 > 0) TRACE(" DataSource %s", debugstr_an((const char *)ServerName, *NameLength1)); if (Description && NameLength2 && *NameLength2 > 0) TRACE(" Description %s", debugstr_an((const char *)Description, *NameLength2)); TRACE("\n"); } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDescribeCol [ODBC32.008] */ SQLRETURN WINAPI SQLDescribeCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLCHAR *ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, SQLSMALLINT *DataType, SQLULEN *ColumnSize, SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) { SQLSMALLINT dummy; SQLRETURN ret; TRACE("(StatementHandle %p, ColumnNumber %d, ColumnName %p, BufferLength %d, NameLength %p, DataType %p," " ColumnSize %p, DecimalDigits %p, Nullable %p)\n", StatementHandle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, ColumnSize, DecimalDigits, Nullable); if (!NameLength) NameLength = &dummy; /* workaround for drivers that don't accept NULL NameLength */ ret = sql_funcs.pSQLDescribeCol(StatementHandle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, ColumnSize, DecimalDigits, Nullable); if (ret >= 0) { if (ColumnName && NameLength) TRACE(" ColumnName %s\n", debugstr_an((const char *)ColumnName, *NameLength)); if (DataType) TRACE(" DataType %d\n", *DataType); if (ColumnSize) TRACE(" ColumnSize %s\n", debugstr_sqlulen(*ColumnSize)); if (DecimalDigits) TRACE(" DecimalDigits %d\n", *DecimalDigits); if (Nullable) TRACE(" Nullable %d\n", *Nullable); } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDisconnect [ODBC32.009] */ SQLRETURN WINAPI SQLDisconnect(SQLHDBC ConnectionHandle) { SQLRETURN ret; TRACE("(ConnectionHandle %p)\n", ConnectionHandle); ret = sql_funcs.pSQLDisconnect(ConnectionHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLEndTran [ODBC32.029] */ SQLRETURN WINAPI SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT CompletionType) { SQLRETURN ret; TRACE("(HandleType %d, Handle %p, CompletionType %d)\n", HandleType, Handle, CompletionType); ret = sql_funcs.pSQLEndTran(HandleType, Handle, CompletionType); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLError [ODBC32.010] */ SQLRETURN WINAPI SQLError(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, ConnectionHandle %p, StatementHandle %p, Sqlstate %p, NativeError %p," " MessageText %p, BufferLength %d, TextLength %p)\n", EnvironmentHandle, ConnectionHandle, StatementHandle, Sqlstate, NativeError, MessageText, BufferLength, TextLength); ret = sql_funcs.pSQLError(EnvironmentHandle, ConnectionHandle, StatementHandle, Sqlstate, NativeError, MessageText, BufferLength, TextLength); if (ret == SQL_SUCCESS) { TRACE(" SQLState %s\n", debugstr_an((const char *)Sqlstate, 5)); TRACE(" Error %d\n", *NativeError); TRACE(" MessageText %s\n", debugstr_an((const char *)MessageText, *TextLength)); } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLExecDirect [ODBC32.011] */ SQLRETURN WINAPI SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength) { SQLRETURN ret; TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, debugstr_an((const char *)StatementText, TextLength), TextLength); ret = sql_funcs.pSQLExecDirect(StatementHandle, StatementText, TextLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLExecute [ODBC32.012] */ SQLRETURN WINAPI SQLExecute(SQLHSTMT StatementHandle) { SQLRETURN ret; TRACE("(StatementHandle %p)\n", StatementHandle); ret = sql_funcs.pSQLExecute(StatementHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLFetch [ODBC32.013] */ SQLRETURN WINAPI SQLFetch(SQLHSTMT StatementHandle) { SQLRETURN ret; TRACE("(StatementHandle %p)\n", StatementHandle); ret = sql_funcs.pSQLFetch(StatementHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLFetchScroll [ODBC32.030] */ SQLRETURN WINAPI SQLFetchScroll(SQLHSTMT StatementHandle, SQLSMALLINT FetchOrientation, SQLLEN FetchOffset) { SQLRETURN ret; TRACE("(StatementHandle %p, FetchOrientation %d, FetchOffset %s)\n", StatementHandle, FetchOrientation, debugstr_sqllen(FetchOffset)); ret = sql_funcs.pSQLFetchScroll(StatementHandle, FetchOrientation, FetchOffset); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLFreeConnect [ODBC32.014] */ SQLRETURN WINAPI SQLFreeConnect(SQLHDBC ConnectionHandle) { SQLRETURN ret; TRACE("(ConnectionHandle %p)\n", ConnectionHandle); ret = sql_funcs.pSQLFreeConnect(ConnectionHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLFreeEnv [ODBC32.015] */ SQLRETURN WINAPI SQLFreeEnv(SQLHENV EnvironmentHandle) { SQLRETURN ret; TRACE("(EnvironmentHandle %p)\n", EnvironmentHandle); ret = sql_funcs.pSQLFreeEnv(EnvironmentHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLFreeHandle [ODBC32.031] */ SQLRETURN WINAPI SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle) { SQLRETURN ret; TRACE("(HandleType %d, Handle %p)\n", HandleType, Handle); ret = sql_funcs.pSQLFreeHandle(HandleType, Handle); TRACE ("Returning %d\n", ret); return ret; } /************************************************************************* * SQLFreeStmt [ODBC32.016] */ SQLRETURN WINAPI SQLFreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option) { SQLRETURN ret; TRACE("(StatementHandle %p, Option %d)\n", StatementHandle, Option); ret = sql_funcs.pSQLFreeStmt(StatementHandle, Option); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetConnectAttr [ODBC32.032] */ SQLRETURN WINAPI SQLGetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Attribute %d, Value %p, BufferLength %d, StringLength %p)\n", ConnectionHandle, Attribute, Value, BufferLength, StringLength); ret = sql_funcs.pSQLGetConnectAttr(ConnectionHandle, Attribute, Value, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetConnectOption [ODBC32.042] */ SQLRETURN WINAPI SQLGetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLPOINTER Value) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Option %d, Value %p)\n", ConnectionHandle, Option, Value); ret = sql_funcs.pSQLGetConnectOption(ConnectionHandle, Option, Value); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetCursorName [ODBC32.017] */ SQLRETURN WINAPI SQLGetCursorName(SQLHSTMT StatementHandle, SQLCHAR *CursorName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength) { SQLRETURN ret; TRACE("(StatementHandle %p, CursorName %p, BufferLength %d, NameLength %p)\n", StatementHandle, CursorName, BufferLength, NameLength); ret = sql_funcs.pSQLGetCursorName(StatementHandle, CursorName, BufferLength, NameLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetData [ODBC32.043] */ SQLRETURN WINAPI SQLGetData(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLPOINTER TargetValue, SQLLEN BufferLength, SQLLEN *StrLen_or_Ind) { SQLRETURN ret; TRACE("(StatementHandle %p, ColumnNumber %d, TargetType %d, TargetValue %p, BufferLength %s, StrLen_or_Ind %p)\n", StatementHandle, ColumnNumber, TargetType, TargetValue, debugstr_sqllen(BufferLength), StrLen_or_Ind); ret = sql_funcs.pSQLGetData(StatementHandle, ColumnNumber, TargetType, TargetValue, BufferLength, StrLen_or_Ind); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDescField [ODBC32.033] */ SQLRETURN WINAPI SQLGetDescField(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { SQLRETURN ret; TRACE("(DescriptorHandle %p, RecNumber %d, FieldIdentifier %d, Value %p, BufferLength %d, StringLength %p)\n", DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength, StringLength); ret = sql_funcs.pSQLGetDescField(DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDescRec [ODBC32.034] */ SQLRETURN WINAPI SQLGetDescRec(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLCHAR *Name, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLSMALLINT *Type, SQLSMALLINT *SubType, SQLLEN *Length, SQLSMALLINT *Precision, SQLSMALLINT *Scale, SQLSMALLINT *Nullable) { SQLRETURN ret; TRACE("(DescriptorHandle %p, RecNumber %d, Name %p, BufferLength %d, StringLength %p, Type %p, SubType %p," " Length %p, Precision %p, Scale %p, Nullable %p)\n", DescriptorHandle, RecNumber, Name, BufferLength, StringLength, Type, SubType, Length, Precision, Scale, Nullable); ret = sql_funcs.pSQLGetDescRec(DescriptorHandle, RecNumber, Name, BufferLength, StringLength, Type, SubType, Length, Precision, Scale, Nullable); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDiagField [ODBC32.035] */ SQLRETURN WINAPI SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, SQLPOINTER DiagInfo, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { SQLRETURN ret; TRACE("(HandleType %d, Handle %p, RecNumber %d, DiagIdentifier %d, DiagInfo %p, BufferLength %d," " StringLength %p)\n", HandleType, Handle, RecNumber, DiagIdentifier, DiagInfo, BufferLength, StringLength); ret = sql_funcs.pSQLGetDiagField(HandleType, Handle, RecNumber, DiagIdentifier, DiagInfo, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDiagRec [ODBC32.036] */ SQLRETURN WINAPI SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { SQLRETURN ret; TRACE("(HandleType %d, Handle %p, RecNumber %d, Sqlstate %p, NativeError %p, MessageText %p, BufferLength %d," " TextLength %p)\n", HandleType, Handle, RecNumber, Sqlstate, NativeError, MessageText, BufferLength, TextLength); ret = sql_funcs.pSQLGetDiagRec(HandleType, Handle, RecNumber, Sqlstate, NativeError, MessageText, BufferLength, TextLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetEnvAttr [ODBC32.037] */ SQLRETURN WINAPI SQLGetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, Attribute %d, Value %p, BufferLength %d, StringLength %p)\n", EnvironmentHandle, Attribute, Value, BufferLength, StringLength); ret = sql_funcs.pSQLGetEnvAttr(EnvironmentHandle, Attribute, Value, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetFunctions [ODBC32.044] */ SQLRETURN WINAPI SQLGetFunctions(SQLHDBC ConnectionHandle, SQLUSMALLINT FunctionId, SQLUSMALLINT *Supported) { SQLRETURN ret; TRACE("(ConnectionHandle %p, FunctionId %d, Supported %p)\n", ConnectionHandle, FunctionId, Supported); ret = sql_funcs.pSQLGetFunctions(ConnectionHandle, FunctionId, Supported); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetInfo [ODBC32.045] */ SQLRETURN WINAPI SQLGetInfo(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValue, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { SQLRETURN ret; TRACE("(ConnectionHandle, %p, InfoType %d, InfoValue %p, BufferLength %d, StringLength %p)\n", ConnectionHandle, InfoType, InfoValue, BufferLength, StringLength); if (!InfoValue) { WARN("Unexpected NULL InfoValue address\n"); return SQL_ERROR; } ret = sql_funcs.pSQLGetInfo(ConnectionHandle, InfoType, InfoValue, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetStmtAttr [ODBC32.038] */ SQLRETURN WINAPI SQLGetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { SQLRETURN ret; TRACE("(StatementHandle %p, Attribute %d, Value %p, BufferLength %d, StringLength %p)\n", StatementHandle, Attribute, Value, BufferLength, StringLength); if (!Value) { WARN("Unexpected NULL Value return address\n"); return SQL_ERROR; } ret = sql_funcs.pSQLGetStmtAttr(StatementHandle, Attribute, Value, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetStmtOption [ODBC32.046] */ SQLRETURN WINAPI SQLGetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLPOINTER Value) { SQLRETURN ret; TRACE("(StatementHandle %p, Option %d, Value %p)\n", StatementHandle, Option, Value); ret = sql_funcs.pSQLGetStmtOption(StatementHandle, Option, Value); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetTypeInfo [ODBC32.047] */ SQLRETURN WINAPI SQLGetTypeInfo(SQLHSTMT StatementHandle, SQLSMALLINT DataType) { SQLRETURN ret; TRACE("(StatementHandle %p, DataType %d)\n", StatementHandle, DataType); ret = sql_funcs.pSQLGetTypeInfo(StatementHandle, DataType); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLNumResultCols [ODBC32.018] */ SQLRETURN WINAPI SQLNumResultCols(SQLHSTMT StatementHandle, SQLSMALLINT *ColumnCount) { SQLRETURN ret; TRACE("(StatementHandle %p, ColumnCount %p)\n", StatementHandle, ColumnCount); ret = sql_funcs.pSQLNumResultCols(StatementHandle, ColumnCount); TRACE("Returning %d ColumnCount %d\n", ret, *ColumnCount); return ret; } /************************************************************************* * SQLParamData [ODBC32.048] */ SQLRETURN WINAPI SQLParamData(SQLHSTMT StatementHandle, SQLPOINTER *Value) { SQLRETURN ret; TRACE("(StatementHandle %p, Value %p)\n", StatementHandle, Value); ret = sql_funcs.pSQLParamData(StatementHandle, Value); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLPrepare [ODBC32.019] */ SQLRETURN WINAPI SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLINTEGER TextLength) { SQLRETURN ret; TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, debugstr_an((const char *)StatementText, TextLength), TextLength); ret = sql_funcs.pSQLPrepare(StatementHandle, StatementText, TextLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLPutData [ODBC32.049] */ SQLRETURN WINAPI SQLPutData(SQLHSTMT StatementHandle, SQLPOINTER Data, SQLLEN StrLen_or_Ind) { SQLRETURN ret; TRACE("(StatementHandle %p, Data %p, StrLen_or_Ind %s)\n", StatementHandle, Data, debugstr_sqllen(StrLen_or_Ind)); ret = sql_funcs.pSQLPutData(StatementHandle, Data, StrLen_or_Ind); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLRowCount [ODBC32.020] */ SQLRETURN WINAPI SQLRowCount(SQLHSTMT StatementHandle, SQLLEN *RowCount) { SQLRETURN ret; TRACE("(StatementHandle %p, RowCount %p)\n", StatementHandle, RowCount); ret = sql_funcs.pSQLRowCount(StatementHandle, RowCount); if (ret == SQL_SUCCESS && RowCount) TRACE(" RowCount %s\n", debugstr_sqllen(*RowCount)); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetConnectAttr [ODBC32.039] */ SQLRETURN WINAPI SQLSetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Attribute %d, Value %p, StringLength %d)\n", ConnectionHandle, Attribute, Value, StringLength); ret = sql_funcs.pSQLSetConnectAttr(ConnectionHandle, Attribute, Value, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetConnectOption [ODBC32.050] */ SQLRETURN WINAPI SQLSetConnectOption(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLULEN Value) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Option %d, Value %s)\n", ConnectionHandle, Option, debugstr_sqlulen(Value)); ret = sql_funcs.pSQLSetConnectOption(ConnectionHandle, Option, Value); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetCursorName [ODBC32.021] */ SQLRETURN WINAPI SQLSetCursorName(SQLHSTMT StatementHandle, SQLCHAR *CursorName, SQLSMALLINT NameLength) { SQLRETURN ret; TRACE("(StatementHandle %p, CursorName %s, NameLength %d)\n", StatementHandle, debugstr_an((const char *)CursorName, NameLength), NameLength); ret = sql_funcs.pSQLSetCursorName(StatementHandle, CursorName, NameLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetDescField [ODBC32.073] */ SQLRETURN WINAPI SQLSetDescField(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength) { SQLRETURN ret; TRACE("(DescriptorHandle %p, RecNumber %d, FieldIdentifier %d, Value %p, BufferLength %d)\n", DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength); ret = sql_funcs.pSQLSetDescField(DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetDescRec [ODBC32.074] */ SQLRETURN WINAPI SQLSetDescRec(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT Type, SQLSMALLINT SubType, SQLLEN Length, SQLSMALLINT Precision, SQLSMALLINT Scale, SQLPOINTER Data, SQLLEN *StringLength, SQLLEN *Indicator) { SQLRETURN ret; TRACE("(DescriptorHandle %p, RecNumber %d, Type %d, SubType %d, Length %s, Precision %d, Scale %d, Data %p," " StringLength %p, Indicator %p)\n", DescriptorHandle, RecNumber, Type, SubType, debugstr_sqllen(Length), Precision, Scale, Data, StringLength, Indicator); ret = sql_funcs.pSQLSetDescRec(DescriptorHandle, RecNumber, Type, SubType, Length, Precision, Scale, Data, StringLength, Indicator); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetEnvAttr [ODBC32.075] */ SQLRETURN WINAPI SQLSetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, Attribute %d, Value %p, StringLength %d)\n", EnvironmentHandle, Attribute, Value, StringLength); ret = sql_funcs.pSQLSetEnvAttr(EnvironmentHandle, Attribute, Value, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetParam [ODBC32.022] */ SQLRETURN WINAPI SQLSetParam(SQLHSTMT StatementHandle, SQLUSMALLINT ParameterNumber, SQLSMALLINT ValueType, SQLSMALLINT ParameterType, SQLULEN LengthPrecision, SQLSMALLINT ParameterScale, SQLPOINTER ParameterValue, SQLLEN *StrLen_or_Ind) { SQLRETURN ret; TRACE("(StatementHandle %p, ParameterNumber %d, ValueType %d, ParameterType %d, LengthPrecision %s," " ParameterScale %d, ParameterValue %p, StrLen_or_Ind %p)\n", StatementHandle, ParameterNumber, ValueType, ParameterType, debugstr_sqlulen(LengthPrecision), ParameterScale, ParameterValue, StrLen_or_Ind); ret = sql_funcs.pSQLSetParam(StatementHandle, ParameterNumber, ValueType, ParameterType, LengthPrecision, ParameterScale, ParameterValue, StrLen_or_Ind); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetStmtAttr [ODBC32.076] */ SQLRETURN WINAPI SQLSetStmtAttr(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { SQLRETURN ret; TRACE("(StatementHandle %p, Attribute %d, Value %p, StringLength %d)\n", StatementHandle, Attribute, Value, StringLength); ret = sql_funcs.pSQLSetStmtAttr(StatementHandle, Attribute, Value, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetStmtOption [ODBC32.051] */ SQLRETURN WINAPI SQLSetStmtOption(SQLHSTMT StatementHandle, SQLUSMALLINT Option, SQLULEN Value) { SQLRETURN ret; TRACE("(StatementHandle %p, Option %d, Value %s)\n", StatementHandle, Option, debugstr_sqlulen(Value)); ret = sql_funcs.pSQLSetStmtOption(StatementHandle, Option, Value); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSpecialColumns [ODBC32.052] */ SQLRETURN WINAPI SQLSpecialColumns(SQLHSTMT StatementHandle, SQLUSMALLINT IdentifierType, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Scope, SQLUSMALLINT Nullable) { SQLRETURN ret; TRACE("(StatementHandle %p, IdentifierType %d, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d," " TableName %s, NameLength3 %d, Scope %d, Nullable %d)\n", StatementHandle, IdentifierType, debugstr_an((const char *)CatalogName, NameLength1), NameLength1, debugstr_an((const char *)SchemaName, NameLength2), NameLength2, debugstr_an((const char *)TableName, NameLength3), NameLength3, Scope, Nullable); ret = sql_funcs.pSQLSpecialColumns(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLStatistics [ODBC32.053] */ SQLRETURN WINAPI SQLStatistics(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Unique, SQLUSMALLINT Reserved) { SQLRETURN ret; TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d SchemaName %s, NameLength2 %d, TableName %s" " NameLength3 %d, Unique %d, Reserved %d)\n", StatementHandle, debugstr_an((const char *)CatalogName, NameLength1), NameLength1, debugstr_an((const char *)SchemaName, NameLength2), NameLength2, debugstr_an((const char *)TableName, NameLength3), NameLength3, Unique, Reserved); ret = sql_funcs.pSQLStatistics(StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Unique, Reserved); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLTables [ODBC32.054] */ SQLRETURN WINAPI SQLTables(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSMALLINT NameLength1, SQLCHAR *SchemaName, SQLSMALLINT NameLength2, SQLCHAR *TableName, SQLSMALLINT NameLength3, SQLCHAR *TableType, SQLSMALLINT NameLength4) { SQLRETURN ret; TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, TableType %s, NameLength4 %d)\n", StatementHandle, debugstr_an((const char *)CatalogName, NameLength1), NameLength1, debugstr_an((const char *)SchemaName, NameLength2), NameLength2, debugstr_an((const char *)TableName, NameLength3), NameLength3, debugstr_an((const char *)TableType, NameLength4), NameLength4); ret = sql_funcs.pSQLTables(StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, TableType, NameLength4); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLTransact [ODBC32.023] */ SQLRETURN WINAPI SQLTransact(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLUSMALLINT CompletionType) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, ConnectionHandle %p, CompletionType %d)\n", EnvironmentHandle, ConnectionHandle, CompletionType); ret = sql_funcs.pSQLTransact(EnvironmentHandle, ConnectionHandle, CompletionType); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLBrowseConnect [ODBC32.055] */ SQLRETURN WINAPI SQLBrowseConnect(SQLHDBC hdbc, SQLCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn, SQLCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut) { SQLRETURN ret; TRACE("(hdbc %p, szConnStrIn %s, cbConnStrIn %d, szConnStrOut %p, cbConnStrOutMax %d, pcbConnStrOut %p)\n", hdbc, debugstr_an((const char *)szConnStrIn, cbConnStrIn), cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut); ret = sql_funcs.pSQLBrowseConnect(hdbc, szConnStrIn, cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLBulkOperations [ODBC32.078] */ SQLRETURN WINAPI SQLBulkOperations(SQLHSTMT StatementHandle, SQLSMALLINT Operation) { SQLRETURN ret; TRACE("(StatementHandle %p, Operation %d)\n", StatementHandle, Operation); ret = sql_funcs.pSQLBulkOperations(StatementHandle, Operation); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLColAttributes [ODBC32.006] */ SQLRETURN WINAPI SQLColAttributes(SQLHSTMT hstmt, SQLUSMALLINT icol, SQLUSMALLINT fDescType, SQLPOINTER rgbDesc, SQLSMALLINT cbDescMax, SQLSMALLINT *pcbDesc, SQLLEN *pfDesc) { SQLRETURN ret; TRACE("(hstmt %p, icol %d, fDescType %d, rgbDesc %p, cbDescMax %d, pcbDesc %p, pfDesc %p)\n", hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc); ret = sql_funcs.pSQLColAttributes(hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLColumnPrivileges [ODBC32.056] */ SQLRETURN WINAPI SQLColumnPrivileges(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szTableName, SQLSMALLINT cbTableName, SQLCHAR *szColumnName, SQLSMALLINT cbColumnName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szTableName %s," " cbTableName %d, szColumnName %s, cbColumnName %d)\n", hstmt, debugstr_an((const char *)szCatalogName, cbCatalogName), cbCatalogName, debugstr_an((const char *)szSchemaName, cbSchemaName), cbSchemaName, debugstr_an((const char *)szTableName, cbTableName), cbTableName, debugstr_an((const char *)szColumnName, cbColumnName), cbColumnName); ret = sql_funcs.pSQLColumnPrivileges(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szTableName, cbTableName, szColumnName, cbColumnName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDescribeParam [ODBC32.058] */ SQLRETURN WINAPI SQLDescribeParam(SQLHSTMT hstmt, SQLUSMALLINT ipar, SQLSMALLINT *pfSqlType, SQLULEN *pcbParamDef, SQLSMALLINT *pibScale, SQLSMALLINT *pfNullable) { SQLRETURN ret; TRACE("(hstmt %p, ipar %d, pfSqlType %p, pcbParamDef %p, pibScale %p, pfNullable %p)\n", hstmt, ipar, pfSqlType, pcbParamDef, pibScale, pfNullable); ret = sql_funcs.pSQLDescribeParam(hstmt, ipar, pfSqlType, pcbParamDef, pibScale, pfNullable); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLExtendedFetch [ODBC32.059] */ SQLRETURN WINAPI SQLExtendedFetch(SQLHSTMT hstmt, SQLUSMALLINT fFetchType, SQLLEN irow, SQLULEN *pcrow, SQLUSMALLINT *rgfRowStatus) { SQLRETURN ret; TRACE("(hstmt %p, fFetchType %d, irow %s, pcrow %p, rgfRowStatus %p)\n", hstmt, fFetchType, debugstr_sqllen(irow), pcrow, rgfRowStatus); ret = sql_funcs.pSQLExtendedFetch(hstmt, fFetchType, irow, pcrow, rgfRowStatus); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLForeignKeys [ODBC32.060] */ SQLRETURN WINAPI SQLForeignKeys(SQLHSTMT hstmt, SQLCHAR *szPkCatalogName, SQLSMALLINT cbPkCatalogName, SQLCHAR *szPkSchemaName, SQLSMALLINT cbPkSchemaName, SQLCHAR *szPkTableName, SQLSMALLINT cbPkTableName, SQLCHAR *szFkCatalogName, SQLSMALLINT cbFkCatalogName, SQLCHAR *szFkSchemaName, SQLSMALLINT cbFkSchemaName, SQLCHAR *szFkTableName, SQLSMALLINT cbFkTableName) { SQLRETURN ret; TRACE("(hstmt %p, szPkCatalogName %s, cbPkCatalogName %d, szPkSchemaName %s, cbPkSchemaName %d," " szPkTableName %s, cbPkTableName %d, szFkCatalogName %s, cbFkCatalogName %d, szFkSchemaName %s," " cbFkSchemaName %d, szFkTableName %s, cbFkTableName %d)\n", hstmt, debugstr_an((const char *)szPkCatalogName, cbPkCatalogName), cbPkCatalogName, debugstr_an((const char *)szPkSchemaName, cbPkSchemaName), cbPkSchemaName, debugstr_an((const char *)szPkTableName, cbPkTableName), cbPkTableName, debugstr_an((const char *)szFkCatalogName, cbFkCatalogName), cbFkCatalogName, debugstr_an((const char *)szFkSchemaName, cbFkSchemaName), cbFkSchemaName, debugstr_an((const char *)szFkTableName, cbFkTableName), cbFkTableName); ret = sql_funcs.pSQLForeignKeys(hstmt, szPkCatalogName, cbPkCatalogName, szPkSchemaName, cbPkSchemaName, szPkTableName, cbPkTableName, szFkCatalogName, cbFkCatalogName, szFkSchemaName, cbFkSchemaName, szFkTableName, cbFkTableName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLMoreResults [ODBC32.061] */ SQLRETURN WINAPI SQLMoreResults(SQLHSTMT StatementHandle) { SQLRETURN ret; TRACE("(%p)\n", StatementHandle); ret = sql_funcs.pSQLMoreResults(StatementHandle); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLNativeSql [ODBC32.062] */ SQLRETURN WINAPI SQLNativeSql(SQLHDBC hdbc, SQLCHAR *szSqlStrIn, SQLINTEGER cbSqlStrIn, SQLCHAR *szSqlStr, SQLINTEGER cbSqlStrMax, SQLINTEGER *pcbSqlStr) { SQLRETURN ret; TRACE("(hdbc %p, szSqlStrIn %s, cbSqlStrIn %d, szSqlStr %p, cbSqlStrMax %d, pcbSqlStr %p)\n", hdbc, debugstr_an((const char *)szSqlStrIn, cbSqlStrIn), cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr); ret = sql_funcs.pSQLNativeSql(hdbc, szSqlStrIn, cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLNumParams [ODBC32.063] */ SQLRETURN WINAPI SQLNumParams(SQLHSTMT hstmt, SQLSMALLINT *pcpar) { SQLRETURN ret; TRACE("(hstmt %p, pcpar %p)\n", hstmt, pcpar); ret = sql_funcs.pSQLNumParams(hstmt, pcpar); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLParamOptions [ODBC32.064] */ SQLRETURN WINAPI SQLParamOptions(SQLHSTMT hstmt, SQLULEN crow, SQLULEN *pirow) { SQLRETURN ret; TRACE("(hstmt %p, crow %s, pirow %p)\n", hstmt, debugstr_sqlulen(crow), pirow); ret = sql_funcs.pSQLParamOptions(hstmt, crow, pirow); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLPrimaryKeys [ODBC32.065] */ SQLRETURN WINAPI SQLPrimaryKeys(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szTableName, SQLSMALLINT cbTableName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szTableName %s," " cbTableName %d)\n", hstmt, debugstr_an((const char *)szCatalogName, cbCatalogName), cbCatalogName, debugstr_an((const char *)szSchemaName, cbSchemaName), cbSchemaName, debugstr_an((const char *)szTableName, cbTableName), cbTableName); ret = sql_funcs.pSQLPrimaryKeys(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szTableName, cbTableName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLProcedureColumns [ODBC32.066] */ SQLRETURN WINAPI SQLProcedureColumns(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szProcName, SQLSMALLINT cbProcName, SQLCHAR *szColumnName, SQLSMALLINT cbColumnName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szProcName %s," " cbProcName %d, szColumnName %s, cbColumnName %d)\n", hstmt, debugstr_an((const char *)szCatalogName, cbCatalogName), cbCatalogName, debugstr_an((const char *)szSchemaName, cbSchemaName), cbSchemaName, debugstr_an((const char *)szProcName, cbProcName), cbProcName, debugstr_an((const char *)szColumnName, cbColumnName), cbColumnName); ret = sql_funcs.pSQLProcedureColumns(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szProcName, cbProcName, szColumnName, cbColumnName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLProcedures [ODBC32.067] */ SQLRETURN WINAPI SQLProcedures(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szProcName, SQLSMALLINT cbProcName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szProcName %s," " cbProcName %d)\n", hstmt, debugstr_an((const char *)szCatalogName, cbCatalogName), cbCatalogName, debugstr_an((const char *)szSchemaName, cbSchemaName), cbSchemaName, debugstr_an((const char *)szProcName, cbProcName), cbProcName); ret = sql_funcs.pSQLProcedures(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szProcName, cbProcName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetPos [ODBC32.068] */ SQLRETURN WINAPI SQLSetPos(SQLHSTMT hstmt, SQLSETPOSIROW irow, SQLUSMALLINT fOption, SQLUSMALLINT fLock) { SQLRETURN ret; TRACE("(hstmt %p, irow %s, fOption %d, fLock %d)\n", hstmt, debugstr_sqlulen(irow), fOption, fLock); ret = sql_funcs.pSQLSetPos(hstmt, irow, fOption, fLock); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLTablePrivileges [ODBC32.070] */ SQLRETURN WINAPI SQLTablePrivileges(SQLHSTMT hstmt, SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLCHAR *szTableName, SQLSMALLINT cbTableName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szTableName %s," " cbTableName %d)\n", hstmt, debugstr_an((const char *)szCatalogName, cbCatalogName), cbCatalogName, debugstr_an((const char *)szSchemaName, cbSchemaName), cbSchemaName, debugstr_an((const char *)szTableName, cbTableName), cbTableName); ret = sql_funcs.pSQLTablePrivileges(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szTableName, cbTableName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDrivers [ODBC32.071] */ SQLRETURN WINAPI SQLDrivers(SQLHENV EnvironmentHandle, SQLUSMALLINT fDirection, SQLCHAR *szDriverDesc, SQLSMALLINT cbDriverDescMax, SQLSMALLINT *pcbDriverDesc, SQLCHAR *szDriverAttributes, SQLSMALLINT cbDriverAttrMax, SQLSMALLINT *pcbDriverAttr) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, Direction %d, szDriverDesc %p, cbDriverDescMax %d, pcbDriverDesc %p," " DriverAttributes %p, cbDriverAttrMax %d, pcbDriverAttr %p)\n", EnvironmentHandle, fDirection, szDriverDesc, cbDriverDescMax, pcbDriverDesc, szDriverAttributes, cbDriverAttrMax, pcbDriverAttr); ret = sql_funcs.pSQLDrivers(EnvironmentHandle, fDirection, szDriverDesc, cbDriverDescMax, pcbDriverDesc, szDriverAttributes, cbDriverAttrMax, pcbDriverAttr); if (ret == SQL_NO_DATA && fDirection == SQL_FETCH_FIRST) ERR_(winediag)("No ODBC drivers could be found. Check the settings for your libodbc provider.\n"); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLBindParameter [ODBC32.072] */ SQLRETURN WINAPI SQLBindParameter(SQLHSTMT hstmt, SQLUSMALLINT ipar, SQLSMALLINT fParamType, SQLSMALLINT fCType, SQLSMALLINT fSqlType, SQLULEN cbColDef, SQLSMALLINT ibScale, SQLPOINTER rgbValue, SQLLEN cbValueMax, SQLLEN *pcbValue) { SQLRETURN ret; TRACE("(hstmt %p, ipar %d, fParamType %d, fCType %d, fSqlType %d, cbColDef %s, ibScale %d, rgbValue %p," " cbValueMax %s, pcbValue %p)\n", hstmt, ipar, fParamType, fCType, fSqlType, debugstr_sqlulen(cbColDef), ibScale, rgbValue, debugstr_sqllen(cbValueMax), pcbValue); ret = sql_funcs.pSQLBindParameter(hstmt, ipar, fParamType, fCType, fSqlType, cbColDef, ibScale, rgbValue, cbValueMax, pcbValue); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDriverConnect [ODBC32.041] */ SQLRETURN WINAPI SQLDriverConnect(SQLHDBC hdbc, SQLHWND hwnd, SQLCHAR *ConnectionString, SQLSMALLINT Length, SQLCHAR *conn_str_out, SQLSMALLINT conn_str_out_max, SQLSMALLINT *ptr_conn_str_out, SQLUSMALLINT driver_completion) { SQLRETURN ret; TRACE("(hdbc %p, hwnd %p, ConnectionString %s, Length %d, conn_str_out %p, conn_str_out_max %d," " ptr_conn_str_out %p, driver_completion %d)\n", hdbc, hwnd, debugstr_an((const char *)ConnectionString, Length), Length, conn_str_out, conn_str_out_max, ptr_conn_str_out, driver_completion); ret = sql_funcs.pSQLDriverConnect(hdbc, hwnd, ConnectionString, Length, conn_str_out, conn_str_out_max, ptr_conn_str_out, driver_completion); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetScrollOptions [ODBC32.069] */ SQLRETURN WINAPI SQLSetScrollOptions(SQLHSTMT statement_handle, SQLUSMALLINT f_concurrency, SQLLEN crow_keyset, SQLUSMALLINT crow_rowset) { SQLRETURN ret; TRACE("(statement_handle %p, f_concurrency %d, crow_keyset %s, crow_rowset %d)\n", statement_handle, f_concurrency, debugstr_sqllen(crow_keyset), crow_rowset); ret = sql_funcs.pSQLSetScrollOptions(statement_handle, f_concurrency, crow_keyset, crow_rowset); TRACE("Returning %d\n", ret); return ret; } static BOOL 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 < ARRAY_SIZE(attrList); i++) { if (attrList[i] == fDescType) return TRUE; } return FALSE; } /************************************************************************* * SQLColAttributesW [ODBC32.106] */ SQLRETURN WINAPI SQLColAttributesW(SQLHSTMT hstmt, SQLUSMALLINT icol, SQLUSMALLINT fDescType, SQLPOINTER rgbDesc, SQLSMALLINT cbDescMax, SQLSMALLINT *pcbDesc, SQLLEN *pfDesc) { SQLRETURN ret; TRACE("(hstmt %p, icol %d, fDescType %d, rgbDesc %p, cbDescMax %d, pcbDesc %p, pfDesc %p)\n", hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc); ret = sql_funcs.pSQLColAttributesW(hstmt, icol, fDescType, rgbDesc, cbDescMax, pcbDesc, pfDesc); if (ret == SQL_SUCCESS && SQLColAttributes_KnownStringAttribute(fDescType) && rgbDesc && pcbDesc && *pcbDesc != lstrlenW(rgbDesc) * 2) { TRACE("CHEAT: resetting name length for ADO\n"); *pcbDesc = lstrlenW(rgbDesc) * 2; } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLConnectW [ODBC32.107] */ SQLRETURN WINAPI SQLConnectW(SQLHDBC ConnectionHandle, WCHAR *ServerName, SQLSMALLINT NameLength1, WCHAR *UserName, SQLSMALLINT NameLength2, WCHAR *Authentication, SQLSMALLINT NameLength3) { SQLRETURN ret; TRACE("(ConnectionHandle %p, ServerName %s, NameLength1 %d, UserName %s, NameLength2 %d, Authentication %s," " NameLength3 %d)\n", ConnectionHandle, debugstr_wn(ServerName, NameLength1), NameLength1, debugstr_wn(UserName, NameLength2), NameLength2, debugstr_wn(Authentication, NameLength3), NameLength3); ret = sql_funcs.pSQLConnectW(ConnectionHandle, ServerName, NameLength1, UserName, NameLength2, Authentication, NameLength3); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDescribeColW [ODBC32.108] */ SQLRETURN WINAPI SQLDescribeColW(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, WCHAR *ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength, SQLSMALLINT *DataType, SQLULEN *ColumnSize, SQLSMALLINT *DecimalDigits, SQLSMALLINT *Nullable) { SQLSMALLINT dummy; SQLRETURN ret; TRACE("(StatementHandle %p, ColumnNumber %d, ColumnName %p, BufferLength %d, NameLength %p, DataType %p," " ColumnSize %p, DecimalDigits %p, Nullable %p)\n", StatementHandle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, ColumnSize, DecimalDigits, Nullable); if (!NameLength) NameLength = &dummy; /* workaround for drivers that don't accept NULL NameLength */ ret = sql_funcs.pSQLDescribeColW(StatementHandle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, ColumnSize, DecimalDigits, Nullable); if (ret >= 0) { if (ColumnName && NameLength) TRACE("ColumnName %s\n", debugstr_wn(ColumnName, *NameLength)); if (DataType) TRACE("DataType %d\n", *DataType); if (ColumnSize) TRACE("ColumnSize %s\n", debugstr_sqlulen(*ColumnSize)); if (DecimalDigits) TRACE("DecimalDigits %d\n", *DecimalDigits); if (Nullable) TRACE("Nullable %d\n", *Nullable); } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLErrorW [ODBC32.110] */ SQLRETURN WINAPI SQLErrorW(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, WCHAR *Sqlstate, SQLINTEGER *NativeError, WCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, ConnectionHandle %p, StatementHandle %p, Sqlstate %p, NativeError %p," " MessageText %p, BufferLength %d, TextLength %p)\n", EnvironmentHandle, ConnectionHandle, StatementHandle, Sqlstate, NativeError, MessageText, BufferLength, TextLength); ret = sql_funcs.pSQLErrorW(EnvironmentHandle, ConnectionHandle, StatementHandle, Sqlstate, NativeError, MessageText, BufferLength, TextLength); if (ret == SQL_SUCCESS) { TRACE(" SQLState %s\n", debugstr_wn(Sqlstate, 5)); TRACE(" Error %d\n", *NativeError); TRACE(" MessageText %s\n", debugstr_wn(MessageText, *TextLength)); } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLExecDirectW [ODBC32.111] */ SQLRETURN WINAPI SQLExecDirectW(SQLHSTMT StatementHandle, WCHAR *StatementText, SQLINTEGER TextLength) { SQLRETURN ret; TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, debugstr_wn(StatementText, TextLength), TextLength); ret = sql_funcs.pSQLExecDirectW(StatementHandle, StatementText, TextLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetCursorNameW [ODBC32.117] */ SQLRETURN WINAPI SQLGetCursorNameW(SQLHSTMT StatementHandle, WCHAR *CursorName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength) { SQLRETURN ret; TRACE("(StatementHandle %p, CursorName %p, BufferLength %d, NameLength %p)\n", StatementHandle, CursorName, BufferLength, NameLength); ret = sql_funcs.pSQLGetCursorNameW(StatementHandle, CursorName, BufferLength, NameLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLPrepareW [ODBC32.119] */ SQLRETURN WINAPI SQLPrepareW(SQLHSTMT StatementHandle, WCHAR *StatementText, SQLINTEGER TextLength) { SQLRETURN ret; TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, debugstr_wn(StatementText, TextLength), TextLength); ret = sql_funcs.pSQLPrepareW(StatementHandle, StatementText, TextLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetCursorNameW [ODBC32.121] */ SQLRETURN WINAPI SQLSetCursorNameW(SQLHSTMT StatementHandle, WCHAR *CursorName, SQLSMALLINT NameLength) { SQLRETURN ret; TRACE("(StatementHandle %p, CursorName %s, NameLength %d)\n", StatementHandle, debugstr_wn(CursorName, NameLength), NameLength); ret = sql_funcs.pSQLSetCursorNameW(StatementHandle, CursorName, NameLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLColAttributeW [ODBC32.127] */ SQLRETURN WINAPI SQLColAttributeW(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLLEN *NumericAttribute) { SQLRETURN ret; TRACE("StatementHandle %p ColumnNumber %d FieldIdentifier %d CharacterAttribute %p BufferLength %d" " StringLength %p NumericAttribute %p\n", StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, StringLength, NumericAttribute); ret = sql_funcs.pSQLColAttributeW(StatementHandle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, StringLength, NumericAttribute); if (ret == SQL_SUCCESS && CharacterAttribute != NULL && SQLColAttributes_KnownStringAttribute(FieldIdentifier) && StringLength && *StringLength != lstrlenW(CharacterAttribute) * 2) { TRACE("CHEAT: resetting name length for ADO\n"); *StringLength = lstrlenW(CharacterAttribute) * 2; } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetConnectAttrW [ODBC32.132] */ SQLRETURN WINAPI SQLGetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Attribute %d, Value %p, BufferLength %d, StringLength %p)\n", ConnectionHandle, Attribute, Value, BufferLength, StringLength); ret = sql_funcs.pSQLGetConnectAttrW(ConnectionHandle, Attribute, Value, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDescFieldW [ODBC32.133] */ SQLRETURN WINAPI SQLGetDescFieldW(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { SQLRETURN ret; TRACE("(DescriptorHandle %p, RecNumber %d, FieldIdentifier %d, Value %p, BufferLength %d, StringLength %p)\n", DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength, StringLength); ret = sql_funcs.pSQLGetDescFieldW(DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDescRecW [ODBC32.134] */ SQLRETURN WINAPI SQLGetDescRecW(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, WCHAR *Name, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLSMALLINT *Type, SQLSMALLINT *SubType, SQLLEN *Length, SQLSMALLINT *Precision, SQLSMALLINT *Scale, SQLSMALLINT *Nullable) { SQLRETURN ret; TRACE("(DescriptorHandle %p, RecNumber %d, Name %p, BufferLength %d, StringLength %p, Type %p, SubType %p," " Length %p, Precision %p, Scale %p, Nullable %p)\n", DescriptorHandle, RecNumber, Name, BufferLength, StringLength, Type, SubType, Length, Precision, Scale, Nullable); ret = sql_funcs.pSQLGetDescRecW(DescriptorHandle, RecNumber, Name, BufferLength, StringLength, Type, SubType, Length, Precision, Scale, Nullable); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDiagFieldW [ODBC32.135] */ SQLRETURN WINAPI SQLGetDiagFieldW(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLSMALLINT DiagIdentifier, SQLPOINTER DiagInfo, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { SQLRETURN ret; TRACE("(HandleType %d, Handle %p, RecNumber %d, DiagIdentifier %d, DiagInfo %p, BufferLength %d," " StringLength %p)\n", HandleType, Handle, RecNumber, DiagIdentifier, DiagInfo, BufferLength, StringLength); ret = sql_funcs.pSQLGetDiagFieldW(HandleType, Handle, RecNumber, DiagIdentifier, DiagInfo, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDiagRecW [ODBC32.136] */ SQLRETURN WINAPI SQLGetDiagRecW(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, WCHAR *Sqlstate, SQLINTEGER *NativeError, WCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { SQLRETURN ret; TRACE("(HandleType %d, Handle %p, RecNumber %d, Sqlstate %p, NativeError %p, MessageText %p, BufferLength %d," " TextLength %p)\n", HandleType, Handle, RecNumber, Sqlstate, NativeError, MessageText, BufferLength, TextLength); ret = sql_funcs.pSQLGetDiagRecW(HandleType, Handle, RecNumber, Sqlstate, NativeError, MessageText, BufferLength, TextLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetStmtAttrW [ODBC32.138] */ SQLRETURN WINAPI SQLGetStmtAttrW(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER BufferLength, SQLINTEGER *StringLength) { SQLRETURN ret; TRACE("(StatementHandle %p, Attribute %d, Value %p, BufferLength %d, StringLength %p)\n", StatementHandle, Attribute, Value, BufferLength, StringLength); if (!Value) { WARN("Unexpected NULL Value return address\n"); return SQL_ERROR; } ret = sql_funcs.pSQLGetStmtAttrW(StatementHandle, Attribute, Value, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetConnectAttrW [ODBC32.139] */ SQLRETURN WINAPI SQLSetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Attribute %d, Value %p, StringLength %d)\n", ConnectionHandle, Attribute, Value, StringLength); ret = sql_funcs.pSQLSetConnectAttrW(ConnectionHandle, Attribute, Value, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLColumnsW [ODBC32.140] */ SQLRETURN WINAPI SQLColumnsW(SQLHSTMT StatementHandle, WCHAR *CatalogName, SQLSMALLINT NameLength1, WCHAR *SchemaName, SQLSMALLINT NameLength2, WCHAR *TableName, SQLSMALLINT NameLength3, WCHAR *ColumnName, SQLSMALLINT NameLength4) { SQLRETURN ret; TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, ColumnName %s, NameLength4 %d)\n", StatementHandle, debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, debugstr_wn(TableName, NameLength3), NameLength3, debugstr_wn(ColumnName, NameLength4), NameLength4); ret = sql_funcs.pSQLColumnsW(StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, ColumnName, NameLength4); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDriverConnectW [ODBC32.141] */ SQLRETURN WINAPI SQLDriverConnectW(SQLHDBC ConnectionHandle, SQLHWND WindowHandle, WCHAR *InConnectionString, SQLSMALLINT Length, WCHAR *OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT *Length2, SQLUSMALLINT DriverCompletion) { SQLRETURN ret; TRACE("(ConnectionHandle %p, WindowHandle %p, InConnectionString %s, Length %d, OutConnectionString %p," " BufferLength %d, Length2 %p, DriverCompletion %d)\n", ConnectionHandle, WindowHandle, debugstr_wn(InConnectionString, Length), Length, OutConnectionString, BufferLength, Length2, DriverCompletion); ret = sql_funcs.pSQLDriverConnectW(ConnectionHandle, WindowHandle, InConnectionString, Length, OutConnectionString, BufferLength, Length2, DriverCompletion); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetConnectOptionW [ODBC32.142] */ SQLRETURN WINAPI SQLGetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLPOINTER Value) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Option %d, Value %p)\n", ConnectionHandle, Option, Value); ret = sql_funcs.pSQLGetConnectOptionW(ConnectionHandle, Option, Value); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetInfoW [ODBC32.145] */ SQLRETURN WINAPI SQLGetInfoW(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQLPOINTER InfoValue, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength) { SQLRETURN ret; TRACE("(ConnectionHandle, %p, InfoType %d, InfoValue %p, BufferLength %d, StringLength %p)\n", ConnectionHandle, InfoType, InfoValue, BufferLength, StringLength); if (!InfoValue) { WARN("Unexpected NULL InfoValue address\n"); return SQL_ERROR; } ret = sql_funcs.pSQLGetInfoW(ConnectionHandle, InfoType, InfoValue, BufferLength, StringLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetTypeInfoW [ODBC32.147] */ SQLRETURN WINAPI SQLGetTypeInfoW(SQLHSTMT StatementHandle, SQLSMALLINT DataType) { SQLRETURN ret; TRACE("(StatementHandle %p, DataType %d)\n", StatementHandle, DataType); ret = sql_funcs.pSQLGetTypeInfoW(StatementHandle, DataType); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetConnectOptionW [ODBC32.150] */ SQLRETURN WINAPI SQLSetConnectOptionW(SQLHDBC ConnectionHandle, SQLUSMALLINT Option, SQLLEN Value) { SQLRETURN ret; TRACE("(ConnectionHandle %p, Option %d, Value %s)\n", ConnectionHandle, Option, debugstr_sqllen(Value)); ret = sql_funcs.pSQLSetConnectOptionW(ConnectionHandle, Option, Value); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * 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) { SQLRETURN ret; TRACE("(StatementHandle %p, IdentifierType %d, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d," " TableName %s, NameLength3 %d, Scope %d, Nullable %d)\n", StatementHandle, IdentifierType, debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, debugstr_wn(TableName, NameLength3), NameLength3, Scope, Nullable); ret = sql_funcs.pSQLSpecialColumnsW(StatementHandle, IdentifierType, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Scope, Nullable); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLStatisticsW [ODBC32.153] */ SQLRETURN WINAPI SQLStatisticsW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, SQLWCHAR *TableName, SQLSMALLINT NameLength3, SQLUSMALLINT Unique, SQLUSMALLINT Reserved) { SQLRETURN ret; TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d SchemaName %s, NameLength2 %d, TableName %s" " NameLength3 %d, Unique %d, Reserved %d)\n", StatementHandle, debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, debugstr_wn(TableName, NameLength3), NameLength3, Unique, Reserved); ret = sql_funcs.pSQLStatisticsW(StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, Unique, Reserved); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLTablesW [ODBC32.154] */ SQLRETURN WINAPI SQLTablesW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, SQLWCHAR *TableName, SQLSMALLINT NameLength3, SQLWCHAR *TableType, SQLSMALLINT NameLength4) { SQLRETURN ret; TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, TableType %s, NameLength4 %d)\n", StatementHandle, debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, debugstr_wn(TableName, NameLength3), NameLength3, debugstr_wn(TableType, NameLength4), NameLength4); ret = sql_funcs.pSQLTablesW(StatementHandle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, TableType, NameLength4); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLBrowseConnectW [ODBC32.155] */ SQLRETURN WINAPI SQLBrowseConnectW(SQLHDBC hdbc, SQLWCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn, SQLWCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut) { SQLRETURN ret; TRACE("(hdbc %p, szConnStrIn %s, cbConnStrIn %d, szConnStrOut %p, cbConnStrOutMax %d, pcbConnStrOut %p)\n", hdbc, debugstr_wn(szConnStrIn, cbConnStrIn), cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut); ret = sql_funcs.pSQLBrowseConnectW(hdbc, szConnStrIn, cbConnStrIn, szConnStrOut, cbConnStrOutMax, pcbConnStrOut); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLColumnPrivilegesW [ODBC32.156] */ SQLRETURN WINAPI SQLColumnPrivilegesW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szTableName, SQLSMALLINT cbTableName, SQLWCHAR *szColumnName, SQLSMALLINT cbColumnName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szTableName %s," " cbTableName %d, szColumnName %s, cbColumnName %d)\n", hstmt, debugstr_wn(szCatalogName, cbCatalogName), cbCatalogName, debugstr_wn(szSchemaName, cbSchemaName), cbSchemaName, debugstr_wn(szTableName, cbTableName), cbTableName, debugstr_wn(szColumnName, cbColumnName), cbColumnName); ret = sql_funcs.pSQLColumnPrivilegesW(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szTableName, cbTableName, szColumnName, cbColumnName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * 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, Direction %d, ServerName %p, BufferLength1 %d, NameLength1 %p, Description %p," " BufferLength2 %d, NameLength2 %p)\n", EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, BufferLength2, NameLength2); ret = sql_funcs.pSQLDataSourcesW(EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, BufferLength2, NameLength2); if (ret >= 0 && TRACE_ON(odbc)) { if (ServerName && NameLength1 && *NameLength1 > 0) TRACE(" DataSource %s", debugstr_wn(ServerName, *NameLength1)); if (Description && NameLength2 && *NameLength2 > 0) TRACE(" Description %s", debugstr_wn(Description, *NameLength2)); TRACE("\n"); } TRACE("Returning %d\n", ret); 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) { SQLRETURN ret; TRACE("(hstmt %p, szPkCatalogName %s, cbPkCatalogName %d, szPkSchemaName %s, cbPkSchemaName %d," " szPkTableName %s, cbPkTableName %d, szFkCatalogName %s, cbFkCatalogName %d, szFkSchemaName %s," " cbFkSchemaName %d, szFkTableName %s, cbFkTableName %d)\n", hstmt, debugstr_wn(szPkCatalogName, cbPkCatalogName), cbPkCatalogName, debugstr_wn(szPkSchemaName, cbPkSchemaName), cbPkSchemaName, debugstr_wn(szPkTableName, cbPkTableName), cbPkTableName, debugstr_wn(szFkCatalogName, cbFkCatalogName), cbFkCatalogName, debugstr_wn(szFkSchemaName, cbFkSchemaName), cbFkSchemaName, debugstr_wn(szFkTableName, cbFkTableName), cbFkTableName); ret = sql_funcs.pSQLForeignKeysW(hstmt, szPkCatalogName, cbPkCatalogName, szPkSchemaName, cbPkSchemaName, szPkTableName, cbPkTableName, szFkCatalogName, cbFkCatalogName, szFkSchemaName, cbFkSchemaName, szFkTableName, cbFkTableName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLNativeSqlW [ODBC32.162] */ SQLRETURN WINAPI SQLNativeSqlW(SQLHDBC hdbc, SQLWCHAR *szSqlStrIn, SQLINTEGER cbSqlStrIn, SQLWCHAR *szSqlStr, SQLINTEGER cbSqlStrMax, SQLINTEGER *pcbSqlStr) { SQLRETURN ret; TRACE("(hdbc %p, szSqlStrIn %s, cbSqlStrIn %d, szSqlStr %p, cbSqlStrMax %d, pcbSqlStr %p)\n", hdbc, debugstr_wn(szSqlStrIn, cbSqlStrIn), cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr); ret = sql_funcs.pSQLNativeSqlW(hdbc, szSqlStrIn, cbSqlStrIn, szSqlStr, cbSqlStrMax, pcbSqlStr); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLPrimaryKeysW [ODBC32.165] */ SQLRETURN WINAPI SQLPrimaryKeysW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szTableName, SQLSMALLINT cbTableName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szTableName %s," " cbTableName %d)\n", hstmt, debugstr_wn(szCatalogName, cbCatalogName), cbCatalogName, debugstr_wn(szSchemaName, cbSchemaName), cbSchemaName, debugstr_wn(szTableName, cbTableName), cbTableName); ret = sql_funcs.pSQLPrimaryKeysW(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szTableName, cbTableName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLProcedureColumnsW [ODBC32.166] */ SQLRETURN WINAPI SQLProcedureColumnsW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szProcName, SQLSMALLINT cbProcName, SQLWCHAR *szColumnName, SQLSMALLINT cbColumnName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szProcName %s," " cbProcName %d, szColumnName %s, cbColumnName %d)\n", hstmt, debugstr_wn(szCatalogName, cbCatalogName), cbCatalogName, debugstr_wn(szSchemaName, cbSchemaName), cbSchemaName, debugstr_wn(szProcName, cbProcName), cbProcName, debugstr_wn(szColumnName, cbColumnName), cbColumnName); ret = sql_funcs.pSQLProcedureColumnsW(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szProcName, cbProcName, szColumnName, cbColumnName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLProceduresW [ODBC32.167] */ SQLRETURN WINAPI SQLProceduresW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szProcName, SQLSMALLINT cbProcName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szProcName %s," " cbProcName %d)\n", hstmt, debugstr_wn(szCatalogName, cbCatalogName), cbCatalogName, debugstr_wn(szSchemaName, cbSchemaName), cbSchemaName, debugstr_wn(szProcName, cbProcName), cbProcName); ret = sql_funcs.pSQLProceduresW(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szProcName, cbProcName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLTablePrivilegesW [ODBC32.170] */ SQLRETURN WINAPI SQLTablePrivilegesW(SQLHSTMT hstmt, SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName, SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName, SQLWCHAR *szTableName, SQLSMALLINT cbTableName) { SQLRETURN ret; TRACE("(hstmt %p, szCatalogName %s, cbCatalogName %d, szSchemaName %s, cbSchemaName %d, szTableName %s," " cbTableName %d)\n", hstmt, debugstr_wn(szCatalogName, cbCatalogName), cbCatalogName, debugstr_wn(szSchemaName, cbSchemaName), cbSchemaName, debugstr_wn(szTableName, cbTableName), cbTableName); ret = sql_funcs.pSQLTablePrivilegesW(hstmt, szCatalogName, cbCatalogName, szSchemaName, cbSchemaName, szTableName, cbTableName); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLDriversW [ODBC32.171] */ SQLRETURN WINAPI SQLDriversW(SQLHENV EnvironmentHandle, SQLUSMALLINT fDirection, SQLWCHAR *szDriverDesc, SQLSMALLINT cbDriverDescMax, SQLSMALLINT *pcbDriverDesc, SQLWCHAR *szDriverAttributes, SQLSMALLINT cbDriverAttrMax, SQLSMALLINT *pcbDriverAttr) { SQLRETURN ret; TRACE("(EnvironmentHandle %p, Direction %d, szDriverDesc %p, cbDriverDescMax %d, pcbDriverDesc %p," " DriverAttributes %p, cbDriverAttrMax %d, pcbDriverAttr %p)\n", EnvironmentHandle, fDirection, szDriverDesc, cbDriverDescMax, pcbDriverDesc, szDriverAttributes, cbDriverAttrMax, pcbDriverAttr); ret = sql_funcs.pSQLDriversW(EnvironmentHandle, fDirection, szDriverDesc, cbDriverDescMax, pcbDriverDesc, szDriverAttributes, cbDriverAttrMax, pcbDriverAttr); if (ret == SQL_NO_DATA && fDirection == SQL_FETCH_FIRST) ERR_(winediag)("No ODBC drivers could be found. Check the settings for your libodbc provider.\n"); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetDescFieldW [ODBC32.173] */ SQLRETURN WINAPI SQLSetDescFieldW(SQLHDESC DescriptorHandle, SQLSMALLINT RecNumber, SQLSMALLINT FieldIdentifier, SQLPOINTER Value, SQLINTEGER BufferLength) { SQLRETURN ret; TRACE("(DescriptorHandle %p, RecNumber %d, FieldIdentifier %d, Value %p, BufferLength %d)\n", DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength); ret = sql_funcs.pSQLSetDescFieldW(DescriptorHandle, RecNumber, FieldIdentifier, Value, BufferLength); TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLSetStmtAttrW [ODBC32.176] */ SQLRETURN WINAPI SQLSetStmtAttrW(SQLHSTMT StatementHandle, SQLINTEGER Attribute, SQLPOINTER Value, SQLINTEGER StringLength) { SQLRETURN ret; TRACE("(StatementHandle %p, Attribute %d, Value %p, StringLength %d)\n", StatementHandle, Attribute, Value, StringLength); ret = sql_funcs.pSQLSetStmtAttrW(StatementHandle, Attribute, Value, StringLength); if (ret == SQL_ERROR && (Attribute == SQL_ROWSET_SIZE || Attribute == SQL_ATTR_ROW_ARRAY_SIZE)) { TRACE("CHEAT: returning SQL_SUCCESS to ADO\n"); return SQL_SUCCESS; } TRACE("Returning %d\n", ret); return ret; } /************************************************************************* * SQLGetDiagRecA [ODBC32.236] */ SQLRETURN WINAPI SQLGetDiagRecA(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR *Sqlstate, SQLINTEGER *NativeError, SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { SQLRETURN ret; TRACE("(HandleType %d, Handle %p, RecNumber %d, Sqlstate %p, NativeError %p, MessageText %p, BufferLength %d," " TextLength %p)\n", HandleType, Handle, RecNumber, Sqlstate, NativeError, MessageText, BufferLength, TextLength); ret = sql_funcs.pSQLGetDiagRecA(HandleType, Handle, RecNumber, Sqlstate, NativeError, MessageText, BufferLength, TextLength); TRACE("Returning %d\n", ret); return ret; } /*********************************************************************** * DllMain [Internal] Initializes the internal 'ODBC32.DLL'. */ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD reason, LPVOID reserved) { TRACE("proxy ODBC: %p,%x,%p\n", hinstDLL, reason, reserved); switch (reason) { case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hinstDLL); if (!__wine_init_unix_lib( hinstDLL, reason, NULL, &sql_funcs )) ODBC_ReplicateToRegistry(); break; case DLL_PROCESS_DETACH: if (reserved) break; __wine_init_unix_lib( hinstDLL, reason, NULL, NULL ); } return TRUE; }