Datenbank.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. #include "Datenbank.h"
  2. #include <iostream>
  3. // Inhalt der LSDatenbank Klasse aus Datenbank.h
  4. // Konstruktor
  5. ShSDatenbank::ShSDatenbank(InitDatei* zIni)
  6. : ReferenceCounter()
  7. {
  8. datenbank = new Datenbank(zIni->zWert("DBBenutzer")->getText(), zIni->zWert("DBPasswort")->getText(),
  9. zIni->zWert("DBName")->getText(), zIni->zWert("DBIP")->getText(),
  10. (unsigned short)TextZuInt(zIni->zWert("DBPort")->getText(), 10));
  11. if (!datenbank->istOk())
  12. {
  13. std::cout << "ShS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
  14. exit(1);
  15. }
  16. InitializeCriticalSection(&cs);
  17. Text befehl = "SELECT port, admin_port FROM server WHERE id = ";
  18. befehl += zIni->zWert("ServerId")->getText();
  19. sid = (int)*zIni->zWert("ServerId");
  20. lock();
  21. datenbank->befehl(befehl);
  22. Result res = datenbank->getResult();
  23. unlock();
  24. if (res.zeilenAnzahl == 1)
  25. {
  26. zIni->addWert("ServerPort", res.values[0]);
  27. zIni->addWert("AdminServerPort", res.values[1]);
  28. }
  29. res.destroy();
  30. }
  31. // Destruktor
  32. ShSDatenbank::~ShSDatenbank()
  33. {
  34. datenbank->release();
  35. DeleteCriticalSection(&cs);
  36. }
  37. // nicht constant
  38. void ShSDatenbank::lock()
  39. {
  40. EnterCriticalSection(&cs);
  41. }
  42. void ShSDatenbank::unlock()
  43. {
  44. LeaveCriticalSection(&cs);
  45. }
  46. int ShSDatenbank::istAdministrator(const char* name, const char* passwort)
  47. {
  48. Text* befehl = new Text("SELECT id FROM benutzer WHERE name = '");
  49. Text n(name);
  50. n.ersetzen("'", "''");
  51. befehl->append(n);
  52. befehl->append("' AND passwort = md5( '");
  53. Text p(passwort);
  54. p.ersetzen("'", "''");
  55. befehl->append(p);
  56. befehl->append("' )");
  57. lock();
  58. datenbank->befehl(befehl->getText());
  59. Result res = datenbank->getResult();
  60. unlock();
  61. befehl->release();
  62. int ret = 0;
  63. if (res.zeilenAnzahl > 0)
  64. ret = TextZuInt(res.values[0].getText(), 10);
  65. res.destroy();
  66. return ret;
  67. }
  68. bool ShSDatenbank::adminHatRecht(int id, int recht)
  69. {
  70. Text* befehl = new Text("SELECT * FROM benutzer_rechte WHERE benutzer_id = ");
  71. befehl->append(id);
  72. befehl->append(" AND rechte_id = ");
  73. befehl->append(recht);
  74. lock();
  75. datenbank->befehl(befehl->getText());
  76. int ret = datenbank->getZeilenAnzahl();
  77. unlock();
  78. befehl->release();
  79. return ret != 0;
  80. }
  81. bool ShSDatenbank::proveKlient(int num, int sNum)
  82. {
  83. Text* befehl = new Text("SELECT * FROM server_client WHERE server_id = ");
  84. befehl->append(sNum);
  85. befehl->append(" AND client_id = ");
  86. befehl->append(num);
  87. lock();
  88. datenbank->befehl(befehl->getText());
  89. Result res = datenbank->getResult();
  90. unlock();
  91. befehl->release();
  92. bool ret = 0;
  93. if (res.zeilenAnzahl == 1)
  94. ret = 1;
  95. res.destroy();
  96. return ret;
  97. }
  98. Text* ShSDatenbank::getKlientKey(int cId)
  99. {
  100. lock();
  101. if (!datenbank->befehl(Text("SELECT schluessel FROM client WHERE id = ") += cId))
  102. {
  103. unlock();
  104. return 0;
  105. }
  106. Result res = datenbank->getResult();
  107. unlock();
  108. if (!res.zeilenAnzahl)
  109. {
  110. res.destroy();
  111. return 0;
  112. }
  113. Text* ret = new Text(res.values[0].getText());
  114. res.destroy();
  115. return ret;
  116. }
  117. void ShSDatenbank::unregisterKlient(int num, int sNum)
  118. {
  119. Text* befehl = new Text("DELETE FROM server_client WHERE client_id = ");
  120. befehl->append(num);
  121. befehl->append(" AND server_id = ");
  122. befehl->append(sNum);
  123. lock();
  124. datenbank->befehl(befehl->getText());
  125. unlock();
  126. befehl->release();
  127. }
  128. bool ShSDatenbank::setServerStatus(int id, int status)
  129. {
  130. Text* befehl = new Text("UPDATE server SET server_status_id = ");
  131. *befehl += status;
  132. *befehl += "WHERE id = ";
  133. *befehl += id;
  134. lock();
  135. if (!datenbank->befehl(befehl->getText()))
  136. {
  137. unlock();
  138. befehl->release();
  139. return 0;
  140. }
  141. bool ret = datenbank->getZeilenAnzahl() != 0;
  142. unlock();
  143. befehl->release();
  144. return ret;
  145. }
  146. bool ShSDatenbank::setMaxKarten(int id, int maxK)
  147. {
  148. Text* befehl = new Text("UPDATE server SET max_tasks = ");
  149. befehl->append(maxK);
  150. befehl->append(" WHERE id = ");
  151. befehl->append(id);
  152. lock();
  153. if (!datenbank->befehl(befehl->getText()))
  154. {
  155. unlock();
  156. befehl->release();
  157. return 0;
  158. }
  159. bool ret = datenbank->getZeilenAnzahl() > 0;
  160. unlock();
  161. befehl->release();
  162. return ret;
  163. }
  164. bool ShSDatenbank::serverIstNichtPausiert(int id)
  165. {
  166. Text* befehl = new Text("SELECT server_status_id FROM server WHERE id = ");
  167. befehl->append(id);
  168. lock();
  169. if (!datenbank->befehl(befehl->getText()))
  170. {
  171. unlock();
  172. befehl->release();
  173. return 0;
  174. }
  175. Result res = datenbank->getResult();
  176. unlock();
  177. befehl->release();
  178. if (!res.zeilenAnzahl)
  179. {
  180. res.destroy();
  181. return 0;
  182. }
  183. bool ret = (int)res.values[0] == 3;
  184. res.destroy();
  185. return ret;
  186. }
  187. bool ShSDatenbank::getSpielArtListe(int cId, char* suche, Array< int >* ret)
  188. {
  189. Text* befehl = new Text("SELECT distinct( a.id ) FROM spiel_art a LEFT JOIN account_client b ON b.client_id = ");
  190. befehl->append(cId);
  191. befehl->append(" LEFT JOIN spiel_art_account c ON a.id = c.spiel_art_id AND b.account_id = c.account_id AND "
  192. "c.status_id = 2 AND c.end_dat IS NULL INNER JOIN spiel_art_kauf_erlaubt d ON d.spiel_art_id = a.id WHERE a.name LIKE '%");
  193. befehl->append(suche);
  194. befehl->append("%' AND c.spiel_art_id IS NULL");
  195. lock();
  196. if (!datenbank->befehl(befehl->getText()))
  197. {
  198. unlock();
  199. befehl->release();
  200. return 0;
  201. }
  202. Result res = datenbank->getResult();
  203. unlock();
  204. befehl->release();
  205. ret->leeren();
  206. for (int i = 0; i < res.zeilenAnzahl; i++)
  207. ret->add(TextZuInt(res.values[i].getText(), 10));
  208. res.destroy();
  209. return 1;
  210. }
  211. int ShSDatenbank::getSpielBesitzStatus(int cId, int sId)
  212. {
  213. Text* befehl = new Text("SELECT b.status_id FROM account_client a, spiel_art_account b "
  214. "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND a.client_id = ");
  215. befehl->append(cId);
  216. befehl->append(" AND b.spiel_art_id = ");
  217. befehl->append(sId);
  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. if (!res.zeilenAnzahl)
  229. {
  230. res.destroy();
  231. return 0;
  232. }
  233. int ret = TextZuInt(res.values[0].getText(), 10);
  234. res.destroy();
  235. return ret;
  236. }
  237. int ShSDatenbank::getSpielTestversionStatus(int cId, int sId)
  238. {
  239. Text* befehl = new Text("SELECT b.verbleibend FROM account_client a, spiel_art_account b "
  240. "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND b.status_id = 1 AND a.client_id = ");
  241. befehl->append(cId);
  242. befehl->append(" AND b.spiel_art_id = ");
  243. befehl->append(sId);
  244. lock();
  245. if (!datenbank->befehl(befehl->getText()))
  246. {
  247. unlock();
  248. befehl->release();
  249. return 0;
  250. }
  251. Result res = datenbank->getResult();
  252. unlock();
  253. befehl->release();
  254. if (!res.zeilenAnzahl)
  255. {
  256. res.destroy();
  257. return 0;
  258. }
  259. int ret = TextZuInt(res.values[0].getText(), 10);
  260. res.destroy();
  261. return ret;
  262. }
  263. int ShSDatenbank::getSpielErwerbbarStatus(int cId, int sId)
  264. {
  265. Text* befehl = new Text("SELECT a.spiel_art_account_status_id FROM spiel_art_kauf_erlaubt a LEFT JOIN account_client b ON b.client_id = ");
  266. befehl->append(cId);
  267. befehl->append(" LEFT JOIN spiel_art_account c ON a.spiel_art_id = c.spiel_art_id AND b.account_id = c.account_id AND c.end_dat IS NULL "
  268. "AND a.spiel_art_account_status_id = c.status_id WHERE c.spiel_art_id IS NULL AND a.spiel_art_id = ");
  269. befehl->append(sId);
  270. lock();
  271. if (!datenbank->befehl(befehl->getText()))
  272. {
  273. unlock();
  274. befehl->release();
  275. return 0;
  276. }
  277. Result res = datenbank->getResult();
  278. unlock();
  279. befehl->release();
  280. int ret = 0;
  281. for (int i = 0; i < res.zeilenAnzahl; i++)
  282. {
  283. if (TextZuInt(res.values[i].getText(), 10) == 1)
  284. ret |= 1;
  285. else if (TextZuInt(res.values[i].getText(), 10) == 2)
  286. ret |= 2;
  287. }
  288. res.destroy();
  289. return ret;
  290. }
  291. int ShSDatenbank::getSpielPreis(int sId, bool testVersion)
  292. {
  293. int status = testVersion ? 1 : 2;
  294. Text* befehl = new Text("SELECT kupfer FROM spiel_art_kauf_erlaubt WHERE spiel_art_id = ");
  295. befehl->append(sId);
  296. befehl->append(" AND spiel_art_account_status_id = ");
  297. befehl->append(status);
  298. lock();
  299. if (!datenbank->befehl(befehl->getText()))
  300. {
  301. unlock();
  302. befehl->release();
  303. return 0;
  304. }
  305. Result res = datenbank->getResult();
  306. unlock();
  307. befehl->release();
  308. if (!res.zeilenAnzahl)
  309. {
  310. res.destroy();
  311. return 0;
  312. }
  313. int ret = TextZuInt(res.values[0].getText(), 10);
  314. res.destroy();
  315. return ret;
  316. }
  317. bool ShSDatenbank::spielKaufen(int cId, int sId, bool testVersion)
  318. {
  319. Text* befehl = new Text("SELECT spiel_erwerben( ");
  320. befehl->append(cId);
  321. befehl->append(", ");
  322. befehl->append(sId);
  323. if (testVersion)
  324. befehl->append(", TRUE )");
  325. else
  326. befehl->append(", FALSE )");
  327. lock();
  328. if (!datenbank->befehl(befehl->getText()))
  329. {
  330. unlock();
  331. befehl->release();
  332. return 0;
  333. }
  334. Result res = datenbank->getResult();
  335. unlock();
  336. befehl->release();
  337. if (!res.zeilenAnzahl)
  338. {
  339. res.destroy();
  340. return 0;
  341. }
  342. bool ret = res.values[0].istGleich("t");
  343. res.destroy();
  344. return ret;
  345. }
  346. bool ShSDatenbank::getKarteListe(int cId, int sId, char* suche, Array< int >* ret)
  347. {
  348. Text* befehl = new Text("SELECT distinct( a.id ) FROM karte a LEFT JOIN account_client b ON b.client_id = ");
  349. befehl->append(cId);
  350. befehl->append(" LEFT JOIN karte_account c ON a.id = c.karte_id AND b.account_id = c.account_id AND "
  351. "c.status_id = 2 AND c.end_dat IS NULL INNER JOIN karte_kauf_erlaubt d ON d.karte_id = a.id WHERE a.name LIKE '%");
  352. Text s(suche);
  353. s.ersetzen("'", "''");
  354. befehl->append(s);
  355. befehl->append("%' AND c.karte_id IS NULL");
  356. if (sId)
  357. {
  358. befehl->append(" AND a.spiel_art_id = ");
  359. befehl->append(sId);
  360. }
  361. lock();
  362. if (!datenbank->befehl(befehl->getText()))
  363. {
  364. unlock();
  365. befehl->release();
  366. return 0;
  367. }
  368. Result res = datenbank->getResult();
  369. unlock();
  370. befehl->release();
  371. ret->leeren();
  372. for (int i = 0; i < res.zeilenAnzahl; i++)
  373. ret->add(TextZuInt(res.values[i].getText(), 10));
  374. res.destroy();
  375. return 1;
  376. }
  377. int ShSDatenbank::getKarteBesitzStatus(int cId, int kId)
  378. {
  379. Text* befehl = new Text("SELECT b.status_id FROM account_client a, karte_account b "
  380. "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND a.client_id = ");
  381. befehl->append(cId);
  382. befehl->append(" AND b.karte_id = ");
  383. befehl->append(kId);
  384. lock();
  385. if (!datenbank->befehl(befehl->getText()))
  386. {
  387. unlock();
  388. befehl->release();
  389. return 0;
  390. }
  391. Result res = datenbank->getResult();
  392. unlock();
  393. befehl->release();
  394. if (!res.zeilenAnzahl)
  395. {
  396. res.destroy();
  397. return 0;
  398. }
  399. int ret = TextZuInt(res.values[0].getText(), 10);
  400. res.destroy();
  401. return ret;
  402. }
  403. int ShSDatenbank::getKarteTestversionStatus(int cId, int kId)
  404. {
  405. Text* befehl = new Text("SELECT b.verbleibend FROM account_client a, karte_account b "
  406. "WHERE a.account_id = b.account_id AND b.end_dat IS NULL AND b.status_id = 1 AND a.client_id = ");
  407. befehl->append(cId);
  408. befehl->append(" AND b.karte_id = ");
  409. befehl->append(kId);
  410. lock();
  411. if (!datenbank->befehl(befehl->getText()))
  412. {
  413. unlock();
  414. befehl->release();
  415. return 0;
  416. }
  417. Result res = datenbank->getResult();
  418. unlock();
  419. befehl->release();
  420. if (!res.zeilenAnzahl)
  421. {
  422. res.destroy();
  423. return 0;
  424. }
  425. int ret = TextZuInt(res.values[0].getText(), 10);
  426. res.destroy();
  427. return ret;
  428. }
  429. int ShSDatenbank::getKarteErwerbbarStatus(int cId, int kId)
  430. {
  431. Text* befehl = new Text("SELECT a.karte_account_status_id FROM karte_kauf_erlaubt a LEFT JOIN account_client b ON b.client_id = ");
  432. befehl->append(cId);
  433. befehl->append(" LEFT JOIN karte_account c ON a.karte_id = c.karte_id AND b.account_id = c.account_id AND c.end_dat IS NULL "
  434. "AND a.karte_account_status_id = c.status_id WHERE c.karte_id IS NULL AND a.karte_id = ");
  435. befehl->append(kId);
  436. lock();
  437. if (!datenbank->befehl(befehl->getText()))
  438. {
  439. unlock();
  440. befehl->release();
  441. return 0;
  442. }
  443. Result res = datenbank->getResult();
  444. unlock();
  445. befehl->release();
  446. int ret = 0;
  447. for (int i = 0; i < res.zeilenAnzahl; i++)
  448. {
  449. if (TextZuInt(res.values[i].getText(), 10) == 1)
  450. ret |= 1;
  451. else if (TextZuInt(res.values[i].getText(), 10) == 2)
  452. ret |= 2;
  453. }
  454. res.destroy();
  455. return ret;
  456. }
  457. int ShSDatenbank::getKartePreis(int kId, bool testVersion)
  458. {
  459. int status = testVersion ? 1 : 2;
  460. Text* befehl = new Text("SELECT kupfer FROM karte_kauf_erlaubt WHERE karte_id = ");
  461. befehl->append(kId);
  462. befehl->append(" AND karte_account_status_id = ");
  463. befehl->append(status);
  464. lock();
  465. if (!datenbank->befehl(befehl->getText()))
  466. {
  467. unlock();
  468. befehl->release();
  469. return 0;
  470. }
  471. Result res = datenbank->getResult();
  472. unlock();
  473. befehl->release();
  474. if (!res.zeilenAnzahl)
  475. {
  476. res.destroy();
  477. return 0;
  478. }
  479. int ret = TextZuInt(res.values[0].getText(), 10);
  480. res.destroy();
  481. return ret;
  482. }
  483. bool ShSDatenbank::karteKaufen(int cId, int kId, bool testVersion)
  484. {
  485. Text* befehl = new Text("SELECT karte_erwerben( ");
  486. befehl->append(cId);
  487. befehl->append(", ");
  488. befehl->append(kId);
  489. if (testVersion)
  490. befehl->append(", TRUE )");
  491. else
  492. befehl->append(", FALSE )");
  493. lock();
  494. if (!datenbank->befehl(befehl->getText()))
  495. {
  496. unlock();
  497. befehl->release();
  498. return 0;
  499. }
  500. Result res = datenbank->getResult();
  501. unlock();
  502. befehl->release();
  503. if (!res.zeilenAnzahl)
  504. {
  505. res.destroy();
  506. return 0;
  507. }
  508. bool ret = res.values[0].istGleich("t");
  509. res.destroy();
  510. return ret;
  511. }
  512. int ShSDatenbank::getUpdateKarte(int serverId)
  513. {
  514. Text befehl = "SELECT id FROM karte WHERE shop_update = true AND server_shop_id = ";
  515. befehl += serverId;
  516. lock();
  517. if (!datenbank->befehl(befehl))
  518. {
  519. unlock();
  520. return 0;
  521. }
  522. Result r = datenbank->getResult();
  523. unlock();
  524. if (r.zeilenAnzahl)
  525. {
  526. int karte = (int)r.values[0];
  527. r.destroy();
  528. return karte;
  529. }
  530. r.destroy();
  531. return 0;
  532. }
  533. bool ShSDatenbank::endUpdateKarte(int karteId)
  534. {
  535. Text befehl = "SELECT karte_shop_update_ende( ";
  536. befehl += karteId;
  537. befehl += " )";
  538. lock();
  539. if (!datenbank->befehl(befehl))
  540. {
  541. unlock();
  542. return 0;
  543. }
  544. Result r = datenbank->getResult();
  545. unlock();
  546. if (!r.zeilenAnzahl)
  547. {
  548. r.destroy();
  549. return 0;
  550. }
  551. bool ret = r.values[0].istGleich("t");
  552. r.destroy();
  553. return ret;
  554. }
  555. bool ShSDatenbank::getEditorServerPortIp(int karteId, int* port, Text* ip)
  556. {
  557. if (!port || !ip)
  558. return 0;
  559. Text befehl = "SELECT a.port, a.ip FROM server a, karte b WHERE a.id = b.server_editor_id AND b.id = ";
  560. befehl += karteId;
  561. lock();
  562. if (!datenbank->befehl(befehl))
  563. {
  564. unlock();
  565. return 0;
  566. }
  567. Result r = datenbank->getResult();
  568. unlock();
  569. if (!r.zeilenAnzahl)
  570. {
  571. r.destroy();
  572. return 0;
  573. }
  574. *port = (int)r.values[0];
  575. ip->setText(r.values[1]);
  576. r.destroy();
  577. return 1;
  578. }
  579. bool ShSDatenbank::proveKarte(int serverId, int karteId)
  580. {
  581. Text befehl = "SELECT id FROM karte WHERE id = ";
  582. befehl += karteId;
  583. befehl += " AND server_shop_id = ";
  584. befehl += serverId;
  585. lock();
  586. if (!datenbank->befehl(befehl))
  587. {
  588. unlock();
  589. return 0;
  590. }
  591. int z = datenbank->getZeilenAnzahl();
  592. unlock();
  593. return z != 0;
  594. }
  595. bool ShSDatenbank::getKarteShopServerPortIp(int karteId, int clientId, int* port, Text* ip)
  596. {
  597. if (!port || !ip)
  598. return 0;
  599. Text befehl = "SELECT a.id, a.port, a.ip FROM server a, karte b WHERE a.id = b.server_shop_id AND a.server_status_id = 3 AND b.id = ";
  600. befehl += karteId;
  601. lock();
  602. if (!datenbank->befehl(befehl))
  603. {
  604. unlock();
  605. return 0;
  606. }
  607. Result r = datenbank->getResult();
  608. unlock();
  609. if (!r.zeilenAnzahl)
  610. {
  611. r.destroy();
  612. return 0;
  613. }
  614. int id = (int)r.values[0];
  615. *port = (int)r.values[1];
  616. ip->setText(r.values[2]);
  617. r.destroy();
  618. befehl = "UPDATE server_client SET server_id = ";
  619. befehl += id;
  620. befehl += " WHERE client_id = ";
  621. befehl += clientId;
  622. befehl += " AND server_id = ";
  623. befehl += sid;
  624. lock();
  625. datenbank->befehl(befehl);
  626. unlock();
  627. return 1;
  628. }
  629. bool ShSDatenbank::proveSpiel(int serverId, int spielId)
  630. {
  631. Text befehl = "SELECT id FROM spiel_art WHERE id = ";
  632. befehl += spielId;
  633. befehl += " AND server_shop_id = ";
  634. befehl += serverId;
  635. lock();
  636. if (!datenbank->befehl(befehl))
  637. {
  638. unlock();
  639. return 0;
  640. }
  641. int z = datenbank->getZeilenAnzahl();
  642. unlock();
  643. return z != 0;
  644. }
  645. bool ShSDatenbank::getSpielShopServerPortIp(int spielId, int clientId, int* port, Text* ip)
  646. {
  647. if (!port || !ip)
  648. return 0;
  649. Text befehl = "SELECT a.id, a.port, a.ip FROM server a, spiel_art b WHERE a.id = b.server_shop_id AND a.server_status_id = 3 AND b.id = ";
  650. befehl += spielId;
  651. lock();
  652. if (!datenbank->befehl(befehl))
  653. {
  654. unlock();
  655. return 0;
  656. }
  657. Result r = datenbank->getResult();
  658. unlock();
  659. if (!r.zeilenAnzahl)
  660. {
  661. r.destroy();
  662. return 0;
  663. }
  664. int id = (int)r.values[0];
  665. *port = (int)r.values[1];
  666. ip->setText(r.values[2]);
  667. r.destroy();
  668. befehl = "UPDATE server_shop_clients SET server_id = ";
  669. befehl += id;
  670. befehl += " WHERE client_id = ";
  671. befehl += clientId;
  672. befehl += " AND server_id = ";
  673. befehl += sid;
  674. lock();
  675. datenbank->befehl(befehl);
  676. unlock();
  677. return 1;
  678. }
  679. // constant
  680. Text* ShSDatenbank::getLetzterFehler() const
  681. {
  682. return datenbank->getLetzterFehler();
  683. }