blob: 3a6ff2c59a5e86a78f71273936fc701a3a412470 [file] [log] [blame]
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// @@@ END COPYRIGHT @@@
//
//
#include "DrvrGlobal.h"
#include "diagfunctions.h"
#include "odbcinst.h"
LPCSTR szTraceFlagsKey= "TraceFlags";
LPCSTR szDefaultTraceFlags= "0";
LPCSTR szTraceDllKey= "TraceDll";
LPCSTR szDefaultTraceDll= "Tdm_OdbcTrace";
LPCSTR szODBC= "ODBC";
LPCSTR szODBCIni= "ODBC.INI";
FPTraceProcessEntry fpTraceProcessEntry = NULL;
FPTraceDebugOut fpTraceDebugOut = NULL;
FPTracePrintMarker fpTracePrintMarker = NULL;
FPTraceFirstEntry fpTraceFirstEntry = NULL;
FPTraceReturn fpTraceReturn = NULL;
FPTraceSQLAllocHandle fpTraceSQLAllocHandle = NULL;
FPTraceSQLBindCol fpTraceSQLBindCol = NULL;
FPTraceSQLBindParameter fpTraceSQLBindParameter = NULL;
FPTraceSQLCancel fpTraceSQLCancel = NULL;
FPTraceSQLCloseCursor fpTraceSQLCloseCursor = NULL;
FPTraceSQLCopyDesc fpTraceSQLCopyDesc = NULL;
FPTraceSQLDescribeParam fpTraceSQLDescribeParam = NULL;
FPTraceSQLDisconnect fpTraceSQLDisconnect = NULL;
FPTraceSQLEndTran fpTraceSQLEndTran = NULL;
FPTraceSQLExecute fpTraceSQLExecute = NULL;
FPTraceSQLExtendedFetch fpTraceSQLExtendedFetch = NULL;
FPTraceSQLFetch fpTraceSQLFetch = NULL;
FPTraceSQLFetchScroll fpTraceSQLFetchScroll = NULL;
FPTraceSQLFreeHandle fpTraceSQLFreeHandle = NULL;
FPTraceSQLFreeStmt fpTraceSQLFreeStmt = NULL;
FPTraceSQLGetData fpTraceSQLGetData = NULL;
FPTraceSQLGetEnvAttr fpTraceSQLGetEnvAttr = NULL;
FPTraceSQLGetTypeInfo fpTraceSQLGetTypeInfo = NULL;
FPTraceSQLMoreResults fpTraceSQLMoreResults = NULL;
FPTraceSQLNumParams fpTraceSQLNumParams = NULL;
FPTraceSQLNumResultCols fpTraceSQLNumResultCols = NULL;
FPTraceSQLParamData fpTraceSQLParamData = NULL;
FPTraceSQLPutData fpTraceSQLPutData = NULL;
FPTraceSQLRowCount fpTraceSQLRowCount = NULL;
FPTraceSQLSetEnvAttr fpTraceSQLSetEnvAttr = NULL;
FPTraceSQLSetPos fpTraceSQLSetPos = NULL;
VERSION_def** fpTraceASVersion = NULL;
VERSION_def** fpTraceSrvrVersion = NULL;
VERSION_def** fpTraceSqlVersion = NULL;
FPTraceTransportIn fpTraceTransportIn = NULL;
FPTraceTransportOut fpTraceTransportOut = NULL;
FPTraceSQLSetDescRec fpTraceSQLSetDescRec = NULL;
//Unicode functions
FPTraceSQLGetDiagRecW fpTraceSQLGetDiagRecW = NULL;
FPTraceSQLGetDiagFieldW fpTraceSQLGetDiagFieldW = NULL;
FPTraceSQLConnectW fpTraceSQLConnectW = NULL;
FPTraceSQLSetConnectAttrW fpTraceSQLSetConnectAttrW = NULL;
FPTraceSQLGetConnectAttrW fpTraceSQLGetConnectAttrW = NULL;
FPTraceSQLSetStmtAttrW fpTraceSQLSetStmtAttrW = NULL;
FPTraceSQLGetStmtAttrW fpTraceSQLGetStmtAttrW = NULL;
FPTraceSQLGetInfoW fpTraceSQLGetInfoW = NULL;
FPTraceSQLSetDescFieldW fpTraceSQLSetDescFieldW = NULL;
FPTraceSQLGetDescFieldW fpTraceSQLGetDescFieldW = NULL;
FPTraceSQLGetDescRecW fpTraceSQLGetDescRecW = NULL;
FPTraceSQLBrowseConnectW fpTraceSQLBrowseConnectW = NULL;
FPTraceSQLDriverConnectW fpTraceSQLDriverConnectW = NULL;
FPTraceSQLPrepareW fpTraceSQLPrepareW = NULL;
FPTraceSQLExecDirectW fpTraceSQLExecDirectW = NULL;
FPTraceSQLDescribeColW fpTraceSQLDescribeColW = NULL;
FPTraceSQLTablesW fpTraceSQLTablesW = NULL;
FPTraceSQLColumnsW fpTraceSQLColumnsW = NULL;
FPTraceSQLSpecialColumnsW fpTraceSQLSpecialColumnsW = NULL;
FPTraceSQLPrimaryKeysW fpTraceSQLPrimaryKeysW = NULL;
FPTraceSQLStatisticsW fpTraceSQLStatisticsW = NULL;
FPTraceSQLGetCursorNameW fpTraceSQLGetCursorNameW = NULL;
FPTraceSQLSetCursorNameW fpTraceSQLSetCursorNameW = NULL;
FPTraceSQLNativeSqlW fpTraceSQLNativeSqlW = NULL;
FPTraceSQLColAttributeW fpTraceSQLColAttributeW = NULL;
FPTraceSQLProceduresW fpTraceSQLProceduresW = NULL;
FPTraceSQLProcedureColumnsW fpTraceSQLProcedureColumnsW = NULL;
FPTraceSQLColumnPrivilegesW fpTraceSQLColumnPrivilegesW = NULL;
FPTraceSQLTablePrivilegesW fpTraceSQLTablePrivilegesW = NULL;
FPTraceSQLForeignKeysW fpTraceSQLForeignKeysW = NULL;
char *TraceOptionString[] =
{
"", /* 0x00000001 TRACE ON/OFF*/
"ODBC_API ", /* 0x00000002 */
"TRANSPORT ", /* 0x00000004 */
};
#define DEBUG_BUFFER_SIZE 2560 /* Maximum string length */
typedef enum FORMAT_OPTIONS
{
FORMAT_TEXT,
FORMAT_DUMP
} FORMAT_OPTIONS;
char *TraceOptionToString(long TraceOption)
{
long index;
if (TraceOption == 0)
index = sizeof(TraceOptionString)/sizeof(TraceOptionString[0]) - 1;
else
for (index = 0;
(TraceOption & 1) == 0 &&
index < sizeof(TraceOptionString)/sizeof(TraceOptionString[0]);
TraceOption >>= 1, index++);
return TraceOptionString[index];
}
BOOL IsTraceLibrary(){
if (GetModuleHandle(TRACE_DLL_NAME) == NULL) return FALSE;
return true;
}
void TraceOut(long TraceOption, char *text, ...)
{
char buffer[DEBUG_BUFFER_SIZE*2]; // double the size to 4096
char *p;
int rc = 0;
if (IsTraceLibrary())
{
if (pdwGlobalTraceVariable == NULL)
InitializeTrace();
if (pdwGlobalTraceVariable && *pdwGlobalTraceVariable && (gTraceFlags & TraceOption))
{
if (fpTraceDebugOut)
{
p = (char *)&text + (long) sizeof (char *); // Get VA_ARG pointer
rc = _vsnprintf(buffer, DEBUG_BUFFER_SIZE*2, text, p);
if (rc == -1) /* if truncation happened, errno will be set to 34 */
errno = 0;/* need to reset it back to 0, otherwise ctosqlconv may fail when */
/* converting numeric due to errno already set */
fpTraceDebugOut(strlen(buffer), buffer, TraceOptionToString(TraceOption), FORMAT_TEXT);
}
}
}
else
RESET_TRACE()
return;
}
void HexOut(long TraceOption, SQLLEN* len, void* buffer, char *text )
{
if (IsTraceLibrary())
{
InitializeTrace();
if (pdwGlobalTraceVariable && *pdwGlobalTraceVariable && (gTraceFlags & TraceOption))
{
if (fpTraceDebugOut)
{
if( buffer != NULL && len != NULL && text != NULL)
{
if( *len > 0 )
{
fpTraceDebugOut(*len % 500, (char*)buffer, text, FORMAT_DUMP);
}
}
}
}
}
else
RESET_TRACE()
return;
}
void InitializeTrace()
{
//Read Trace Flag and TraceDLL
char szTraceFlags[100];
char szTraceDll[_MAX_PATH+1];
UWORD wConfigMode;
if (g_hTraceDLL != NULL && GetModuleHandle(TRACE_DLL_NAME) == g_hTraceDLL){
if(fpTraceProcessEntry)
pdwGlobalTraceVariable = fpTraceProcessEntry();
return;
}
SQLGetConfigMode( &wConfigMode);
SQLSetConfigMode( ODBC_USER_DSN);
SQLGetPrivateProfileString(szODBC,
szTraceDllKey,
szDefaultTraceDll,
szTraceDll,
sizeof(szTraceDll),
szODBCIni);
//
// ODBC DM 3.52 works only with HKEY_CURRENT_USER
//
/*
if ((g_hTraceDLL = GetModuleHandle(szTraceDll)) == NULL)
{
SQLSetConfigMode( ODBC_SYSTEM_DSN);
SQLGetPrivateProfileString(szODBC,
szTraceDllKey,
szDefaultTraceDll,
szTraceDll,
sizeof(szTraceDll),
szODBCIni);
if ((g_hTraceDLL = GetModuleHandle(szTraceDll)) == NULL)
{
SQLSetConfigMode( wConfigMode);
return;
}
}
*/
SQLGetPrivateProfileString(szODBC,
szTraceFlagsKey,
szDefaultTraceFlags,
szTraceFlags,
sizeof(szTraceFlags),
szODBCIni);
SQLSetConfigMode( wConfigMode);
gTraceFlags = atol(szTraceFlags);
if ((g_hTraceDLL = GetModuleHandle(TRACE_DLL_NAME)) != NULL)
{
fpTraceProcessEntry = (FPTraceProcessEntry) GetProcAddress(g_hTraceDLL, "TraceProcessEntry");
fpTraceDebugOut = (FPTraceDebugOut) GetProcAddress(g_hTraceDLL, "TraceDebugOut");
fpTracePrintMarker = (FPTracePrintMarker) GetProcAddress(g_hTraceDLL, "TracePrintMarker");
fpTraceFirstEntry = (FPTraceFirstEntry) GetProcAddress(g_hTraceDLL, "TraceFirstEntry");
fpTraceReturn = (FPTraceReturn) GetProcAddress(g_hTraceDLL, "TraceReturn");
fpTraceSQLAllocHandle = (FPTraceSQLAllocHandle) GetProcAddress(g_hTraceDLL, "TraceSQLAllocHandle");
fpTraceSQLBindCol = (FPTraceSQLBindCol) GetProcAddress(g_hTraceDLL, "TraceSQLBindCol");
fpTraceSQLBindParameter = (FPTraceSQLBindParameter) GetProcAddress(g_hTraceDLL, "TraceSQLBindParameter");
fpTraceSQLCancel = (FPTraceSQLCancel) GetProcAddress(g_hTraceDLL, "TraceSQLCancel");
fpTraceSQLCloseCursor = (FPTraceSQLCloseCursor) GetProcAddress(g_hTraceDLL, "TraceSQLCloseCursor");
fpTraceSQLCopyDesc = (FPTraceSQLCopyDesc) GetProcAddress(g_hTraceDLL, "TraceSQLCopyDesc");
fpTraceSQLDescribeParam = (FPTraceSQLDescribeParam) GetProcAddress(g_hTraceDLL, "TraceSQLDescribeParam");
fpTraceSQLDisconnect = (FPTraceSQLDisconnect) GetProcAddress(g_hTraceDLL, "TraceSQLDisconnect");
fpTraceSQLEndTran = (FPTraceSQLEndTran) GetProcAddress(g_hTraceDLL, "TraceSQLEndTran");
fpTraceSQLExecute = (FPTraceSQLExecute) GetProcAddress(g_hTraceDLL, "TraceSQLExecute");
fpTraceSQLExtendedFetch = (FPTraceSQLExtendedFetch) GetProcAddress(g_hTraceDLL, "TraceSQLExtendedFetch");
fpTraceSQLFetch = (FPTraceSQLFetch) GetProcAddress(g_hTraceDLL, "TraceSQLFetch");
fpTraceSQLFetchScroll = (FPTraceSQLFetchScroll) GetProcAddress(g_hTraceDLL, "TraceSQLFetchScroll");
fpTraceSQLFreeHandle = (FPTraceSQLFreeHandle) GetProcAddress(g_hTraceDLL, "TraceSQLFreeHandle");
fpTraceSQLFreeStmt = (FPTraceSQLFreeStmt) GetProcAddress(g_hTraceDLL, "TraceSQLFreeStmt");
fpTraceSQLGetData = (FPTraceSQLGetData) GetProcAddress(g_hTraceDLL, "TraceSQLGetData");
fpTraceSQLGetEnvAttr = (FPTraceSQLGetEnvAttr) GetProcAddress(g_hTraceDLL, "TraceSQLGetEnvAttr");
fpTraceSQLGetTypeInfo = (FPTraceSQLGetTypeInfo) GetProcAddress(g_hTraceDLL, "TraceSQLGetTypeInfo");
fpTraceSQLMoreResults = (FPTraceSQLMoreResults) GetProcAddress(g_hTraceDLL, "TraceSQLMoreResults");
fpTraceSQLNumParams = (FPTraceSQLNumParams) GetProcAddress(g_hTraceDLL, "TraceSQLNumParams");
fpTraceSQLNumResultCols = (FPTraceSQLNumResultCols) GetProcAddress(g_hTraceDLL, "TraceSQLNumResultCols");
fpTraceSQLParamData = (FPTraceSQLParamData) GetProcAddress(g_hTraceDLL, "TraceSQLParamData");
fpTraceSQLPutData = (FPTraceSQLPutData) GetProcAddress(g_hTraceDLL, "TraceSQLPutData");
fpTraceSQLRowCount = (FPTraceSQLRowCount) GetProcAddress(g_hTraceDLL, "TraceSQLRowCount");
fpTraceSQLSetEnvAttr = (FPTraceSQLSetEnvAttr) GetProcAddress(g_hTraceDLL, "TraceSQLSetEnvAttr");
fpTraceSQLSetPos = (FPTraceSQLSetPos) GetProcAddress(g_hTraceDLL, "TraceSQLSetPos");
fpTraceASVersion = (VERSION_def**) GetProcAddress(g_hTraceDLL, "ASVersion");
fpTraceSrvrVersion = (VERSION_def**) GetProcAddress(g_hTraceDLL, "SrvrVersion");
fpTraceSqlVersion = (VERSION_def**) GetProcAddress(g_hTraceDLL, "SqlVersion");
fpTraceTransportIn = (FPTraceTransportIn) GetProcAddress(g_hTraceDLL, "TraceTransportIn");
fpTraceTransportOut = (FPTraceTransportOut) GetProcAddress(g_hTraceDLL, "TraceTransportOut");
fpTraceSQLSetDescRec = (FPTraceSQLSetDescRec) GetProcAddress(g_hTraceDLL, "TraceSQLSetDescRec");
//Unicode functions
fpTraceSQLGetDiagRecW = (FPTraceSQLGetDiagRecW) GetProcAddress(g_hTraceDLL, "TraceSQLGetDiagRecW");
fpTraceSQLGetDiagFieldW = (FPTraceSQLGetDiagFieldW) GetProcAddress(g_hTraceDLL, "TraceSQLGetDiagFieldW");
fpTraceSQLConnectW = (FPTraceSQLConnectW) GetProcAddress(g_hTraceDLL, "TraceSQLConnectW");
fpTraceSQLSetConnectAttrW = (FPTraceSQLSetConnectAttrW) GetProcAddress(g_hTraceDLL, "TraceSQLSetConnectAttrW");
fpTraceSQLGetConnectAttrW = (FPTraceSQLGetConnectAttrW) GetProcAddress(g_hTraceDLL, "TraceSQLGetConnectAttrW");
fpTraceSQLSetStmtAttrW = (FPTraceSQLSetStmtAttrW) GetProcAddress(g_hTraceDLL, "TraceSQLSetStmtAttrW");
fpTraceSQLGetStmtAttrW = (FPTraceSQLGetStmtAttrW) GetProcAddress(g_hTraceDLL, "TraceSQLGetStmtAttrW");
fpTraceSQLGetInfoW = (FPTraceSQLGetInfoW) GetProcAddress(g_hTraceDLL, "TraceSQLGetInfoW");
fpTraceSQLSetDescFieldW = (FPTraceSQLSetDescFieldW) GetProcAddress(g_hTraceDLL, "TraceSQLSetDescFieldW");
fpTraceSQLGetDescFieldW = (FPTraceSQLGetDescFieldW) GetProcAddress(g_hTraceDLL, "TraceSQLGetDescFieldW");
fpTraceSQLGetDescRecW = (FPTraceSQLGetDescRecW) GetProcAddress(g_hTraceDLL, "TraceSQLGetDescRecW");
fpTraceSQLBrowseConnectW = (FPTraceSQLBrowseConnectW) GetProcAddress(g_hTraceDLL, "TraceSQLBrowseConnectW");
fpTraceSQLDriverConnectW = (FPTraceSQLDriverConnectW) GetProcAddress(g_hTraceDLL, "TraceSQLDriverConnectW");
fpTraceSQLPrepareW = (FPTraceSQLPrepareW) GetProcAddress(g_hTraceDLL, "TraceSQLPrepareW");
fpTraceSQLExecDirectW = (FPTraceSQLExecDirectW) GetProcAddress(g_hTraceDLL, "TraceSQLExecDirectW");
fpTraceSQLDescribeColW = (FPTraceSQLDescribeColW) GetProcAddress(g_hTraceDLL, "TraceSQLDescribeColW");
fpTraceSQLTablesW = (FPTraceSQLTablesW) GetProcAddress(g_hTraceDLL, "TraceSQLTablesW");
fpTraceSQLColumnsW = (FPTraceSQLColumnsW) GetProcAddress(g_hTraceDLL, "TraceSQLColumnsW");
fpTraceSQLSpecialColumnsW = (FPTraceSQLSpecialColumnsW) GetProcAddress(g_hTraceDLL, "TraceSQLSpecialColumnsW");
fpTraceSQLPrimaryKeysW = (FPTraceSQLPrimaryKeysW) GetProcAddress(g_hTraceDLL, "TraceSQLPrimaryKeysW");
fpTraceSQLStatisticsW = (FPTraceSQLStatisticsW) GetProcAddress(g_hTraceDLL, "TraceSQLStatisticsW");
fpTraceSQLGetCursorNameW = (FPTraceSQLGetCursorNameW) GetProcAddress(g_hTraceDLL, "TraceSQLGetCursorNameW");
fpTraceSQLSetCursorNameW = (FPTraceSQLSetCursorNameW) GetProcAddress(g_hTraceDLL, "TraceSQLSetCursorNameW");
fpTraceSQLNativeSqlW = (FPTraceSQLNativeSqlW) GetProcAddress(g_hTraceDLL, "TraceSQLNativeSqlW");
fpTraceSQLColAttributeW = (FPTraceSQLColAttributeW) GetProcAddress(g_hTraceDLL, "TraceSQLColAttributeW");
fpTraceSQLProceduresW = (FPTraceSQLProceduresW) GetProcAddress(g_hTraceDLL, "TraceSQLProceduresW");
fpTraceSQLProcedureColumnsW = (FPTraceSQLProcedureColumnsW) GetProcAddress(g_hTraceDLL, "TraceSQLProcedureColumnsW");
fpTraceSQLColumnPrivilegesW = (FPTraceSQLColumnPrivilegesW) GetProcAddress(g_hTraceDLL, "TraceSQLColumnPrivilegesW");
fpTraceSQLTablePrivilegesW = (FPTraceSQLTablePrivilegesW) GetProcAddress(g_hTraceDLL, "TraceSQLTablePrivilegesW");
fpTraceSQLForeignKeysW = (FPTraceSQLForeignKeysW) GetProcAddress(g_hTraceDLL, "TraceSQLForeignKeysW");
}
if(fpTraceProcessEntry)
pdwGlobalTraceVariable = fpTraceProcessEntry();
}
char g_ElapsedTime[50];
char *ElapsedTimeString(struct _timeb StartTime)
{
struct _timeb CurrentTime;
long ElapsedSeconds;
short ElapsedMilliSec;
_ftime(&CurrentTime);
ElapsedSeconds=(long)((long)CurrentTime.time-(long)StartTime.time);
ElapsedMilliSec=(signed short)(CurrentTime.millitm-StartTime.millitm);
if(ElapsedMilliSec<0){
ElapsedSeconds--;
ElapsedMilliSec+=1000;
}
if (ElapsedSeconds > 0)
sprintf(g_ElapsedTime,"%ld.%03d sec<----------",ElapsedSeconds,ElapsedMilliSec);
else
sprintf(g_ElapsedTime,"%ld.%03d sec",ElapsedSeconds,ElapsedMilliSec);
return g_ElapsedTime;
}
void LogFile( char* txt1, char* txt2, char* txt3 )
{
char fileName[80];
FILE* pFile = NULL;
char buffer[501];
sprintf( fileName, "P%d.txt",GetCurrentProcessId());
if((pFile = fopen( fileName, "a" )) == NULL ) return;
if (*txt2 != 0)
{
strcat(buffer,txt1);
strcat(buffer,"---------->");
strncat(buffer,txt2,100);
strcat(buffer,"---------->");
strcat(buffer,txt3);
strcat(buffer,"\n");
}
else
sprintf(buffer,"%s---------->%s\n",txt1,txt3);
fputs( buffer, pFile );
fclose( pFile );
}
void LogInfo(VERSION_def* ASVersion, VERSION_def* SrvrVersion,VERSION_def* SqlVersion)
{
if(fpTraceASVersion != NULL) *fpTraceASVersion = ASVersion;
if(fpTraceSrvrVersion != NULL) *fpTraceSrvrVersion = SrvrVersion;
if(fpTraceSqlVersion != NULL) *fpTraceSqlVersion = SqlVersion;
if(fpTraceFirstEntry)
fpTraceFirstEntry(DRIVER_DLL_NAME);
}
void TRACE_TRANSPORT_IN(int operation, char* reference, void* prheader, char* rbuffer, long tcount, long timeout)
{
if (IsTraceLibrary())
{
if (pdwGlobalTraceVariable && *pdwGlobalTraceVariable && (gTraceFlags & TR_DRVR_TRANSPORT_API))
{
if (fpTraceTransportIn)
fpTraceTransportIn(operation, reference, prheader, rbuffer, tcount, timeout);
}
}
else
RESET_TRACE()
}
void TRACE_TRANSPORT_OUT(int operation, char* reference, void* pwheader, char* wbuffer, long tcount, long timeout)
{
if (IsTraceLibrary())
{
if (pdwGlobalTraceVariable && *pdwGlobalTraceVariable && (gTraceFlags & TR_DRVR_TRANSPORT_API))
{
if (fpTraceTransportOut)
fpTraceTransportOut(operation, reference, pwheader, wbuffer, tcount, timeout);
}
}
else
RESET_TRACE()
}