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

模拟服务器

开发平台:

C/C++

  1. //-----------------------------------------//
  2. //                                         //
  3. //  File : S3PAccount.cpp    //
  4. // Author : Yang Xiaodong            //
  5. // Modified : 8/29/2002                //
  6. //                                         //
  7. //-----------------------------------------//
  8. #include "S3PAccount.h"
  9. S3PAccount::S3PAccount():
  10. m_bLocked( TRUE )
  11. {
  12. }
  13. S3PAccount::~S3PAccount()
  14. {
  15. }
  16. //----------------------------------------------------------
  17. // < Static Member Function >
  18. // Name : ActivateAccount
  19. // Return : BOOL
  20. //   = TRUE ---- Successful;
  21. //   = FALSE ---- Failed to access database.
  22. // Description : Activate a account.
  23. //----------------------------------------------------------
  24. BOOL S3PAccount::ActivateAccount( const std::string strAccName,
  25.  const std::string strPassword,
  26.  const DWORD dwGameID )
  27. {
  28. BOOL bRet = FALSE;
  29. S3PDBConnection* pAccountCon =
  30. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  31. if ( NULL != pAccountCon )
  32. {
  33. S3PAccountInfoDAO account( pAccountCon );
  34. ColumnAndValue cav;
  35. char szBuffer[20];
  36. _ltoa( dwGameID, szBuffer, 10 );
  37. cav["igameid"] = szBuffer;
  38. ColumnAndValue where;
  39. where["caccname"] = strAccName;
  40. where["strpassword"] = strPassword;
  41. where["igameid"] = szBuffer;
  42. S3PRow row( account.GetTableName(), &cav, pAccountCon );
  43. S3PRow rowWhere( account.GetTableName(), &where, pAccountCon );
  44. if ( account.Update( &row, &rowWhere ) <= 0 )
  45. {
  46. bRet = FALSE;
  47. assert( false );
  48. }
  49. else
  50. {
  51. bRet = TRUE;
  52. }
  53. pAccountCon->Close();
  54. }
  55. return bRet;
  56. }
  57. //----------------------------------------------------------
  58. // < Static Member Function >
  59. // Name : AddAccount
  60. // Return : int
  61. //   = 1 ---- Successful;
  62. //   = 0 ---- Failed to access database;
  63. //   = -1 ---- Parameter "strAccName" is null;
  64. //   = -2 ---- Parameter "strPassword" is null;
  65. //   = -3 ---- Parameter "strRealName" is null;
  66. //   = -4 ---- The account has existed;
  67. //   = others ---- Not defined.
  68. // Description : Add a new account.
  69. //----------------------------------------------------------
  70. int S3PAccount::AddAccount( const std::string strAccName,
  71. const std::string strPassword,
  72. const std::string strRealName,
  73. const std::string strIDNum,
  74. const std::string strBirthDay,
  75. const std::string strArea,
  76. const std::string strPhone )
  77. {
  78. int iRet = 1;
  79. if ( strAccName.empty() )
  80. {
  81. iRet = -1;
  82. return iRet;
  83. }
  84. if ( strPassword.empty() )
  85. {
  86. iRet = -2;
  87. return iRet;
  88. }
  89. if ( strRealName.empty() )
  90. {
  91. iRet = -3;
  92. return iRet;
  93. }
  94. S3PDBConnection* pAccountCon =
  95. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  96. if ( NULL != pAccountCon )
  97. {
  98. S3PAccountInfoDAO account( pAccountCon );
  99. ColumnAndValue cav;
  100. cav["caccname"] = strAccName;
  101. cav["cpassword"] = strPassword;
  102. cav["crealname"] = strRealName;
  103. if ( !( strIDNum.empty() ) )
  104. {
  105. cav["cidnum"] = strIDNum;
  106. }
  107. if ( !( strBirthDay.empty() ) )
  108. {
  109. cav["dbirthday"] = strBirthDay;
  110. }
  111. if ( !( strArea.empty() ) )
  112. {
  113. cav["carea"] = strArea;
  114. }
  115. if ( !( strPhone.empty() ) )
  116. {
  117. cav["cphone"] = strPhone;
  118. }
  119. cav["dregdate"] = pAccountCon->GetDate();
  120. ColumnAndValue where;
  121. where["caccname"] = strAccName;
  122. S3PRow rowCav( account.GetTableName(), &cav, pAccountCon );
  123. S3PRow rowWhere( account.GetTableName(), &where, pAccountCon );
  124. if ( false == account.HasItem( &rowWhere ) )
  125. {
  126. int iResult = account.Add( &rowCav );
  127. if ( iResult <= 0 )
  128. {
  129. iRet = 0;
  130. }
  131. else
  132. {
  133. iRet = 1;
  134. }
  135. }
  136. else
  137. {
  138. iRet = -4;
  139. }
  140. pAccountCon->Close();
  141. }
  142. else
  143. {
  144. iRet = 0;
  145. }
  146. return iRet;
  147. }
  148. //----------------------------------------------------------
  149. // < Static Member Function >
  150. // Name : Login
  151. // Return : int
  152. //   = 1 ---- Successful;
  153. //   = 0 ---- Failed to access database;
  154. //   = -1 ---- Parameter "strAccName" is null;
  155. //   = -2 ---- Parameter "strPassword" is null;
  156. //   = -3 ---- The same user has logged in from
  157. //      other host machine;
  158. //   = -4 ---- The user has not registered;
  159. //   = others ---- Not defined.
  160. // Description : login from game.
  161. //----------------------------------------------------------
  162. int S3PAccount::Login( const std::string strAccName, const std::string strPassword, int iGameId )
  163. {
  164. int iRet = 1;
  165. if ( strAccName.empty() )
  166. {
  167. iRet = -1;
  168. return iRet;
  169. }
  170. if ( strPassword.empty() )
  171. {
  172. iRet = -2;
  173. return iRet;
  174. }
  175. S3PDBConnection* pAccountCon =
  176. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  177. if ( NULL != pAccountCon )
  178. {
  179. S3PAccountInfoDAO account( pAccountCon );
  180. ColumnAndValue cav;
  181. char szGameID[11]; // The maxima number is 4294967296
  182. memset( szGameID, 0, 11 );
  183. _itoa( iGameId, szGameID, 10 );
  184. cav["igameid"] = szGameID;
  185. cav["itimecount"] = "1";
  186. ColumnAndValue where;
  187. where["caccname"] = strAccName;
  188. where["cpassword"] = strPassword;
  189. S3PRow rowWhere0( account.GetTableName(), &where, pAccountCon );
  190. if ( account.HasItem( &rowWhere0 ) )
  191. {
  192. where["igameid"] = "0";
  193. S3PRow rowWhere1( account.GetTableName(), &where, pAccountCon );
  194. if ( account.HasItem( &rowWhere1 ) )
  195. {
  196. if ( 0 != iGameId )
  197. {
  198. S3PRow rowCav( account.GetTableName(), &cav, pAccountCon );
  199. S3PRow rowWhere2( account.GetTableName(), &where, pAccountCon );
  200. if ( account.Update( &rowCav, &rowWhere2 ) <= 0 )
  201. {
  202. iRet = 0;
  203. }
  204. else
  205. {
  206. iRet = 1;
  207. }
  208. }
  209. else
  210. {
  211. iRet = 1;
  212. }
  213. }
  214. else
  215. {
  216. iRet = -3;
  217. }
  218. }
  219. else
  220. {
  221. iRet = -4;
  222. }
  223. pAccountCon->Close();
  224. }
  225. else
  226. {
  227. iRet = 0;
  228. }
  229. return iRet;
  230. }
  231. //----------------------------------------------------------
  232. // < Static Member Function >
  233. // Name : Logout
  234. // Return : int
  235. //   = 1 ---- Successful;
  236. //   = 0 ---- Failed to access database;
  237. //   = -1 ---- Parameter "strAccName" is null;
  238. //   = -2 ---- Parameter "strPassword" is null;
  239. //   = others ---- Not defined.
  240. // Description : logout from game.
  241. //----------------------------------------------------------
  242. int S3PAccount::Logout( const std::string strAccName, const std::string strPassword, int iGameId )
  243. {
  244. int iRet = 1;
  245. if ( strAccName.empty() )
  246. {
  247. iRet = -1;
  248. return iRet;
  249. }
  250. if ( strPassword.empty() )
  251. {
  252. iRet = -2;
  253. return iRet;
  254. }
  255. S3PDBConnection* pAccountCon =
  256. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  257. if ( NULL != pAccountCon )
  258. {
  259. S3PAccountInfoDAO account( pAccountCon );
  260. ColumnAndValue cav;
  261. char szGameId[11]; // The maxima number is 4294967296
  262. memset( szGameId, 0, 11 );
  263. _itoa( iGameId, szGameId, 10 );
  264. cav["igameid"] = "0";
  265. cav["itimecount"] = "0";
  266. ColumnAndValue where;
  267. where["caccname"] = strAccName;
  268. where["cpassword"] = strPassword;
  269. where["igameid"] = szGameId;
  270. S3PRow rowCav( account.GetTableName(), &cav, pAccountCon );
  271. S3PRow rowWhere( account.GetTableName(), &where, pAccountCon );
  272. if ( account.Update( &rowCav, &rowWhere ) <= 0 )
  273. {
  274. iRet = 0;
  275. }
  276. else
  277. {
  278. iRet = 1;
  279. }
  280. pAccountCon->Close();
  281. }
  282. else
  283. {
  284. iRet = 0;
  285. }
  286. return iRet;
  287. }
  288. //----------------------------------------------------------
  289. // < Static Member Function >
  290. // Name : Report
  291. // Return : int
  292. //   = 1 ---- Successful;
  293. //   = 0 ---- Failed to access database;
  294. //   = -1 ---- Parameter "strAccName" is null;
  295. //   = -2 ---- Parameter "strPassword" is null;
  296. //   = -3 ---- Has been disconnected;
  297. //   = -4 ---- User has not registered;
  298. //   = others ---- Not defined.
  299. // Description : 与服务器握手,用于检查游戏是否在线.
  300. //----------------------------------------------------------
  301. int S3PAccount::Report( const std::string strAccName, const std::string strPassword, int iGameId )
  302. {
  303. int iRet = 1;
  304. if ( strAccName.empty() )
  305. {
  306. iRet = -1;
  307. return iRet;
  308. }
  309. if ( strPassword.empty() )
  310. {
  311. iRet = -2;
  312. return iRet;
  313. }
  314. S3PDBConnection* pAccountCon =
  315. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  316. if ( NULL != pAccountCon )
  317. {
  318. S3PAccountInfoDAO account( pAccountCon );
  319. ColumnAndValue cav;
  320. char szGameId[11]; // The maxima number is 4294967296
  321. memset( szGameId, 0, 11 );
  322. _itoa( iGameId, szGameId, 10 );
  323. cav["itimecount"] = "1";
  324. ColumnAndValue where0;
  325. where0["caccname"] = strAccName;
  326. where0["cpassword"] = strPassword;
  327. S3PRow rowWhere0( account.GetTableName(), &where0, pAccountCon );
  328. if ( account.HasItem( &rowWhere0 ) )
  329. {
  330. ColumnAndValue where;
  331. where["caccname"] = strAccName;
  332. where["cpassword"] = strPassword;
  333. where["igameid"] = "0";
  334. S3PRow rowCav( account.GetTableName(), &cav, pAccountCon );
  335. S3PRow rowWhere( account.GetTableName(), &where, pAccountCon );
  336. if ( !( account.HasItem( &rowWhere ) ) )
  337. {
  338. where["igameid"] = szGameId;
  339. where["itimecount"] = "0";
  340. S3PRow rowWhere1( account.GetTableName(), &where, pAccountCon );
  341. if ( account.Update( &rowCav, &rowWhere1 ) <= 0 )
  342. {
  343. iRet = 0;
  344. }
  345. else
  346. {
  347. iRet = 1;
  348. }
  349. }
  350. else
  351. {
  352. iRet = -3;
  353. }
  354. }
  355. else
  356. {
  357. iRet = -4;
  358. }
  359. pAccountCon->Close();
  360. }
  361. else
  362. {
  363. iRet = 0;
  364. }
  365. return iRet;
  366. }
  367. //----------------------------------------------------------
  368. // < Static Member Function >
  369. // Name : QueryGameserverList
  370. // Return : int
  371. //   = 1 ---- Successful;
  372. //   = 0 ---- Failed to access database;
  373. //   = -1 ---- Parameter "strAccName" is null;
  374. //   = -2 ---- Parameter "strPassword" is null;
  375. //   = -3 ---- i)The account doesn't exist,
  376. //      ii)account or password is wrong;
  377. //   = -4 ---- The size of "pServers"("dwSize") is
  378. //      smaller than the reality;
  379. //   = others ---- Not defined.
  380. // Description : Query game server list.
  381. //----------------------------------------------------------
  382. int S3PAccount::QueryGameserverList( const std::string strAccName,
  383. const std::string strPassword,
  384. IBYTE* pServers, DWORD& dwSize )
  385. {
  386. int iRet = 1;
  387. if ( strAccName.empty() )
  388. {
  389. iRet = -1;
  390. return iRet;
  391. }
  392. if ( strPassword.empty() )
  393. {
  394. iRet = -2;
  395. return iRet;
  396. }
  397. S3PDBConnection* pAccountCon =
  398. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  399. if ( NULL != pAccountCon )
  400. {
  401. S3PAccountInfoDAO account( pAccountCon );
  402. S3PServerListDAO serverList( pAccountCon );
  403. ColumnAndValue where;
  404. where["caccname"] = strAccName;
  405. where["cpassword"] = strPassword;
  406. S3PRow rowWhere( account.GetTableName(), &where, pAccountCon );
  407. if ( account.HasItem( &rowWhere ) )
  408. {
  409. std::string strTableName = serverList.GetTableName();
  410. std::string strSql = "select * from ";
  411. strSql += strTableName;
  412. S3PResult res;
  413. serverList.Query( strSql, res );
  414. int iRowNum = res.num_rows();
  415. DWORD dwSizeTemp = iRowNum * sizeof( KLoginGameServer );
  416. if ( dwSizeTemp > dwSize )
  417. {
  418. iRet = -4;
  419. }
  420. else
  421. {
  422. if ( NULL != pServers )
  423. {
  424. memset( pServers, 0, dwSizeTemp );
  425. res.data_seek( 0 );
  426. for ( int i = 0; i < iRowNum; i++ )
  427. {
  428. ColumnAndValue cav = res[i];
  429. std::string strName = cav["cservername"];
  430. std::string strIP = cav["dwip"];
  431. std::string strPort = cav["iport"];
  432. std::string strID = cav["iid"];
  433. DWORD dwIP = atol( strIP.c_str() );
  434. int iPort = atol( strPort.c_str() );
  435. DWORD dwID = atol( strID.c_str() );
  436. int iLength = strName.length();
  437. int offset = 0;
  438. memcpy( &( pServers[i*sizeof( KLoginGameServer )+offset] ),
  439. strName.c_str(),
  440. GAMESERVERNAME_MAX_LEN );
  441. offset += GAMESERVERNAME_MAX_LEN + 2;
  442. memcpy( &( pServers[i*sizeof( KLoginGameServer )+offset] ),
  443. &dwIP, sizeof( DWORD ) );
  444. offset += sizeof( DWORD );
  445. memcpy( &( pServers[i*sizeof( KLoginGameServer )+offset] ),
  446. &iPort, sizeof( short ) );
  447. offset += sizeof( short );
  448. memcpy( &( pServers[i*sizeof( KLoginGameServer )+offset] ),
  449. &dwID, sizeof( DWORD ) );
  450. }
  451. iRet = 1;
  452. }
  453. }
  454. dwSize = dwSizeTemp;
  455. }
  456. else
  457. {
  458. iRet = -3; // 未注册用户或者用户名、密码错误
  459. }
  460. pAccountCon->Close();
  461. }
  462. else
  463. {
  464. iRet = 0;
  465. }
  466. return iRet;
  467. }
  468. //----------------------------------------------------------
  469. // < Static Member Function >
  470. // Name : DBLogin
  471. // Return : int
  472. //   = 1 ---- Successful;
  473. //   = 0 ---- Failed to access database;
  474. //   = -1 ---- Parameter "strUserName" is null;
  475. //   = -2 ---- Parameter "strPassword" is null;
  476. //   = -3 ---- Parameter "strHostAddr" is null;
  477. //   = -4 ---- User has logged in.
  478. //   = others ---- Not defined.
  479. // Description : log in account database as database
  480. //   remote user.
  481. //----------------------------------------------------------
  482. int S3PAccount::DBLogin( const std::string strUserName,
  483. const std::string strPassword,
  484. const std::string strHostAddr )
  485. {
  486. int iRet = 1;
  487. if ( strUserName.empty() )
  488. {
  489. iRet = -1;
  490. return iRet;
  491. }
  492. if ( strPassword.empty() )
  493. {
  494. iRet = -2;
  495. return iRet;
  496. }
  497. if ( strHostAddr.empty() )
  498. {
  499. iRet = -3;
  500. return iRet;
  501. }
  502. S3PDBConnection* pAccountCon =
  503. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  504. if ( NULL != pAccountCon )
  505. {
  506. S3PAccountUserDAO user( pAccountCon );
  507. ColumnAndValue where0;
  508. where0["szusername"] = strUserName;
  509. where0["szpassword"] = strPassword;
  510. where0["eloggedin"] = "N";
  511. S3PRow rowWhere0( user.GetTableName(), &where0, pAccountCon );
  512. if ( user.HasItem( &rowWhere0 ) )
  513. {
  514. ColumnAndValue cav;
  515. cav["eloggedin"] = "Y";
  516. cav["szhostaddr"] = strHostAddr;
  517. cav["dlastlogintime"] = pAccountCon->GetDateTime();
  518. ColumnAndValue where1;
  519. where1["szusername"] = strUserName;
  520. where1["szpassword"] = strPassword;
  521. S3PRow rowCav( user.GetTableName(), &cav, pAccountCon );
  522. S3PRow rowWhere1( user.GetTableName(), &where1, pAccountCon );
  523. if ( user.Update( &rowCav, &rowWhere1 ) <= 0 )
  524. {
  525. iRet = 0;
  526. }
  527. else
  528. {
  529. iRet = 1;
  530. }
  531. }
  532. else
  533. {
  534. where0["eloggedin"] = "Y";
  535. S3PRow rowWhereTemp( user.GetTableName(), &where0, pAccountCon );
  536. if ( user.HasItem( &rowWhereTemp ) )
  537. iRet = -4; // User has logged in.
  538. else
  539. iRet = 0;
  540. }
  541. pAccountCon->Close();
  542. }
  543. else
  544. {
  545. iRet = 0;
  546. }
  547. return iRet;
  548. }
  549. //----------------------------------------------------------
  550. // < Static Member Function >
  551. // Name : DBLogout
  552. // Return : int
  553. //   = 1 ---- Successful;
  554. //   = 0 ---- Failed to access database;
  555. //   = -1 ---- Parameter "strUserName" is null;
  556. //   = -2 ---- Parameter "strPassword" is null;
  557. //   = others ---- Not defined.
  558. // Description : log out from account database as database
  559. //   remote user.
  560. //----------------------------------------------------------
  561. int S3PAccount::DBLogout( const std::string strUserName,
  562.  const std::string strPassword )
  563. {
  564. int iRet = 1;
  565. if ( strUserName.empty() )
  566. {
  567. iRet = -1;
  568. return iRet;
  569. }
  570. if ( strPassword.empty() )
  571. {
  572. iRet = -2;
  573. return iRet;
  574. }
  575. S3PDBConnection* pAccountCon =
  576. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  577. if ( NULL != pAccountCon )
  578. {
  579. S3PAccountUserDAO user( pAccountCon );
  580. ColumnAndValue cav;
  581. cav["eloggedin"] = "N";
  582. cav["dlastlogouttime"] = pAccountCon->GetDateTime();
  583. ColumnAndValue where;
  584. where["szusername"] = strUserName;
  585. where["szpassword"] = strPassword;
  586. S3PRow rowCav( user.GetTableName(), &cav, pAccountCon );
  587. S3PRow rowWhere( user.GetTableName(), &where, pAccountCon );
  588. if ( user.Update( &rowCav, &rowWhere ) <= 0 )
  589. {
  590. iRet = 0;
  591. }
  592. else
  593. {
  594. iRet = 1;
  595. }
  596. pAccountCon->Close();
  597. }
  598. else
  599. {
  600. iRet = 0;
  601. }
  602. return iRet;
  603. }
  604. //----------------------------------------------------------
  605. // < Static Member Function >
  606. // Name : DBQueryUserList
  607. // Return : int
  608. //   = 1 ---- Successful;
  609. //   = 0 ---- Failed to access database;
  610. //   = -1 ---- Parameter "strUserName" is null;
  611. //   = -2 ---- Parameter "strPassword" is null;
  612. //   = -3 ---- Has no enough priority;
  613. //   = -4 ---- Has no such user or password is wrong
  614. //      or the user has not logged in;
  615. //   = -5 ---- User list is empty;
  616. //   = -6 ---- The size of pUser buffer is not enough big;
  617. //   = others ---- Not defined.
  618. // Description : Query user list from account database
  619. //   as database remote user.
  620. //----------------------------------------------------------
  621. int S3PAccount::DBQueryUserList( const std::string strUserName,
  622. const std::string strPassword,
  623. IBYTE* pUsers, DWORD& dwSize )
  624. {
  625. int iRet = 1;
  626. if ( strUserName.empty() )
  627. {
  628. iRet = -1;
  629. return iRet;
  630. }
  631. if ( strPassword.empty() )
  632. {
  633. iRet = -2;
  634. return iRet;
  635. }
  636. S3PDBConnection* pAccountCon =
  637. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  638. if ( NULL != pAccountCon )
  639. {
  640. S3PAccountUserDAO user( pAccountCon );
  641. std::string strTableName = user.GetTableName();
  642. std::string strSql = "select * from ";
  643. strSql += strTableName;
  644. strSql += " where szUserName='";
  645. strSql += strUserName;
  646. strSql += "' and szPassword='";
  647. strSql += strPassword;
  648. strSql += "' and eLoggedin='Y'";
  649. S3PResult res;
  650. user.Query( strSql, res );
  651. int iRowNum = res.num_rows();
  652. res.data_seek( 0 );
  653. if ( 1 == iRowNum )
  654. {
  655. ColumnAndValue cav = res[0];
  656. std::string strPriority = cav["epriority"];
  657. BOOL bHasPriority = FALSE;
  658. if ( 0 == stricmp( "Read", strPriority.c_str() ) )
  659. {
  660. bHasPriority = TRUE;
  661. }
  662. else if ( 0 == stricmp( "Read-Write", strPriority.c_str() ) )
  663. {
  664. bHasPriority = TRUE;
  665. }
  666. else if ( 0 == stricmp( "Administrator", strPriority.c_str() ) )
  667. {
  668. bHasPriority = TRUE;
  669. }
  670. if ( TRUE == bHasPriority )
  671. {
  672. strSql = "select * from ";
  673. strSql += strTableName;
  674. S3PResult queryUserListRes;
  675. user.Query( strSql, queryUserListRes );
  676. iRowNum = queryUserListRes.num_rows();
  677. queryUserListRes.data_seek( 0 );
  678. if ( 0 < iRowNum )
  679. {
  680. DWORD dwSizeTemp = iRowNum * sizeof( _USERINFO );
  681. if ( NULL != pUsers )
  682. {
  683. if ( dwSizeTemp > dwSize )
  684. {
  685. iRet = -6;
  686. }
  687. else
  688. {
  689. memset( pUsers, 0, dwSize );
  690. for ( int i = 0; i < iRowNum; i++ )
  691. {
  692. int offset = 0;
  693. ColumnAndValue userinfo = queryUserListRes[i];
  694. memcpy( &pUsers[i*sizeof( _USERINFO )+offset], 
  695. userinfo["szhostaddr"].c_str(), 16 );
  696. offset += 16;
  697. memcpy( &pUsers[i*sizeof( _USERINFO )+offset],
  698. userinfo["szusername"].c_str(),
  699. userinfo["szusername"].size() );
  700. offset += def_DBUSERNAME_MAX_LEN + 1;
  701. memcpy( &pUsers[i*sizeof( _USERINFO )+offset],
  702. userinfo["szpassword"].c_str(),
  703. userinfo["szpassword"].size() );
  704. offset += def_DBPASSWORD_MAX_LEN + 1;
  705. short siPriority;
  706. std::string strPriority = userinfo["epriority"];
  707. if ( 0 == stricmp( strPriority.c_str(), "Read" ) )
  708. {
  709. siPriority = 0;
  710. }
  711. else if ( 0 == stricmp( strPriority.c_str(), "Write" ) )
  712. {
  713. siPriority = 1;
  714. }
  715. else if ( 0 == stricmp( strPriority.c_str(), "Read-Write" ) )
  716. {
  717. siPriority = 2;
  718. }
  719. else if ( 0 == stricmp( strPriority.c_str(), "Administrator" ) )
  720. {
  721. siPriority = 3;
  722. }
  723. memcpy( &pUsers[i*sizeof( _USERINFO )+offset],
  724. &siPriority, sizeof( short ) );
  725. offset += sizeof( short );
  726. BOOL bLoggedin;
  727. std::string strLoggedin = userinfo["eloggedin"];
  728. if ( 0 == stricmp( strLoggedin.c_str(), "N" ) )
  729. {
  730. bLoggedin = FALSE;
  731. }
  732. else if ( 0 == stricmp( strLoggedin.c_str(), "Y" ) )
  733. {
  734. bLoggedin = TRUE;
  735. }
  736. memcpy( &pUsers[i*sizeof( _USERINFO )+offset],
  737. &bLoggedin, sizeof( BOOL ) );
  738. offset += sizeof( BOOL );
  739. memcpy( &pUsers[i*sizeof( _USERINFO )+offset],
  740. userinfo["dlastlogintime"].c_str(),
  741. userinfo["dlastlogintime"].size() );
  742. offset += 20;
  743. memcpy( &pUsers[i*sizeof( _USERINFO )+offset],
  744. userinfo["dlastlogouttime"].c_str(),
  745. userinfo["dlastlogouttime"].size() );
  746. offset += 20;
  747. }
  748. iRet = 1;
  749. }
  750. }
  751. else
  752. {
  753. iRet = 1;
  754. }
  755. dwSize = dwSizeTemp;
  756. }
  757. else
  758. {
  759. iRet = -5;
  760. // or iRet = 0;
  761. }
  762. }
  763. else
  764. {
  765. iRet = -3; // Has no enough priority.
  766. }
  767. }
  768. else
  769. {
  770. iRet = -4;
  771. }
  772. pAccountCon->Close();
  773. }
  774. else
  775. {
  776. iRet = 0;
  777. }
  778. return iRet;
  779. }
  780. //----------------------------------------------------------
  781. // < Static Member Function >
  782. // Name : DBLock
  783. // Return : int
  784. //   = 1 ---- Successful;
  785. //   = 0 ---- Failed to access database;
  786. //   = -1 ---- Parameter "strUserName" is null;
  787. //   = -2 ---- Parameter "strPassword" is null;
  788. //   = others ---- Not defined.
  789. // Description : Check whether the specified user who carry out
  790. //       locking account database operation is connected.
  791. //----------------------------------------------------------
  792. int S3PAccount::DBLock( const std::string strUserName, const std::string strPassword )
  793. {
  794. int iRet = 1;
  795. if ( strUserName.empty() )
  796. {
  797. iRet = -1;
  798. return iRet;
  799. }
  800. if ( strPassword.empty() )
  801. {
  802. iRet = -2;
  803. return iRet;
  804. }
  805. S3PDBConnection* pAccountCon =
  806. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  807. if ( NULL != pAccountCon )
  808. {
  809. S3PAccountUserDAO user( pAccountCon );
  810. ColumnAndValue where;
  811. where["szusername"] = strUserName;
  812. where["szpassword"] = strPassword;
  813. where["eloggedin"] = "Y";
  814. S3PRow rowWhere( user.GetTableName(), &where, pAccountCon );
  815. if ( user.HasItem( &rowWhere ) )
  816. {
  817. iRet = 1;
  818. }
  819. else
  820. {
  821. iRet = 0;
  822. }
  823. pAccountCon->Close();
  824. }
  825. else
  826. {
  827. iRet = 0;
  828. }
  829. return iRet;
  830. }
  831. //----------------------------------------------------------
  832. // < Static Member Function >
  833. // Name : DBLock
  834. // Return : int
  835. //   = 1 ---- Successful;
  836. //   = 0 ---- Failed to access database;
  837. //   = -1 ---- Parameter "strUserName" is null;
  838. //   = -2 ---- Parameter "strPassword" is null;
  839. //   = others ---- Not defined.
  840. // Description : Check whether the specified user who carry out
  841. //       activating account database operation is connected.
  842. //----------------------------------------------------------
  843. int S3PAccount::DBActivate( const std::string strUserName, const std::string strPassword )
  844. {
  845. int iRet = 1;
  846. if ( strUserName.empty() )
  847. {
  848. iRet = -1;
  849. return iRet;
  850. }
  851. if ( strPassword.empty() )
  852. {
  853. iRet = -2;
  854. return iRet;
  855. }
  856. S3PDBConnection* pAccountCon =
  857. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  858. if ( NULL != pAccountCon )
  859. {
  860. S3PAccountUserDAO user( pAccountCon );
  861. ColumnAndValue where;
  862. where["szusername"] = strUserName;
  863. where["szpassword"] = strPassword;
  864. where["eloggedin"] = "Y";
  865. S3PRow rowWhere( user.GetTableName(), &where, pAccountCon );
  866. if ( user.HasItem( &rowWhere ) )
  867. {
  868. iRet = 1;
  869. }
  870. else
  871. {
  872. iRet = 0;
  873. }
  874. pAccountCon->Close();
  875. }
  876. else
  877. {
  878. iRet = 0;
  879. }
  880. return iRet;
  881. }
  882. //----------------------------------------------------------
  883. // < Static Member Function >
  884. // Name : DBAddUser
  885. // Return : int
  886. //   = 1 ---- Successful;
  887. //   = 0 ---- Failed to access database;
  888. //   = -1 ---- Parameter "strUserName" is null;
  889. //   = -2 ---- Parameter "strPassword" is null;
  890. //   = -3 ---- Parameter "strNewUserName" is null;
  891. //   = -4 ---- Parameter "strNewUserPassword" is null;
  892. //   = -5 ---- Parameter "siNewUserPriority" is invalid;
  893. //   = -6 ---- Has no enough priority;
  894. //   = -7 ---- The user has existed;
  895. //   = others ---- Not defined.
  896. // Description : Add new administrator of account database.
  897. //----------------------------------------------------------
  898. int S3PAccount::DBAddUser( const std::string strUserName, const std::string strPassword,
  899.   const std::string strNewUserName, const std::string strNewUserPassword,
  900.   short int siNewUserPriority )
  901. {
  902. int iRet = 0;
  903. if ( strUserName.empty() )
  904. {
  905. iRet = -1;
  906. return iRet;
  907. }
  908. if ( strPassword.empty() )
  909. {
  910. iRet = -2;
  911. return iRet;
  912. }
  913. if ( strNewUserName.empty() )
  914. {
  915. iRet = -3;
  916. return iRet;
  917. }
  918. if ( strNewUserPassword.empty() )
  919. {
  920. iRet = -4;
  921. return iRet;
  922. }
  923. if ( ( 0 > siNewUserPriority ) || ( 3 < siNewUserPriority ) )
  924. {
  925. iRet = -5;
  926. return iRet;
  927. }
  928. S3PDBConnection* pAccountCon =
  929. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  930. if ( NULL != pAccountCon )
  931. {
  932. S3PAccountUserDAO user( pAccountCon );
  933. std::string strTableName = user.GetTableName();
  934. std::string strSql = "select * from ";
  935. strSql += strTableName;
  936. strSql += " where szUserName='";
  937. strSql += strUserName;
  938. strSql += "' and szPassword='";
  939. strSql += strPassword;
  940. strSql += "' and eLoggedin='Y'";
  941. S3PResult res;
  942. user.Query( strSql, res );
  943. int iRowNum = res.num_rows();
  944. res.data_seek( 0 );
  945. if ( 1 == iRowNum )
  946. {
  947. ColumnAndValue cav = res[0];
  948. std::string strPriority = cav["epriority"];
  949. BOOL bHasPriority = FALSE;
  950. if ( 0 == stricmp( "Write", strPriority.c_str() ) )
  951. {
  952. if ( ( 0 < siNewUserPriority )
  953. && ( 1 >= siNewUserPriority ) )
  954. {
  955. bHasPriority = TRUE;
  956. }
  957. }
  958. else if ( 0 == stricmp( "Read-Write", strPriority.c_str() ) )
  959. {
  960. if ( ( 0 < siNewUserPriority )
  961. && ( 2 >= siNewUserPriority ) )
  962. {
  963. bHasPriority = TRUE;
  964. }
  965. }
  966. else if ( 0 == stricmp( "Administrator", strPriority.c_str() ) )
  967. {
  968. bHasPriority = TRUE;
  969. }
  970. if ( TRUE == bHasPriority )
  971. {
  972. ColumnAndValue where;
  973. where["szusername"] = strNewUserName;
  974. S3PRow rowWhere( user.GetTableName(), &where, pAccountCon );
  975. if ( false == user.HasItem( &rowWhere ) )
  976. {
  977. ColumnAndValue newCav;
  978. newCav["szusername"] = strNewUserName;
  979. newCav["szpassword"] = strNewUserPassword;
  980. newCav["eloggedin"] = "N";
  981. //newCav["szhostaddr"] = "0.0.0.0";
  982. //newCav["dlastlogintime"] = "1978-2-21 12:00:00";
  983. //newCav["dlastlogouttime"] = "1978-2-21 12:00:00";
  984. switch ( siNewUserPriority )
  985. {
  986. case 0:
  987. newCav["epriority"] = "Read";
  988. break;
  989. case 1:
  990. newCav["epriority"] = "Write";
  991. break;
  992. case 2:
  993. newCav["epriority"] = "Read-Write";
  994. break;
  995. case 3:
  996. newCav["epriority"] = "Administrator";
  997. break;
  998. }
  999. S3PRow rowCav( user.GetTableName(), &newCav, pAccountCon );
  1000. int iResult = user.Add( &rowCav );
  1001. if ( iResult <= 0 )
  1002. {
  1003. iRet = 0;
  1004. }
  1005. else
  1006. {
  1007. iRet = 1;
  1008. }
  1009. }
  1010. else
  1011. {
  1012. iRet = -7;
  1013. }
  1014. }
  1015. else
  1016. {
  1017. iRet = -6;
  1018. }
  1019. }
  1020. else
  1021. {
  1022. iRet = 0;
  1023. }
  1024. pAccountCon->Close();
  1025. }
  1026. else
  1027. {
  1028. iRet = 0;
  1029. }
  1030. return iRet;
  1031. }
  1032. //----------------------------------------------------------
  1033. // < Static Member Function >
  1034. // Name : DBDeleteUser
  1035. // Return : int
  1036. //   = 1 ---- Successful;
  1037. //   = 0 ---- Failed to access database;
  1038. //   = -1 ---- Parameter "strUserName" is null;
  1039. //   = -2 ---- Parameter "strPassword" is null;
  1040. //   = -3 ---- Parameter "strSelUserName" is null;
  1041. //   = -4 ---- Has no enough priority or is disconnected;
  1042. //   = others ---- Not defined.
  1043. // Description : Delete specified administrator of account database.
  1044. //----------------------------------------------------------
  1045. int S3PAccount::DBDeleteUser( const std::string strUserName,
  1046.  const std::string strPassword,
  1047.  const std::string strSelUserName )
  1048. {
  1049. int iRet = 0;
  1050. if ( strUserName.empty() )
  1051. {
  1052. iRet = -1;
  1053. return iRet;
  1054. }
  1055. if ( strPassword.empty() )
  1056. {
  1057. iRet = -2;
  1058. return iRet;
  1059. }
  1060. if ( strSelUserName.empty() )
  1061. {
  1062. iRet = -3;
  1063. return iRet;
  1064. }
  1065. S3PDBConnection* pAccountCon =
  1066. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  1067. if ( NULL != pAccountCon )
  1068. {
  1069. S3PAccountUserDAO user( pAccountCon );
  1070. ColumnAndValue where1;
  1071. where1["szusername"] = strUserName;
  1072. where1["szpassword"] = strPassword;
  1073. where1["eloggedin"] = "Y";
  1074. where1["epriority"] = "Administrator";
  1075. S3PRow rowWhere1( user.GetTableName(), &where1, pAccountCon );
  1076. if ( user.HasItem( &rowWhere1 ) )
  1077. {
  1078. ColumnAndValue where2;
  1079. where2["szusername"] = strSelUserName;
  1080. S3PRow rowWhere2( user.GetTableName(), &where2, pAccountCon );
  1081. if ( 1 == user.Delete( &rowWhere2 ) )
  1082. {
  1083. iRet = 1;
  1084. }
  1085. else
  1086. {
  1087. iRet = 0;
  1088. }
  1089. }
  1090. else
  1091. {
  1092. iRet = -4;
  1093. }
  1094. pAccountCon->Close();
  1095. }
  1096. return iRet;
  1097. }
  1098. //----------------------------------------------------------
  1099. // < Static Member Function >
  1100. // Name : DBDeleteUser
  1101. // Return : int
  1102. //   = 1 ---- Successful;
  1103. //   = 0 ---- Failed to access database;
  1104. //   = -1 ---- Parameter "strUserName" is null;
  1105. //   = -2 ---- Parameter "strPassword" is null;
  1106. //   = -3 ---- Parameter "strAccRealName" is null;
  1107. //   = -4 ---- Parameter "strAccPassword" is null;
  1108. //   = -5 ---- Parameter "strAccName" is null;
  1109. //   = -6 ---- Has no enough priority or is disconnected;
  1110. //   = -7 ---- The account has existed;
  1111. //   = others ---- Not defined.
  1112. // Description : Create new account.
  1113. //----------------------------------------------------------
  1114. int S3PAccount::DBCreateAccount( const std::string strUserName,
  1115. const std::string strPassword,
  1116. const std::string strAccRealName,
  1117. const std::string strAccPassword,
  1118. const std::string strAccName )
  1119. {
  1120. int iRet = 1;
  1121. if ( strUserName.empty() )
  1122. {
  1123. iRet = -1;
  1124. return iRet;
  1125. }
  1126. if ( strPassword.empty() )
  1127. {
  1128. iRet = -2;
  1129. return iRet;
  1130. }
  1131. if ( strAccRealName.empty() )
  1132. {
  1133. iRet = -3;
  1134. return iRet;
  1135. }
  1136. if ( strAccPassword.empty() )
  1137. {
  1138. iRet = -4;
  1139. return iRet;
  1140. }
  1141. if ( strAccName.empty() )
  1142. {
  1143. iRet = -5;
  1144. return iRet;
  1145. }
  1146. S3PDBConnection* pAccountCon =
  1147. S3PDBConnector::Instance()->ApplyDBConnection( def_ACCOUNTDB );
  1148. if ( NULL != pAccountCon )
  1149. {
  1150. S3PAccountUserDAO user( pAccountCon );
  1151. ColumnAndValue where;
  1152. where["szusername"] = strUserName;
  1153. where["szpassword"] = strPassword;
  1154. where["eloggedin"] = "Y";
  1155. where["epriority"] = "Administrator";
  1156. S3PRow rowWhere( user.GetTableName(), &where, pAccountCon );
  1157. if ( user.HasItem( &rowWhere ) )
  1158. {
  1159. S3PAccountInfoDAO account( pAccountCon );
  1160. ColumnAndValue where1;
  1161. where1["caccname"] = strAccName;
  1162. S3PRow rowWhere1( account.GetTableName(), &where1, pAccountCon );
  1163. if ( !( account.HasItem( &rowWhere1 ) ) )
  1164. {
  1165. ColumnAndValue cav;
  1166. cav["caccname"] = strAccName;
  1167. cav["cpassword"] = strAccPassword;
  1168. cav["crealname"] = strAccRealName;
  1169. cav["dregdate"] = pAccountCon->GetDate();
  1170. S3PRow rowCav( account.GetTableName(), &cav, pAccountCon );
  1171. if ( account.Add( &rowCav ) <= 0 )
  1172. {
  1173. iRet = 0;
  1174. }
  1175. else
  1176. {
  1177. iRet = 1;
  1178. }
  1179. }
  1180. else
  1181. {
  1182. iRet = -7;
  1183. }
  1184. }
  1185. else
  1186. {
  1187. iRet = -6;
  1188. }
  1189. pAccountCon->Close();
  1190. }
  1191. return iRet;
  1192. }