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

📄 sqlproc.cpp

📁 百色电信中继电话录音系统,是对于电话会议接入到本中继系统进行电话录音
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SqlProc.cpp : implementation file
//

#include "stdafx.h"
#include "recsys.h"
#include "SqlProc.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSqlProc

IMPLEMENT_DYNCREATE(CSqlProc, CWinThread)

CSqlProc::CSqlProc()
{
	m_dbok=false;
	hOdbcStmt=NULL;
	x=0;
	ret=0;
	curpos=0;
}

CSqlProc::~CSqlProc()
{
	try
	{
		if(m_database.IsOpen())
			m_database.Close();
	}
	catch (CDBException* e) 
	{
		e->Delete();
		return;
	}
	catch(...)
	{
		return;
	}
}

BOOL CSqlProc::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	mainwnd=NULL;
	mainwnd=mainproc;
	if(mainwnd==NULL)
		return false;
	//设置时钟HWND(this->m_hThread)
	if(!connectdb()) ::PostMessage(mainwnd,WM_PROCMSG,0,SQLPROC_SERV_FAILD);
	SetTimer(NULL,100,5*1000,NULL);
//	SetTimer(HWND(this->m_hThread),100,5*1000,ScanDatabase);
	//
	if(!GetZgFromSQL()) GetZgFromFile();
	return TRUE;
}

int CSqlProc::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CSqlProc, CWinThread)
	//{{AFX_MSG_MAP(CSqlProc)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	ON_THREAD_MESSAGE( WM_EXESQL,OnExeSql )
	ON_THREAD_MESSAGE( WM_KILLTHREAD,OnKillThread )
	ON_THREAD_MESSAGE(WM_GETFTPQUEUE,OnGetFtpQueue)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSqlProc message handlers
void CSqlProc::exesql(char* sql)
{
	CString ts;
	int charind;
	ts.Format("%s",sql);
	charind=ts.Find("e:\\rec\\");
	if(charind>=0)
		ts.Delete(charind,11);
	char strsql[1024];
	sprintf(strsql,"%s",ts);
	char errmsg[1024];
	if(m_dbok)
	{
		try
		{
			m_database.ExecuteSQL(strsql);
		}
		catch (CDBException* e) 
		{
			sprintf(errmsg,e->m_strError);
			PostMsg(errmsg);
			e->Delete();
			m_dbok=false;
			WriteSqlToFile(strsql);
		}
		catch(...)
		{
			PostMsg("SqlProc:SQL语句执行时遇到未知异常!");
			m_dbok=false;
			WriteSqlToFile(strsql);
		}
	}
	else
	{
		WriteSqlToFile(strsql);
	}
}

BOOL CSqlProc::connectdb()
{	//连接数据库,显示工作信息,影响m_dbok标志
	char ts[300];
	try
	{
		if(m_database.IsOpen())
			m_database.Close();
		if(	m_database.OpenEx("DRIVER=SQL Server;SERVER=192.168.1.111;"
			"UID=recsys;PWD=pass;"
			"APP=Microsoft Data Access Components;;DSN=recsys",8))
		{
			SQLAllocHandle ( SQL_HANDLE_STMT,m_database.m_hdbc, &hOdbcStmt );
			::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_WORKING);
			m_dbok=true;
			m_restored=false;
			PostMsg("SqlProc连接数据库成功");
			return true;
		}
		m_dbok=false;
		return false;
	}
	catch (CDBException* e) 
	{
		sprintf(ts,e->m_strError);
		PostMsg(ts);
		m_dbok=false;
		e->Delete();
		::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
		return false;
	}
	catch(...)
	{
		PostMsg("SqlProc连接数据库时发生未知异常");
		m_dbok=false;
		::PostMessage(mainwnd,WM_PROCMSG,curpos,SQLPROC_SERV_FAILD);
		return false;
	}
}

void CSqlProc::releaselink(MEMZGB *fnod)
{
	if(fnod->nextp!=NULL)
		releaselink(fnod->nextp);
	else
	{
		delete fnod;
		return;
	}
}

