升龙物业 老版本 ocx IPO, 加密狗 转值班电话

SqlWriter.cpp 2.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "StdAfx.h"
  2. #include "SqlWriter.h"
  3. SINGLETON_IMPLEMENT(CSqlWriter)
  4. CSqlWriter::CSqlWriter(void)
  5. {
  6. m_WinThread = AfxBeginThread(__writeThreadFun, this);
  7. }
  8. CSqlWriter::~CSqlWriter(void)
  9. {
  10. TerminateThread(m_WinThread->m_hThread, 0);
  11. }
  12. /*****************************************************************
  13. **【函数名称】 __popSql
  14. **【函数功能】 取出Sql语句
  15. **【参数】 Sql: 输出参数,Sql语句
  16. **【返回值】 成功true,失败false
  17. ****************************************************************/
  18. bool CSqlWriter::__popSql( CString& Sql )
  19. {
  20. CSingleLock Locker(&m_LockSection, TRUE);
  21. if(m_SQLList.GetCount() > 0)
  22. {
  23. // 缓冲区中取SQL语句
  24. Sql = m_SQLList.RemoveHead();
  25. return true;
  26. }
  27. else return false;
  28. }
  29. /*****************************************************************
  30. **【函数名称】 __writeThreadFun
  31. **【函数功能】 呼叫明细记录线程函数
  32. **【参数】
  33. **【返回值】
  34. ****************************************************************/
  35. UINT CSqlWriter::__writeThreadFun( LPVOID pParam )
  36. {
  37. CSqlWriter* pSelf = (CSqlWriter*)pParam;
  38. ASSERT(pSelf != NULL);
  39. CString Sql;
  40. IOtlConnection* pDbControl = IOtlConnection::getInstance();
  41. ASSERT(pDbControl != NULL);
  42. if(pDbControl == NULL)
  43. {
  44. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 记录统计信息时获取数据库接口失败"));
  45. return 0;
  46. }
  47. while(TRUE)
  48. {
  49. while(pSelf->__popSql(Sql))
  50. {
  51. // 数据库执行
  52. if(!pDbControl->ExecCommand(Sql))
  53. {
  54. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计信息写入数据库失败,统计内容:%s"), Sql);
  55. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计写入数据库失败原因:%s"), pDbControl->GetLastError());
  56. }
  57. } // end while
  58. Sleep(100);
  59. } // end while
  60. return 0;
  61. }
  62. /*****************************************************************
  63. **【函数名称】 addSql
  64. **【函数功能】 添加Sql语句到缓冲区队列
  65. **【参数】 Sql:Sql语句
  66. **【返回值】
  67. ****************************************************************/
  68. void CSqlWriter::addSql( CString& Sql )
  69. {
  70. m_LockSection.Lock();
  71. // 保证缓冲区字节大小不超过10M
  72. if(m_SQLList.GetCount() < 1024)
  73. m_SQLList.AddTail(Sql);
  74. else
  75. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{SQL}: 插入统计数据时由于缓存量过大,将遗弃该条数据:%s"), Sql);
  76. m_LockSection.Unlock();
  77. }