中间件底层,websocket

DBInterface.cpp 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. #include "StdAfx.h"
  2. #include "DBInterface.h"
  3. CDBInterface::CDBInterface( void )
  4. {
  5. ::CoInitialize(NULL);
  6. this->m_PConnection = NULL;
  7. this->m_PCommand = NULL;
  8. this->m_pDBSemaphore = new CSemaphore( 1, 1 );
  9. m_bIsStarted = FALSE;
  10. }
  11. CDBInterface::~CDBInterface(void)
  12. {
  13. if( m_pDBSemaphore!=NULL )
  14. {
  15. delete( m_pDBSemaphore );
  16. m_pDBSemaphore = NULL;
  17. }
  18. if( m_PConnection )
  19. {
  20. if( m_PConnection->State )
  21. m_PConnection->Close();
  22. m_PConnection.Release();
  23. m_PConnection = NULL;
  24. }
  25. if( m_PCommand )
  26. m_PCommand.Release();
  27. ::CoUninitialize();
  28. }
  29. /*****************************************************************
  30. **【函数名称】 ConnectDataBase
  31. **【函数功能】 重连时调用
  32. **【参数】 ErrMassege :返回的错误信息
  33. **【返回值】 TRUE:连接创建成功 FALSE:连接创建失败
  34. **【调用模块】 (根据实际情况)
  35. ****************************************************************/
  36. bool CDBInterface::ConnectDataBase(const CString& connStr, CString &ErrMessage )
  37. {
  38. _bstr_t varSRC(connStr);
  39. m_ConnectStr = connStr;//连接字符串的值保存
  40. bool bRet = true;
  41. try
  42. {
  43. if (FAILED(m_PConnection->Open(varSRC,"","",adModeUnknown)))
  44. {
  45. ErrMessage = "执行Open操作失败, ConnectString = " + connStr;
  46. bRet = false;
  47. }
  48. else
  49. {
  50. m_PCommand->ActiveConnection=m_PConnection;
  51. }
  52. }
  53. catch (_com_error e)
  54. {
  55. bRet = false;
  56. ErrMessage = (LPCSTR)e.Description();
  57. ErrMessage = ErrMessage + _T(", ConnectString = ") + connStr;
  58. } // end catch
  59. return bRet;
  60. }
  61. /*****************************************************************
  62. **【函数名称】 CloseConn
  63. **【函数功能】 执行不返回记录集的SQL语句
  64. **【参数】 无
  65. **【返回值】 true执行成功,false执行失败
  66. **【调用模块】 (根据实际情况)
  67. **【修改】 (根据实际情况)
  68. ****************************************************************/
  69. bool CDBInterface::CloseConn()
  70. {
  71. bool bRet = true;
  72. if( m_PConnection )
  73. {
  74. if( m_PConnection->State )
  75. m_PConnection->Close();
  76. }
  77. else
  78. bRet = false;
  79. return bRet;
  80. }
  81. /*****************************************************************
  82. **【函数名称】 Init
  83. **【函数功能】 初始化数据库
  84. **【参数】 ErrMessage错误返回值
  85. **【返回值】 ture执行成功,反之-失败
  86. **【调用模块】 (根据实际情况)
  87. **【修改】 (根据实际情况)
  88. ****************************************************************/
  89. bool CDBInterface::Init( CString &ErrMessage )
  90. {
  91. //CoInitialize(NULL);
  92. bool bRet = true;
  93. try
  94. {
  95. if ( bRet)
  96. {
  97. if(FAILED(m_PConnection.CreateInstance("ADODB.Connection")))
  98. {
  99. ErrMessage = "ADO创建Connection失败!";
  100. bRet = false;
  101. }
  102. }
  103. if ( bRet)
  104. {
  105. m_PConnection->ConnectionTimeout =2;
  106. if(FAILED(m_PCommand.CreateInstance(__uuidof(Command))))
  107. {
  108. ErrMessage = "ADO创建Command失败";
  109. bRet = false;
  110. }
  111. }
  112. }
  113. catch (_com_error)
  114. {
  115. bRet = false;
  116. ErrMessage = "连接数据库失败!";
  117. }
  118. return bRet;
  119. }
  120. /*****************************************************************
  121. **【函数名称】 SqlCommand
  122. **【函数功能】 执行不返回记录集的SQL语句
  123. **【参数】 SQL:要执行的SQL语句,ErrMassege :返回的错误信息
  124. **【返回值】 TRUE:执行成功 FALSE:执行失败
  125. **【调用模块】 (根据实际情况)
  126. **【修改】 (根据实际情况)
  127. ****************************************************************/
  128. bool CDBInterface::SqlCommand(const CString& SQL, CString &ErrMessage )
  129. {
  130. _bstr_t sql( SQL );
  131. bool bRet = true;
  132. if (NULL == m_pDBSemaphore)
  133. {
  134. ErrMessage = "数据库初始化失败!";
  135. bRet = false;
  136. }
  137. if ( bRet )
  138. {
  139. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 ) == WAIT_OBJECT_0 )
  140. {
  141. try
  142. {
  143. m_PCommand->CommandText=sql;
  144. m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  145. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  146. }
  147. catch(_com_error &e)
  148. {
  149. ErrMessage=(LPCSTR)e.Description();
  150. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  151. || ErrMessage.Find("gone") != -1)
  152. {
  153. m_bIsStarted=FALSE;
  154. }
  155. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );//先释放信号量
  156. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  157. || ErrMessage.Find("gone") != -1)
  158. {
  159. ReConnectStart(ErrMessage);
  160. }
  161. ErrMessage+="SqlCommand:";
  162. bRet = false;
  163. }
  164. }
  165. else
  166. {
  167. bRet = false;
  168. ErrMessage="sqlcommandWAIT";
  169. }
  170. }
  171. return bRet;
  172. }
  173. /*****************************************************************
  174. **【函数名称】 SqlRecordset
  175. **【函数功能】 执行返回记录集的SQL语句
  176. **【参数】 SQL:要执行的SQL语句,State:返回的执行状态 true:执行成功 FALSE:执行失败
  177. ErrMassege :返回的错误信息
  178. **【返回值】 返回的ADO记录集
  179. **【调用模块】 (根据实际情况)
  180. ****************************************************************/
  181. _RecordsetPtr CDBInterface::SqlRecordset(const CString& SQL, bool &State, CString &ErrMessage )
  182. {
  183. _bstr_t sql( SQL );
  184. _RecordsetPtr TmpRecordset;
  185. State = true;
  186. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 )==WAIT_OBJECT_0 )
  187. {
  188. try
  189. {
  190. m_PCommand->ActiveConnection=m_PConnection;
  191. m_PCommand->CommandText=sql;
  192. TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  193. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  194. }
  195. catch(_com_error e)
  196. {
  197. ErrMessage=(LPCSTR)e.Description();
  198. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  199. || ErrMessage.Find("gone") != -1)
  200. {
  201. m_bIsStarted=FALSE;
  202. }
  203. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );//先释放信号量
  204. if(ErrMessage.Find("链接失败") != -1 || ErrMessage.Find("被关闭或无效") != -1
  205. || ErrMessage.Find("gone") != -1)
  206. {
  207. ReConnectStart(ErrMessage);
  208. }
  209. ErrMessage+="SqlRecordset:";
  210. State = false;
  211. }
  212. }
  213. else
  214. {
  215. State = false;
  216. ErrMessage="wait Error";
  217. if(NULL != TmpRecordset)
  218. {
  219. TmpRecordset.Release();
  220. TmpRecordset = NULL;
  221. }
  222. }
  223. return TmpRecordset;
  224. }
  225. /*****************************************************************
  226. **【函数名称】 SqlRecordsetNocritical
  227. **【函数功能】 执行返回记录集的SQL语句,不带临界区
  228. **【参数】 SQL:要执行的SQL语句,State:返回的执行状态 true:执行成功 FALSE:执行失败
  229. ErrMassege :返回的错误信息
  230. **【返回值】 返回的ADO记录集
  231. **【调用模块】 (根据实际情况)
  232. ****************************************************************/
  233. _RecordsetPtr CDBInterface::SqlRecordsetNocritical(const CString& SQL, bool &State, CString &ErrMessage )
  234. {
  235. _bstr_t sql( SQL );
  236. _RecordsetPtr TmpRecordset;
  237. State = true;
  238. try
  239. {
  240. m_PCommand->ActiveConnection=m_PConnection;
  241. m_PCommand->CommandText=sql;
  242. TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  243. }
  244. catch(_com_error e)
  245. {
  246. ErrMessage=(LPCSTR)e.Description();
  247. ErrMessage+="SqlRecordset:";
  248. State = false;
  249. }
  250. return TmpRecordset;
  251. }
  252. /*****************************************************************
  253. **【函数名称】 GetSingleData
  254. **【函数功能】 执行返回记录集的SQL语句中一个字段值
  255. **【参数】 SQL:要执行的SQL语句
  256. nFieldIndx:指定取返回的字段
  257. sValue:返回字段值
  258. ErrMassege :返回的错误信息
  259. **【返回值】 int -1:执行sql失败, 0-正常 1-未找到记录
  260. **【调用模块】 (根据实际情况)
  261. ****************************************************************/
  262. int CDBInterface::GetSingleData(const CString& SQL, const unsigned int nFieldIndx,
  263. CString &sValue, CString &ErrMessage)
  264. {
  265. _RecordsetPtr TmpRecordset = NULL;
  266. _variant_t VarValue;
  267. bool State;
  268. const int EXEC_ERROR = -1; // 执行失败
  269. const int EXEC_OK = 0; // 正常
  270. const int EXEC_NOVALUE = 1; // 未找到记录
  271. int nRet = EXEC_OK;
  272. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 ) == WAIT_OBJECT_0 )
  273. {
  274. // 取指定值
  275. try
  276. {
  277. TmpRecordset = SqlRecordsetNocritical( SQL, State, ErrMessage );
  278. if ((TmpRecordset != NULL)&&(State))
  279. {
  280. if ((!TmpRecordset->adoBOF && (!TmpRecordset->adoEOF)) )
  281. {
  282. TmpRecordset->MoveFirst();
  283. VarValue = TmpRecordset->GetCollect((_variant_t)(long)nFieldIndx);
  284. sValue.Format("%s", (char *)_bstr_t( VarValue ));
  285. nRet = EXEC_OK;
  286. }
  287. else
  288. {
  289. nRet = EXEC_NOVALUE;
  290. }
  291. }
  292. else
  293. {
  294. ErrMessage = "未找到记录";
  295. nRet = EXEC_ERROR;
  296. }
  297. }
  298. catch(_com_error e)
  299. {
  300. ErrMessage =(LPCSTR) e.Description();
  301. ErrMessage+= "GetDataIn";
  302. nRet = EXEC_ERROR;
  303. }
  304. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  305. }
  306. if(NULL != TmpRecordset)
  307. {
  308. TmpRecordset.Release();
  309. TmpRecordset = NULL;
  310. }
  311. return nRet;
  312. }
  313. /*****************************************************************
  314. **【函数名称】 GetSingleData
  315. **【函数功能】 执行返回记录集的SQL语句中一个字段值
  316. **【参数】 SQL:要执行的SQL语句
  317. strField:指定取返回的字段
  318. sValue:返回字段值
  319. ErrMassege :返回的错误信息
  320. **【返回值】 int -1:执行sql失败, 0-正常 1-未找到记录
  321. **【调用模块】 (根据实际情况)
  322. ****************************************************************/
  323. int CDBInterface::GetSingleData(const CString& SQL, const CString strField,
  324. CString &sValue, CString &ErrMessage)
  325. {
  326. _RecordsetPtr TmpRecordset = NULL;
  327. _variant_t VarValue;
  328. bool State;
  329. const int EXEC_ERROR = -1; // 执行失败
  330. const int EXEC_OK = 0; // 正常
  331. const int EXEC_NOVALUE = 1; // 未找到记录
  332. int nRet = EXEC_OK;
  333. _bstr_t sql( SQL );
  334. State = true;
  335. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 1000 )==WAIT_OBJECT_0 )
  336. {
  337. try
  338. {
  339. m_PCommand->CommandText=sql;
  340. TmpRecordset = m_PCommand->Execute(NULL,NULL,adCmdUnknown);
  341. }
  342. catch(_com_error e)
  343. {
  344. ErrMessage+= (LPCSTR)e.Description();
  345. if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1)
  346. ||(ErrMessage.Find("gone") != -1))
  347. {
  348. m_bIsStarted=FALSE;
  349. }
  350. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  351. if(NULL != TmpRecordset )
  352. {
  353. TmpRecordset.Release();
  354. TmpRecordset = NULL;
  355. }
  356. if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1)
  357. ||(ErrMessage.Find("gone") != -1))
  358. {
  359. TRACE0("FAILE GetRecord*");
  360. ReConnectStart(ErrMessage);
  361. }
  362. ErrMessage+= "GetRecordset";
  363. State = false;
  364. return -1;
  365. }
  366. // 取指定值
  367. try
  368. {
  369. if (TmpRecordset != NULL)
  370. {
  371. if ( (!TmpRecordset->adoBOF && (!TmpRecordset->adoEOF)) )
  372. {
  373. TmpRecordset->MoveFirst();
  374. VarValue = TmpRecordset->GetCollect((_variant_t)strField);
  375. sValue.Format("%s", (char *)_bstr_t( VarValue ));
  376. nRet = EXEC_OK;
  377. }
  378. else
  379. {
  380. nRet = EXEC_NOVALUE;
  381. ErrMessage ="GetCollectError*";
  382. }
  383. }
  384. else
  385. {
  386. ErrMessage = "GetRecordNull*";
  387. nRet = EXEC_ERROR;
  388. }
  389. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  390. }
  391. catch(_com_error e)
  392. {
  393. if(NULL != TmpRecordset)
  394. {
  395. TmpRecordset.Release();
  396. TmpRecordset = NULL;
  397. }
  398. ErrMessage+= (LPCSTR)e.Description();
  399. if((ErrMessage.Find("链接") != -1) || ( ErrMessage.Find("被关闭或无效") != -1)
  400. ||(ErrMessage.Find("gone") != -1))
  401. {
  402. m_bIsStarted=FALSE;
  403. }
  404. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  405. if((ErrMessage.Find("链接失败") != -1 )|| (ErrMessage.Find("被关闭或无效") != -1)
  406. ||(ErrMessage.Find("gone") != -1))
  407. {
  408. TRACE0("FAILE GetFiled*");
  409. ReConnectStart(ErrMessage);
  410. }
  411. ErrMessage+="RecordsetGetfiled";
  412. nRet = EXEC_ERROR;
  413. }
  414. }
  415. else
  416. {
  417. State = false;
  418. ErrMessage="wait Error";
  419. if(NULL != TmpRecordset)
  420. {
  421. TmpRecordset.Release();
  422. TmpRecordset = NULL;
  423. }
  424. }
  425. if(NULL != TmpRecordset)
  426. {
  427. TmpRecordset.Release();
  428. TmpRecordset = NULL;
  429. }
  430. return nRet;
  431. }
  432. /*****************************************************************
  433. **【函数名称】 ReConnectStart
  434. **【函数功能】 构造函数
  435. **【参数】 pParam传入使用主体对象,ErrMessage错误返回值
  436. **【返回值】 ture执行成功,反之-失败
  437. **【调用模块】 (根据实际情况)
  438. **【修改】 (根据实际情况)
  439. ****************************************************************/
  440. bool CDBInterface::ReConnectStart(CString &ErrMessage )
  441. {
  442. try
  443. {
  444. if( WaitForSingleObject( m_pDBSemaphore->m_hObject, 10 ) == WAIT_OBJECT_0 )
  445. {
  446. if(!m_bIsStarted )
  447. {
  448. if( m_PConnection->State )
  449. m_PConnection->Close();
  450. if(ConnectDataBase(m_ConnectStr,ErrMessage))
  451. {
  452. m_bIsStarted = TRUE;
  453. }
  454. }
  455. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  456. }
  457. }
  458. catch(_com_error e)
  459. {
  460. ErrMessage = "数据库重新连接线程启动失败!";
  461. m_bIsStarted = FALSE;
  462. ReleaseSemaphore( m_pDBSemaphore->m_hObject, 1, NULL );
  463. }
  464. return true;
  465. }
  466. /*****************************************************************
  467. **【函数名称】 ReLease
  468. **【函数功能】 释放资源
  469. **【参数】 无
  470. **【返回值】
  471. ****************************************************************/
  472. void CDBInterface::ReLease()
  473. {
  474. if( m_pDBSemaphore!=NULL )
  475. {
  476. delete( m_pDBSemaphore );
  477. m_pDBSemaphore = NULL;
  478. }
  479. if( m_PConnection )
  480. {
  481. if( m_PConnection->State )
  482. m_PConnection->Close();
  483. m_PConnection.Release();
  484. m_PConnection = NULL;
  485. }
  486. if( m_PCommand )
  487. m_PCommand.Release();
  488. ::CoUninitialize();
  489. }