Hi all
I found that the function GETMXCSWARNINGORERROR, which used to set warnings or
errors in mxosrvr, could only record one warning or error during one client
request.
If you call the function twice , it will remove the message which is recorded
in the first time(by bzero(WarningOrError,sizeof(WarningOrError))),while errors
or warnings from sql engine
could be recorded by SRVR::GETSQLWARNINGORERROR2 no matter how many they are.
If I make a mistake, please let me know.
The function GETMXCSWARNINGORERROR is in the file
core/conn/odbc/src/odbc/nsksrvrcore/srvrcommon.cpp.
I want to modify the related code and suggestions are welcome.
// DO NOT call this function using pSrvrStmt->sqlWarningOrErrorLength and
pSrvrStmt->sqlWarningOrError,
// Since the WarningOrError is static and pSrvrStmt->sqlWarningOrError will
deallocate this memory.
extern "C" void GETMXCSWARNINGORERROR(
/* In */ Int32 sqlcode
, /* In */ char *sqlState
, /* In */ char *msg_buf
, /* Out */ Int32 *MXCSWarningOrErrorLength
, /* Out */ BYTE *&MXCSWarningOrError)
{
Int32 total_conds = 1;
Int32 buf_len;
Int32 curr_cond = 1;
Int32 msg_buf_len = strlen(msg_buf)+1;
Int32 time_and_msg_buf_len = 0;
Int32 msg_total_len = 0;
Int32 rowId = 0; // use this for rowset recovery.
char tsqlState[6];
static BYTE WarningOrError[1024];
char strNow[TIMEBUFSIZE + 1];
char* time_and_msg_buf = NULL;
memset(tsqlState,0,sizeof(tsqlState));
memcpy(tsqlState,sqlState,sizeof(tsqlState)-1);
bzero(WarningOrError,sizeof(WarningOrError));
*MXCSWarningOrErrorLength = 0;
MXCSWarningOrError = WarningOrError; // Size of internally generated
message should be enough
*(Int32 *)(MXCSWarningOrError+msg_total_len) = total_conds;
msg_total_len += sizeof(total_conds);
*(Int32 *)(MXCSWarningOrError+msg_total_len) = rowId;
msg_total_len += sizeof(rowId);
*(Int32 *)(MXCSWarningOrError+msg_total_len) = sqlcode;
msg_total_len += sizeof(sqlcode);
time_and_msg_buf_len = msg_buf_len + TIMEBUFSIZE;
*(Int32 *)(MXCSWarningOrError+msg_total_len) = time_and_msg_buf_len;
msg_total_len += sizeof(time_and_msg_buf_len);
//Get the timetsamp
time_and_msg_buf = new char[time_and_msg_buf_len];
strncpy(time_and_msg_buf, msg_buf, msg_buf_len);
time_t now = time(NULL);
bzero(strNow, sizeof(strNow));
strftime(strNow, sizeof(strNow), " [%Y-%m-%d %H:%M:%S]", localtime(&now));
strcat(time_and_msg_buf, strNow);
memcpy(MXCSWarningOrError+msg_total_len, time_and_msg_buf,
time_and_msg_buf_len);
msg_total_len += time_and_msg_buf_len;
delete time_and_msg_buf;
memcpy(MXCSWarningOrError+msg_total_len, tsqlState, sizeof(tsqlState));
msg_total_len += sizeof(tsqlState);
*MXCSWarningOrErrorLength = msg_total_len;
return;
}