⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hopekingdatabase.cpp

📁 IVR交互式语音应答系统脚本解析器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// HopeKingDatabase.cpp: implementation of the CHopeKingDatabase class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "HopeKingDatabase.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHopeKingDatabase::CHopeKingDatabase(CDataBus * pBus):CAsynWorker(pBus)
{
	m_defaultSql.m_pDatabase=this;
	m_ParamSql.m_pDatabase=this;
}

CHopeKingDatabase::~CHopeKingDatabase()
{
	CloseData();
}

int CHopeKingDatabase::ExcuteOdbc(LPCTSTR szExcuteSql,int iflag,UniVar & uvSpyy,int iParNum,UniVar * pParam)
{
	int pnum=iParNum;
	int excuteflag=0;
	*m_defaultSql.m_Ret.m_Data.m_pInt=0;
	switch(iflag&0xf000){
	case nProcedureName:
		if((iflag&nNoReturn)==nNoReturn){
			excuteflag=1;
		}
		else{
			excuteflag=0;
		}
		if((iflag&nPamTypePointed)==nPamTypePointed){
			if((iflag&nPmPointedSet)==nPmPointedSet){
				pnum=iParNum/2;
				m_defaultSql.SetParaNum(pnum);
				for(int i=0;i<pnum;i++){
					m_defaultSql.SetParamValue(i,pParam[i],(int)pParam[i+pnum]);
				}
			}
			else {
				m_defaultSql.SetParaNum(pnum);
				for(int i=0;i<pnum;i++){
					m_defaultSql.SetParamValue(i,pParam[i]);
				}
			}
		}
		else{
			CString csCmd=m_csProcInfo,cst="\'";
			cst+=szExcuteSql;
			cst+="\'";
			csCmd.Replace("?",cst);
			m_ParamSql.SetParaNum(0);
			if(!m_ParamSql.ExcuteSql(csCmd,3)){
				uvSpyy="信息查询语句有误";
				return -25001;
			}
			if(!m_ParamSql.IsOpen()){
				uvSpyy="信息查询语句有误";
				return -25001;
			}
			m_defaultSql.SetParaNum(pnum);
			int ii=0;
			while(!m_ParamSql.IsEOF()){
				if(ii>=pnum){
					uvSpyy="参数错误";
					return -25002;
				}
				int isoutp=m_ParamSql.GetResultValueI(0);
				int istype=m_ParamSql.GetResultValueI(1);
				int ilen=m_ParamSql.GetResultValueI(2);
				int itype=nSqlParam;
				if(isoutp)
					itype=nSqlOutputParam;
				switch(istype){
				case SQLTEXT 			:
				case SQLVARCHAR			:
				case SQLCHARACTER		:
				case SQLMONEY			:
				case SQLMONEYN			:
				case SQLMONEY4			:
				case SQLDECIMAL			:
				case SQLDECIMALN		:
				case SQLNUMERIC			:
				case SQLNUMERICN 		:
					break;
				case SQLINT1 			:
					itype+=1;
					break;
				case SQLINT2 			:
					itype+=2;
					break;
				case SQLFLT4 			:
					itype+=3;
					break;
				case SQLFLT8 			:
				case SQLFLTN 			:
					itype+=4;
					break;
				case SQLDATETIME 		:
				case SQLDATETIMN 		:
				case SQLDATETIM4 		:
					itype+=5;
					break;
				case SQLBINARY			:
				case SQLVARBINARY		:
					itype+=6;
					break;
				case SQLIMAGE			:
					itype+=7;
					break;
				case SQLBIT				:
					itype+=8;
					break;
				case SQLINTN 			:
				case SQLINT4 			:
					itype+=9;
					break;
				}
				m_defaultSql.SetParamValue(ii,pParam[ii],itype);
				ii++;
				m_ParamSql.MoveNext();
			}
			if(ii!=pnum){
				uvSpyy="参数错误";
				return -25002;
			}
		}
		break;
	case nTableName:
		{
			excuteflag=5;
			m_defaultSql.SetParaNum(pnum);
			for(int i=0;i<pnum;i++){
				pParam[i].ToA();
				m_defaultSql.SetParamValue(i,pParam[i],0);
			}
		}
		break;
	case nSqlClause:
		{
			excuteflag=3;
			if((iflag&nPmPointedSet)==nPmPointedSet){
				pnum=iParNum/2;
				m_defaultSql.SetParaNum(pnum);
				for(int i=0;i<pnum;i++){
					m_defaultSql.SetParamValue(i,pParam[i],(int)pParam[i+pnum]);
				}
			}
			else {
				m_defaultSql.SetParaNum(pnum);
				for(int i=0;i<pnum;i++){
					m_defaultSql.SetParamValue(i,pParam[i]);
				}
			}
		}
		break;
	default:
		uvSpyy="执行标志错误";
		return -25003;
	}
	if(!m_defaultSql.ExcuteSql(szExcuteSql,excuteflag)){
		uvSpyy="执行失败";
		return -25004;
	}
	else{
		return *m_defaultSql.m_Ret.m_Data.m_pInt;
	}
}

