Datenbank.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941
  1. #include "Datenbank.h"
  2. #include <iostream>
  3. #include <Datei.h>
  4. #ifndef WIN32
  5. #include <spawn.h>
  6. #endif
  7. // Inhalt der AppSDatenbank Klasse aus Datenbank.h
  8. // Konstruktor
  9. AppSDatenbank::AppSDatenbank(InitDatei* zDat)
  10. : ReferenceCounter()
  11. {
  12. datenbank = new Datenbank(zDat->zWert("DBBenutzer")->getText(), zDat->zWert("DBPasswort")->getText(),
  13. zDat->zWert("DBName")->getText(), zDat->zWert("DBIP")->getText(),
  14. (unsigned short)TextZuInt(zDat->zWert("DBPort")->getText(), 10));
  15. if (!datenbank->istOk())
  16. {
  17. std::cout << "AppS: Es konnte keine Verbindung zur Datenbank hergestellt werden:\n";
  18. Text* txt = datenbank->getLetzterFehler();
  19. std::cout << txt->getText() << "\nDas Programm wird beendet.";
  20. txt->release();
  21. exit(1);
  22. }
  23. InitializeCriticalSection(&ths);
  24. Text befehl = "SELECT port, admin_port FROM server WHERE id = ";
  25. befehl += zDat->zWert("ServerId")->getText();
  26. lock();
  27. datenbank->befehl(befehl);
  28. Result res = datenbank->getResult();
  29. unlock();
  30. if (res.zeilenAnzahl == 1)
  31. {
  32. zDat->addWert("AppSPort", res.values[0]);
  33. zDat->addWert("AppSAPort", res.values[1]);
  34. }
  35. res.destroy();
  36. }
  37. // Detruktor
  38. AppSDatenbank::~AppSDatenbank()
  39. {
  40. datenbank->release();
  41. DeleteCriticalSection(&ths);
  42. }
  43. // nicht constant
  44. void AppSDatenbank::lock()
  45. {
  46. EnterCriticalSection(&ths);
  47. }
  48. void AppSDatenbank::unlock()
  49. {
  50. LeaveCriticalSection(&ths);
  51. }
  52. int AppSDatenbank::istAdministrator(const char* name, const char* passwort)
  53. {
  54. Text* befehl = new Text("SELECT id FROM benutzer WHERE name = '");
  55. Text n(name);
  56. n.ersetzen("'", "''");
  57. befehl->append(n);
  58. befehl->append("' AND passwort = md5('");
  59. Text p(passwort);
  60. p.ersetzen("'", "''");
  61. befehl->append(p);
  62. befehl->append("')");
  63. lock();
  64. datenbank->befehl(befehl->getText());
  65. Result res = datenbank->getResult();
  66. unlock();
  67. befehl->release();
  68. int ret = 0;
  69. if (res.zeilenAnzahl > 0)
  70. ret = TextZuInt(res.values[0].getText(), 10);
  71. res.destroy();
  72. return ret;
  73. }
  74. bool AppSDatenbank::adminHatRecht(int id, int recht)
  75. {
  76. Text* befehl = new Text("SELECT * FROM benutzer_rechte WHERE benutzer_id = ");
  77. befehl->append(id);
  78. befehl->append(" AND rechte_id = ");
  79. befehl->append(recht);
  80. lock();
  81. datenbank->befehl(befehl->getText());
  82. int ret = datenbank->getZeilenAnzahl();
  83. unlock();
  84. befehl->release();
  85. return ret != 0;
  86. }
  87. Text* AppSDatenbank::getKey()
  88. {
  89. lock();
  90. datenbank->befehl("SELECT get_next_schluessel()");
  91. Result res = datenbank->getResult();
  92. unlock();
  93. if (!res.zeilenAnzahl)
  94. return 0;
  95. Text* ret = new Text(res.values[0].getText());
  96. res.destroy();
  97. return ret;
  98. }
  99. int AppSDatenbank::login(char* name, char* passwort)
  100. {
  101. Text befehl = "SELECT id FROM account WHERE name = '";
  102. befehl += name;
  103. befehl += "' AND passwort = md5('";
  104. befehl += passwort;
  105. befehl += "')";
  106. lock();
  107. datenbank->befehl(befehl);
  108. Result res = datenbank->getResult();
  109. unlock();
  110. if (!res.zeilenAnzahl)
  111. return 0;
  112. int ret = (int)res.values[0];
  113. res.destroy();
  114. return ret;
  115. }
  116. bool AppSDatenbank::istNeu(int account)
  117. {
  118. Text befehl = "SELECT * from app_5_minigames_score WHERE account_id = ";
  119. befehl += account;
  120. lock();
  121. datenbank->befehl(befehl);
  122. int zeilen = datenbank->getZeilenAnzahl();
  123. unlock();
  124. return zeilen == 0;
  125. }
  126. int AppSDatenbank::getWeltBloeckeScore(int anz, Array< int >* score, RCArray< Text >* namen)
  127. {
  128. Text befehl = "SELECT a.bloecke, b.ruf_name FROM app_5_minigames_score a, account b WHERE b.id = a.account_id ORDER BY a.bloecke DESC LIMIT ";
  129. befehl += anz;
  130. lock();
  131. datenbank->befehl(befehl);
  132. Result res = datenbank->getResult();
  133. unlock();
  134. int ret = res.zeilenAnzahl;
  135. for (int i = 0; i < ret; i++)
  136. {
  137. score->set((int)res.values[i * 2], i);
  138. namen->set(new Text(res.values[i * 2 + 1].getText()), i);
  139. }
  140. res.destroy();
  141. return ret;
  142. }
  143. int AppSDatenbank::getWeltMauerScore(int anz, Array< int >* score, RCArray< Text >* namen)
  144. {
  145. Text befehl = "SELECT a.mauer, b.ruf_name FROM app_5_minigames_score a, account b WHERE b.id = a.account_id ORDER BY a.mauer DESC LIMIT ";
  146. befehl += anz;
  147. lock();
  148. datenbank->befehl(befehl);
  149. Result res = datenbank->getResult();
  150. unlock();
  151. int ret = res.zeilenAnzahl;
  152. for (int i = 0; i < ret; i++)
  153. {
  154. score->set((int)res.values[i * 2], i);
  155. namen->set(new Text(res.values[i * 2 + 1].getText()), i);
  156. }
  157. res.destroy();
  158. return ret;
  159. }
  160. int AppSDatenbank::getWeltFarbenScore(int anz, Array< int >* score, RCArray< Text >* namen)
  161. {
  162. Text befehl = "SELECT a.farben, b.ruf_name FROM app_5_minigames_score a, account b WHERE b.id = a.account_id ORDER BY a.farben DESC LIMIT ";
  163. befehl += anz;
  164. lock();
  165. datenbank->befehl(befehl);
  166. Result res = datenbank->getResult();
  167. unlock();
  168. int ret = res.zeilenAnzahl;
  169. for (int i = 0; i < ret; i++)
  170. {
  171. score->set((int)res.values[i * 2], i);
  172. namen->set(new Text(res.values[i * 2 + 1].getText()), i);
  173. }
  174. res.destroy();
  175. return ret;
  176. }
  177. int AppSDatenbank::getWeltFangenScore(int anz, Array< int >* score, RCArray< Text >* namen)
  178. {
  179. Text befehl = "SELECT a.fangen, b.ruf_name FROM app_5_minigames_score a, account b WHERE b.id = a.account_id ORDER BY a.fangen DESC LIMIT ";
  180. befehl += anz;
  181. lock();
  182. datenbank->befehl(befehl);
  183. Result res = datenbank->getResult();
  184. unlock();
  185. int ret = res.zeilenAnzahl;
  186. for (int i = 0; i < ret; i++)
  187. {
  188. score->set((int)res.values[i * 2], i);
  189. namen->set(new Text(res.values[i * 2 + 1].getText()), i);
  190. }
  191. res.destroy();
  192. return ret;
  193. }
  194. int AppSDatenbank::getWeltRennenScore(int anz, Array< int >* score, RCArray< Text >* namen)
  195. {
  196. Text befehl = "SELECT a.rennen, b.ruf_name FROM app_5_minigames_score a, account b WHERE b.id = a.account_id ORDER BY a.rennen DESC LIMIT ";
  197. befehl += anz;
  198. lock();
  199. datenbank->befehl(befehl);
  200. Result res = datenbank->getResult();
  201. unlock();
  202. int ret = res.zeilenAnzahl;
  203. for (int i = 0; i < ret; i++)
  204. {
  205. score->set((int)res.values[i * 2], i);
  206. namen->set(new Text(res.values[i * 2 + 1].getText()), i);
  207. }
  208. res.destroy();
  209. return ret;
  210. }
  211. int AppSDatenbank::getWeltGesamtScore(int anz, Array< int >* score, RCArray< Text >* namen)
  212. {
  213. Text befehl = "SELECT a.gesamt, b.ruf_name FROM app_5_minigames_score a, account b WHERE b.id = a.account_id ORDER BY a.gesamt DESC LIMIT ";
  214. befehl += anz;
  215. lock();
  216. datenbank->befehl(befehl);
  217. Result res = datenbank->getResult();
  218. unlock();
  219. int ret = res.zeilenAnzahl;
  220. for (int i = 0; i < ret; i++)
  221. {
  222. score->set((int)res.values[i * 2], i);
  223. namen->set(new Text(res.values[i * 2 + 1].getText()), i);
  224. }
  225. res.destroy();
  226. return ret;
  227. }
  228. int AppSDatenbank::getBloeckeScore(int account)
  229. {
  230. Text befehl = "SELECT bloecke FROM app_5_minigames_score WHERE account_id = ";
  231. befehl += account;
  232. lock();
  233. datenbank->befehl(befehl);
  234. Result res = datenbank->getResult();
  235. unlock();
  236. if (!res.zeilenAnzahl)
  237. return 0;
  238. int ret = (int)res.values[0];
  239. res.destroy();
  240. return ret;
  241. }
  242. int AppSDatenbank::getMauerScore(int account)
  243. {
  244. Text befehl = "SELECT mauer FROM app_5_minigames_score WHERE account_id = ";
  245. befehl += account;
  246. lock();
  247. datenbank->befehl(befehl);
  248. Result res = datenbank->getResult();
  249. unlock();
  250. if (!res.zeilenAnzahl)
  251. return 0;
  252. int ret = (int)res.values[0];
  253. res.destroy();
  254. return ret;
  255. }
  256. int AppSDatenbank::getMauerZeit(int account, int level)
  257. {
  258. Text befehl = "SELECT sekunden FROM app_5_minigames_mauer_score WHERE account_id = ";
  259. befehl += account;
  260. befehl += " AND level = ";
  261. befehl += level;
  262. lock();
  263. datenbank->befehl(befehl);
  264. Result res = datenbank->getResult();
  265. unlock();
  266. if (!res.zeilenAnzahl)
  267. return 0;
  268. int ret = (int)res.values[0];
  269. res.destroy();
  270. return ret;
  271. }
  272. int AppSDatenbank::getFarbenScore(int account)
  273. {
  274. Text befehl = "SELECT farben FROM app_5_minigames_score WHERE account_id = ";
  275. befehl += account;
  276. lock();
  277. datenbank->befehl(befehl);
  278. Result res = datenbank->getResult();
  279. unlock();
  280. if (!res.zeilenAnzahl)
  281. return 0;
  282. int ret = (int)res.values[0];
  283. res.destroy();
  284. return ret;
  285. }
  286. int AppSDatenbank::getFangenScore(int account)
  287. {
  288. Text befehl = "SELECT fangen FROM app_5_minigames_score WHERE account_id = ";
  289. befehl += account;
  290. lock();
  291. datenbank->befehl(befehl);
  292. Result res = datenbank->getResult();
  293. unlock();
  294. if (!res.zeilenAnzahl)
  295. return 0;
  296. int ret = (int)res.values[0];
  297. res.destroy();
  298. return ret;
  299. }
  300. int AppSDatenbank::getRennenScore(int account)
  301. {
  302. Text befehl = "SELECT rennen FROM app_5_minigames_score WHERE account_id = ";
  303. befehl += account;
  304. lock();
  305. datenbank->befehl(befehl);
  306. Result res = datenbank->getResult();
  307. unlock();
  308. if (!res.zeilenAnzahl)
  309. return 0;
  310. int ret = (int)res.values[0];
  311. res.destroy();
  312. return ret;
  313. }
  314. int AppSDatenbank::getGesamtScore(int account)
  315. {
  316. Text befehl = "SELECT gesamt FROM app_5_minigames_score WHERE account_id = ";
  317. befehl += account;
  318. lock();
  319. datenbank->befehl(befehl);
  320. Result res = datenbank->getResult();
  321. unlock();
  322. if (!res.zeilenAnzahl)
  323. return 0;
  324. int ret = (int)res.values[0];
  325. res.destroy();
  326. return ret;
  327. }
  328. void AppSDatenbank::setBloeckeScore(int account, int score)
  329. {
  330. if (score < getBloeckeScore(account))
  331. return;
  332. Text befehl = "UPDATE app_5_minigames_score SET bloecke = ";
  333. befehl += score;
  334. befehl += " WHERE account_id = ";
  335. befehl += account;
  336. lock();
  337. datenbank->befehl(befehl);
  338. int z = datenbank->getZeilenAnzahl();
  339. unlock();
  340. if (!z)
  341. {
  342. befehl = "INSERT INTO app_5_minigames_score( bloecke, account_id ) VALUES( ";
  343. befehl += score;
  344. befehl += ", ";
  345. befehl += account;
  346. befehl += " )";
  347. lock();
  348. datenbank->befehl(befehl);
  349. unlock();
  350. }
  351. calkGesamtScore(account);
  352. }
  353. void AppSDatenbank::setFarbenScore(int account, int score)
  354. {
  355. if (score < getFarbenScore(account))
  356. return;
  357. Text befehl = "UPDATE app_5_minigames_score SET farben = ";
  358. befehl += score;
  359. befehl += " WHERE account_id = ";
  360. befehl += account;
  361. lock();
  362. datenbank->befehl(befehl);
  363. int z = datenbank->getZeilenAnzahl();
  364. unlock();
  365. if (!z)
  366. {
  367. befehl = "INSERT INTO app_5_minigames_score( farben, account_id ) VALUES( ";
  368. befehl += score;
  369. befehl += ", ";
  370. befehl += account;
  371. befehl += " )";
  372. lock();
  373. datenbank->befehl(befehl);
  374. unlock();
  375. }
  376. calkGesamtScore(account);
  377. }
  378. void AppSDatenbank::setFangenScore(int account, int score)
  379. {
  380. if (score < getFangenScore(account))
  381. return;
  382. Text befehl = "UPDATE app_5_minigames_score SET fangen = ";
  383. befehl += score;
  384. befehl += " WHERE account_id = ";
  385. befehl += account;
  386. lock();
  387. datenbank->befehl(befehl);
  388. int z = datenbank->getZeilenAnzahl();
  389. unlock();
  390. if (!z)
  391. {
  392. befehl = "INSERT INTO app_5_minigames_score( fangen, account_id ) VALUES( ";
  393. befehl += score;
  394. befehl += ", ";
  395. befehl += account;
  396. befehl += " )";
  397. lock();
  398. datenbank->befehl(befehl);
  399. unlock();
  400. }
  401. calkGesamtScore(account);
  402. }
  403. void AppSDatenbank::setRennenScore(int account, int score)
  404. {
  405. if (score < getRennenScore(account))
  406. return;
  407. Text befehl = "UPDATE app_5_minigames_score SET rennen = ";
  408. befehl += score;
  409. befehl += " WHERE account_id = ";
  410. befehl += account;
  411. lock();
  412. datenbank->befehl(befehl);
  413. int z = datenbank->getZeilenAnzahl();
  414. unlock();
  415. if (!z)
  416. {
  417. befehl = "INSERT INTO app_5_minigames_score( rennen, account_id ) VALUES( ";
  418. befehl += score;
  419. befehl += ", ";
  420. befehl += account;
  421. befehl += " )";
  422. lock();
  423. datenbank->befehl(befehl);
  424. unlock();
  425. }
  426. calkGesamtScore(account);
  427. }
  428. void AppSDatenbank::setMauerZeit(int account, int level, int zeit)
  429. {
  430. if (zeit > getMauerZeit(account, level) && getMauerZeit(account, level) != 0)
  431. return;
  432. if (zeit > 600)
  433. zeit = 600;
  434. Text befehl = "UPDATE app_5_minigames_mauer_score SET sekunden = ";
  435. befehl += zeit;
  436. befehl += " WHERE account_id = ";
  437. befehl += account;
  438. befehl += " AND level = ";
  439. befehl += level;
  440. lock();
  441. datenbank->befehl(befehl);
  442. int z = datenbank->getZeilenAnzahl();
  443. unlock();
  444. if (!z)
  445. {
  446. befehl = "INSERT INTO app_5_minigames_mauer_score( account_id, level, sekunden ) VALUES( ";
  447. befehl += account;
  448. befehl += ", ";
  449. befehl += level;
  450. befehl += ", ";
  451. befehl += zeit;
  452. befehl += " )";
  453. lock();
  454. datenbank->befehl(befehl);
  455. unlock();
  456. }
  457. calkMauerScore(account);
  458. }
  459. void AppSDatenbank::calkMauerScore(int account)
  460. {
  461. Text befehl = "SELECT count( sekunden ), sum( sekunden ) FROM app_5_minigames_mauer_score WHERE account_id = ";
  462. befehl += account;
  463. lock();
  464. datenbank->befehl(befehl);
  465. Result res = datenbank->getResult();
  466. unlock();
  467. if ((int)res.values[0] == 0)
  468. return;
  469. int score = (int)res.values[0] * 600 - (int)res.values[1];
  470. res.destroy();
  471. befehl = "UPDATE app_5_minigames_score SET mauer = ";
  472. befehl += score;
  473. befehl += " WHERE account_id = ";
  474. befehl += account;
  475. lock();
  476. datenbank->befehl(befehl);
  477. int z = datenbank->getZeilenAnzahl();
  478. unlock();
  479. if (!z)
  480. {
  481. befehl = "INSERT INTO app_5_minigames_score( mauer, account_id ) VALUES( ";
  482. befehl += score;
  483. befehl += ", ";
  484. befehl += account;
  485. befehl += " )";
  486. lock();
  487. datenbank->befehl(befehl);
  488. unlock();
  489. }
  490. calkGesamtScore(account);
  491. }
  492. void AppSDatenbank::calkGesamtScore(int account)
  493. {
  494. Text befehl = "SELECT bloecke, mauer, farben, fangen, rennen FROM app_5_minigames_score WHERE account_id = ";
  495. befehl += account;
  496. lock();
  497. datenbank->befehl(befehl);
  498. Result res = datenbank->getResult();
  499. unlock();
  500. if (!res.zeilenAnzahl)
  501. return;
  502. int gesamt = ((int)res.values[0] + (int)res.values[1] + (int)res.values[2] + (int)res.values[3] + (int)res.values[4]) / 5;
  503. res.destroy();
  504. befehl = "UPDATE app_5_minigames_score SET gesamt = ";
  505. befehl += gesamt;
  506. befehl += " WHERE account_id = ";
  507. befehl += account;
  508. lock();
  509. datenbank->befehl(befehl);
  510. unlock();
  511. }
  512. int AppSDatenbank::pruefNeuAccount(const char* name, const char* eMail)
  513. {
  514. Text* befehl = new Text("SELECT account_neu_alt_check( '");
  515. Text n(name);
  516. n.ersetzen("'", "''");
  517. befehl->append(n);
  518. befehl->append("', '");
  519. Text m(eMail);
  520. m.ersetzen("'", "''");
  521. befehl->append(m);
  522. befehl->append("' )");
  523. lock();
  524. datenbank->befehl(befehl->getText());
  525. Result res = datenbank->getResult();
  526. unlock();
  527. if (res.values[0].istGleich("t"))
  528. {
  529. befehl->release();
  530. res.destroy();
  531. return 0;
  532. }
  533. else
  534. {
  535. res.destroy();
  536. befehl->setText("SELECT account.id FROM account, account_neu WHERE account.name = '");
  537. befehl->append(n);
  538. befehl->append("' OR account_neu.name = '");
  539. befehl->append(n);
  540. befehl->append("'");
  541. lock();
  542. datenbank->befehl(befehl->getText());
  543. res = datenbank->getResult();
  544. unlock();
  545. if (res.zeilenAnzahl > 0)
  546. {
  547. befehl->release();
  548. res.destroy();
  549. return 1;
  550. }
  551. else
  552. {
  553. res.destroy();
  554. befehl->release();
  555. return 2;
  556. }
  557. }
  558. }
  559. bool AppSDatenbank::neuAccount(const char* name, const char* pass, const char* geheim, const char* eMail, const char* gebDatum, InitDatei* zIni)
  560. {
  561. Text* befehl = new Text("INSERT INTO account_neu( name, passwort, geheimnis, e_mail, geb_datum ) VALUES ( '");
  562. Text n(name);
  563. n.ersetzen("'", "''");
  564. befehl->append(n);
  565. befehl->append("', md5('");
  566. Text p(pass);
  567. p.ersetzen("'", "''");
  568. befehl->append(p);
  569. befehl->append("'), '");
  570. Text g(geheim);
  571. g.ersetzen("'", "''");
  572. befehl->append(g);
  573. befehl->append("', '");
  574. Text m(eMail);
  575. m.ersetzen("'", "''");
  576. befehl->append(m);
  577. befehl->append("', '");
  578. Text d(gebDatum);
  579. d.ersetzen("'", "''");
  580. befehl->append(d);
  581. befehl->append("' )");
  582. lock();
  583. if (datenbank->befehl(befehl->getText()))
  584. {
  585. unlock();
  586. befehl->setText("SELECT schluessel, id FROM account_neu WHERE name = '");
  587. befehl->append(n);
  588. befehl->append("'");
  589. lock();
  590. datenbank->befehl(befehl->getText());
  591. Result res = datenbank->getResult();
  592. unlock();
  593. if (res.zeilenAnzahl)
  594. {
  595. // e_mail senden
  596. pid_t pid;
  597. char* pargs[] = { (char*)zIni->zWert("PHP")->getText(), (char*)zIni->zWert("AccountActivationMail")->getText(), (char*)name, (char*)geheim, (char*)gebDatum, (char*)res.values[0].getText(), (char*)eMail, (char*)res.values[1].getText(), (char*)0 };
  598. posix_spawn(&pid, zIni->zWert("PHP")->getText(), 0, 0, pargs, 0);
  599. }
  600. res.destroy();
  601. befehl->release();
  602. return 1;
  603. }
  604. unlock();
  605. befehl->release();
  606. return 0;
  607. }
  608. void AppSDatenbank::markballsFinish(int level, int sek, int account, char* device, int diff, int kupfer, int gId)
  609. {
  610. if (!device && kupfer > 0)
  611. {
  612. Text befehl = "UPDATE account SET kupfer = kupfer + ";
  613. befehl += kupfer;
  614. befehl += " WHERE id = ";
  615. befehl += account;
  616. lock();
  617. datenbank->befehl(befehl);
  618. unlock();
  619. }
  620. if (gId > 0)
  621. {
  622. Text befehl = "SELECT markballs_gegenstand_id FROM markballs_gegenstand_account WHERE markballs_gegenstand_id = ";
  623. befehl += gId;
  624. befehl += " AND diff = ";
  625. befehl += diff;
  626. if (!device)
  627. {
  628. befehl += " AND account_id = ";
  629. befehl += account;
  630. }
  631. else
  632. {
  633. befehl += " AND device = '";
  634. befehl += device;
  635. befehl += "'";
  636. }
  637. lock();
  638. datenbank->befehl(befehl);
  639. int rows = datenbank->getZeilenAnzahl();
  640. unlock();
  641. if (!rows)
  642. {
  643. befehl = "INSERT INTO markballs_gegenstand_account( account_id, device, markballs_gegenstand_id, diff ) VALUES( ";
  644. if (!device)
  645. {
  646. befehl += account;
  647. befehl += ", NULL, ";
  648. }
  649. else
  650. {
  651. befehl += "NULL, '";
  652. befehl += device;
  653. befehl += "', ";
  654. }
  655. befehl += gId;
  656. befehl += ", ";
  657. befehl += diff;
  658. befehl += " )";
  659. lock();
  660. datenbank->befehl(befehl);
  661. unlock();
  662. }
  663. }
  664. Text befehl = "SELECT * FROM markballs WHERE level = ";
  665. befehl += level;
  666. befehl += " AND diff = ";
  667. befehl += diff;
  668. lock();
  669. datenbank->befehl(befehl);
  670. int rows = datenbank->getZeilenAnzahl();
  671. unlock();
  672. if (!rows)
  673. {
  674. befehl = "INSERT INTO markballs( level, diff ) VALUES( ";
  675. befehl += level;
  676. befehl += ", ";
  677. befehl += diff;
  678. befehl += " )";
  679. lock();
  680. datenbank->befehl(befehl);
  681. unlock();
  682. }
  683. Text spalte = "verloren";
  684. if (sek > 0 && sek <= 10)
  685. spalte = "s_1_10";
  686. else if (sek > 10 && sek <= 20)
  687. spalte = "s_11_20";
  688. else if (sek > 20 && sek <= 30)
  689. spalte = "s_21_30";
  690. else if (sek > 30 && sek <= 40)
  691. spalte = "s_31_40";
  692. else if (sek > 40 && sek <= 50)
  693. spalte = "s_41_50";
  694. else if (sek > 50 && sek <= 60)
  695. spalte = "s_51_60";
  696. else if (sek > 60)
  697. spalte = "more";
  698. befehl = "UPDATE markballs SET ";
  699. befehl += spalte.getText();
  700. befehl += " = ";
  701. befehl += spalte.getText();
  702. befehl += " + 1, account_id = ";
  703. if (account)
  704. befehl += account;
  705. else
  706. befehl += "null";
  707. befehl += ", device = ";
  708. if (!device)
  709. befehl += "null";
  710. else
  711. {
  712. befehl += "'";
  713. befehl += device;
  714. befehl += "'";
  715. }
  716. befehl += ", best = ";
  717. befehl += sek;
  718. befehl += " WHERE level = ";
  719. befehl += level;
  720. befehl += " AND diff = ";
  721. befehl += diff;
  722. lock();
  723. datenbank->befehl(befehl);
  724. unlock();
  725. }
  726. int AppSDatenbank::getMarkballsScore(Array< int >* level, Array< int >* score, RCArray< Text >* name, int diff)
  727. {
  728. Text befehl = "SELECT a.level, a.best, b.ruf_name from markballs a left join account b ON a.account_id = b.id WHERE a.diff = ";
  729. befehl += diff;
  730. lock();
  731. datenbank->befehl(befehl);
  732. Result res = datenbank->getResult();
  733. unlock();
  734. int ret = res.zeilenAnzahl;
  735. for (int i = 0; i < ret; i++)
  736. {
  737. level->set((int)res.values[i * 3], i);
  738. score->set((int)res.values[i * 3 + 1], i);
  739. name->set(new Text(res.values[i * 3 + 2].getText()), i);
  740. }
  741. res.destroy();
  742. return ret;
  743. }
  744. int AppSDatenbank::getMarkballsScore(Array< int >* level, Array< int >* score, int diff)
  745. {
  746. Text befehl = "SELECT level, best from markballs WHERE diff = ";
  747. befehl += diff;
  748. lock();
  749. datenbank->befehl(befehl);
  750. Result res = datenbank->getResult();
  751. unlock();
  752. int ret = res.zeilenAnzahl;
  753. for (int i = 0; i < ret; i++)
  754. {
  755. level->set((int)res.values[i * 2], i);
  756. score->set((int)res.values[i * 2 + 1], i);
  757. }
  758. res.destroy();
  759. return ret;
  760. }
  761. void AppSDatenbank::deviceAccount(char* device, int account)
  762. {
  763. Text befehl = "UPDATE markballs SET account_id = ";
  764. befehl += account;
  765. befehl += ", device = null WHERE account_id IS NULL AND device = '";
  766. befehl += device;
  767. befehl += "'";
  768. lock();
  769. datenbank->befehl(befehl);
  770. unlock();
  771. befehl = "SELECT app_device_to_account( '";
  772. befehl += device;
  773. befehl += "', ";
  774. befehl += account;
  775. befehl += " )";
  776. lock();
  777. datenbank->befehl(befehl);
  778. unlock();
  779. befehl = "UPDATE markballs_fortschritt SET account_id = ";
  780. befehl += account;
  781. befehl += ", device = null WHERE account_id IS NULL AND device = '";
  782. befehl += device;
  783. befehl += "'";
  784. lock();
  785. datenbank->befehl(befehl);
  786. unlock();
  787. befehl = "UPDATE markballs_gegenstand_account SET account_id = ";
  788. befehl += account;
  789. befehl += ", device = null WHERE account_id IS NULL AND device = '";
  790. befehl += device;
  791. befehl += "'";
  792. lock();
  793. datenbank->befehl(befehl);
  794. unlock();
  795. }
  796. int AppSDatenbank::getGegenstaende(int accountId, char* device, Array< int >* gId, Array< int >* diff)
  797. {
  798. Text befehl = "SELECT markballs_gegenstand_id, diff FROM markballs_gegenstand_account WHERE ";
  799. if (!device)
  800. {
  801. befehl += " account_id = ";
  802. befehl += accountId;
  803. }
  804. else
  805. {
  806. befehl += " device = '";
  807. befehl += device;
  808. befehl += "'";
  809. }
  810. lock();
  811. datenbank->befehl(befehl);
  812. Result r = datenbank->getResult();
  813. unlock();
  814. if (!r.zeilenAnzahl)
  815. {
  816. r.destroy();
  817. return 0;
  818. }
  819. for (int i = 0; i < r.zeilenAnzahl; i++)
  820. {
  821. gId->add((int)r.values[i * 2]);
  822. diff->add((int)r.values[i * 2 + 1]);
  823. }
  824. int ret = r.zeilenAnzahl;
  825. r.destroy();
  826. return ret;
  827. }
  828. int AppSDatenbank::getKupfer(int accountId)
  829. {
  830. Text befehl = "SELECT kupfer FROM account WHERE id = ";
  831. befehl += accountId;
  832. lock();
  833. datenbank->befehl(befehl);
  834. Result r = datenbank->getResult();
  835. unlock();
  836. int ret = r.zeilenAnzahl ? (int)r.values[0] : 0;
  837. r.destroy();
  838. return ret;
  839. }
  840. int AppSDatenbank::getMarkballsFortschritt(int accountId, char* device, Array< int >* f)
  841. {
  842. Text befehl = "SELECT level, diff FROM markballs_fortschritt WHERE ";
  843. if (!device)
  844. {
  845. befehl += " account_id = ";
  846. befehl += accountId;
  847. }
  848. else
  849. {
  850. befehl += " device = '";
  851. befehl += device;
  852. befehl += "'";
  853. }
  854. befehl += " ORDER BY diff";
  855. lock();
  856. datenbank->befehl(befehl);
  857. Result r = datenbank->getResult();
  858. unlock();
  859. int anz = 0;
  860. int lastDiff = 0;
  861. for (int i = 0; i < r.zeilenAnzahl; i++, anz++)
  862. {
  863. int l = (int)r.values[i * 2];
  864. int d = (int)r.values[i * 2 + 1];
  865. for (int j = lastDiff + 1; j < d; j++, anz++)
  866. f->add(0);
  867. f->add(l);
  868. lastDiff = d;
  869. }
  870. r.destroy();
  871. return anz;
  872. }
  873. void AppSDatenbank::addKupfer(int account, int kupfer)
  874. {
  875. Text befehl = "UPDATE account SET kupfer = kupfer + ";
  876. befehl += kupfer;
  877. befehl += " WHERE id = ";
  878. befehl += account;
  879. lock();
  880. datenbank->befehl(befehl);
  881. unlock();
  882. }
  883. bool AppSDatenbank::getFreeAds(int account)
  884. {
  885. Text befehl = "SELECT get_account_free_ad( ";
  886. befehl += account;
  887. befehl += " )";
  888. lock();
  889. datenbank->befehl(befehl);
  890. Result r = datenbank->getResult();
  891. unlock();
  892. if (r.zeilenAnzahl < 1)
  893. {
  894. r.destroy();
  895. return 0;
  896. }
  897. bool ret = r.values[0].istGleich("t");
  898. r.destroy();
  899. return ret;
  900. }