void ServiceSkeleton::onDefaultMessage(const ServiceIdentifier& req, UserTransferMessage utm) { m_logger.debug("[%04d] default message(%s, %s, %X) from (%s) bypass\n", m_identifier.m_appport, utm.getReq().toString().c_str(), utm.getRes().toString().c_str(), utm.getMessageId(), req.toString().c_str()); }
void TDBProcess::ReconnectProcess() { UserTransferMessage utm; string sql="select * from dual"; utm.setMessageId(_ReqExecSQL); utm[_TagSql]=sql; while( !m_bStop ) { g_dagwlog.print("keep connect!\n"); Process(utm); Sleep(60*1000); } }
bool TDBProcess::PreExecSQL(const ServiceIdentifier&sender,UserTransferMessage& utm,string &sql) { bool ret = true; //empty string will cause sybase api crash if(sql == "") { utm.setReturn(ERR_DBS_ERROR); PrintLog("SEND ResExecSQL failed,sql is null\n"); m_owner->postMessage(sender, utm); return false; } //just for sybase, need change for all database #ifdef _DB_SYBASE_ if( sql.find("rowcount")!= string::npos && sql.find("set") !=string::npos ) { utm.setReturn(ERR_DBS_ERROR); PrintLog("SEND ResExecSQL failed,sql can not set row count\n"); m_owner->postMessage(sender, utm); return false; } u32 rowCount = utm[_TagMaxRowCount]; if (rowCount == 0 || rowCount > g_cfgData.m_MaxRowCount ) rowCount = g_cfgData.m_MaxRowCount; if ( rowCount != m_rowCount || m_pDbQuery->effectCount() > m_rowCount ) { m_rowCount = rowCount; try { char buf[256]; sprintf(buf,"set rowcount %d", m_rowCount); m_pDbQuery->command(buf); m_pDbQuery->execute(); PrintLog("%s\n", buf); } catch(BaseException& excp) { utm.setReturn( ERR_DBS_ERROR ); PrintLog("SEND ResExecSQL failed, %s:%s\n", excp.name.c_str(), excp.description.c_str() ); m_owner->postMessage(sender, utm); ret =false; }; } #endif return ret; }
void TDBProcess::run() { Service::printConsole("[%04d] DBGW Process running OK\n",m_iThreadNo); //m_thread.start(this,&TDBProcess::ReconnectProcess); UserTransferMessage utm; while( !m_bStop ) { g_dagwlog.print("[%04d] try to get msg\n", m_iThreadNo ); m_queue.get(utm); g_dagwlog.print("[%04d] get msg ok\n", m_iThreadNo ); onMessage( utm.getReq(), utm); } Service::printConsole("[%04d] DBGW Process quit\n",m_iThreadNo); }
void TDBProcess::OnExecSQL(const ServiceIdentifier&sender,UserTransferMessage& utm) { string sql = utm[_TagSql]; string sourceName=utm[_TagSourceName]; strarray result ; strarray fieldname; BaseFieldDescription *pField; int rowcount = 0; u32 fieldcount = 0; bool tryconnect = false; utm.setRes(utm.getReq()); utm.setMessageId(_ResExecSQL); PrintLog("RECV ReqExecSQL sql = %s \n",sql.c_str() ); if(!PreExecSQL(sender,utm, sql ) ) { PrintLog("Check SQL Statement Error\n"); return; } try { m_pDbQuery->command(sql); for(u32 i= 1 ; i <= m_pDbQuery->outputCount() ; i++) { m_pDbQuery->registerOutParam(i,FT_STRING); } PrintLog("Debug DO ExecSQL\n"); m_pDbQuery->execute(); PrintLog("Debug Finish ExecSQL\n"); fieldcount = (u32) m_pDbQuery->fieldCount(); utm[_TagFieldCount] = fieldcount; while ( !m_pDbQuery->eof()) { rowcount++; m_pDbQuery->fetchNext(); for(u32 i= 0 ; i < fieldcount ; i++) result.push_back( m_pDbQuery->getFieldByColumn(i)->asString()); } if( 0 == rowcount ) { for(u32 i=1; i <= m_pDbQuery->outputCount() ; i++ ) result.push_back(m_pDbQuery->getOutParamByIndex(i)->asString()); utm[_TagFieldCount] = (u32) m_pDbQuery->outputCount(); } utm[_TagResult] = result; if( fieldcount ) { for(u32 i = 0; i< fieldcount ; i++) { pField = m_pDbQuery->getFieldInfoByColumn(i); if( pField) fieldname.push_back(pField->name()); } } utm[_TagFieldName] = fieldname; } #ifdef _DB_ORACLE_ catch( BaseException &err ) { Service::printConsole(cacti::LogLevel::FATAL, "%s %s\n",err.name.c_str(),err.description.c_str()); utm.setReturn(ERR_DBS_ERROR); PrintLog("SEND ResExecSQL failed, Exec SQL %s %s\n", err.name.c_str(),err.description.c_str()); errProcess(err,sourceName); m_rowCount = 0; m_owner->postMessage(sender, utm); return ; } #endif #ifdef _DB_SYBASE_ catch( BaseException &err ) { if ( utm.getReturn() == 0 ){ // check the error information. // if the communication is lost, reconnect it. if ( err.state == "08S01" || err.state == "HY000"){ tryconnect = true; }; }; if ( ! tryconnect ){ Service::printConsole(cacti::LogLevel::FATAL, "%s %s\n",err.name.c_str(),err.description.c_str()); utm.setReturn(ERR_DBS_ERROR); PrintLog("SEND ResExecSQL failed, Exec SQL %s %s\n", err.name.c_str(),err.description.c_str()); errProcess(err,sourceName); m_owner->postMessage(sender, utm); return ; } } #endif #ifdef FOR_ODBC catch( BaseException &err ) { if ( utm.getReturn() == 0 ){ // check the error information. // if the communication is lost, reconnect it. if ( err.state == "08S01" || err.state == "HY000"){ tryconnect = true; }; }; if ( ! tryconnect ){ Service::printConsole(cacti::LogLevel::FATAL, "%s %s\n",err.name.c_str(),err.description.c_str()); utm.setReturn(ERR_DBS_ERROR); PrintLog("SEND ResExecSQL failed, Exec SQL %s %s\n", err.name.c_str(),err.description.c_str()); errProcess(err,sourceName); m_owner->postMessage(sender, utm); return ; } } if ( tryconnect ){ ODBCQuery* oq = (ODBCQuery*)m_pDbQuery; try{ oq->getParentConnection()->_odbcReconnect( oq->getIndex() ); } catch( BaseException& err ){ Service::printConsole(cacti::LogLevel::FATAL, "%s %s\n",err.name.c_str(),err.description.c_str()); utm.setReturn(ERR_DBS_ERROR); PrintLog("SEND ResExecSQL failed, Exec SQL %s %s\n", err.name.c_str(),err.description.c_str()); errProcess(err,sourceName); m_owner->postMessage(sender, utm); return ; }; utm.setMessageId( _ReqExecSQL ); utm.setReturn( utm.getReturn() + 1 ); Process( utm ); return; }; utm.setReturn( 0 ); #endif PrintLog("SEND ResExecSQL fieldcount =%d, rowcount=%d\n",fieldcount,rowcount); m_owner->postMessage(sender, utm); return; }