Datenbank.cpp 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918
  1. #include "Datenbank.h"
  2. #include <Zeit.h>
  3. #include "AccountHistorieDaten.h"
  4. #include "KartenLeser.h"
  5. // Inhalt der LSDatenbank Klasse aus Datenbank.h
  6. // Konstruktor
  7. ISDatenbank::ISDatenbank(InitDatei* zIni)
  8. : ReferenceCounter()
  9. {
  10. datenbank = new Datenbank(zIni->zWert("DBBenutzer")->getText(), zIni->zWert("DBPasswort")->getText(),
  11. zIni->zWert("DBName")->getText(), zIni->zWert("DBIP")->getText(),
  12. (unsigned short)TextZuInt(zIni->zWert("DBPort")->getText(), 10));
  13. if (!datenbank->istOk())
  14. {
  15. std::cout << "IS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
  16. exit(1);
  17. }
  18. InitializeCriticalSection(&cs);
  19. Text befehl = "SELECT port, admin_port FROM server WHERE id = ";
  20. befehl += zIni->zWert("ServerId")->getText();
  21. lock();
  22. datenbank->befehl(befehl);
  23. Result res = datenbank->getResult();
  24. unlock();
  25. if (res.zeilenAnzahl == 1)
  26. {
  27. zIni->addWert("ServerPort", res.values[0]);
  28. zIni->addWert("AdminServerPort", res.values[1]);
  29. }
  30. res.destroy();
  31. }
  32. // Destruktor
  33. ISDatenbank::~ISDatenbank()
  34. {
  35. datenbank->release();
  36. DeleteCriticalSection(&cs);
  37. }
  38. // nicht constant
  39. void ISDatenbank::lock()
  40. {
  41. EnterCriticalSection(&cs);
  42. }
  43. void ISDatenbank::unlock()
  44. {
  45. LeaveCriticalSection(&cs);
  46. }
  47. int ISDatenbank::istAdministrator(const char* name, const char* passwort)
  48. {
  49. Text* befehl = new Text("SELECT id FROM benutzer WHERE name = '");
  50. befehl->append(name);
  51. befehl->append("' AND passwort = md5('");
  52. befehl->append(passwort);
  53. befehl->append("')");
  54. lock();
  55. datenbank->befehl(befehl->getText());
  56. Result res = datenbank->getResult();
  57. unlock();
  58. befehl->release();
  59. int ret = 0;
  60. if (res.zeilenAnzahl > 0)
  61. ret = TextZuInt(res.values[0].getText(), 10);
  62. res.destroy();
  63. return ret;
  64. }
  65. bool ISDatenbank::adminHatRecht(int id, int recht)
  66. {
  67. Text* befehl = new Text("SELECT * FROM benutzer_rechte WHERE benutzer_id = ");
  68. befehl->append(id);
  69. befehl->append(" AND rechte_id = ");
  70. befehl->append(recht);
  71. lock();
  72. datenbank->befehl(befehl->getText());
  73. int ret = datenbank->getZeilenAnzahl();
  74. unlock();
  75. befehl->release();
  76. return ret != 0;
  77. }
  78. bool ISDatenbank::proveKlient(int num, int sNum)
  79. {
  80. Text* befehl = new Text("SELECT * FROM server_client WHERE server_id = ");
  81. befehl->append(sNum);
  82. befehl->append(" AND client_id = ");
  83. befehl->append(num);
  84. lock();
  85. datenbank->befehl(befehl->getText());
  86. Result res = datenbank->getResult();
  87. unlock();
  88. befehl->release();
  89. bool ret = 0;
  90. if (res.zeilenAnzahl == 1)
  91. ret = 1;
  92. res.destroy();
  93. return ret;
  94. }
  95. Text* ISDatenbank::getKlientKey(int cId)
  96. {
  97. lock();
  98. if (!datenbank->befehl(Text("SELECT schluessel FROM client WHERE id = ") += cId))
  99. {
  100. unlock();
  101. return 0;
  102. }
  103. Result res = datenbank->getResult();
  104. unlock();
  105. if (!res.zeilenAnzahl)
  106. {
  107. res.destroy();
  108. return 0;
  109. }
  110. Text* ret = new Text(res.values[0].getText());
  111. res.destroy();
  112. return ret;
  113. }
  114. void ISDatenbank::unregisterKlient(int num, int sNum)
  115. {
  116. Text* befehl = new Text("DELETE FROM server_client WHERE client_id = ");
  117. befehl->append(num);
  118. befehl->append(" AND server_id = ");
  119. befehl->append(sNum);
  120. lock();
  121. datenbank->befehl(befehl->getText());
  122. int za = datenbank->getZeilenAnzahl();
  123. unlock();
  124. if (za == 1)
  125. {
  126. befehl->setText("UPDATE server SET tasks = tasks - 1 WHERE id = ");
  127. befehl->append(sNum);
  128. lock();
  129. datenbank->befehl(befehl->getText());
  130. unlock();
  131. }
  132. befehl->release();
  133. }
  134. bool ISDatenbank::setServerStatus(int id, int status)
  135. {
  136. Text* befehl = new Text("UPDATE server SET server_status_id = ");
  137. *befehl += status;
  138. *befehl += "WHERE id = ";
  139. *befehl += id;
  140. lock();
  141. if (!datenbank->befehl(befehl->getText()))
  142. {
  143. unlock();
  144. befehl->release();
  145. return 0;
  146. }
  147. bool ret = datenbank->getZeilenAnzahl() != 0;
  148. unlock();
  149. befehl->release();
  150. return ret;
  151. }
  152. bool ISDatenbank::setMaxClients(int id, int maxC)
  153. {
  154. Text* befehl = new Text("UPDATE server SET max_tasks = ");
  155. befehl->append(maxC);
  156. befehl->append(" WHERE id = ");
  157. befehl->append(id);
  158. lock();
  159. if (!datenbank->befehl(befehl->getText()))
  160. {
  161. unlock();
  162. befehl->release();
  163. return 0;
  164. }
  165. bool ret = datenbank->getZeilenAnzahl() > 0;
  166. unlock();
  167. befehl->release();
  168. return ret;
  169. }
  170. bool ISDatenbank::serverIstNichtPausiert(int id)
  171. {
  172. Text* befehl = new Text("SELECT server_status_id FROM server WHERE id = ");
  173. befehl->append(id);
  174. lock();
  175. if (!datenbank->befehl(befehl->getText()))
  176. {
  177. unlock();
  178. befehl->release();
  179. return 0;
  180. }
  181. Result res = datenbank->getResult();
  182. unlock();
  183. befehl->release();
  184. if (!res.zeilenAnzahl)
  185. {
  186. res.destroy();
  187. return 0;
  188. }
  189. bool ret = (int)res.values[0] == 3;
  190. res.destroy();
  191. return ret;
  192. }
  193. Text* ISDatenbank::getInformationsText(char* typ)
  194. {
  195. lock();
  196. if (!datenbank->befehl("SELECT text, typ FROM info_text ORDER BY insert_datum DESC LIMIT 1"))
  197. {
  198. unlock();
  199. return 0;
  200. }
  201. Result res = datenbank->getResult();
  202. unlock();
  203. if (!res.zeilenAnzahl)
  204. {
  205. res.destroy();
  206. *typ = 0;
  207. return 0;
  208. }
  209. *typ = (char)TextZuInt(res.values[1].getText(), 10);
  210. Text* ret = new Text(res.values[0].getText());
  211. res.destroy();
  212. return ret;
  213. }
  214. bool ISDatenbank::istSpielErlaubt(int spielId)
  215. {
  216. Text* befehl = new Text("SELECT erlaubt FROM spiel_art WHERE id = ");
  217. befehl->append(spielId);
  218. lock();
  219. if (!datenbank->befehl(befehl->getText()))
  220. {
  221. unlock();
  222. befehl->release();
  223. return 0;
  224. }
  225. Result res = datenbank->getResult();
  226. unlock();
  227. befehl->release();
  228. bool ret = 0;
  229. if (res.zeilenAnzahl > 0 && res.values[0].istGleich("t"))
  230. ret = 1;
  231. res.destroy();
  232. return ret;
  233. }
  234. bool ISDatenbank::istKarteErlaubt(int karteId)
  235. {
  236. Text* befehl = new Text("SELECT erlaubt FROM karte WHERE id = ");
  237. befehl->append(karteId);
  238. lock();
  239. if (!datenbank->befehl(befehl->getText()))
  240. {
  241. unlock();
  242. befehl->release();
  243. return 0;
  244. }
  245. Result res = datenbank->getResult();
  246. unlock();
  247. befehl->release();
  248. bool ret = 0;
  249. if (res.zeilenAnzahl > 0 && res.values[0].istGleich("t"))
  250. ret = 1;
  251. res.destroy();
  252. return ret;
  253. }
  254. Text* ISDatenbank::getAccountRufName(int accountId)
  255. {
  256. Text* befehl = new Text("SELECT ruf_name FROM account WHERE id = ");
  257. befehl->append(accountId);
  258. lock();
  259. if (!datenbank->befehl(befehl->getText()))
  260. {
  261. unlock();
  262. befehl->release();
  263. return 0;
  264. }
  265. Result res = datenbank->getResult();
  266. unlock();
  267. befehl->release();
  268. if (!res.zeilenAnzahl)
  269. {
  270. res.destroy();
  271. return 0;
  272. }
  273. Text* ret = new Text(res.values[0].getText());
  274. res.destroy();
  275. return ret;
  276. }
  277. int ISDatenbank::getAccountId(const char* rufName)
  278. {
  279. Text* befehl = new Text("SELECT id FROM account WHERE ruf_name = '");
  280. befehl->append(rufName);
  281. befehl->append("' LIMIT 1");
  282. lock();
  283. if (!datenbank->befehl(befehl->getText()))
  284. {
  285. unlock();
  286. befehl->release();
  287. return 0;
  288. }
  289. Result res = datenbank->getResult();
  290. unlock();
  291. befehl->release();
  292. if (!res.zeilenAnzahl)
  293. {
  294. res.destroy();
  295. return 0;
  296. }
  297. int ret = TextZuInt(res.values[0].getText(), 10);
  298. res.destroy();
  299. return ret;
  300. }
  301. Array< int >* ISDatenbank::getAccountSpielStatistik(int accountId, int spielId)
  302. {
  303. Text* befehl = new Text("SELECT gespielt, gewonnen, verloren, punkte, bw0, bw1, bw2, bw3, bw4, bw5 FROM spiel_statistik WHERE account_id = ");
  304. befehl->append(accountId);
  305. befehl->append(" AND spiel_art_id = ");
  306. befehl->append(spielId);
  307. lock();
  308. if (!datenbank->befehl(befehl->getText()))
  309. {
  310. unlock();
  311. befehl->release();
  312. return 0;
  313. }
  314. Result res = datenbank->getResult();
  315. unlock();
  316. befehl->release();
  317. Array< int >* ret = new Array< int >();
  318. if (!res.zeilenAnzahl)
  319. {
  320. for (int i = 0; i < res.feldAnzahl; i++)
  321. ret->add(0);
  322. res.destroy();
  323. return ret;
  324. }
  325. for (int i = 0; i < res.feldAnzahl; i++)
  326. ret->add(TextZuInt(res.values[i].getText(), 10));
  327. res.destroy();
  328. return ret;
  329. }
  330. int ISDatenbank::getAccountKarteSpiele(int accountId, int karteId)
  331. {
  332. Text* befehl = new Text("SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.id = b.spiel_id AND b.account_id = ");
  333. befehl->append(accountId);
  334. befehl->append(" AND a.karte_id = ");
  335. befehl->append(karteId);
  336. lock();
  337. if (!datenbank->befehl(befehl->getText()))
  338. {
  339. unlock();
  340. befehl->release();
  341. return 0;
  342. }
  343. Result res = datenbank->getResult();
  344. unlock();
  345. befehl->release();
  346. if (!res.zeilenAnzahl)
  347. {
  348. res.destroy();
  349. return 0;
  350. }
  351. int ret = (int)res.values[0];
  352. res.destroy();
  353. return ret;
  354. }
  355. int ISDatenbank::getAccountKarteSpieleGewonnen(int accountId, int karteId)
  356. {
  357. Text* befehl = new Text("SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.id = b.spiel_id "
  358. "AND b.spiel_spieler_status_id = 2 AND b.account_id = ");
  359. befehl->append(accountId);
  360. befehl->append(" AND a.karte_id = ");
  361. befehl->append(karteId);
  362. lock();
  363. if (!datenbank->befehl(befehl->getText()))
  364. {
  365. unlock();
  366. befehl->release();
  367. return 0;
  368. }
  369. Result res = datenbank->getResult();
  370. unlock();
  371. befehl->release();
  372. if (!res.zeilenAnzahl)
  373. {
  374. res.destroy();
  375. return 0;
  376. }
  377. int ret = (int)res.values[0];
  378. res.destroy();
  379. return ret;
  380. }
  381. Text* ISDatenbank::getKarteName(int karteId)
  382. {
  383. Text* befehl = new Text("SELECT name FROM karte WHERE id = ");
  384. befehl->append(karteId);
  385. lock();
  386. if (!datenbank->befehl(befehl->getText()))
  387. {
  388. unlock();
  389. befehl->release();
  390. return 0;
  391. }
  392. Result res = datenbank->getResult();
  393. unlock();
  394. befehl->release();
  395. if (!res.zeilenAnzahl)
  396. {
  397. res.destroy();
  398. return 0;
  399. }
  400. Text* ret = new Text(res.values[0].getText());
  401. res.destroy();
  402. return ret;
  403. }
  404. Text* ISDatenbank::getSpielName(int spielId)
  405. {
  406. Text* befehl = new Text("SELECT name FROM spiel_art WHERE id = ");
  407. befehl->append(spielId);
  408. lock();
  409. if (!datenbank->befehl(befehl->getText()))
  410. {
  411. unlock();
  412. befehl->release();
  413. return 0;
  414. }
  415. Result res = datenbank->getResult();
  416. unlock();
  417. befehl->release();
  418. if (!res.zeilenAnzahl)
  419. {
  420. res.destroy();
  421. return 0;
  422. }
  423. Text* ret = new Text(res.values[0].getText());
  424. res.destroy();
  425. return ret;
  426. }
  427. Text* ISDatenbank::getChatroomName(int chatroomId)
  428. {
  429. Text* befehl = new Text("SELECT name FROM chatroom WHERE id = ");
  430. befehl->append(chatroomId);
  431. lock();
  432. if (!datenbank->befehl(befehl->getText()))
  433. {
  434. unlock();
  435. befehl->release();
  436. return 0;
  437. }
  438. Result res = datenbank->getResult();
  439. unlock();
  440. befehl->release();
  441. if (!res.zeilenAnzahl)
  442. {
  443. res.destroy();
  444. return 0;
  445. }
  446. Text* ret = new Text(res.values[0].getText());
  447. res.destroy();
  448. return ret;
  449. }
  450. int ISDatenbank::getChatroomId(const char* name)
  451. {
  452. Text* befehl = new Text("SELECT id FROM chatroom WHERE name = '");
  453. befehl->append(name);
  454. befehl->append("' LIMIT 1");
  455. lock();
  456. if (!datenbank->befehl(befehl->getText()))
  457. {
  458. unlock();
  459. befehl->release();
  460. return 0;
  461. }
  462. Result res = datenbank->getResult();
  463. unlock();
  464. befehl->release();
  465. if (!res.zeilenAnzahl)
  466. {
  467. res.destroy();
  468. return 0;
  469. }
  470. int ret = TextZuInt(res.values[0].getText(), 10);
  471. res.destroy();
  472. return ret;
  473. }
  474. int ISDatenbank::getSpielId(int karteId)
  475. {
  476. Text* befehl = new Text("SELECT spiel_art_id FROM karte WHERE id = ");
  477. befehl->append(karteId);
  478. lock();
  479. if (!datenbank->befehl(befehl->getText()))
  480. {
  481. unlock();
  482. befehl->release();
  483. return 0;
  484. }
  485. Result res = datenbank->getResult();
  486. unlock();
  487. befehl->release();
  488. if (!res.zeilenAnzahl)
  489. {
  490. res.destroy();
  491. return 0;
  492. }
  493. int ret = TextZuInt(res.values[0].getText(), 10);
  494. res.destroy();
  495. return ret;
  496. }
  497. int ISDatenbank::getSpielId(const char* name)
  498. {
  499. Text* befehl = new Text("SELECT id FROM spiel_art WHERE name = '");
  500. befehl->append(name);
  501. befehl->append("'");
  502. lock();
  503. if (!datenbank->befehl(befehl->getText()))
  504. {
  505. unlock();
  506. befehl->release();
  507. return 0;
  508. }
  509. Result res = datenbank->getResult();
  510. unlock();
  511. befehl->release();
  512. if (!res.zeilenAnzahl)
  513. {
  514. res.destroy();
  515. return 0;
  516. }
  517. int ret = TextZuInt(res.values[0].getText(), 10);
  518. res.destroy();
  519. return ret;
  520. }
  521. int ISDatenbank::getKarteId(const char* name)
  522. {
  523. Text* befehl = new Text("SELECT id FROM karte WHERE name = '");
  524. befehl->append(name);
  525. befehl->append("'");
  526. lock();
  527. if (!datenbank->befehl(befehl->getText()))
  528. {
  529. unlock();
  530. befehl->release();
  531. return 0;
  532. }
  533. Result res = datenbank->getResult();
  534. unlock();
  535. befehl->release();
  536. if (!res.zeilenAnzahl)
  537. {
  538. res.destroy();
  539. return 0;
  540. }
  541. int ret = TextZuInt(res.values[0].getText(), 10);
  542. res.destroy();
  543. return ret;
  544. }
  545. int ISDatenbank::getGruppenKarteId(int gruppeId)
  546. {
  547. Text* befehl = new Text("SELECT karte_id FROM gruppe WHERE id = ");
  548. befehl->append(gruppeId);
  549. lock();
  550. if (!datenbank->befehl(befehl->getText()))
  551. {
  552. unlock();
  553. befehl->release();
  554. return 0;
  555. }
  556. Result res = datenbank->getResult();
  557. unlock();
  558. befehl->release();
  559. if (!res.zeilenAnzahl)
  560. {
  561. res.destroy();
  562. return 0;
  563. }
  564. int ret = TextZuInt(res.values[0].getText(), 10);
  565. res.destroy();
  566. return ret;
  567. }
  568. int ISDatenbank::getGruppeAdminId(int gruppeId)
  569. {
  570. Text* befehl = new Text("SELECT admin_account_id FROM gruppe WHERE id = ");
  571. befehl->append(gruppeId);
  572. lock();
  573. if (!datenbank->befehl(befehl->getText()))
  574. {
  575. unlock();
  576. befehl->release();
  577. return 0;
  578. }
  579. Result res = datenbank->getResult();
  580. unlock();
  581. befehl->release();
  582. if (!res.zeilenAnzahl)
  583. {
  584. res.destroy();
  585. return 0;
  586. }
  587. int ret = TextZuInt(res.values[0].getText(), 10);
  588. res.destroy();
  589. return ret;
  590. }
  591. int ISDatenbank::getSpielerPunkte(int spielId, int accountId)
  592. {
  593. Text* befehl = new Text("SELECT sum( b.punkte ) FROM spiel a, spiel_spieler b, karte c WHERE a.karte_id = c.id "
  594. "AND a.spiel_status_id = 5 AND c.spiel_art_id = ");
  595. befehl->append(spielId);
  596. befehl->append(" AND b.spiel_id = a.id AND b.account_id = ");
  597. befehl->append(accountId);
  598. lock();
  599. if (!datenbank->befehl(befehl->getText()))
  600. {
  601. unlock();
  602. befehl->release();
  603. return 0;
  604. }
  605. Result res = datenbank->getResult();
  606. unlock();
  607. befehl->release();
  608. if (!res.zeilenAnzahl)
  609. {
  610. res.destroy();
  611. return 0;
  612. }
  613. int ret = TextZuInt(res.values[0].getText(), 10);
  614. res.destroy();
  615. return ret;
  616. }
  617. Array< int >* ISDatenbank::getAccountSpielArtListe(int cId)
  618. {
  619. Text* befehl = new Text("SELECT a.spiel_art_id FROM spiel_art_account a, account_client b "
  620. "WHERE a.account_id = b.account_id AND a.end_dat IS NULL AND b.client_id = ");
  621. befehl->append(cId);
  622. lock();
  623. if (!datenbank->befehl(befehl->getText()))
  624. {
  625. unlock();
  626. befehl->release();
  627. return 0;
  628. }
  629. Result res = datenbank->getResult();
  630. unlock();
  631. befehl->release();
  632. Array< int >* ret = new Array< int >();
  633. for (int i = 0; i < res.zeilenAnzahl; i++)
  634. ret->add(TextZuInt(res.values[i].getText(), 10));
  635. res.destroy();
  636. return ret;
  637. }
  638. int ISDatenbank::getNeusteSpielVersion(int sId)
  639. {
  640. Text* befehl = new Text("SELECT a.version FROM datei_gruppe a, spiel_art b WHERE a.id = b.datei_gruppe_id AND b.id = ");
  641. befehl->append(sId);
  642. lock();
  643. if (!datenbank->befehl(befehl->getText()))
  644. {
  645. unlock();
  646. befehl->release();
  647. return 0;
  648. }
  649. Result res = datenbank->getResult();
  650. unlock();
  651. befehl->release();
  652. if (!res.zeilenAnzahl)
  653. {
  654. res.destroy();
  655. return 0;
  656. }
  657. int ret = TextZuInt(res.values[0].getText(), 10);
  658. res.destroy();
  659. return ret;
  660. }
  661. int ISDatenbank::getKupfer(int cId)
  662. {
  663. Text* befehl = new Text("SELECT a.kupfer FROM account a, account_client b WHERE a.id = b.account_id AND b.client_id = ");
  664. befehl->append(cId);
  665. lock();
  666. if (!datenbank->befehl(befehl->getText()))
  667. {
  668. unlock();
  669. befehl->release();
  670. return 0;
  671. }
  672. Result res = datenbank->getResult();
  673. unlock();
  674. befehl->release();
  675. if (!res.zeilenAnzahl)
  676. {
  677. res.destroy();
  678. return 0;
  679. }
  680. int ret = TextZuInt(res.values[0].getText(), 10);
  681. res.destroy();
  682. return ret;
  683. }
  684. int ISDatenbank::getDateiGruppeVonSpiel(int sId)
  685. {
  686. Text* befehl = new Text("SELECT datei_gruppe_id FROM spiel_art WHERE id = ");
  687. befehl->append(sId);
  688. lock();
  689. if (!datenbank->befehl(befehl->getText()))
  690. {
  691. unlock();
  692. befehl->release();
  693. return 0;
  694. }
  695. Result res = datenbank->getResult();
  696. unlock();
  697. befehl->release();
  698. if (!res.zeilenAnzahl)
  699. {
  700. res.destroy();
  701. return 0;
  702. }
  703. int ret = TextZuInt(res.values[0].getText(), 10);
  704. res.destroy();
  705. return ret;
  706. }
  707. Text* ISDatenbank::getDateiGruppePfad(int dgId)
  708. {
  709. Text* befehl = new Text("SELECT pfad FROM datei_gruppe WHERE id = ");
  710. befehl->append(dgId);
  711. lock();
  712. if (!datenbank->befehl(befehl->getText()))
  713. {
  714. unlock();
  715. befehl->release();
  716. return 0;
  717. }
  718. Result res = datenbank->getResult();
  719. unlock();
  720. befehl->release();
  721. if (!res.zeilenAnzahl)
  722. {
  723. res.destroy();
  724. return 0;
  725. }
  726. Text* ret = new Text(res.values[0].getText());
  727. res.destroy();
  728. return ret;
  729. }
  730. Array< int >* ISDatenbank::getAccountKarteListe(int cId, int sId)
  731. {
  732. Text* befehl = new Text("SELECT a.karte_id FROM karte_account a, account_client b, karte c "
  733. "WHERE c.id = a.karte_id AND a.account_id = b.account_id AND a.end_dat IS NULL AND b.client_id = ");
  734. befehl->append(cId);
  735. befehl->append(" AND c.spiel_art_id = ");
  736. befehl->append(sId);
  737. lock();
  738. if (!datenbank->befehl(befehl->getText()))
  739. {
  740. unlock();
  741. befehl->release();
  742. return 0;
  743. }
  744. Result res = datenbank->getResult();
  745. unlock();
  746. befehl->release();
  747. Array< int >* ret = new Array< int >();
  748. for (int i = 0; i < res.zeilenAnzahl; i++)
  749. ret->add(TextZuInt(res.values[i].getText(), 10));
  750. res.destroy();
  751. return ret;
  752. }
  753. bool ISDatenbank::hatAccountKarte(int account, int karte)
  754. {
  755. Text* befehl = new Text("SELECT karte_id FROM karte_account WHERE end_dat IS NULL AND karte_id = ");
  756. befehl->append(karte);
  757. befehl->append(" AND account_id = ");
  758. befehl->append(account);
  759. lock();
  760. if (!datenbank->befehl(befehl->getText()))
  761. {
  762. unlock();
  763. befehl->release();
  764. return 0;
  765. }
  766. bool ret = datenbank->getZeilenAnzahl() != 0;
  767. unlock();
  768. befehl->release();
  769. return ret;
  770. }
  771. bool ISDatenbank::hatAccountSpiel(int account, int spiel)
  772. {
  773. Text* befehl = new Text("SELECT spiel_art_id FROM spiel_art_account WHERE end_dat IS NULL AND spiel_art_id = ");
  774. befehl->append(spiel);
  775. befehl->append(" AND account_id = ");
  776. befehl->append(account);
  777. lock();
  778. if (!datenbank->befehl(befehl->getText()))
  779. {
  780. unlock();
  781. befehl->release();
  782. return 0;
  783. }
  784. bool ret = datenbank->getZeilenAnzahl() != 0;
  785. unlock();
  786. befehl->release();
  787. return ret;
  788. }
  789. Array< int >* ISDatenbank::getAccountKarteGespieltListe(int accountId, int spielArt)
  790. {
  791. Text* befehl = new Text("SELECT distinct( c.id ) FROM spiel a, spiel_spieler b, karte c WHERE "
  792. "a.karte_id = c.id AND b.spiel_id = a.id AND b.account_id = ");
  793. befehl->append(accountId);
  794. befehl->append(" AND c.spiel_art_id = ");
  795. befehl->append(spielArt);
  796. lock();
  797. if (!datenbank->befehl(befehl->getText()))
  798. {
  799. unlock();
  800. befehl->release();
  801. return 0;
  802. }
  803. Result res = datenbank->getResult();
  804. unlock();
  805. befehl->release();
  806. Array< int >* ret = new Array< int >();
  807. for (int i = 0; i < res.zeilenAnzahl; i++)
  808. ret->set((int)res.values[i], i);
  809. res.destroy();
  810. return ret;
  811. }
  812. Array< int >* ISDatenbank::getAccountSpielGespieltListe(int accountId)
  813. {
  814. Text* befehl = new Text("SELECT distinct( c.spiel_art_id ) FROM spiel a, spiel_spieler b, karte c WHERE "
  815. "a.karte_id = c.id AND b.spiel_id = a.id AND b.account_id = ");
  816. befehl->append(accountId);
  817. lock();
  818. if (!datenbank->befehl(befehl->getText()))
  819. {
  820. unlock();
  821. befehl->release();
  822. return 0;
  823. }
  824. Result res = datenbank->getResult();
  825. unlock();
  826. befehl->release();
  827. Array< int >* ret = new Array< int >();
  828. for (int i = 0; i < res.zeilenAnzahl; i++)
  829. ret->add((int)res.values[i]);
  830. res.destroy();
  831. return ret;
  832. }
  833. int ISDatenbank::getDateiGruppeVonPfad(const char* pfad)
  834. {
  835. Text* befehl = new Text("SELECT id FROM datei_gruppe WHERE pfad = '");
  836. befehl->append(pfad);
  837. befehl->append("'");
  838. lock();
  839. if (!datenbank->befehl(befehl->getText()))
  840. {
  841. unlock();
  842. befehl->release();
  843. return 0;
  844. }
  845. Result res = datenbank->getResult();
  846. unlock();
  847. befehl->release();
  848. if (!res.zeilenAnzahl)
  849. {
  850. res.destroy();
  851. return 0;
  852. }
  853. int ret = TextZuInt(res.values[0].getText(), 10);
  854. res.destroy();
  855. return ret;
  856. }
  857. int ISDatenbank::getNeusteDateiGruppe(int dg)
  858. {
  859. Text* befehl = new Text("SELECT version FROM datei_gruppe WHERE id = ");
  860. befehl->append(dg);
  861. lock();
  862. if (!datenbank->befehl(befehl->getText()))
  863. {
  864. unlock();
  865. befehl->release();
  866. return 0;
  867. }
  868. Result res = datenbank->getResult();
  869. unlock();
  870. befehl->release();
  871. if (!res.zeilenAnzahl)
  872. {
  873. res.destroy();
  874. return 0;
  875. }
  876. int ret = TextZuInt(res.values[0].getText(), 10);
  877. res.destroy();
  878. return ret;
  879. }
  880. bool ISDatenbank::getGruppeSpielerAdd(int gruppeId)
  881. {
  882. Text* befehl = new Text("SELECT spiel_starten FROM gruppe WHERE id = ");
  883. befehl->append(gruppeId);
  884. lock();
  885. if (!datenbank->befehl(befehl->getText()))
  886. {
  887. unlock();
  888. befehl->release();
  889. return 0;
  890. }
  891. Result res = datenbank->getResult();
  892. unlock();
  893. befehl->release();
  894. if (!res.zeilenAnzahl)
  895. {
  896. res.destroy();
  897. return 0;
  898. }
  899. bool ret = res.values[0].istGleich("f");
  900. res.destroy();
  901. return ret;
  902. }
  903. Result ISDatenbank::getSpielerListe(const char* suche, int* seite, int* maxSeite, int sortStalte, bool backwords)
  904. {
  905. Text* befehl = new Text("SELECT count( a.id ) FROM account a, "
  906. "( SELECT a.id, max( b.datum ) "
  907. " FROM account a LEFT JOIN "
  908. " ( SELECT g.spiel_art_id, i.account_id"
  909. " FROM karte g, spiel h, spiel_spieler i "
  910. " WHERE i.spiel_id = h.id AND h.karte_id = g.id AND h.beginn_datum = "
  911. " ( SELECT max( x.beginn_datum ) FROM spiel x, spiel_spieler y WHERE y.spiel_id = x.id AND y.account_id = i.account_id ) ) f ON a.id = f.account_id "
  912. " LEFT JOIN account_online b ON b.account_id = a.id "
  913. " LEFT JOIN spiel_statistik e ON e.account_id = a.id "
  914. " LEFT JOIN spiel_art c ON c.id = f.spiel_art_id "
  915. " LEFT JOIN karte d ON c.id = d.spiel_art_id "
  916. " WHERE a.name LIKE '");
  917. befehl->append(suche);
  918. befehl->append("' AND d.spiel_art_id = c.id "
  919. " AND e.spiel_art_id = f.spiel_art_id "
  920. " GROUP BY a.id ) b "
  921. "WHERE a.id = b.id");
  922. lock();
  923. if (!datenbank->befehl(*befehl))
  924. {
  925. unlock();
  926. befehl->release();
  927. Result res = { 0, 0, 0, 0 };
  928. return res;
  929. }
  930. Result res = datenbank->getResult();
  931. unlock();
  932. if (!res.zeilenAnzahl)
  933. {
  934. res.destroy();
  935. befehl->release();
  936. Result res = { 0, 0, 0, 0 };
  937. return res;
  938. }
  939. int entrys = (int)res.values[0];
  940. res.destroy();
  941. *maxSeite = entrys / 21;
  942. if (entrys % 21)
  943. (*maxSeite)++;
  944. if (*seite > *maxSeite)
  945. *seite = *maxSeite;
  946. if (!(*seite))
  947. {
  948. befehl->release();
  949. Result res = { 0, 0, 0, 0 };
  950. return res;
  951. }
  952. befehl->setText("SELECT a.id, a.ruf_name, max( b.datum ), c.name, d.name, e.punkte "
  953. "FROM account a LEFT JOIN "
  954. "( SELECT g.spiel_art_id, i.account_id "
  955. " FROM karte g, spiel h, spiel_spieler i "
  956. " WHERE i.spiel_id = h.id AND h.karte_id = g.id AND h.beginn_datum = "
  957. "( SELECT max( x.beginn_datum ) FROM spiel x, spiel_spieler y WHERE y.spiel_id = x.id AND y.account_id = i.account_id ) ) f ON a.id = f.account_id "
  958. "LEFT JOIN account_online b ON b.account_id = a.id "
  959. "LEFT JOIN spiel_statistik e ON e.account_id = a.id "
  960. "LEFT JOIN spiel_art c ON c.id = f.spiel_art_id "
  961. "LEFT JOIN karte d ON c.id = d.spiel_art_id "
  962. "WHERE a.name LIKE '");
  963. befehl->append(suche);
  964. befehl->append("' AND ( d.spiel_art_id = c.id "
  965. "AND e.spiel_art_id = f.spiel_art_id ) "
  966. "OR d.spiel_art_id IS NULL "
  967. "GROUP BY a.id, a.ruf_name, c.name, d.name, e.punkte ORDER BY ");
  968. befehl->append(sortStalte + 2);
  969. if (backwords)
  970. befehl->append(" DESC");
  971. befehl->append(" OFFSET ");
  972. befehl->append(((*seite) - 1) * 21);
  973. befehl->append(" LIMIT 21");
  974. lock();
  975. if (!datenbank->befehl(*befehl))
  976. {
  977. unlock();
  978. befehl->release();
  979. Result res = { 0, 0, 0, 0 };
  980. return res;
  981. }
  982. res = datenbank->getResult();
  983. unlock();
  984. befehl->release();
  985. return res;
  986. }
  987. bool ISDatenbank::getSpielerAktivity(int accountId, RCArray< Text >* datum, Array< double >* stOnline, Array< double >* stGespielt,
  988. Array< int >* anzSpiele, Array< int >* anzGewonnen)
  989. {
  990. Datum* beg = getDatum();
  991. Datum* end = getDatum();
  992. beg->minusTag(29);
  993. end->minusTag(29);
  994. end->plusTag(1);
  995. for (int i = 0; i < 30; i++)
  996. { // 30 Tage Rückblick
  997. datum->add(beg->getDatum("d-m-y"));
  998. Text* b = beg->getDatum("y-m-d");
  999. Text* e = end->getDatum("y-m-d");
  1000. stOnline->add(getOnlineSeconds(accountId, *b, *e) / (60.0 * 60));
  1001. stGespielt->add(getGespieltSeconds(accountId, *b, *e) / (60.0 * 60));
  1002. anzSpiele->add(getGespieltSpiele(accountId, *b, *e));
  1003. anzGewonnen->add(getGewonnenSpiele(accountId, *b, *e));
  1004. b->release();
  1005. e->release();
  1006. beg->plusTag(1);
  1007. end->plusTag(1);
  1008. }
  1009. return 1;
  1010. }
  1011. int ISDatenbank::getOnlineSeconds(int accountId, const char* beg, const char* end)
  1012. {
  1013. int sec = 0;
  1014. Text* befehl = new Text("SELECT date_part( 'epoch', ( SELECT sum( now() - '");
  1015. befehl->append(beg);
  1016. befehl->append("' ) FROM account_online WHERE datum < '");
  1017. befehl->append(beg);
  1018. befehl->append("' AND now() < '");
  1019. befehl->append(end);
  1020. befehl->append("' AND now() > '");
  1021. befehl->append(beg);
  1022. befehl->append("' AND end_datum IS NULL AND account_id = ");
  1023. befehl->append(accountId);
  1024. befehl->append(" )::INTERVAL )");
  1025. lock();
  1026. if (!datenbank->befehl(*befehl))
  1027. {
  1028. unlock();
  1029. befehl->release();
  1030. return 0;
  1031. }
  1032. Result res = datenbank->getResult();
  1033. unlock();
  1034. if (res.zeilenAnzahl)
  1035. sec += (int)res.values[0];
  1036. res.destroy();
  1037. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( now() - datum ) FROM account_online WHERE datum > '");
  1038. befehl->append(beg);
  1039. befehl->append("' AND now() < '");
  1040. befehl->append(end);
  1041. befehl->append("' AND end_datum IS NULL AND account_id = ");
  1042. befehl->append(accountId);
  1043. befehl->append(" )::INTERVAL )");
  1044. lock();
  1045. if (!datenbank->befehl(*befehl))
  1046. {
  1047. unlock();
  1048. befehl->release();
  1049. return 0;
  1050. }
  1051. res = datenbank->getResult();
  1052. unlock();
  1053. if (res.zeilenAnzahl)
  1054. sec += (int)res.values[0];
  1055. res.destroy();
  1056. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1057. befehl->append(end);
  1058. befehl->append("' - datum ) FROM account_online WHERE datum > '");
  1059. befehl->append(beg);
  1060. befehl->append("' AND datum < '");
  1061. befehl->append(end);
  1062. befehl->append("' AND now() > '");
  1063. befehl->append(end);
  1064. befehl->append("' AND end_datum IS NULL AND account_id = ");
  1065. befehl->append(accountId);
  1066. befehl->append(" )::INTERVAL )");
  1067. lock();
  1068. if (!datenbank->befehl(*befehl))
  1069. {
  1070. unlock();
  1071. befehl->release();
  1072. return 0;
  1073. }
  1074. res = datenbank->getResult();
  1075. unlock();
  1076. if (res.zeilenAnzahl)
  1077. sec += (int)res.values[0];
  1078. res.destroy();
  1079. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1080. befehl->append(end);
  1081. befehl->append("'::TIMESTAMP WITH TIME ZONE - '");
  1082. befehl->append(beg);
  1083. befehl->append("' ) FROM account_online WHERE datum < '");
  1084. befehl->append(beg);
  1085. befehl->append("' AND now() > '");
  1086. befehl->append(end);
  1087. befehl->append("' AND end_datum IS NULL AND account_id = ");
  1088. befehl->append(accountId);
  1089. befehl->append(" )::INTERVAL )");
  1090. lock();
  1091. if (!datenbank->befehl(*befehl))
  1092. {
  1093. unlock();
  1094. befehl->release();
  1095. return 0;
  1096. }
  1097. res = datenbank->getResult();
  1098. unlock();
  1099. if (res.zeilenAnzahl)
  1100. sec += (int)res.values[0];
  1101. res.destroy();
  1102. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( end_datum - '");
  1103. befehl->append(beg);
  1104. befehl->append("' ) FROM account_online WHERE datum < '");
  1105. befehl->append(beg);
  1106. befehl->append("' AND end_datum < '");
  1107. befehl->append(end);
  1108. befehl->append("' AND end_datum > '");
  1109. befehl->append(beg);
  1110. befehl->append("' AND account_id = ");
  1111. befehl->append(accountId);
  1112. befehl->append(" )::INTERVAL )");
  1113. lock();
  1114. if (!datenbank->befehl(*befehl))
  1115. {
  1116. unlock();
  1117. befehl->release();
  1118. return 0;
  1119. }
  1120. res = datenbank->getResult();
  1121. unlock();
  1122. if (res.zeilenAnzahl)
  1123. sec += (int)res.values[0];
  1124. res.destroy();
  1125. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( end_datum - datum ) FROM account_online WHERE datum > '");
  1126. befehl->append(beg);
  1127. befehl->append("' AND end_datum < '");
  1128. befehl->append(end);
  1129. befehl->append("' AND account_id = ");
  1130. befehl->append(accountId);
  1131. befehl->append(" )::INTERVAL )");
  1132. lock();
  1133. if (!datenbank->befehl(*befehl))
  1134. {
  1135. unlock();
  1136. befehl->release();
  1137. return 0;
  1138. }
  1139. res = datenbank->getResult();
  1140. unlock();
  1141. if (res.zeilenAnzahl)
  1142. sec += (int)res.values[0];
  1143. res.destroy();
  1144. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1145. befehl->append(end);
  1146. befehl->append("' - datum ) FROM account_online WHERE datum > '");
  1147. befehl->append(beg);
  1148. befehl->append("' AND datum < '");
  1149. befehl->append(end);
  1150. befehl->append("' AND end_datum > '");
  1151. befehl->append(end);
  1152. befehl->append("' AND account_id = ");
  1153. befehl->append(accountId);
  1154. befehl->append(" )::INTERVAL )");
  1155. lock();
  1156. if (!datenbank->befehl(*befehl))
  1157. {
  1158. unlock();
  1159. befehl->release();
  1160. return 0;
  1161. }
  1162. res = datenbank->getResult();
  1163. unlock();
  1164. if (res.zeilenAnzahl)
  1165. sec += (int)res.values[0];
  1166. res.destroy();
  1167. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1168. befehl->append(end);
  1169. befehl->append("'::TIMESTAMP WITH TIME ZONE - '");
  1170. befehl->append(beg);
  1171. befehl->append("' ) FROM account_online WHERE datum < '");
  1172. befehl->append(beg);
  1173. befehl->append("' AND end_datum > '");
  1174. befehl->append(end);
  1175. befehl->append("' AND account_id = ");
  1176. befehl->append(accountId);
  1177. befehl->append(" )::INTERVAL )");
  1178. lock();
  1179. if (!datenbank->befehl(*befehl))
  1180. {
  1181. unlock();
  1182. befehl->release();
  1183. return 0;
  1184. }
  1185. res = datenbank->getResult();
  1186. unlock();
  1187. if (res.zeilenAnzahl)
  1188. sec += (int)res.values[0];
  1189. res.destroy();
  1190. befehl->release();
  1191. return sec;
  1192. }
  1193. int ISDatenbank::getGespieltSeconds(int accountId, const char* beg, const char* end)
  1194. {
  1195. int sec = 0;
  1196. Text* befehl = new Text("SELECT date_part( 'epoch', ( SELECT sum( now() - '");
  1197. befehl->append(beg);
  1198. befehl->append("' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '");
  1199. befehl->append(beg);
  1200. befehl->append("' AND now() < '");
  1201. befehl->append(end);
  1202. befehl->append("' AND now() > '");
  1203. befehl->append(beg);
  1204. befehl->append("' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = ");
  1205. befehl->append(accountId);
  1206. befehl->append(" )::INTERVAL )");
  1207. lock();
  1208. if (!datenbank->befehl(*befehl))
  1209. {
  1210. unlock();
  1211. befehl->release();
  1212. return 0;
  1213. }
  1214. Result res = datenbank->getResult();
  1215. unlock();
  1216. if (res.zeilenAnzahl)
  1217. sec += (int)res.values[0];
  1218. res.destroy();
  1219. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( now() - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '");
  1220. befehl->append(beg);
  1221. befehl->append("' AND now() < '");
  1222. befehl->append(end);
  1223. befehl->append("' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = ");
  1224. befehl->append(accountId);
  1225. befehl->append(" )::INTERVAL )");
  1226. lock();
  1227. if (!datenbank->befehl(*befehl))
  1228. {
  1229. unlock();
  1230. befehl->release();
  1231. return 0;
  1232. }
  1233. res = datenbank->getResult();
  1234. unlock();
  1235. if (res.zeilenAnzahl)
  1236. sec += (int)res.values[0];
  1237. res.destroy();
  1238. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1239. befehl->append(end);
  1240. befehl->append("' - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '");
  1241. befehl->append(beg);
  1242. befehl->append("' AND a.beginn_datum < '");
  1243. befehl->append(end);
  1244. befehl->append("' AND now() > '");
  1245. befehl->append(end);
  1246. befehl->append("' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = ");
  1247. befehl->append(accountId);
  1248. befehl->append(" )::INTERVAL )");
  1249. lock();
  1250. if (!datenbank->befehl(*befehl))
  1251. {
  1252. unlock();
  1253. befehl->release();
  1254. return 0;
  1255. }
  1256. res = datenbank->getResult();
  1257. unlock();
  1258. if (res.zeilenAnzahl)
  1259. sec += (int)res.values[0];
  1260. res.destroy();
  1261. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1262. befehl->append(end);
  1263. befehl->append("'::TIMESTAMP WITH TIME ZONE - '");
  1264. befehl->append(beg);
  1265. befehl->append("' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '");
  1266. befehl->append(beg);
  1267. befehl->append("' AND now() > '");
  1268. befehl->append(end);
  1269. befehl->append("' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = ");
  1270. befehl->append(accountId);
  1271. befehl->append(" )::INTERVAL )");
  1272. lock();
  1273. if (!datenbank->befehl(*befehl))
  1274. {
  1275. unlock();
  1276. befehl->release();
  1277. return 0;
  1278. }
  1279. res = datenbank->getResult();
  1280. unlock();
  1281. if (res.zeilenAnzahl)
  1282. sec += (int)res.values[0];
  1283. res.destroy();
  1284. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( a.end_datum - '");
  1285. befehl->append(beg);
  1286. befehl->append("' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '");
  1287. befehl->append(beg);
  1288. befehl->append("' AND a.end_datum < '");
  1289. befehl->append(end);
  1290. befehl->append("' AND a.end_datum > '");
  1291. befehl->append(beg);
  1292. befehl->append("' AND a.id = b.spiel_id AND b.account_id = ");
  1293. befehl->append(accountId);
  1294. befehl->append(" )::INTERVAL )");
  1295. lock();
  1296. if (!datenbank->befehl(*befehl))
  1297. {
  1298. unlock();
  1299. befehl->release();
  1300. return 0;
  1301. }
  1302. res = datenbank->getResult();
  1303. unlock();
  1304. if (res.zeilenAnzahl)
  1305. sec += (int)res.values[0];
  1306. res.destroy();
  1307. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( a.end_datum - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '");
  1308. befehl->append(beg);
  1309. befehl->append("' AND a.end_datum < '");
  1310. befehl->append(end);
  1311. befehl->append("' AND a.id = b.spiel_id AND b.account_id = ");
  1312. befehl->append(accountId);
  1313. befehl->append(" )::INTERVAL )");
  1314. lock();
  1315. if (!datenbank->befehl(*befehl))
  1316. {
  1317. unlock();
  1318. befehl->release();
  1319. return 0;
  1320. }
  1321. res = datenbank->getResult();
  1322. unlock();
  1323. if (res.zeilenAnzahl)
  1324. sec += (int)res.values[0];
  1325. res.destroy();
  1326. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1327. befehl->append(end);
  1328. befehl->append("' - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '");
  1329. befehl->append(beg);
  1330. befehl->append("' AND a.beginn_datum < '");
  1331. befehl->append(end);
  1332. befehl->append("' AND a.end_datum > '");
  1333. befehl->append(end);
  1334. befehl->append("' AND a.id = b.spiel_id AND account_id = ");
  1335. befehl->append(accountId);
  1336. befehl->append(" )::INTERVAL )");
  1337. lock();
  1338. if (!datenbank->befehl(*befehl))
  1339. {
  1340. unlock();
  1341. befehl->release();
  1342. return 0;
  1343. }
  1344. res = datenbank->getResult();
  1345. unlock();
  1346. if (res.zeilenAnzahl)
  1347. sec += (int)res.values[0];
  1348. res.destroy();
  1349. befehl->setText("SELECT date_part( 'epoch', ( SELECT sum( '");
  1350. befehl->append(end);
  1351. befehl->append("'::TIMESTAMP WITH TIME ZONE - '");
  1352. befehl->append(beg);
  1353. befehl->append("' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '");
  1354. befehl->append(beg);
  1355. befehl->append("' AND a.end_datum > '");
  1356. befehl->append(end);
  1357. befehl->append("' AND a.id = b.spiel_id AND account_id = ");
  1358. befehl->append(accountId);
  1359. befehl->append(" )::INTERVAL )");
  1360. lock();
  1361. if (!datenbank->befehl(*befehl))
  1362. {
  1363. unlock();
  1364. befehl->release();
  1365. return 0;
  1366. }
  1367. res = datenbank->getResult();
  1368. unlock();
  1369. if (res.zeilenAnzahl)
  1370. sec += (int)res.values[0];
  1371. res.destroy();
  1372. befehl->release();
  1373. return sec;
  1374. }
  1375. int ISDatenbank::getGespieltSpiele(int accountId, const char* beg, const char* end)
  1376. {
  1377. int anz = 0;
  1378. Text* befehl = new Text("SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '");
  1379. befehl->append(beg);
  1380. befehl->append("' AND a.end_datum < '");
  1381. befehl->append(end);
  1382. befehl->append("' AND a.end_datum > '");
  1383. befehl->append(beg);
  1384. befehl->append("' AND a.id = b.spiel_id AND b.account_id = ");
  1385. befehl->append(accountId);
  1386. lock();
  1387. if (!datenbank->befehl(*befehl))
  1388. {
  1389. unlock();
  1390. befehl->release();
  1391. return 0;
  1392. }
  1393. Result res = datenbank->getResult();
  1394. unlock();
  1395. if (res.zeilenAnzahl)
  1396. anz += (int)res.values[0];
  1397. res.destroy();
  1398. befehl->setText("SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '");
  1399. befehl->append(beg);
  1400. befehl->append("' AND a.end_datum < '");
  1401. befehl->append(end);
  1402. befehl->append("' AND a.id = b.spiel_id AND b.account_id = ");
  1403. befehl->append(accountId);
  1404. lock();
  1405. if (!datenbank->befehl(*befehl))
  1406. {
  1407. unlock();
  1408. befehl->release();
  1409. return 0;
  1410. }
  1411. res = datenbank->getResult();
  1412. unlock();
  1413. if (res.zeilenAnzahl)
  1414. anz += (int)res.values[0];
  1415. res.destroy();
  1416. befehl->release();
  1417. return anz;
  1418. }
  1419. int ISDatenbank::getGewonnenSpiele(int accountId, const char* beg, const char* end)
  1420. {
  1421. int anz = 0;
  1422. Text* befehl = new Text("SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '");
  1423. befehl->append(beg);
  1424. befehl->append("' AND a.end_datum < '");
  1425. befehl->append(end);
  1426. befehl->append("' AND a.end_datum > '");
  1427. befehl->append(beg);
  1428. befehl->append("' AND a.id = b.spiel_id AND b.spiel_spieler_status_id = 2 AND b.account_id = ");
  1429. befehl->append(accountId);
  1430. lock();
  1431. if (!datenbank->befehl(*befehl))
  1432. {
  1433. unlock();
  1434. befehl->release();
  1435. return 0;
  1436. }
  1437. Result res = datenbank->getResult();
  1438. unlock();
  1439. if (res.zeilenAnzahl)
  1440. anz += (int)res.values[0];
  1441. res.destroy();
  1442. befehl->setText("SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '");
  1443. befehl->append(beg);
  1444. befehl->append("' AND a.end_datum < '");
  1445. befehl->append(end);
  1446. befehl->append("' AND a.id = b.spiel_id AND b.spiel_spieler_status_id = 2 AND b.account_id = ");
  1447. befehl->append(accountId);
  1448. lock();
  1449. if (!datenbank->befehl(*befehl))
  1450. {
  1451. unlock();
  1452. befehl->release();
  1453. return 0;
  1454. }
  1455. res = datenbank->getResult();
  1456. unlock();
  1457. if (res.zeilenAnzahl)
  1458. anz += (int)res.values[0];
  1459. res.destroy();
  1460. befehl->release();
  1461. return anz;
  1462. }
  1463. Result ISDatenbank::getSpielPartnerListe(int accountId)
  1464. {
  1465. Text* befehl = new Text("SELECT account_id_b, anzahl, karte_id FROM account_mitspieler WHERE account_id_a = ");
  1466. befehl->append(accountId);
  1467. lock();
  1468. if (!datenbank->befehl(*befehl))
  1469. {
  1470. unlock();
  1471. befehl->release();
  1472. Result res = { 0, 0, 0, 0 };
  1473. return res;
  1474. }
  1475. Result res = datenbank->getResult();
  1476. unlock();
  1477. befehl->release();
  1478. return res;
  1479. }
  1480. Result ISDatenbank::getSpielStatistikListe(int accountId, int* seite, int* maxSeite, int sortStalte, bool backwords)
  1481. {
  1482. Text* befehl = new Text("SELECT count( spiel_art_id ) FROM spiel_statistik WHERE account_id = ");
  1483. befehl->append(accountId);
  1484. lock();
  1485. if (!datenbank->befehl(*befehl))
  1486. {
  1487. unlock();
  1488. befehl->release();
  1489. Result res = { 0, 0, 0, 0 };
  1490. return res;
  1491. }
  1492. Result res = datenbank->getResult();
  1493. unlock();
  1494. if (!res.zeilenAnzahl)
  1495. {
  1496. res.destroy();
  1497. befehl->release();
  1498. Result res = { 0, 0, 0, 0 };
  1499. return res;
  1500. }
  1501. int entrys = (int)res.values[0];
  1502. res.destroy();
  1503. *maxSeite = entrys / 21;
  1504. if (entrys % 21)
  1505. (*maxSeite)++;
  1506. if (*seite > *maxSeite)
  1507. *seite = *maxSeite;
  1508. if (!(*seite))
  1509. {
  1510. befehl->release();
  1511. Result res = { 0, 0, 0, 0 };
  1512. return res;
  1513. }
  1514. befehl->setText("SELECT a.id, a.name, b.gespielt, b.gewonnen, b.verloren, b.punkte, b.bw0, b.bw1, b.bw2, b.bw3, "
  1515. "b.bw4, b.bw5 FROM spiel_art a, spiel_statistik b WHERE a.id = b.spiel_art_id AND b.account_id = ");
  1516. befehl->append(accountId);
  1517. befehl->append(" ORDER BY ");
  1518. befehl->append(sortStalte + 2);
  1519. if (backwords)
  1520. befehl->append(" DESC");
  1521. befehl->append(" OFFSET ");
  1522. befehl->append(((*seite) - 1) * 18);
  1523. befehl->append(" LIMIT 18");
  1524. lock();
  1525. if (!datenbank->befehl(*befehl))
  1526. {
  1527. unlock();
  1528. befehl->release();
  1529. Result res = { 0, 0, 0, 0 };
  1530. return res;
  1531. }
  1532. res = datenbank->getResult();
  1533. unlock();
  1534. befehl->release();
  1535. return res;
  1536. }
  1537. AHDaten* ISDatenbank::getSpielHistorie(int accountId, InformationServer* is)
  1538. {
  1539. Text* befehl = new Text("SELECT a.id, a.karte_id, c.name, d.name, substring( a.beginn_datum::CHARACTER VARYING FOR 16 ), "
  1540. "b.spiel_spieler_status_id, a.spiel_status_id, count( e.spiel_id ) "
  1541. "FROM spiel a, spiel_spieler b, spiel_art c, karte d, (SELECT spiel_id FROM spiel_spieler) e "
  1542. "WHERE a.id = e.spiel_id AND a.karte_id = d.id AND d.spiel_art_id = c.id "
  1543. "AND a.id = b.spiel_id AND b.account_id = ");
  1544. *befehl += accountId;
  1545. *befehl += " GROUP BY a.id, a.karte_id, c.name, d.name, a.beginn_datum, b.spiel_spieler_status_id, a.spiel_status_id "
  1546. "ORDER BY beginn_datum DESC LIMIT 20";
  1547. lock();
  1548. if (!datenbank->befehl(*befehl))
  1549. {
  1550. unlock();
  1551. befehl->release();
  1552. return 0;
  1553. }
  1554. Result spielListe = datenbank->getResult();
  1555. unlock();
  1556. AHDaten* ret = new AHDaten();
  1557. for (int i = 0; i < spielListe.zeilenAnzahl; i++)
  1558. {
  1559. SpielerTeamStruktur* sts = new SpielerTeamStruktur();
  1560. bool stsOK = 1;
  1561. KartenLeser* reader = new KartenLeser((int)spielListe.values[1 + i * spielListe.feldAnzahl], is);
  1562. if (!reader->ladeSpielerTeamStruktur(sts))
  1563. stsOK = 0;
  1564. reader->release();
  1565. AHSpielDaten* spiel = new AHSpielDaten();
  1566. spiel->id = (int)spielListe.values[i * spielListe.feldAnzahl];
  1567. spiel->karteId = (int)spielListe.values[1 + i * spielListe.feldAnzahl];
  1568. spiel->spiel->setText(spielListe.values[2 + i * spielListe.feldAnzahl]);
  1569. spiel->karte->setText(spielListe.values[3 + i * spielListe.feldAnzahl]);
  1570. spiel->datum->setText(spielListe.values[4 + i * spielListe.feldAnzahl]);
  1571. switch ((int)spielListe.values[5 + i * spielListe.feldAnzahl])
  1572. {
  1573. case 1:
  1574. spiel->status->setText("Verloren");
  1575. break;
  1576. case 2:
  1577. spiel->status->setText("Gewonnen");
  1578. break;
  1579. case 3:
  1580. spiel->status->setText("Nicht Anwesend");
  1581. break;
  1582. case 4:
  1583. spiel->status->setText("Beobachter");
  1584. break;
  1585. case 5:
  1586. spiel->status->setText("Unentschieden");
  1587. break;
  1588. }
  1589. switch ((int)spielListe.values[6 + i * spielListe.feldAnzahl])
  1590. {
  1591. case 1:
  1592. spiel->spielStatus->setText("Beginnt");
  1593. break;
  1594. case 2:
  1595. spiel->spielStatus->setText("Läuft");
  1596. break;
  1597. case 3:
  1598. spiel->spielStatus->setText("Abgebrochen");
  1599. break;
  1600. case 4:
  1601. spiel->spielStatus->setText("Fehlerhaft");
  1602. break;
  1603. case 5:
  1604. spiel->spielStatus->setText("Beendet");
  1605. break;
  1606. case 6:
  1607. spiel->spielStatus->setText("Unbewertet");
  1608. break;
  1609. }
  1610. spiel->sAnzahl = (int)spielListe.values[7 + i * spielListe.feldAnzahl];
  1611. *befehl = "SELECT substring( (end_datum - beginn_datum)::CHARACTER VARYING FOR 8) FROM spiel WHERE id = ";
  1612. *befehl += spielListe.values[i * spielListe.feldAnzahl].getText();
  1613. lock();
  1614. if (datenbank->befehl(*befehl))
  1615. {
  1616. Result dauer = datenbank->getResult();
  1617. unlock();
  1618. if (dauer.zeilenAnzahl && dauer.values[0].getLength())
  1619. spiel->dauer->setText(dauer.values[0]);
  1620. }
  1621. else
  1622. unlock();
  1623. int gewinnerTeam = -1;
  1624. if (stsOK)
  1625. {
  1626. *befehl = "SELECT team_id FROM spiel_spieler WHERE spiel_spieler_status_id = 2 AND spiel_id = ";
  1627. *befehl += spielListe.values[i * spielListe.feldAnzahl].getText();
  1628. lock();
  1629. if (datenbank->befehl(*befehl))
  1630. {
  1631. Result team = datenbank->getResult();
  1632. unlock();
  1633. if (team.zeilenAnzahl && team.values[0].getLength() && sts->teamName->z((int)team.values[0]))
  1634. {
  1635. spiel->gewinner->setText(sts->teamName->z((int)team.values[0])->getText());
  1636. gewinnerTeam = (int)team.values[0];
  1637. }
  1638. }
  1639. else
  1640. unlock();
  1641. }
  1642. *befehl = "SELECT a.ruf_name, b.team_id, b.punkte, b.spiel_spieler_status_id, b.spieler_nummer FROM account a, spiel_spieler b WHERE b.account_id = a.id AND spiel_id = ";
  1643. *befehl += spielListe.values[i * spielListe.feldAnzahl].getText();
  1644. *befehl += " ORDER BY team_id";
  1645. lock();
  1646. if (datenbank->befehl(*befehl))
  1647. {
  1648. Result spielerListe = datenbank->getResult();
  1649. unlock();
  1650. for (int j = 0; j < spielerListe.zeilenAnzahl; j++)
  1651. {
  1652. int tAnz = spiel->teams->getEintragAnzahl();
  1653. int index = -1;
  1654. for (int k = 0; k < tAnz; k++)
  1655. {
  1656. if (spiel->teams->z(k)->id == (int)spielerListe.values[1 + j * spielerListe.feldAnzahl])
  1657. {
  1658. index = k;
  1659. break;
  1660. }
  1661. }
  1662. if (index < 0)
  1663. {
  1664. index = tAnz;
  1665. AHSpielTeamDaten* team = new AHSpielTeamDaten();
  1666. team->id = (int)spielerListe.values[1 + j * spielerListe.feldAnzahl];
  1667. if (sts->teamName->z(team->id))
  1668. team->name->setText(sts->teamName->z(team->id)->getText());
  1669. team->sAnzahl = 0;
  1670. if (team->id == gewinnerTeam)
  1671. team->status->setText("Gewonnen");
  1672. else
  1673. team->status->setText("Verloren");
  1674. if (sts->teamFarbe->hat(team->id))
  1675. team->farbe = sts->teamFarbe->get(team->id);
  1676. else
  1677. team->farbe = 0;
  1678. spiel->teams->add(team);
  1679. }
  1680. AHSpielSpielerDaten* spieler = new AHSpielSpielerDaten();
  1681. spieler->name->setText(spielerListe.values[j * spielerListe.feldAnzahl]);
  1682. spieler->punkte = (int)spielerListe.values[2 + j * spielerListe.feldAnzahl];
  1683. if (sts->spielerFarbe->hat((int)spielerListe.values[4 + j * spielerListe.feldAnzahl] - 1))
  1684. spieler->farbe = sts->spielerFarbe->get((int)spielerListe.values[4 + j * spielerListe.feldAnzahl] - 1);
  1685. else
  1686. spieler->farbe = 0;
  1687. switch ((int)spielerListe.values[3 + j * spielerListe.feldAnzahl])
  1688. {
  1689. case 1:
  1690. spieler->status->setText("Verloren");
  1691. break;
  1692. case 2:
  1693. spieler->status->setText("Gewonnen");
  1694. break;
  1695. case 3:
  1696. spieler->status->setText("Nicht Anwesend");
  1697. break;
  1698. case 4:
  1699. spieler->status->setText("Beobachter");
  1700. break;
  1701. case 5:
  1702. spieler->status->setText("Unentschieden");
  1703. break;
  1704. }
  1705. spiel->teams->z(index)->sAnzahl++;
  1706. spiel->teams->z(index)->spieler->add(spieler);
  1707. }
  1708. }
  1709. else
  1710. unlock();
  1711. sts->release();
  1712. ret->spiele->add(spiel);
  1713. }
  1714. return ret;
  1715. }
  1716. bool ISDatenbank::getHistorieServerPortIp(int clientId, int spielId, int* port, Text* ip)
  1717. {
  1718. lock();
  1719. if (!datenbank->befehl(Text("SELECT a.id, a.port, a.ip FROM server a, server_historie_spiel b "
  1720. "WHERE a.id = b.server_historie_id AND a.tasks < a.max_tasks - 1 AND "
  1721. "a.server_status_id = 3 AND b.spiel_id = ") += spielId))
  1722. {
  1723. unlock();
  1724. return 0;
  1725. }
  1726. Result res = datenbank->getResult();
  1727. unlock();
  1728. if (!res.zeilenAnzahl)
  1729. {
  1730. res.destroy();
  1731. return 0;
  1732. }
  1733. int id = (int)res.values[0];
  1734. *port = (int)res.values[1];
  1735. *ip = res.values[2].getText();
  1736. res.destroy();
  1737. Text* befehl = new Text("INSERT INTO server_client( client_id, server_id ) VALUES ( ");
  1738. befehl->append(clientId);
  1739. befehl->append(", ");
  1740. befehl->append(id);
  1741. befehl->append(" )");
  1742. bool ret = 1;
  1743. lock();
  1744. ret &= datenbank->befehl(Text("DELETE FROM server_client a USING server b WHERE b.server_typ_name = 'historie' AND b.id = a.server_id AND a.client_id = ") += clientId);
  1745. ret &= datenbank->befehl(*befehl);
  1746. unlock();
  1747. befehl->release();
  1748. return ret;
  1749. }
  1750. bool ISDatenbank::hatKlientRecht(int kId, int recht)
  1751. {
  1752. Text befehl = "SELECT a.* FROM account_user_rechte a, account_client b WHERE a.account_id = b.account_id AND b.client_id = ";
  1753. befehl += kId;
  1754. befehl += " AND a.user_rechte_id = ";
  1755. befehl += recht;
  1756. lock();
  1757. datenbank->befehl(befehl);
  1758. int num = datenbank->getZeilenAnzahl();
  1759. unlock();
  1760. return num == 1;
  1761. }
  1762. Result ISDatenbank::getKartenListe(int kId, const char* suchFilter, char sortSpalte, char sortRichtung)
  1763. {
  1764. Text befehl = "SELECT a.id, a.name, b.name, c.kupfer, a.verkauft, a.max_spieler FROM karte a ";
  1765. befehl += "INNER JOIN spiel_art b ON a.spiel_art_id = b.id ";
  1766. befehl += "LEFT JOIN karte_kauf_erlaubt c ON a.id = c.karte_id ";
  1767. befehl += "INNER JOIN account_client d ON d.account_id = a.account_id ";
  1768. befehl += "WHERE d.client_id = ";
  1769. befehl += kId;
  1770. befehl += " AND a.name LIKE'%";
  1771. befehl += suchFilter;
  1772. befehl += "%' ORDER BY ";
  1773. befehl += sortSpalte + 2;
  1774. if (sortRichtung) // absteigend
  1775. befehl += " DESC";
  1776. lock();
  1777. if (!datenbank->befehl(befehl))
  1778. {
  1779. unlock();
  1780. Result res = { 0, 0, 0, 0 };
  1781. return res;
  1782. }
  1783. Result res = datenbank->getResult();
  1784. unlock();
  1785. return res;
  1786. }
  1787. bool ISDatenbank::getEditorServerPortIp(int clientId, int karteId, int* port, Text* ip)
  1788. {
  1789. Text befehl = "SELECT a.port, a.ip, a.id FROM server a, karte b, account_client c ";
  1790. befehl += "WHERE a.id = b.server_editor_id AND b.account_id = c.account_id AND a.server_status_id = 3 AND c.client_id = ";
  1791. befehl += clientId;
  1792. befehl += " AND b.id = ";
  1793. befehl += karteId;
  1794. lock();
  1795. if (!datenbank->befehl(befehl))
  1796. {
  1797. unlock();
  1798. return 0;
  1799. }
  1800. Result res = datenbank->getResult();
  1801. unlock();
  1802. *port = (int)res.values[0];
  1803. ip->setText(res.values[1]);
  1804. int id = (int)res.values[2];
  1805. res.destroy();
  1806. befehl = "INSERT INTO server_client( client_id, server_id ) VALUES ( ";
  1807. befehl += clientId;
  1808. befehl += ", ";
  1809. befehl += id;
  1810. befehl += " )";
  1811. bool ret = 1;
  1812. lock();
  1813. ret &= datenbank->befehl(Text("SELECT a.server_id FROM server_client a, server b WHERE a.server_id = b.id AND b.server_typ_name = 'editor' AND a.client_id = ") += clientId);
  1814. ret &= datenbank->befehl(Text("DELETE FROM server_client a USING server b WHERE b.id = a.server_id AND b.server_typ_name = 'editor' AND a.client_id = ") += clientId);
  1815. ret &= datenbank->befehl(befehl);
  1816. unlock();
  1817. return 1;
  1818. }
  1819. bool ISDatenbank::getKartenServerPortIp(int clientId, int karteId, int* port, Text* ip)
  1820. {
  1821. Text befehl = "SELECT a.port, a.ip, a.id FROM server a, karte b ";
  1822. befehl += "WHERE a.id = b.server_karten_id AND a.server_status_id = 3 AND b.id = ";
  1823. befehl += karteId;
  1824. if (!karteId)
  1825. befehl = "SELECT port, ip, id FROM server WHERE server_typ_name = 'karten' AND server_status_id = 3 LIMIT 1";
  1826. lock();
  1827. if (!datenbank->befehl(befehl))
  1828. {
  1829. unlock();
  1830. return 0;
  1831. }
  1832. Result res = datenbank->getResult();
  1833. unlock();
  1834. if (!res.zeilenAnzahl)
  1835. return 0;
  1836. *port = (int)res.values[0];
  1837. ip->setText(res.values[1]);
  1838. int id = (int)res.values[2];
  1839. res.destroy();
  1840. if (clientId)
  1841. {
  1842. befehl = "INSERT INTO server_client( client_id, server_id ) VALUES ( ";
  1843. befehl += clientId;
  1844. befehl += ", ";
  1845. befehl += id;
  1846. befehl += " )";
  1847. bool ret = 1;
  1848. lock();
  1849. ret &= datenbank->befehl(Text("SELECT a.server_id FROM server_client a, server b WHERE b.id = a.server_id AND b.server_typ_name = 'karten' AND a.client_id = ") += clientId);
  1850. ret &= datenbank->befehl(Text("DELETE FROM server_client a USING server b WHERE b.id = a.server_id AND b.server_typ_name = 'karten' AND a.client_id = ") += clientId);
  1851. ret &= datenbank->befehl(befehl);
  1852. unlock();
  1853. }
  1854. return 1;
  1855. }
  1856. // constant
  1857. Text* ISDatenbank::getLetzterFehler() const
  1858. {
  1859. return datenbank->getLetzterFehler();
  1860. }