S3PDBConnectionPool.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:11k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //-----------------------------------------//
  2. //                                         //
  3. //  File : S3PDBConnectionPool.cpp  //
  4. // Author : Yang Xiaodong            //
  5. // Modified : 8/24/2002                //
  6. //                                         //
  7. //-----------------------------------------//
  8. #include "S3PDBConnectionPool.h"
  9. S3PDBConnectionPool* S3PDBConnectionPool::m_pInstance = NULL;
  10. std::string S3PDBConnectionPool::m_strINIPath = "";
  11. S3PDBConnectionPool::_DATABASEINFO S3PDBConnectionPool::m_AccountDBInfo;
  12. S3PDBConnectionPool::_DATABASEINFO S3PDBConnectionPool::m_RoleDBInfo;
  13. S3PDBConnectionPool::_DATABASEINFO S3PDBConnectionPool::m_CardDBInfo;
  14. S3PDBConnectionPool::S3PDBConnectionPool()
  15. {
  16. }
  17. S3PDBConnectionPool::~S3PDBConnectionPool()
  18. {
  19. }
  20. void S3PDBConnectionPool::InitAccountDBInfo()
  21. {
  22. TCHAR szServer[def_KEYNAMELEN];
  23. TCHAR szDataBase[def_KEYNAMELEN];
  24. TCHAR szUser[def_KEYNAMELEN];
  25. TCHAR szPassword[def_KEYNAMELEN];
  26. DWORD dwLen =
  27. KPIGetPrivateProfileString( def_ACCOUNTSECTIONNAME,
  28. def_SERVERKEYNAME,
  29. "",
  30. szServer,
  31. def_KEYNAMELEN,
  32. m_strINIPath.c_str() );
  33. if ( dwLen < def_KEYNAMELEN )
  34. {
  35. szServer[dwLen] = 0;
  36. }
  37. else
  38. {
  39. szServer[0] = 0;
  40. }
  41. dwLen =
  42. KPIGetPrivateProfileString( def_ACCOUNTSECTIONNAME,
  43. def_DATABASEKEYNAME,
  44. "",
  45. szDataBase,
  46. def_KEYNAMELEN,
  47. m_strINIPath.c_str() );
  48. if ( dwLen < def_KEYNAMELEN )
  49. {
  50. szDataBase[dwLen] = 0;
  51. }
  52. else
  53. {
  54. szDataBase[0] = 0;
  55. }
  56. dwLen =
  57. KPIGetPrivateProfileString( def_ACCOUNTSECTIONNAME,
  58. def_USERKEYNAME,
  59. "",
  60. szUser,
  61. def_KEYNAMELEN,
  62. m_strINIPath.c_str() );
  63. if ( dwLen < def_KEYNAMELEN )
  64. {
  65. szUser[dwLen] = 0;
  66. }
  67. else
  68. {
  69. szUser[0] = 0;
  70. }
  71. dwLen =
  72. KPIGetPrivateProfileString( def_ACCOUNTSECTIONNAME,
  73. def_PASSWORDKEYNAME,
  74. "",
  75. szPassword,
  76. def_KEYNAMELEN,
  77. m_strINIPath.c_str() );
  78. if ( dwLen < def_KEYNAMELEN )
  79. {
  80. szPassword[dwLen] = 0;
  81. }
  82. else
  83. {
  84. szPassword[0] = 0;
  85. }
  86. m_AccountDBInfo.strServer = szServer;
  87. m_AccountDBInfo.strDataBase = szDataBase;
  88. m_AccountDBInfo.strUser = szUser;
  89. m_AccountDBInfo.strPassword = szPassword;
  90. }
  91. void S3PDBConnectionPool::InitRoleDBInfo()
  92. {
  93. TCHAR szServer[def_KEYNAMELEN];
  94. TCHAR szDataBase[def_KEYNAMELEN];
  95. TCHAR szUser[def_KEYNAMELEN];
  96. TCHAR szPassword[def_KEYNAMELEN];
  97. DWORD dwLen =
  98. KPIGetPrivateProfileString( def_ROLESECTIONNAME,
  99. def_SERVERKEYNAME,
  100. "",
  101. szServer,
  102. def_KEYNAMELEN,
  103. m_strINIPath.c_str() );
  104. if ( dwLen < def_KEYNAMELEN )
  105. {
  106. szServer[dwLen] = 0;
  107. }
  108. else
  109. {
  110. szServer[0] = 0;
  111. }
  112. dwLen =
  113. KPIGetPrivateProfileString( def_ROLESECTIONNAME,
  114. def_DATABASEKEYNAME,
  115. "",
  116. szDataBase,
  117. def_KEYNAMELEN,
  118. m_strINIPath.c_str() );
  119. if ( dwLen < def_KEYNAMELEN )
  120. {
  121. szDataBase[dwLen] = 0;
  122. }
  123. else
  124. {
  125. szDataBase[0] = 0;
  126. }
  127. dwLen =
  128. KPIGetPrivateProfileString( def_ROLESECTIONNAME,
  129. def_USERKEYNAME,
  130. "",
  131. szUser,
  132. def_KEYNAMELEN,
  133. m_strINIPath.c_str() );
  134. if ( dwLen < def_KEYNAMELEN )
  135. {
  136. szUser[dwLen] = 0;
  137. }
  138. else
  139. {
  140. szUser[0] = 0;
  141. }
  142. dwLen =
  143. KPIGetPrivateProfileString( def_ROLESECTIONNAME,
  144. def_PASSWORDKEYNAME,
  145. "",
  146. szPassword,
  147. def_KEYNAMELEN,
  148. m_strINIPath.c_str() );
  149. if ( dwLen < def_KEYNAMELEN )
  150. {
  151. szPassword[dwLen] = 0;
  152. }
  153. else
  154. {
  155. szPassword[0] = 0;
  156. }
  157. m_RoleDBInfo.strServer = szServer;
  158. m_RoleDBInfo.strDataBase = szDataBase;
  159. m_RoleDBInfo.strUser = szUser;
  160. m_RoleDBInfo.strPassword = szPassword;
  161. }
  162. void S3PDBConnectionPool::InitCardDBInfo()
  163. {
  164. TCHAR szServer[def_KEYNAMELEN];
  165. TCHAR szDataBase[def_KEYNAMELEN];
  166. TCHAR szUser[def_KEYNAMELEN];
  167. TCHAR szPassword[def_KEYNAMELEN];
  168. DWORD dwLen =
  169. KPIGetPrivateProfileString( def_CARDSECTIONNAME,
  170. def_SERVERKEYNAME,
  171. "",
  172. szServer,
  173. def_KEYNAMELEN,
  174. m_strINIPath.c_str() );
  175. if ( dwLen < def_KEYNAMELEN )
  176. {
  177. szServer[dwLen] = 0;
  178. }
  179. else
  180. {
  181. szServer[0] = 0;
  182. }
  183. dwLen =
  184. KPIGetPrivateProfileString( def_CARDSECTIONNAME,
  185. def_DATABASEKEYNAME,
  186. "",
  187. szDataBase,
  188. def_KEYNAMELEN,
  189. m_strINIPath.c_str() );
  190. if ( dwLen < def_KEYNAMELEN )
  191. {
  192. szDataBase[dwLen] = 0;
  193. }
  194. else
  195. {
  196. szDataBase[0] = 0;
  197. }
  198. dwLen =
  199. KPIGetPrivateProfileString( def_CARDSECTIONNAME,
  200. def_USERKEYNAME,
  201. "",
  202. szUser,
  203. def_KEYNAMELEN,
  204. m_strINIPath.c_str() );
  205. if ( dwLen < def_KEYNAMELEN )
  206. {
  207. szUser[dwLen] = 0;
  208. }
  209. else
  210. {
  211. szUser[0] = 0;
  212. }
  213. dwLen =
  214. KPIGetPrivateProfileString( def_CARDSECTIONNAME,
  215. def_PASSWORDKEYNAME,
  216. "",
  217. szPassword,
  218. def_KEYNAMELEN,
  219. m_strINIPath.c_str() );
  220. if ( dwLen < def_KEYNAMELEN )
  221. {
  222. szPassword[dwLen] = 0;
  223. }
  224. else
  225. {
  226. szPassword[0] = 0;
  227. }
  228. m_CardDBInfo.strServer = szServer;
  229. m_CardDBInfo.strDataBase = szDataBase;
  230. m_CardDBInfo.strUser = szUser;
  231. m_CardDBInfo.strPassword = szPassword;
  232. }
  233. void S3PDBConnectionPool::Init( const std::string &strINIPath )
  234. {
  235. m_strINIPath = strINIPath;
  236. if ( !( m_strINIPath.empty() ) )
  237. {
  238. InitAccountDBInfo();
  239. InitRoleDBInfo();
  240. InitCardDBInfo();
  241. }
  242. }
  243. S3PDBConnectionPool* S3PDBConnectionPool::Instance()
  244. {
  245. if ( NULL == m_pInstance )
  246. {
  247. m_pInstance = new S3PDBConnectionPool;
  248. //Question no delete,must delete in somewhere romandoufind
  249. }
  250. return m_pInstance;
  251. }
  252. void S3PDBConnectionPool::ReleaseInstance()
  253. {
  254. if ( NULL != m_pInstance )
  255. {
  256. m_pInstance->Release();
  257. m_pInstance = NULL;
  258. }
  259. }
  260. _CONNECTION_ID S3PDBConnectionPool::ApplyAccountDBCon()
  261. {
  262. _CONNECTION_ID ret;
  263. ret.dwID = def_ERRORCONID;
  264. ret.pCon = NULL;
  265. DWORD dwNullID = def_ERRORCONID;
  266. DWORD dwSize = m_AccountMap.size();
  267. for ( DWORD i = 0; i < dwSize; i++ )
  268. {
  269. if ( NULL != m_AccountMap[i].pCon )
  270. {
  271. if ( TRUE != m_AccountMap[i].bBusy )
  272. {
  273. ret.dwID = i;
  274. ret.pCon = m_AccountMap[i].pCon;
  275. break;
  276. }
  277. }
  278. else if ( def_ERRORCONID == dwNullID )
  279. {
  280. dwNullID = i;
  281. }
  282. }
  283. if ( NULL == ret.pCon )
  284. {
  285. Connection* pCon =
  286. ( Connection* )( malloc( sizeof( Connection ) ) );
  287. if ( NULL != pCon )
  288. {
  289. if ( TRUE == pCon->connect( m_AccountDBInfo.strDataBase.c_str(),
  290. m_AccountDBInfo.strServer.c_str(),
  291. m_AccountDBInfo.strUser.c_str(),
  292. m_AccountDBInfo.strPassword.c_str() ) )
  293. {
  294. if ( def_ERRORCONID != dwNullID )
  295. {
  296. ret.dwID = dwNullID;
  297. }
  298. else
  299. {
  300. ret.dwID = dwSize;
  301. }
  302. ret.pCon = pCon;
  303. _CONNECTIONITEM conItem = { TRUE, pCon };
  304. m_AccountMap[ret.dwID] = conItem;
  305. }
  306. else
  307. {
  308. free( pCon );
  309. pCon = NULL;
  310. }
  311. }
  312. }
  313. return ret;
  314. }
  315. _CONNECTION_ID S3PDBConnectionPool::ApplyRoleDBCon()
  316. {
  317. _CONNECTION_ID ret;
  318. ret.dwID = def_ERRORCONID;
  319. ret.pCon = NULL;
  320. DWORD dwNullID = def_ERRORCONID;
  321. DWORD dwSize = m_RoleMap.size();
  322. for ( DWORD i = 0; i < dwSize; i++ )
  323. {
  324. if ( NULL != m_RoleMap[i].pCon )
  325. {
  326. if ( TRUE != m_RoleMap[i].bBusy )
  327. {
  328. ret.dwID = i;
  329. ret.pCon = m_RoleMap[i].pCon;
  330. break;
  331. }
  332. }
  333. else if ( def_ERRORCONID == dwNullID )
  334. {
  335. dwNullID = i;
  336. }
  337. }
  338. if ( NULL == ret.pCon )
  339. {
  340. Connection* pCon =
  341. ( Connection* )( malloc( sizeof( Connection ) ) );
  342. //Question up no delete ,must delete
  343. if ( NULL != pCon )
  344. {
  345. if ( TRUE == pCon->connect( m_RoleDBInfo.strDataBase.c_str(),
  346. m_RoleDBInfo.strServer.c_str(),
  347. m_RoleDBInfo.strUser.c_str(),
  348. m_RoleDBInfo.strPassword.c_str() ) )
  349. {
  350. if ( def_ERRORCONID != dwNullID )
  351. {
  352. ret.dwID = dwNullID;
  353. }
  354. else
  355. {
  356. ret.dwID = dwSize;
  357. }
  358. ret.pCon = pCon;
  359. _CONNECTIONITEM conItem = { TRUE, pCon };
  360. m_RoleMap[ret.dwID] = conItem;
  361. }
  362. else
  363. {
  364. free( pCon );
  365. pCon = NULL;
  366. }
  367. }
  368. }
  369. return ret;
  370. }
  371. _CONNECTION_ID S3PDBConnectionPool::ApplyCardDBCon()
  372. {
  373. _CONNECTION_ID ret;
  374. ret.dwID = def_ERRORCONID;
  375. ret.pCon = NULL;
  376. DWORD dwNullID = def_ERRORCONID;
  377. DWORD dwSize = m_CardMap.size();
  378. for ( DWORD i = 0; i < dwSize; i++ )
  379. {
  380. if ( NULL != m_CardMap[i].pCon )
  381. {
  382. if ( TRUE != m_CardMap[i].bBusy )
  383. {
  384. ret.dwID = i;
  385. ret.pCon = m_CardMap[i].pCon;
  386. break;
  387. }
  388. }
  389. else if ( def_ERRORCONID == dwNullID )
  390. {
  391. dwNullID = i;
  392. }
  393. }
  394. if ( NULL == ret.pCon )
  395. {
  396. Connection* pCon =
  397. ( Connection* )( malloc( sizeof( Connection ) ) );
  398. if ( NULL != pCon )
  399. {
  400. if ( TRUE == pCon->connect( m_CardDBInfo.strDataBase.c_str(),
  401. m_CardDBInfo.strServer.c_str(),
  402. m_CardDBInfo.strUser.c_str(),
  403. m_CardDBInfo.strPassword.c_str() ) )
  404. {
  405. if ( def_ERRORCONID != dwNullID )
  406. {
  407. ret.dwID = dwNullID;
  408. }
  409. else
  410. {
  411. ret.dwID = dwSize;
  412. }
  413. ret.pCon = pCon;
  414. _CONNECTIONITEM conItem = { TRUE, pCon };
  415. m_CardMap[ret.dwID] = conItem;
  416. }
  417. else
  418. {
  419. free( pCon );
  420. pCon = NULL;
  421. }
  422. }
  423. }
  424. return ret;
  425. }
  426. _CONNECTION_ID S3PDBConnectionPool::ApplyDBConnection( int iDBIdentifier )
  427. {
  428. _CONNECTION_ID ret;
  429. ret.dwID = def_ERRORCONID;
  430. ret.pCon = NULL;
  431. switch ( iDBIdentifier )
  432. {
  433. case def_ACCOUNTDB:
  434. ret = ApplyAccountDBCon();
  435. break;
  436. case def_ROLEDB:
  437. ret = ApplyRoleDBCon();
  438. break;
  439. case def_CARDDB:
  440. ret = ApplyCardDBCon();
  441. break;
  442. default:
  443. break;
  444. }
  445. return ret;
  446. }
  447. BOOL S3PDBConnectionPool::SetAccountDBConFree( DWORD dwConID )
  448. {
  449. BOOL bRet = FALSE;
  450. ConMap::iterator accountIterator = m_AccountMap.find( dwConID );
  451. if ( m_AccountMap.end() != accountIterator )
  452. {
  453. ( *accountIterator ).second.bBusy = FALSE;
  454. }
  455. return bRet;
  456. }
  457. BOOL S3PDBConnectionPool::SetRoleDBConFree( DWORD dwConID )
  458. {
  459. BOOL bRet = FALSE;
  460. ConMap::iterator roleIterator = m_RoleMap.find( dwConID );
  461. if ( m_RoleMap.end() != roleIterator )
  462. {
  463. ( *roleIterator ).second.bBusy = FALSE;
  464. }
  465. return bRet;
  466. }
  467. BOOL S3PDBConnectionPool::SetCardDBConFree( DWORD dwConID )
  468. {
  469. BOOL bRet = FALSE;
  470. ConMap::iterator cardIterator = m_CardMap.find( dwConID );
  471. if ( m_CardMap.end() != cardIterator )
  472. {
  473. ( *cardIterator ).second.bBusy = FALSE;
  474. }
  475. return bRet;
  476. }
  477. BOOL S3PDBConnectionPool::SetDBConFree( int iDBIdentifier, DWORD dwConID )
  478. {
  479. BOOL bRet = FALSE;
  480. switch ( iDBIdentifier )
  481. {
  482. case def_ACCOUNTDB:
  483. bRet = SetAccountDBConFree( dwConID );
  484. break;
  485. case def_ROLEDB:
  486. bRet = SetRoleDBConFree( dwConID );
  487. break;
  488. case def_CARDDB:
  489. bRet = SetCardDBConFree( dwConID );
  490. break;
  491. default:
  492. break;
  493. }
  494. return bRet;
  495. }
  496. void S3PDBConnectionPool::ReleaseAccountMap()
  497. {
  498. DWORD dwSize = m_AccountMap.size();
  499. for ( DWORD i = 0; i < dwSize; i++ )
  500. {
  501. if ( NULL != m_AccountMap[i].pCon )
  502. {
  503. m_AccountMap[i].pCon->close();
  504. free( m_AccountMap[i].pCon );
  505. m_AccountMap[i].pCon = NULL;
  506. }
  507. }
  508. m_AccountMap.clear();
  509. }
  510. void S3PDBConnectionPool::ReleaseRoleMap()
  511. {
  512. DWORD dwSize = m_RoleMap.size();
  513. for ( DWORD i = 0; i < dwSize; i++ )
  514. {
  515. if ( NULL != m_RoleMap[i].pCon )
  516. {
  517. m_RoleMap[i].pCon->close();
  518. free( m_RoleMap[i].pCon );
  519. m_RoleMap[i].pCon = NULL;
  520. }
  521. }
  522. m_RoleMap.clear();
  523. }
  524. void S3PDBConnectionPool::ReleaseCardMap()
  525. {
  526. DWORD dwSize = m_CardMap.size();
  527. for ( DWORD i = 0; i < dwSize; i++ )
  528. {
  529. if ( NULL != m_CardMap[i].pCon )
  530. {
  531. m_CardMap[i].pCon->close();
  532. free( m_CardMap[i].pCon );
  533. m_CardMap[i].pCon = NULL;
  534. }
  535. }
  536. m_CardMap.clear();
  537. }
  538. void S3PDBConnectionPool::Release()
  539. {
  540. ReleaseAccountMap();
  541. ReleaseRoleMap();
  542. ReleaseCardMap();
  543. }