Пример #1
0
	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());
	}
Пример #2
0
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);
	}
}
Пример #3
0
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;
}
Пример #4
0
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);
}
Пример #5
0
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;
}