BOOL CSqlProc::GetZgFromSQL()
{
	CDatabase m_db;
	char zg[21];
	int groupid;
	char rec_folder[51];
	SQLRETURN ret;
	SQLHANDLE hOdbcStmt;
	char msg[500];
	long x;
//	m_dbok=false;
	try
	{
		try
		{
			m_dbok=m_db.OpenEx("DRIVER=SQL Server;SERVER=192.168.1.111;"
			"UID=recsys;PWD=pass;"
			"APP=Microsoft Data Access Components;;DSN=recsys",8);
		}
		catch (CDBException* e) 
		{
			sprintf(msg,e->m_strError);
			PostMsg(msg);
			e->Delete();
			m_dbok=false;
			::InterlockedExchange(&ZG_Enable,0);
			return false;
		}
		catch(...)
		{
			PostMsg("连接数据库时遇到未知异常!");
			m_dbok=false;
			::InterlockedExchange(&ZG_Enable,0);
			return false;
		}
		if(m_dbok)
		{	//数据库载入成功,读出字冠表,载入内存,写入文件
			sumzg=0;
			zgb_fp=NULL;
			MEMZGB* tpnew,*tpold;
			tpold=zgb_fp;
			::InterlockedExchange(&ZG_Enable,0);
			Sleep(50);
			ret=SQLAllocHandle(SQL_HANDLE_STMT,m_db.m_hdbc,&hOdbcStmt);
			ret = SQLExecDirect ( hOdbcStmt, (SQLCHAR *)"select zg,group_id,rec_floder from zgb", SQL_NTS );
			ret=SQLBindCol ( hOdbcStmt, 1, SQL_C_CHAR, &zg, sizeof(zg), &x );
			ret=SQLBindCol ( hOdbcStmt, 2, SQL_C_LONG, &groupid, sizeof(groupid), &x );
			ret=SQLBindCol ( hOdbcStmt, 3, SQL_C_CHAR, &rec_folder, sizeof(rec_folder), &x );
			ret = SQLFetch ( hOdbcStmt ) ;
			while(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
			{
				tpnew=new MEMZGB;
				if(tpold==NULL)
				{
					zgb_fp=tpnew;
					tpold=tpnew;
				}
				sprintf(tpnew->zg,"%s",zg);sprintf(tpnew->rec_folder,"%s",rec_folder);
				tpnew->groupid=groupid;tpold->nextp=tpnew;
				tpnew->nextp=NULL;
				tpold=tpnew;
				ret = SQLFetch ( hOdbcStmt ) ;
				sumzg++;
			}
			::InterlockedExchange(&ZG_Enable,1);
			ret = SQLCloseCursor ( hOdbcStmt );
			ret = SQLFreeStmt ( hOdbcStmt, SQL_CLOSE );
			m_db.Close();
			//把读出的字冠存入文件,可在数据库不可用时从文件读取;
			CFile myfile;char buff[300];
			if(myfile.Open("zgb",CFile::modeCreate|CFile::modeWrite,NULL))
			{
				tpnew=zgb_fp;
				while(tpnew)
				{
					sprintf(buff,"%s,%d%c",tpnew->zg,tpnew->groupid,10);
					myfile.Write(buff,strlen(buff));
					tpnew=tpnew->nextp;
				}
				myfile.Close();
				PostMsg("从数据库读取字冠表成功,已存入文件");
			}
			exesql("update CHANGE_FLAG set ischange=0");
			return true;
//			::InterlockedExchange(&ZG_Enable,1);
		}
		else
		{
			return false;
//			::InterlockedExchange(&ZG_Enable,0);
		}
	}
	catch (...) 
	{
		PostMsg("字冠表读取或写入构建字冠链表时发生异常!");
		m_dbok=false;
		zgb_fp=NULL;
		return false;
		::InterlockedExchange(&ZG_Enable,0);
	}
	return true;
}

void CSqlProc::GetZgFromFile()
{
//从文件读出字冠表
	CFile myfile;char *fbuff=new char[1024*1024];
	char zg[20],strgid[10],log[255];
	char *tp,*endchar;
	int groupid=0;
	m_dbok=false;
	sumzg=0;
	zgb_fp=NULL;
	MEMZGB* tpnew,*tpold;
	tpold=zgb_fp;
	if(myfile.Open("zgb",CFile::modeRead,NULL))
	{
		memset(fbuff,0,1024*1024);
		long zgblen=myfile.ReadHuge(fbuff,1024*1024);
		myfile.Close();
		tp=fbuff;
		int i=0;
		while((*tp!=0)&&(tp-fbuff<=zgblen))
		{
			i=0;
			while(*tp!=',')
				zg[i]=*tp,tp++,i++;
			zg[i]=0;
			i=0;
			tp++;
			while(*tp!=10)
				strgid[i]=*tp,tp++,i++;
			strgid[i]=0;tp++;
			groupid=strtol(strgid,&endchar,10);
			tpnew=new MEMZGB;
			if(tpold==NULL)
			{
				zgb_fp=tpnew;
				tpold=tpnew;
			}
			sprintf(tpnew->zg,"%s",zg);sprintf(tpnew->rec_folder,"");
			tpnew->groupid=groupid;
			sprintf(log,"Read ZG:%s,rec_folder:%s,groupid:%d",
				tpnew->zg,tpnew->rec_folder,tpnew->groupid);
			PostMsg(log);
			tpold->nextp=tpnew;
			tpnew->nextp=NULL;
			tpold=tpnew;
			
			sumzg++;
		}
		sprintf(log,"从文件读取字冠表成功!Read zg Sum:%d",sumzg);
		PostMsg(log);
	}
	delete fbuff;
	::InterlockedExchange(&ZG_Enable,1);
}

void CSqlProc::WriteSqlToFile(char *strsql)
{
	CFile myfile;
	CFileException fe;
	SYSTEMTIME	t;
	GetLocalTime(&t);
	char strfn[100];
	sprintf(strfn,"tempdata\\%04d%02d%02d%02d.txt",t.wYear,t.wMonth,t.wDay,t.wHour);
	char ts[300];
	try
	{
		try
		{
			if(!myfile.Open(strfn,CFile::modeWrite,&fe))
			{
				if(fe.m_cause==CFileException::fileNotFound)
				{
					sprintf(ts,"%s 文件不存在",fe.m_strFileName);
					PostMsg(ts);
					if(!myfile.Open(strfn,CFile::modeWrite|CFile::modeCreate,&fe))
					{
						sprintf(ts,"%s 打开错误:%d",fe.m_strFileName,fe.m_cause);
						PostMsg(ts);
					}
				}
			}
		}
/*		catch (CFileException* e) 
		{
			sprintf(ts,"%s 打开错误:%d",e->m_strFileName,e->m_cause);
			PostMsg(ts);;
			if(!myfile.Open("tempsql.txt",CFile::modeWrite|CFile::modeCreate,&fe))
			{
				sprintf(ts,"%s 打开错误:%d",fe.m_strFileName,fe.m_cause);
				PostMsg(ts);

⌨️ 快捷键说明

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