Datenbank.cpp 12 KB

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