void CHopeKingDatabase::OnMsgReceive(CUniMsg * pMsg)
{
	switch(pMsg->m_dwCommand){
	case CMD_TASK_RUNTASK:
		{
			CUniMsg um;
			um.m_dwCommand=CMD_TASK_RUNTASK;
			um.m_btMsgType=MSG_RESPONSE;
			um.m_dwSendMode=pMsg->m_dwReceiveMode;
			um.m_dwReceiveMode=pMsg->m_dwSendMode;
			um.m_pReceivor=pMsg->m_pSender;
			um.m_pSender=pMsg->m_pReceivor;
			um.m_dwIdent=pMsg->m_dwIdent;
			um.m_ierror=0;
			if(pMsg->GetSize()<3){
				um.m_ierror=-25000;
				um.Add(-25000);
				um.Add("参数不够");
				m_pBus->SendMessage(&um,m_btCurRoad);
				return;
			}
			else{
				LPCTSTR lpsql=(LPCTSTR)(pMsg->m_pTV[1].ToA());
				if(!lpsql||!lpsql[0]){
					um.m_ierror=-25005;
					um.Add(-25005);
					um.Add("执行体不存在");
					m_pBus->SendMessage(&um,m_btCurRoad);
					return;
				}
				try{
					int iflag=(int)pMsg->m_pTV[2];
					UniVar uvSpyy;
					int irunst=ExcuteOdbc(lpsql,iflag,uvSpyy,pMsg->GetSize()-3,pMsg->m_pTV+3);
					um.Add(irunst);
					um.Add(uvSpyy);
					if(irunst<=-25000){
						um.m_ierror=irunst;
						m_pBus->SendMessage(&um,m_btCurRoad);
						return;
					}
					int irow=0;
					int icol=m_defaultSql.m_iPreDefColNum;
					um.Add(m_defaultSql.m_iParamNum);
					um.Add(icol);
					um.Add(irow);
					for(int i=0;i<m_defaultSql.m_iParamNum;i++){
						m_defaultSql.GetParamValue(i,uvSpyy);
						um.Add(uvSpyy);
					}
					if((nWantResult&iflag)==nWantResult){
						if(m_defaultSql.IsOpen()){
							irow=0;
							while(!m_defaultSql.IsEOF()){
								for(i=0;i<icol;i++){
									m_defaultSql.GetResultValue(i,uvSpyy);
									um.Add(uvSpyy);
								}
								irow++;
								m_defaultSql.MoveNext();
							}
							um.m_pTV[4]=irow;
						}
					}
					m_defaultSql.Close();
					m_pBus->SendMessage(&um,m_btCurRoad);
					return;
				}
				catch(...){
					um.m_ierror=-25010;
					um.RemoveAll();
					um.Add(-25010);
					um.Add("发生异常");
					m_pBus->SendMessage(&um,m_btCurRoad);
					return;
				}
			}
		}
		break;
	default:
		CAsynWorker::OnMsgReceive(pMsg);
	}
}

void CHopeKingDatabase::QueueMenuberTimeOut(CUniMsg *pMsg)
{
	CUniMsg um;
	um.m_dwCommand=CMD_TASK_RUNTASK;
	um.m_btMsgType=MSG_RESPONSE;
	um.m_dwSendMode=pMsg->m_dwReceiveMode;
	um.m_dwReceiveMode=pMsg->m_dwSendMode;
	um.m_pReceivor=pMsg->m_pSender;
	um.m_pSender=pMsg->m_pReceivor;
	um.m_dwIdent=pMsg->m_dwIdent;
	um.m_ierror=-25008;
	um.Add(-25008);
	um.Add("超时");
	m_pBus->SendMessage(&um,m_btCurRoad);
}

void CHopeKingDatabase::OnSynMsg(CUniMsg * pMsg,CUniMsg * pCmdReceive)
{
	switch(pMsg->m_dwCommand){
	case CMD_TASK_RUNTASK:
		{
			if(pMsg->GetSize()<3){
				pCmdReceive->Add(-25000);
				pCmdReceive->Add("参数不够");
				return;
			}
			else{
				LPCTSTR lpsql=(LPCTSTR)(pMsg->m_pTV[1].ToA());
				if(!lpsql||!lpsql[0]){
					pCmdReceive->Add(-25005);
					pCmdReceive->Add("执行体不存在");
					return;
				}
				try{
					int iflag=(int)pMsg->m_pTV[2];
					UniVar uvSpyy;
					int irunst=ExcuteOdbc(lpsql,iflag,uvSpyy,pMsg->GetSize()-3,pMsg->m_pTV+3);
					pCmdReceive->Add(irunst);
					pCmdReceive->Add(uvSpyy);
					if(irunst<=-25000){
						return;
					}
					int irow=0;
					int icol=m_defaultSql.m_iPreDefColNum;
					pCmdReceive->Add(m_defaultSql.m_iParamNum);
					pCmdReceive->Add(icol);
					pCmdReceive->Add(irow);
					for(int i=0;i<m_defaultSql.m_iParamNum;i++){
						m_defaultSql.GetParamValue(i,uvSpyy);
						pCmdReceive->Add(uvSpyy);
					}
					if((nWantResult&iflag)==nWantResult){
						if(m_defaultSql.IsOpen()){
							irow=0;
							while(!m_defaultSql.IsEOF()){
								for(i=0;i<icol;i++){
									m_defaultSql.GetResultValue(i,uvSpyy);
									pCmdReceive->Add(uvSpyy);
								}
								irow++;
								m_defaultSql.MoveNext();
							}
							pCmdReceive->m_pTV[4]=irow;
						}
					}
					m_defaultSql.Close();
					return;
				}
				catch(...){
					pCmdReceive->RemoveAll();
					pCmdReceive->Add(-25010);
					pCmdReceive->Add("发生异常");
					SendMsg(pCmdReceive,m_btCurRoad);
					return;
				}
			}
		}
		break;
	default:
		CAsynWorker::OnSynMsg(pMsg,pCmdReceive);
	}
}

