Datenbank.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. #include "Datenbank.h"
  2. // Inhalt der LSDatenbank Klasse aus Datenbank.h
  3. // Konstruktor
  4. LSDatenbank::LSDatenbank( InitDatei *zIni )
  5. {
  6. if( !zIni->wertExistiert( "DBBenutzer" ) )
  7. zIni->addWert( "DBBenutzer", "loginserveru" );
  8. if( !zIni->wertExistiert( "DBPasswort" ) )
  9. zIni->addWert( "DBPasswort", "LTLoginServerPW" );
  10. if( !zIni->wertExistiert( "DBName" ) )
  11. zIni->addWert( "DBName", "lenck_tech_db" );
  12. if( !zIni->wertExistiert( "DBIP" ) )
  13. zIni->addWert( "DBIP", "127.0.0.1" );
  14. if( !zIni->wertExistiert( "DBPort" ) )
  15. zIni->addWert( "DBPort", "5432" );
  16. datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(),
  17. zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(),
  18. (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) );
  19. InitializeCriticalSection( &cs );
  20. ref = 1;
  21. }
  22. // Destruktor
  23. LSDatenbank::~LSDatenbank()
  24. {
  25. datenbank->release();
  26. DeleteCriticalSection( &cs );
  27. }
  28. // nicht constant
  29. void LSDatenbank::lock()
  30. {
  31. EnterCriticalSection( &cs );
  32. }
  33. void LSDatenbank::unlock()
  34. {
  35. LeaveCriticalSection( &cs );
  36. }
  37. int LSDatenbank::istAdministrator( const char *name, const char *passwort )
  38. {
  39. Text *befehl = new Text( "SELECT id FROM benutzer WHERE name = '" );
  40. Text n( name );
  41. n.ersetzen( "'", "''" );
  42. befehl->append( (char*)n );
  43. befehl->append( "' AND passwort = '" );
  44. Text p( passwort );
  45. p.ersetzen( "'", "''" );
  46. befehl->append( (char*)p );
  47. befehl->append( "'" );
  48. lock();
  49. datenbank->befehl( befehl->getText() );
  50. Result res = datenbank->getResult();
  51. unlock();
  52. befehl->release();
  53. int ret = 0;
  54. if( res.zeilenAnzahl > 0 )
  55. ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  56. res.destroy();
  57. return ret;
  58. }
  59. bool LSDatenbank::adminHatRecht( int id, int recht )
  60. {
  61. Text *befehl = new Text( "SELECT * FROM benutzer_rechte WHERE benutzer_id = " );
  62. befehl->append( id );
  63. befehl->append( " AND rechte_id = " );
  64. befehl->append( recht );
  65. lock();
  66. datenbank->befehl( befehl->getText() );
  67. int ret = datenbank->getZeilenAnzahl();
  68. unlock();
  69. befehl->release();
  70. return ret != 0;
  71. }
  72. bool LSDatenbank::proveKlient( int num, int sNum )
  73. {
  74. Text *befehl = new Text( "SELECT * FROM server_login_clients WHERE server_login_id = " );
  75. befehl->append( sNum );
  76. befehl->append( " AND client_id = " );
  77. befehl->append( num );
  78. lock();
  79. datenbank->befehl( befehl->getText() );
  80. Result res = datenbank->getResult();
  81. unlock();
  82. befehl->release();
  83. bool ret = 0;
  84. if( res.zeilenAnzahl == 1 )
  85. ret = 1;
  86. res.destroy();
  87. return ret;
  88. }
  89. Text *LSDatenbank::getKlientKey( int cId )
  90. {
  91. lock();
  92. if( !datenbank->befehl( Text( "SELECT schluessel FROM clients WHERE id = " ) += cId ) )
  93. {
  94. unlock();
  95. return 0;
  96. }
  97. Result res = datenbank->getResult();
  98. unlock();
  99. if( !res.zeilenAnzahl )
  100. {
  101. res.destroy();
  102. return 0;
  103. }
  104. Text *ret = new Text( res.values[ 0 ].getText() );
  105. res.destroy();
  106. return ret;
  107. }
  108. void LSDatenbank::unregisterKlient( int num, int sNum )
  109. {
  110. Text *befehl = new Text( "DELETE FROM server_login_clients WHERE client_id = " );
  111. befehl->append( num );
  112. befehl->append( " AND server_login_id = " );
  113. befehl->append( sNum );
  114. lock();
  115. datenbank->befehl( befehl->getText() );
  116. int za = datenbank->getZeilenAnzahl();
  117. unlock();
  118. if( za == 1 )
  119. {
  120. befehl->setText( "UPDATE server_login SET clients = clients - 1 WHERE id = " );
  121. befehl->append( sNum );
  122. lock();
  123. datenbank->befehl( befehl->getText() );
  124. unlock();
  125. }
  126. befehl->release();
  127. }
  128. bool LSDatenbank::serverAnmelden( InitDatei *zIni )
  129. {
  130. if( !zIni->wertExistiert( "ServerId" ) )
  131. zIni->addWert( "ServerId", "0" );
  132. if( !zIni->wertExistiert( "ServerName" ) )
  133. zIni->addWert( "ServerName", "Name" );
  134. if( !zIni->wertExistiert( "ServerPort" ) )
  135. zIni->addWert( "ServerPort", "49144" );
  136. if( !zIni->wertExistiert( "ServerIP" ) )
  137. zIni->addWert( "ServerIP", "127.0.0.1" );
  138. if( !zIni->wertExistiert( "AdminServerPort" ) )
  139. zIni->addWert( "AdminServerPort", "49143" );
  140. if( !zIni->wertExistiert( "Aktiv" ) )
  141. zIni->addWert( "Aktiv", "FALSE" );
  142. if( !zIni->wertExistiert( "MaxClients" ) )
  143. zIni->addWert( "MaxClients", "50" );
  144. bool insert = 0;
  145. int id = *zIni->zWert( "ServerId" );
  146. if( id )
  147. {
  148. lock();
  149. if( !datenbank->befehl( Text( "SELECT id FROM server_login WHERE id = " ) += id ) )
  150. {
  151. unlock();
  152. return 0;
  153. }
  154. int anz = datenbank->getZeilenAnzahl();
  155. unlock();
  156. insert = anz == 0;
  157. if( !insert )
  158. {
  159. lock();
  160. if( !datenbank->befehl( Text( "SELECT id FROM server_login WHERE server_status_id = 1 AND id = " ) += id ) )
  161. {
  162. unlock();
  163. return 0;
  164. }
  165. int anz = datenbank->getZeilenAnzahl();
  166. unlock();
  167. if( !anz ) // Server läuft bereits
  168. return 0;
  169. }
  170. }
  171. if( insert || !id )
  172. { // Neuer Eintrag in Tabelle server_login
  173. Text *befehl = new Text( "INSERT INTO server_login( " );
  174. if( id )
  175. *befehl += "id, ";
  176. *befehl += "name, ip, port, admin_port, server_status_id, max_clients ) VALUES( ";
  177. if( id )
  178. {
  179. *befehl += id;
  180. *befehl += ", ";
  181. }
  182. *befehl += "'";
  183. *befehl += zIni->zWert( "ServerName" )->getText();
  184. *befehl += "', '";
  185. *befehl += zIni->zWert( "ServerIP" )->getText();
  186. *befehl += "', ";
  187. *befehl += zIni->zWert( "ServerPort" )->getText();
  188. *befehl += ", ";
  189. *befehl += zIni->zWert( "AdminServerPort" )->getText();
  190. *befehl += ", 1, ";
  191. *befehl += zIni->zWert( "MaxClients" )->getText();
  192. *befehl += " ) RETURNING id";
  193. lock();
  194. if( !datenbank->befehl( *befehl ) )
  195. {
  196. unlock();
  197. befehl->release();
  198. return 0;
  199. }
  200. Result res = datenbank->getResult();
  201. unlock();
  202. befehl->release();
  203. if( !res.zeilenAnzahl )
  204. {
  205. res.destroy();
  206. return 0;
  207. }
  208. zIni->setWert( "ServerId", res.values[ 0 ] );
  209. return 1;
  210. }
  211. else
  212. { // Alten Eintrag aus Tabelle server_login ändern
  213. Text *befehl = new Text( "UPDATE server_login SET name = '" );
  214. *befehl += zIni->zWert( "ServerName" )->getText();
  215. *befehl += "', port = ";
  216. *befehl += zIni->zWert( "ServerPort" )->getText();
  217. *befehl += ", ip = '";
  218. *befehl += zIni->zWert( "ServerIP" )->getText();
  219. *befehl += "', max_clients = ";
  220. *befehl += zIni->zWert( "MaxClients" )->getText();
  221. *befehl += ", admin_port = ";
  222. *befehl += zIni->zWert( "AdminServerPort" )->getText();
  223. *befehl += " WHERE id = ";
  224. *befehl += id;
  225. lock();
  226. bool ret = datenbank->befehl( *befehl );
  227. unlock();
  228. befehl->release();
  229. return ret;
  230. }
  231. }
  232. bool LSDatenbank::setServerStatus( int id, int status )
  233. {
  234. Text *befehl = new Text( "UPDATE server_login SET server_status_id = " );
  235. *befehl += status;
  236. *befehl += "WHERE id = ";
  237. *befehl += id;
  238. lock();
  239. if( !datenbank->befehl( befehl->getText() ) )
  240. {
  241. unlock();
  242. befehl->release();
  243. return 0;
  244. }
  245. bool ret = datenbank->getZeilenAnzahl() != 0;
  246. unlock();
  247. befehl->release();
  248. return ret;
  249. }
  250. bool LSDatenbank::setMaxClients( int id, int maxC )
  251. {
  252. Text *befehl = new Text( "UPDATE server_login SET max_clients = " );
  253. befehl->append( maxC );
  254. befehl->append( " WHERE id = " );
  255. befehl->append( id );
  256. lock();
  257. if( !datenbank->befehl( befehl->getText() ) )
  258. {
  259. unlock();
  260. befehl->release();
  261. return 0;
  262. }
  263. bool ret = datenbank->getZeilenAnzahl() > 0;
  264. unlock();
  265. befehl->release();
  266. return ret;
  267. }
  268. int LSDatenbank::getAdminPort( int id )
  269. {
  270. Text *befehl = new Text( "SELECT admin_port FROM server_login WHERE id = " );
  271. befehl->append( id );
  272. lock();
  273. if( !datenbank->befehl( befehl->getText() ) )
  274. {
  275. unlock();
  276. befehl->release();
  277. return 0;
  278. }
  279. Result res = datenbank->getResult();
  280. unlock();
  281. befehl->release();
  282. if( !res.zeilenAnzahl )
  283. {
  284. res.destroy();
  285. return 0;
  286. }
  287. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  288. res.destroy();
  289. return ret;
  290. }
  291. bool LSDatenbank::serverIstNichtPausiert( int id )
  292. {
  293. Text *befehl = new Text( "SELECT server_status_id FROM server_login WHERE id = " );
  294. befehl->append( id );
  295. lock();
  296. if( !datenbank->befehl( befehl->getText() ) )
  297. {
  298. unlock();
  299. befehl->release();
  300. return 0;
  301. }
  302. Result res = datenbank->getResult();
  303. unlock();
  304. befehl->release();
  305. if( !res.zeilenAnzahl )
  306. {
  307. res.destroy();
  308. return 0;
  309. }
  310. bool ret = (int)res.values[ 0 ] == 3;
  311. res.destroy();
  312. return ret;
  313. }
  314. int LSDatenbank::getAccountId( char *name, char *pass )
  315. {
  316. Text *befehl = new Text( "SELECT id FROM account WHERE name = '" );
  317. Text n( name );
  318. n.ersetzen( "'", "''" );
  319. befehl->append( (char*)n );
  320. befehl->append( "' AND passwort = '" );
  321. Text p( pass );
  322. p.ersetzen( "'", "''" );
  323. befehl->append( (char*)p );
  324. befehl->append( "'" );
  325. lock();
  326. datenbank->befehl( befehl->getText() );
  327. Result res = datenbank->getResult();
  328. unlock();
  329. befehl->release();
  330. if( res.zeilenAnzahl == 0 )
  331. {
  332. res.destroy();
  333. return 0;
  334. }
  335. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  336. res.destroy();
  337. return ret;
  338. }
  339. int LSDatenbank::loginKlient( int klientId, int accountId )
  340. {
  341. Text *befehl = new Text( "SELECT login_client( " );
  342. befehl->append( klientId );
  343. befehl->append( ", " );
  344. befehl->append( accountId );
  345. befehl->append( " )" );
  346. lock();
  347. datenbank->befehl( befehl->getText() );
  348. Result res = datenbank->getResult();
  349. unlock();
  350. befehl->release();
  351. if( res.zeilenAnzahl == 0 )
  352. {
  353. res.destroy();
  354. return 0;
  355. }
  356. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  357. res.destroy();
  358. return ret;
  359. }
  360. bool LSDatenbank::accountGeheim( int accountId, char *geheim )
  361. {
  362. Text *befehl = new Text( "SELECT * FROM account WHERE id = " );
  363. befehl->append( accountId );
  364. befehl->append( " AND geheimnis = '" );
  365. Text g( geheim );
  366. g.ersetzen( "'", "''" );
  367. befehl->append( (char*)g );
  368. befehl->append( "'" );
  369. lock();
  370. datenbank->befehl( befehl->getText() );
  371. Result res = datenbank->getResult();
  372. unlock();
  373. befehl->release();
  374. if( res.zeilenAnzahl == 1 )
  375. {
  376. res.destroy();
  377. return 1;
  378. }
  379. res.destroy();
  380. return 0;
  381. }
  382. int *LSDatenbank::kickKlient( int accountId )
  383. {
  384. Text *befehl = new Text( "SELECT kick_client( " );
  385. befehl->append( accountId );
  386. befehl->append( " )" );
  387. lock();
  388. datenbank->befehl( befehl->getText() );
  389. Result res = datenbank->getResult();
  390. unlock();
  391. befehl->release();
  392. if( res.zeilenAnzahl == 0 )
  393. {
  394. res.destroy();
  395. return 0;
  396. }
  397. int *ret = new int[ res.zeilenAnzahl ];
  398. for( int i = 0; i < res.zeilenAnzahl; i++ )
  399. ret[ i ] = TextZuInt( res.values[ i ].getText(), 10 );
  400. res.destroy();
  401. return ret;
  402. }
  403. void LSDatenbank::accountOnline( int accountId, char *ip, unsigned char *locIp, char *pcName )
  404. {
  405. Text *befehl = new Text( "INSERT INTO account_online( account_id, ip, loc_ip, pc_name ) VALUES ( " );
  406. befehl->append( accountId );
  407. befehl->append( ", '" );
  408. befehl->append( ip );
  409. befehl->append( "', '" );
  410. befehl->append( (int)locIp[ 0 ] );
  411. befehl->append( "." );
  412. befehl->append( (int)locIp[ 1 ] );
  413. befehl->append( "." );
  414. befehl->append( (int)locIp[ 2 ] );
  415. befehl->append( "." );
  416. befehl->append( (int)locIp[ 3 ] );
  417. befehl->append( "', '" );
  418. Text n( pcName );
  419. n.ersetzen( "'", "''" );
  420. befehl->append( (char*)n );
  421. befehl->append( "' )" );
  422. lock();
  423. datenbank->befehl( befehl->getText() );
  424. unlock();
  425. befehl->release();
  426. }
  427. int LSDatenbank::logoutKlient( int klientId, Array< int > *ret )
  428. {
  429. Text *befehl = new Text( "SELECT logout_client( " );
  430. befehl->append( klientId );
  431. befehl->append( " )" );
  432. lock();
  433. datenbank->befehl( befehl->getText() );
  434. Result res = datenbank->getResult();
  435. unlock();
  436. befehl->release();
  437. for( int i = 0; i < res.zeilenAnzahl; i++ )
  438. ret->set( TextZuInt( res.values[ i ].getText(), 10 ), i );
  439. int retVal = res.zeilenAnzahl;
  440. res.destroy();
  441. return retVal;
  442. }
  443. Text **LSDatenbank::getChatServerIpPort( int id )
  444. {
  445. Text *befehl = new Text( "SELECT ip, port FROM server_chat WHERE id = " );
  446. befehl->append( id );
  447. lock();
  448. datenbank->befehl( befehl->getText() );
  449. Result res = datenbank->getResult();
  450. unlock();
  451. if( !res.zeilenAnzahl )
  452. {
  453. res.destroy();
  454. return 0;
  455. }
  456. Text **ret = new Text*[ 2 ];
  457. ret[ 0 ] = new Text( res.values[ 0 ].getText() );
  458. ret[ 1 ] = new Text( res.values[ 1 ].getText() );
  459. res.destroy();
  460. return ret;
  461. }
  462. bool LSDatenbank::getSpielServerPortIp( int spielErstelltId, unsigned short *port, Text *ip )
  463. {
  464. Text *befehl = new Text( "SELECT a.port, a.ip FROM server_spiel a, spiel_erstellt b "
  465. "WHERE a.id = b.server_spiel_id AND b.id = " );
  466. befehl->append( spielErstelltId );
  467. lock();
  468. if( !datenbank->befehl( befehl->getText() ) )
  469. {
  470. unlock();
  471. befehl->release();
  472. return 0;
  473. }
  474. Result res = datenbank->getResult();
  475. unlock();
  476. befehl->release();
  477. *port = (unsigned short)TextZuInt( res.values[ 0 ].getText(), 10 );
  478. ip->setText( res.values[ 1 ].getText() );
  479. res.destroy();
  480. return 1;
  481. }
  482. int LSDatenbank::getSpielerAusGruppe( int gruppeId, Array< int > *accountId )
  483. {
  484. Text *befehl = new Text( "SELECT account_id FROM gruppe_spieler WHERE gruppe_id = " );
  485. befehl->append( gruppeId );
  486. lock();
  487. if( !datenbank->befehl( befehl->getText() ) )
  488. {
  489. unlock();
  490. befehl->release();
  491. return 0;
  492. }
  493. Result res = datenbank->getResult();
  494. unlock();
  495. befehl->release();
  496. int ret = res.zeilenAnzahl;
  497. for( int i = 0; i < ret; i++ )
  498. accountId->add( TextZuInt( res.values[ i ].getText(), 10 ), i );
  499. return ret;
  500. }
  501. int LSDatenbank::kickSpielerAusGruppe( int gruppeId, int accountId )
  502. {
  503. Text *befehl = new Text( "SELECT spieler_verlaesst_gruppe( " );
  504. befehl->append( accountId );
  505. befehl->append( ", " );
  506. befehl->append( gruppeId );
  507. befehl->append( " )" );
  508. lock();
  509. if( !datenbank->befehl( befehl->getText() ) )
  510. {
  511. unlock();
  512. befehl->release();
  513. return 0;
  514. }
  515. Result res = datenbank->getResult();
  516. unlock();
  517. befehl->release();
  518. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  519. res.destroy();
  520. return ret;
  521. }
  522. bool LSDatenbank::getChatServerPortIp( int accountId, unsigned short *port, Text *ip )
  523. {
  524. Text *befehl = new Text( "SELECT a.port, a.ip FROM server_chat AS a, server_chat_clients AS b, account_clients AS c "
  525. "WHERE c.client_id = b.client_id AND a.id = b.server_chat_id AND c.account_id = " );
  526. befehl->append( accountId );
  527. lock();
  528. if( !datenbank->befehl( befehl->getText() ) )
  529. {
  530. unlock();
  531. befehl->release();
  532. return 0;
  533. }
  534. Result res = datenbank->getResult();
  535. unlock();
  536. befehl->release();
  537. *port = (unsigned short)TextZuInt( res.values[ 0 ].getText(), 10 );
  538. ip->setText( res.values[ 1 ].getText() );
  539. res.destroy();
  540. return 1;
  541. }
  542. int LSDatenbank::getGruppeAdmin( int gruppeId )
  543. {
  544. Text *befehl = new Text( "SELECT admin_account_id FROM gruppe WHERE id = " );
  545. befehl->append( gruppeId );
  546. lock();
  547. if( !datenbank->befehl( befehl->getText() ) )
  548. {
  549. unlock();
  550. befehl->release();
  551. return 0;
  552. }
  553. Result res = datenbank->getResult();
  554. unlock();
  555. befehl->release();
  556. if( !res.zeilenAnzahl )
  557. {
  558. res.destroy();
  559. return 0;
  560. }
  561. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  562. res.destroy();
  563. return ret;
  564. }
  565. int LSDatenbank::getSpielerAusChatroom( int chatroomId, Array< int > *accountId )
  566. {
  567. Text *befehl = new Text( "SELECT account_id FROM chatroom_spieler WHERE chatroom_id = " );
  568. befehl->append( chatroomId );
  569. lock();
  570. if( !datenbank->befehl( befehl->getText() ) )
  571. {
  572. unlock();
  573. befehl->release();
  574. return 0;
  575. }
  576. Result res = datenbank->getResult();
  577. unlock();
  578. befehl->release();
  579. int ret = res.zeilenAnzahl;
  580. for( int i = 0; i < ret; i++ )
  581. accountId->add( TextZuInt( res.values[ i ].getText(), 10 ), i );
  582. return ret;
  583. }
  584. int LSDatenbank::getChatroomAdmin( int chatroomId )
  585. {
  586. Text *befehl = new Text( "SELECT admin_account_id FROM chatroom WHERE id = " );
  587. befehl->append( chatroomId );
  588. lock();
  589. if( !datenbank->befehl( befehl->getText() ) )
  590. {
  591. unlock();
  592. befehl->release();
  593. return 0;
  594. }
  595. Result res = datenbank->getResult();
  596. unlock();
  597. befehl->release();
  598. if( !res.zeilenAnzahl )
  599. {
  600. res.destroy();
  601. return 0;
  602. }
  603. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  604. res.destroy();
  605. return ret;
  606. }
  607. // constant
  608. Text *LSDatenbank::getLetzterFehler() const
  609. {
  610. return datenbank->getLetzterFehler();
  611. }
  612. // Reference Counting
  613. LSDatenbank *LSDatenbank::getThis()
  614. {
  615. ref++;
  616. return this;
  617. }
  618. LSDatenbank *LSDatenbank::release()
  619. {
  620. ref--;
  621. if( !ref )
  622. delete this;
  623. return 0;
  624. }