blob: 4fd85e587e7c9a94b3b47cc82e36994251d5d487 [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 @@@
********************************************************************/
/**************************************************************************
**************************************************************************/
/* MODULE: ResStatisticsSession.cpp
PURPOSE: Implements the member functions of ResAccountingSession class
*/
#include "ResStatisticsSession.h"
#include "ResStatisticsStatement.h"
void sendAggrStats(pub_struct_type pub_type, std::tr1::shared_ptr<SESSION_AGGREGATION> pAggr_info);
void sendSessionStats(std::tr1::shared_ptr<SESSION_INFO> pSession_info);
using namespace SRVR;
void ResStatisticsSession::start(struct collect_info *setinit)
{
if (setinit != NULL)
{
char ts[25];
getCurrentTime(ts);
strcpy(startTime, ts);
strcpy(resCollectinfo.clientId, setinit->clientId);
strcpy(resCollectinfo.userName, setinit->userName);
strcpy(resCollectinfo.clientUserName, setinit->clientUserName);
strcpy(resCollectinfo.applicationId, setinit->applicationId);
strcpy(resCollectinfo.nodeName, setinit->nodeName);
strcpy(resCollectinfo.cpuPin, setinit->cpuPin);
resCollectinfo.startPriority = setinit->startPriority;
resCollectinfo.currentPriority = setinit->startPriority;
strcpy(resCollectinfo.DSName, setinit->DSName);
resCollectinfo.userId = setinit->userId;
resCollectinfo.totalLoginTime = setinit->totalLoginTime;
resCollectinfo.ldapLoginTime = setinit->ldapLoginTime;
resCollectinfo.sqlUserTime = setinit->sqlUserTime;
resCollectinfo.searchConnectionTime = setinit->searchConnectionTime;
resCollectinfo.searchTime = setinit->searchTime;
resCollectinfo.authenticationConnectionTime = setinit->authenticationConnectionTime;
resCollectinfo.authenticationTime = setinit->authenticationTime;
//if logon information for session is on write the initial information to the collector
if (srvrGlobal->resourceStatistics & SESSTAT_LOGINFO)
{
#ifdef RES_STATS_EVENT
stringstream ss;
ss << "Connection Information: UserName: " << resCollectinfo.userName
<< ", UserId: " << resCollectinfo.userId
<< ", ClientId: " << resCollectinfo.clientId
<< ", ApplicationId: " << resCollectinfo.applicationId
<< ", ClientUserName: " << resCollectinfo.clientUserName
<< ", DataSource: " << resCollectinfo.DSName
<< ", NodeName: " << resCollectinfo.nodeName
<< ", CpuPin: " << resCollectinfo.cpuPin
<< ", TotalLoginTime: " << resCollectinfo.totalLoginTime
<< ", LDAPLoginTime: " << resCollectinfo.ldapLoginTime;
<< ", SQLUserTime: " << resCollectinfo.sqlUserTime;
<< ", SearchConnectionTime: " << resCollectinfo.searchConnectionTime;
<< ", SearchTime: " << resCollectinfo.searchTime;
<< ", AuthenticationConnectionTime: " << resCollectinfo.authenticationConnectionTime;
<< ", AuthenticationTime: " << resCollectinfo.authenticationTime;
SendEventMsg(MSG_RES_STAT_INFO,
EVENTLOG_INFORMATION_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
4,
srvrGlobal->sessionId,
"STATISTICS INFORMATION",
"0",
ss.str().c_str());
#endif
logonFlag = TRUE;
}
stringstream ss;
ss << "File: " << __FILE__ << ", Fuction: " << __FUNCTION__ << ", Line: " << __LINE__ << ", SESSIONID: " << srvrGlobal->sessionId;
string session_status = "START";
int64 entryTime = JULIANTIMESTAMP();
int64 startTime = JULIANTIMESTAMP();
startTime_ts = startTime;
entryTime_ts = entryTime;
if( srvrGlobal->m_bStatisticsEnabled && srvrGlobal->m_statisticsPubType == STATISTICS_AGGREGATED )
{
sendSessionInfo(session_status, startTime_ts, endTime_ts);
std::tr1::shared_ptr<SESSION_AGGREGATION> pAggr_info = getAggrStats();
sendAggrStats(PUB_TYPE_SESSION_START_AGGREGATION, pAggr_info);
}
}
}
void ResStatisticsSession::sendSessionInfo(string session_status, long long startTime, long long endTime)
{
std::tr1::shared_ptr<SESSION_INFO> pSession_info = std::tr1::shared_ptr<SESSION_INFO>(new SESSION_INFO);
*pSession_info = {0};
pSession_info->m_process_id = srvrGlobal->process_id;
pSession_info->m_thread_id = srvrGlobal->receiveThrId;
pSession_info->m_node_id = srvrGlobal->m_NodeId;
pSession_info->m_ip_address_id = srvrGlobal->IpAddress;
pSession_info->m_process_name = srvrGlobal->m_ProcName;
pSession_info->m_sessionId = srvrGlobal->sessionId;
pSession_info->m_session_status = session_status;
pSession_info->m_session_start_utc_ts = startTime;
pSession_info->m_session_end_utc_ts = endTime;
pSession_info->m_user_id = srvrGlobal->userID;
pSession_info->m_user_name = srvrGlobal->userSID;
pSession_info->m_role_name = srvrGlobal->QSRoleName;
pSession_info->m_client_name = srvrGlobal->ClientComputerName;
pSession_info->m_client_user_name = resCollectinfo.clientUserName;
pSession_info->m_application_name = srvrGlobal->ApplicationName;
UpdateStringText(pSession_info->m_application_name);
pSession_info->m_profile_name = srvrGlobal->mappedProfileName;
pSession_info->m_sla_name= srvrGlobal->mappedSLAName;
pSession_info->m_total_odbc_exection_time = totalOdbcExecutionTime;
pSession_info->m_total_odbc_elapsed_time = totalOdbcElapseTime;
pSession_info->m_total_insert_stmts_executed = totalInsertStatements;
pSession_info->m_total_delete_stmts_executed = totalDeleteStatements;
pSession_info->m_total_update_stmts_executed = totalUpdateStatements;
pSession_info->m_total_select_stmts_executed = totalSelectStatements;
pSession_info->m_total_catalog_stmts = totalCatalogStatements;
pSession_info->m_total_prepares = totalPrepares;
pSession_info->m_total_executes = totalExecutes;
pSession_info->m_total_fetches = totalFetches;
pSession_info->m_total_closes = totalCloses;
pSession_info->m_total_execdirects = totalExecDirects;
pSession_info->m_total_errors = totalErrors;
pSession_info->m_total_warnings = totalWarnings;
pSession_info->m_total_login_elapsed_time_mcsec = resCollectinfo.totalLoginTime;
pSession_info->m_ldap_login_elapsed_time_mcsec = resCollectinfo.ldapLoginTime;
pSession_info->m_sql_user_elapsed_time_mcsec = resCollectinfo.sqlUserTime;
pSession_info->m_search_connection_elapsed_time_mcsec = resCollectinfo.searchConnectionTime;
pSession_info->m_search_elapsed_time_mcsec = resCollectinfo.searchTime;
pSession_info->m_authentication_connection_elapsed_time_mcsec = resCollectinfo.authenticationConnectionTime;
pSession_info->m_authentication_elapsed_time_mcsec = resCollectinfo.authenticationTime;
sendSessionStats(pSession_info);
}
void ResStatisticsSession::end()
{
char ts[25];
getCurrentTime(ts);
strcpy(endTime, ts);
// if summary for session is on
if (srvrGlobal->resourceStatistics & SESSTAT_SUMMARY)
{
#ifdef RES_STATS_EVENT
stringstream ss;
ss << "Session Summary: StartTime: " << startTime
<< ", EndTime: " << endTime
<< ", StartPriority: " << resCollectinfo.startPriority
<< ", TotalOdbcExecutionTime: " << totalOdbcExecutionTime
<< ", TotalODBCElapsedTime: " << totalOdbcElapseTime
<< ", TotalInsertStmtsExecuted: " << totalInsertStatements
<< ", TotalDeleteStmtsExecuted: " << totalDeleteStatements
<< ", TotalUpdateStmtsExecuted: " << totalUpdateStatements
<< ", TotalSelectStmtsExecuted: " << totalSelectStatements
<< ", TotalCatalogStmts: " << totalCatalogStatements
<< ", TotalPrepares: " << totalPrepares
<< ", TotalExecutes: " << totalExecutes
<< ", TotalFetches: " << totalFetches
<< ", TotalCloses: " << totalCloses
<< ", TotalExecDirects: " << totalExecDirects
<< ", TotalErrors: " << totalErrors
<< ", TotalWarnings: " << totalWarnings;
SendEventMsg(MSG_RES_STAT_INFO,
EVENTLOG_INFORMATION_TYPE,
srvrGlobal->nskProcessInfo.processId,
ODBCMX_SERVER,
srvrGlobal->srvrObjRef,
4,
srvrGlobal->sessionId,
"STATISTICS INFORMATION",
"0",
ss.str().c_str());
#endif
}
stringstream ss;
ss << "File: " << __FILE__ << ", Fuction: " << __FUNCTION__ << ", Line: " << __LINE__ << ", SESSIONID: " << srvrGlobal->sessionId;
int64 endTime = JULIANTIMESTAMP();
endTime_ts = endTime;
if ( srvrGlobal->m_bStatisticsEnabled )
{
if( srvrGlobal->m_statisticsPubType == STATISTICS_AGGREGATED )
{
std::tr1::shared_ptr<SESSION_AGGREGATION> pAggr_info = getAggrStats();
sendAggrStats(PUB_TYPE_SESSION_END_AGGREGATION, pAggr_info);
}
sendSessionInfo("END", startTime_ts, endTime_ts);
}
}
void ResStatisticsSession::accumulateStatistics(passSession *ps)
{
// Compute totals
//Increment the number of prepares, executes, closes, fetch according to state
//Increment the type of statement (Insert, delete etc) according to state
// Check for state and increment accordingly
switch (ps->state)
{
case STMTSTAT_PREPARE:
totalPrepares++;
break;
case STMTSTAT_EXECUTE:
totalExecutes++;
break;
case STMTSTAT_FETCH:
totalFetches++;
break;
case STMTSTAT_CLOSE:
totalCloses++;
break;
case STMTSTAT_EXECDIRECT:
totalExecDirects++;
break;
default:
break;
}
// Check for Statement Type and increment accordingly
switch (ps->stmtType)
{
case TYPE_SELECT:
totalSelectStatements++;
if (ps->errorStatement)
totalSelectErrors++;
break;
case TYPE_INSERT:
totalInsertStatements++;
if (ps->errorStatement)
totalInsertErrors++;
break;
case TYPE_DELETE:
totalDeleteStatements++;
if (ps->errorStatement)
totalDeleteErrors++;
break;
case TYPE_UPDATE:
totalUpdateStatements++;
if (ps->errorStatement)
totalUpdateErrors++;
break;
default:
switch (ps->sqlNewQueryType)
{
case SQL_OTHER:
case SQL_CALL_NO_RESULT_SETS:
case SQL_CALL_WITH_RESULT_SETS:
case SQL_SP_RESULT_SET:
totalOtherStatements++;
if (ps->errorStatement)
totalOtherErrors++;
break;
case SQL_CAT_UTIL:
case SQL_EXE_UTIL:
totalUtilStatements++;
if (ps->errorStatement)
totalUtilErrors++;
break;
default:
break;
}
break;
}
totalOdbcElapseTime = totalOdbcElapseTime + ps->odbcElapseTime;
totalOdbcExecutionTime = totalOdbcExecutionTime + ps->odbcExecutionTime;
//totalSqlExecutionTime = totalSqlExecutionTime + ps->SqlExecutionTime;
//totalSqlElapseTime = totalSqlElapsedTime + ps->SqlElapsedTime;
totalErrors = totalErrors + ps->errorStatement;
totalWarnings = totalWarnings + ps->warningStatement;
}
void ResStatisticsSession::accumulateStatistics(const ResStatistics * const pResStats)
{
ResStatisticsStatement *pResStatsStmt = (ResStatisticsStatement *)pResStats;
// Aggregated counters
//
// pSrvrStmt->m_aggODBCElapsedTime += pResStatsStmt->inqueryElapseTime; //EVERY
// pSrvrStmt->m_aggODBCExecutionTime += pResStatsStmt->inqueryExecutionTime; //EVERY
sessWlStats.aggrStats.EstimatedRowsAccessed += pResStatsStmt->estRowsAccessed; //AGGREG
sessWlStats.aggrStats.EstimatedRowsUsed += pResStatsStmt->estRowsUsed; //AGGREG
sessWlStats.aggrStats.StatsBytes += pResStatsStmt->StatsBytes; //AGGREG
sessWlStats.aggrStats.RowsReturned += pResStatsStmt->rowsReturned; //AGGREG
sessWlStats.aggrStats.SQLProcessBusyTime += pResStatsStmt->ProcessBusyTime; //AGGREG
sessWlStats.aggrStats.AQRnumRetries += pResStatsStmt->AQRnumRetries; //AGGREG
sessWlStats.aggrStats.AQRdelayBeforeRetry += pResStatsStmt->AQRdelayBeforeRetry; //AGGREG
sessWlStats.aggrStats.NumberOfRows += pResStatsStmt->numberOfRows; //AGGREG
sessWlStats.aggrStats.OpenBusyTime += pResStatsStmt->OpenTime; //AGGREG
sessWlStats.aggrStats.NumOpens += pResStatsStmt->Opens; //AGGREG
sessWlStats.aggrStats.ProcessesCreated += pResStatsStmt->NewProcess; //AGGREG
sessWlStats.aggrStats.ProcessCreateBusyTime += pResStatsStmt->NewProcessTime; //AGGREG
sessWlStats.aggrStats.RowsAccessed += pResStatsStmt->AccessedRows; //AGGREG
sessWlStats.aggrStats.RowsRetrieved += pResStatsStmt->UsedRows; //AGGREG
sessWlStats.aggrStats.DiscProcessBusyTime += pResStatsStmt->DiskProcessBusyTime; //AGGREG
sessWlStats.aggrStats.DiscReads += pResStatsStmt->DiskIOs; //AGGREG
sessWlStats.aggrStats.SpaceTotal += pResStatsStmt->SpaceTotal; //AGGREG
sessWlStats.aggrStats.SpaceUsed += pResStatsStmt->SpaceUsed; //AGGREG
sessWlStats.aggrStats.HeapTotal += pResStatsStmt->HeapTotal; //AGGREG
sessWlStats.aggrStats.HeapUsed += pResStatsStmt->HeapUsed; //AGGREG
sessWlStats.aggrStats.TotalMemory += pResStatsStmt->TotalMemAlloc; //AGGREG
sessWlStats.aggrStats.Dp2SpaceTotal += pResStatsStmt->Dp2SpaceTotal; //AGGREG
sessWlStats.aggrStats.Dp2SpaceUsed += pResStatsStmt->Dp2SpaceUsed; //AGGREG
sessWlStats.aggrStats.Dp2HeapTotal += pResStatsStmt->Dp2HeapTotal; //AGGREG
sessWlStats.aggrStats.Dp2HeapUsed += pResStatsStmt->Dp2HeapUsed; //AGGREG
sessWlStats.aggrStats.MsgsToDisc += pResStatsStmt->NumMessages; //AGGREG
sessWlStats.aggrStats.MsgsBytesToDisc += pResStatsStmt->MessagesBytes; //AGGREG
sessWlStats.aggrStats.NumRqstMsgs += pResStatsStmt->reqMsgCnt; //AGGREG
sessWlStats.aggrStats.NumRqstMsgBytes += pResStatsStmt->reqMsgBytes; //AGGREG
sessWlStats.aggrStats.NumRplyMsgs += pResStatsStmt->replyMsgCnt; //AGGREG
sessWlStats.aggrStats.NumRplyMsgBytes += pResStatsStmt->replyMsgBytes; //AGGREG
sessWlStats.aggrStats.LockWaits += pResStatsStmt->LockWaits; //AGGREG
sessWlStats.aggrStats.LockEscalation += pResStatsStmt->Escalations; //AGGREG
sessWlStats.aggrStats.TotalExecutes++;
sessWlStats.aggrStats.totalSelects = totalSelectStatements;
sessWlStats.aggrStats.totalInserts = totalInsertStatements;
sessWlStats.aggrStats.totalUpdates = totalUpdateStatements;
sessWlStats.aggrStats.totalDeletes = totalDeleteStatements;
sessWlStats.aggrStats.totalDDLs = totalDDLStatements;
sessWlStats.aggrStats.totalUtils = totalUtilStatements;
sessWlStats.aggrStats.totalCatalogs = totalCatalogStatements;
sessWlStats.aggrStats.totalOthers = totalOtherStatements;
sessWlStats.aggrStats.totalSelectErrors = totalSelectErrors;
sessWlStats.aggrStats.totalInsertErrors = totalInsertErrors;
sessWlStats.aggrStats.totalUpdateErrors = totalUpdateErrors;
sessWlStats.aggrStats.totalDeleteErrors = totalDeleteErrors;
sessWlStats.aggrStats.totalDDLErrors = totalDDLErrors;
sessWlStats.aggrStats.totalUtilErrors = totalUtilErrors;
sessWlStats.aggrStats.totalCatalogErrors = totalCatalogErrors;
sessWlStats.aggrStats.totalOtherErrors = totalOtherErrors;
sessWlStats.aggrStats.NumRowsIUD = (totalInsertStatements+totalUpdateStatements+totalDeleteStatements);
}
void ResStatisticsSession::update()
{
if(srvrGlobal->m_bStatisticsEnabled && srvrGlobal->m_statisticsPubType == STATISTICS_AGGREGATED && endTime_ts == 0)
{
sessWlStats.computeDeltaStats();
std::tr1::shared_ptr<SESSION_AGGREGATION> pAggr_info = getAggrStats();
sendAggrStats(PUB_TYPE_SESSION_UPDATE_AGGREGATION, pAggr_info);
}
}
void ResStatisticsSession::init()
{
// Initialize the variables to be accumulated
totalSqlExecutionTime = 0;
totalOdbcElapseTime = 0;
totalSqlElapseTime = 0;
totalOdbcExecutionTime = 0;
totalInsertStatements = 0;
totalDeleteStatements = 0;
totalUpdateStatements = 0;
totalSelectStatements = 0;
totalDDLStatements = 0;
totalUtilStatements = 0;
totalOtherStatements = 0;
totalInsertErrors = 0;
totalUpdateErrors = 0;
totalDeleteErrors = 0;
totalSelectErrors = 0;
totalDDLErrors = 0;
totalUtilErrors = 0;
totalOtherErrors = 0;
totalPrepares = 0;
totalExecutes = 0;
totalFetches = 0;
totalCloses = 0;
totalExecDirects = 0;
totalErrors = 0;
totalWarnings = 0;
totalCatalogStatements = 0;
totalCatalogErrors = 0;
totalCatalogWarnings = 0;
logonFlag = FALSE;
sessWlStats.aggrStats.reset();
sessWlStats.deltaStats.reset();
startTime_ts = 0;
entryTime_ts = 0;
endTime_ts = 0;
}
std::tr1::shared_ptr<SESSION_AGGREGATION> ResStatisticsSession::getAggrStats()
{
std::tr1::shared_ptr<SESSION_AGGREGATION> pAggr_info = std::tr1::shared_ptr<SESSION_AGGREGATION>(new SESSION_AGGREGATION);
*pAggr_info = {0};
pAggr_info->m_process_id = srvrGlobal->process_id;
pAggr_info->m_thread_id = srvrGlobal->receiveThrId;
pAggr_info->m_node_id = srvrGlobal->m_NodeId;
pAggr_info->m_ip_address_id = srvrGlobal->IpAddress;
pAggr_info->m_process_name = srvrGlobal->m_ProcName;
pAggr_info->m_sessionId = srvrGlobal->sessionId;
pAggr_info->m_session_start_utc_ts = startTime_ts;
pAggr_info->m_aggregation_last_update_utc_ts = JULIANTIMESTAMP();
pAggr_info->m_aggregation_last_elapsed_time = srvrGlobal->m_iAggrInterval * 1000; // milliseconds
pAggr_info->m_user_id = srvrGlobal->userID;
pAggr_info->m_user_name = srvrGlobal->userSID;
pAggr_info->m_role_name = srvrGlobal->QSRoleName;
pAggr_info->m_client_name = srvrGlobal->ClientComputerName;
pAggr_info->m_application_name = srvrGlobal->ApplicationName;
UpdateStringText(pAggr_info->m_application_name);
pAggr_info->m_client_user_name = resCollectinfo.clientUserName;
pAggr_info->m_total_est_rows_accessed = sessWlStats.aggrStats.EstimatedRowsAccessed;
pAggr_info->m_total_est_rows_used = sessWlStats.aggrStats.EstimatedRowsUsed;
pAggr_info->m_total_rows_retrieved = sessWlStats.aggrStats.RowsRetrieved;
pAggr_info->m_total_num_rows_iud = sessWlStats.aggrStats.NumRowsIUD;
pAggr_info->m_total_selects = sessWlStats.aggrStats.totalSelects;
pAggr_info->m_total_inserts = sessWlStats.aggrStats.totalInserts;
pAggr_info->m_total_updates = sessWlStats.aggrStats.totalUpdates;
pAggr_info->m_total_deletes = sessWlStats.aggrStats.totalDeletes;
pAggr_info->m_total_ddl_stmts = sessWlStats.aggrStats.totalDDLs;
pAggr_info->m_total_util_stmts = sessWlStats.aggrStats.totalUtils;
pAggr_info->m_total_catalog_stmts = sessWlStats.aggrStats.totalCatalogs;
pAggr_info->m_total_other_stmts = sessWlStats.aggrStats.totalOthers;
pAggr_info->m_total_select_errors = sessWlStats.aggrStats.totalSelectErrors;
pAggr_info->m_total_insert_errors = sessWlStats.aggrStats.totalInsertErrors;
pAggr_info->m_total_update_errors = sessWlStats.aggrStats.totalUpdateErrors;
pAggr_info->m_total_delete_errors = sessWlStats.aggrStats.totalDeleteErrors;
pAggr_info->m_total_ddl_errors = sessWlStats.aggrStats.totalDDLErrors;
pAggr_info->m_total_util_errors = sessWlStats.aggrStats.totalUtilErrors;
pAggr_info->m_total_catalog_errors = sessWlStats.aggrStats.totalCatalogErrors;
pAggr_info->m_total_other_errors = sessWlStats.aggrStats.totalOtherErrors;
pAggr_info->m_delta_estimated_rows_accessed =max(double(0), sessWlStats.deltaStats.EstimatedRowsAccessed);
pAggr_info->m_delta_estimated_rows_used = max(double(0),sessWlStats.deltaStats.EstimatedRowsUsed);
pAggr_info->m_delta_rows_accessed = max(int64(0),sessWlStats.deltaStats.RowsAccessed);
pAggr_info->m_delta_rows_retrieved = max(int64(0),sessWlStats.deltaStats.RowsRetrieved);
pAggr_info->m_delta_num_rows_iud = max(int64(0),sessWlStats.deltaStats.NumRowsIUD);
pAggr_info->m_delta_total_selects = max(int64(0),sessWlStats.deltaStats.totalSelects);
pAggr_info->m_delta_total_inserts = max(int64(0),sessWlStats.deltaStats.totalInserts);
pAggr_info->m_delta_total_updates = max(int64(0),sessWlStats.deltaStats.totalUpdates);
pAggr_info->m_delta_total_deletes = max(int64(0),sessWlStats.deltaStats.totalDeletes);
pAggr_info->m_delta_total_ddl_stmts = max(int64(0),sessWlStats.deltaStats.totalDDLs);
pAggr_info->m_delta_total_util_stmts = max(int64(0),sessWlStats.deltaStats.totalUtils);
pAggr_info->m_delta_total_catalog_stmts = max(int64(0),sessWlStats.deltaStats.totalCatalogs);
pAggr_info->m_delta_total_other_stmts = max(int64(0),sessWlStats.deltaStats.totalOthers);
pAggr_info->m_delta_select_errors = max(int64(0),sessWlStats.deltaStats.totalSelectErrors);
pAggr_info->m_delta_insert_errors = max(int64(0),sessWlStats.deltaStats.totalInsertErrors);
pAggr_info->m_delta_update_errors = max(int64(0),sessWlStats.deltaStats.totalUpdateErrors);
pAggr_info->m_delta_delete_errors = max(int64(0),sessWlStats.deltaStats.totalDeleteErrors);
pAggr_info->m_delta_ddl_errors = max(int64(0),sessWlStats.deltaStats.totalDDLErrors);
pAggr_info->m_delta_util_errors = max(int64(0),sessWlStats.deltaStats.totalUtilErrors);
pAggr_info->m_delta_catalog_errors = max(int64(0),sessWlStats.deltaStats.totalCatalogErrors);
pAggr_info->m_delta_other_errors = max(int64(0),sessWlStats.deltaStats.totalOtherErrors);
return pAggr_info;
}
ResStatisticsSession::ResStatisticsSession()
{
}
ResStatisticsSession::~ResStatisticsSession()
{
}