Datenbank.cpp 17 KB

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