void CHopeKingDatabase::CloseData()
{
	m_ParamSql.RealCloseSql();
	m_defaultSql.RealCloseSql();
	for(int i=0;i<m_ListSql.GetSize();i++){
		m_ListSql[i]->RealCloseSql();
		delete m_ListSql[i];
	};
}

COdbcMg::COdbcMg(CDataBus * pBus):CAsynWorker(pBus)
{
	InitializeCriticalSection(&statArea);
	m_pDefaultOdbc=NULL;
};

COdbcMg::~COdbcMg()
{
	if(m_pDefaultOdbc){
		m_pDefaultOdbc->CloseData();
		delete m_pDefaultOdbc;
		m_pDefaultOdbc=NULL;
	}
	for(int i=0;i<m_ListOdbcData.GetSize();i++){
		if(m_ListOdbcData[i]->IsValid()){
			m_ListOdbcData[i]->CloseData();
			delete m_ListOdbcData[i];
		}
	}
	m_ListOdbcData.RemoveAll();
	DeleteCriticalSection(&statArea);
}

void COdbcMg::OpenDefaultOdbc(LPCTSTR procinfo,LPCTSTR tableinfo)
{
	if(!procinfo||!tableinfo)return;
	if(!procinfo[0]||!tableinfo[0])return;
	if(!m_pDefaultOdbc){
		m_pDefaultOdbc=new CHopeKingDatabase(m_pBus);
		m_pDefaultOdbc->PointeRoad(1);
	}
	if(!m_pDefaultOdbc->IsOpen()){
		if(m_csDefaultAlis.IsEmpty()||m_csDefaultDsn.IsEmpty())
			return;
		m_OdbcDataMap.SetAt(m_csDefaultAlis,(void *)m_pDefaultOdbc);
		m_pDefaultOdbc->m_csDsn=m_csDefaultDsn;
		m_pDefaultOdbc->m_csAlis=m_csDefaultAlis;
		m_pDefaultOdbc->m_csProcInfo=procinfo;
		m_pDefaultOdbc->m_csTableInfo=tableinfo;
		TRY{
			m_pDefaultOdbc->OpenEx(m_csDefaultDsn,CDatabase::noOdbcDialog);
		}
		CATCH(CDBException, e)
		{
			m_pDefaultOdbc->Close();
		}
		END_CATCH
	}
}

CHopeKingDatabase * COdbcMg::OpenOdbc(LPCTSTR szAlis,LPCTSTR lpszConnect,LPCTSTR procinfo,LPCTSTR tableinfo)
{
	if(!szAlis||!lpszConnect)return NULL;
	if(!szAlis[0]||!lpszConnect[0])return NULL;
	if(!procinfo||!tableinfo)return NULL;
	if(!procinfo[0]||!tableinfo[0])return NULL;
	EnterCriticalSection(&statArea);
	CHopeKingDatabase * pDbs=GetOdbc(szAlis);
	if(pDbs){
		LeaveCriticalSection(&statArea);
		return pDbs;
	}
	pDbs=new CHopeKingDatabase(m_pBus);
	m_ListOdbcData.Add(pDbs);
	pDbs->PointeRoad(1);
	try{
		m_OdbcDataMap.SetAt(szAlis,(void *)pDbs);
		pDbs->m_csDsn=lpszConnect;
		pDbs->m_csAlis=szAlis;
		pDbs->m_csProcInfo=procinfo;
		pDbs->m_csTableInfo=tableinfo;
		TRY{
			pDbs->OpenEx(lpszConnect,CDatabase::noOdbcDialog);
		}
		CATCH(CDBException, e)
		{
			pDbs->Close();
		}
		END_CATCH
	}
	catch(...){
	}
	LeaveCriticalSection(&statArea);
	return pDbs;
}

void COdbcMg::CloseOdbc(CHopeKingDatabase * pDbs)
{
	if(!pDbs->IsValid())
		return;
	EnterCriticalSection(&statArea);
	try{
		CString csa=pDbs->m_csAlis;
		if(pDbs!=GetOdbc(csa)){
			LeaveCriticalSection(&statArea);
			return;
		}
	}
	catch(...){
		LeaveCriticalSection(&statArea);
		return;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -