Datenbank.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. #include "Datenbank.h"
  2. #include <iostream>
  3. // Inhalt der CSDatenbank Klasse aus Datenbank.h
  4. // Konstruktor
  5. CSDatenbank::CSDatenbank(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 << "CS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
  14. exit(1);
  15. }
  16. Text befehl = "SELECT port, admin_port FROM server WHERE id = ";
  17. befehl += zIni->zWert("ServerId")->getText();
  18. lock();
  19. datenbank->befehl(befehl);
  20. Result res = datenbank->getResult();
  21. unlock();
  22. if (res.zeilenAnzahl == 1)
  23. {
  24. zIni->addWert("ServerPort", res.values[0]);
  25. zIni->addWert("AdminServerPort", res.values[1]);
  26. }
  27. res.destroy();
  28. }
  29. // Destruktor
  30. CSDatenbank::~CSDatenbank()
  31. {
  32. datenbank->release();
  33. }
  34. // nicht constant
  35. void CSDatenbank::lock()
  36. {
  37. cs.lock();
  38. }
  39. void CSDatenbank::unlock()
  40. {
  41. cs.unlock();
  42. }
  43. int CSDatenbank::istAdministrator(const char* name, const char* passwort)
  44. {
  45. Text* befehl = new Text("SELECT id FROM benutzer WHERE name = '");
  46. Text n(name);
  47. n.ersetzen("'", "''");
  48. befehl->append(n);
  49. befehl->append("' AND passwort = md5('");
  50. Text p(passwort);
  51. p.ersetzen("'", "''");
  52. befehl->append(p);
  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 CSDatenbank::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 CSDatenbank::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* CSDatenbank::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 CSDatenbank::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 CSDatenbank::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 CSDatenbank::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 CSDatenbank::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. int CSDatenbank::getKlientAccountId(int klientId)
  194. {
  195. Text* befehl = new Text("SELECT account_id FROM account_client WHERE client_id = ");
  196. befehl->append(klientId);
  197. lock();
  198. datenbank->befehl(befehl->getText());
  199. Result res = datenbank->getResult();
  200. unlock();
  201. befehl->release();
  202. if (res.zeilenAnzahl)
  203. {
  204. int ret = TextZuInt(res.values[0].getText(), 10);
  205. res.destroy();
  206. return ret;
  207. }
  208. res.destroy();
  209. return 0;
  210. }
  211. int CSDatenbank::getAccountFreunde(int accountId, Array< int >* fAccountId)
  212. {
  213. Text* befehl = new Text("SELECT account_id AS freundId FROM freund WHERE freund_account_id = ");
  214. befehl->append(accountId);
  215. befehl->append(" UNION SELECT freund_account_id AS freundId FROM freund WHERE account_id = ");
  216. befehl->append(accountId);
  217. lock();
  218. datenbank->befehl(befehl->getText());
  219. Result res = datenbank->getResult();
  220. unlock();
  221. befehl->release();
  222. int anzahl = res.zeilenAnzahl;
  223. for (int i = 0; i < anzahl; i++)
  224. fAccountId->add(TextZuInt(res.values[i].getText(), 10), i);
  225. res.destroy();
  226. return anzahl;
  227. }
  228. int CSDatenbank::getAccountOnlineFreunde(int accountId, Array< int >* fAccountId)
  229. {
  230. Text* befehl = new Text("SELECT freund.account_id AS freundId FROM freund, account_client WHERE freund.freund_account_id = ");
  231. befehl->append(accountId);
  232. befehl->append(" AND freund.account_id = account_client.account_id "
  233. "UNION SELECT freund.freund_account_id AS freundId FROM freund, account_client WHERE freund.account_id = ");
  234. befehl->append(accountId);
  235. befehl->append(" AND freund.freund_account_id = account_client.account_id ");
  236. lock();
  237. datenbank->befehl(befehl->getText());
  238. Result res = datenbank->getResult();
  239. unlock();
  240. befehl->release();
  241. int anzahl = res.zeilenAnzahl;
  242. for (int i = 0; i < anzahl; i++)
  243. fAccountId->add(TextZuInt(res.values[i].getText(), 10), i);
  244. res.destroy();
  245. return anzahl;
  246. }
  247. bool CSDatenbank::accountNameChange(int accountId, const char* name)
  248. {
  249. if (!name)
  250. return 1;
  251. Text* befehl = new Text("UPDATE account SET ruf_name = '");
  252. Text n(name);
  253. n.ersetzen("'", "''");
  254. befehl->append(n);
  255. befehl->append("' WHERE id = ");
  256. befehl->append(accountId);
  257. bool ret = 0;
  258. lock();
  259. ret = datenbank->befehl(befehl->getText());
  260. unlock();
  261. befehl->release();
  262. return ret;
  263. }
  264. bool CSDatenbank::beendeFreundschaft(int accountId1, int accountId2)
  265. {
  266. Text* befehl = new Text("DELETE FROM freund WHERE ( account_id = ");
  267. befehl->append(accountId1);
  268. befehl->append(" AND freund_account_id = ");
  269. befehl->append(accountId2);
  270. befehl->append(" ) OR ( freund_account_id = ");
  271. befehl->append(accountId1);
  272. befehl->append(" AND account_id = ");
  273. befehl->append(accountId2);
  274. befehl->append(" )");
  275. lock();
  276. if (!datenbank->befehl(befehl->getText()))
  277. {
  278. unlock();
  279. return 0;
  280. }
  281. unlock();
  282. befehl->release();
  283. return 1;
  284. }
  285. bool CSDatenbank::proveFreundschaftsAnfrage(int vonAccountId, int zuAccountId)
  286. {
  287. if (vonAccountId == zuAccountId)
  288. return 0;
  289. Text* befehl = new Text("SELECT account_id AS freundId FROM freund WHERE freund_account_id = ");
  290. befehl->append(vonAccountId);
  291. befehl->append(" AND freund.account_id = ");
  292. befehl->append(zuAccountId);
  293. befehl->append("UNION SELECT freund_account_id AS freundId FROM freund WHERE freund_account_id = ");
  294. befehl->append(zuAccountId);
  295. befehl->append(" AND freund.account_id = ");
  296. befehl->append(vonAccountId);
  297. lock();
  298. datenbank->befehl(befehl->getText());
  299. Result res = datenbank->getResult();
  300. unlock();
  301. befehl->release();
  302. bool ret = res.zeilenAnzahl == 0;
  303. res.destroy();
  304. return ret;
  305. }
  306. bool CSDatenbank::saveFreundschaftsAnfrage(int vonAccountId, int zuAccountId)
  307. {
  308. Text* befehl = new Text("SELECT account_id FROM freund_anfrage WHERE ( account_id = ");
  309. befehl->append(vonAccountId);
  310. befehl->append(" AND freund_id = ");
  311. befehl->append(zuAccountId);
  312. befehl->append(" ) OR ( freund_id = ");
  313. befehl->append(vonAccountId);
  314. befehl->append(" AND account_id = ");
  315. befehl->append(zuAccountId);
  316. befehl->append(" )");
  317. lock();
  318. if (!datenbank->befehl(befehl->getText()))
  319. {
  320. unlock();
  321. befehl->release();
  322. return 0;
  323. }
  324. Result res = datenbank->getResult();
  325. unlock();
  326. if (res.zeilenAnzahl)
  327. {
  328. res.destroy();
  329. befehl->release();
  330. return 1;
  331. }
  332. res.destroy();
  333. befehl->setText("INSERT INTO freund_anfrage( account_id, freund_id ) VALUES( ");
  334. befehl->append(vonAccountId);
  335. befehl->append(", ");
  336. befehl->append(zuAccountId);
  337. befehl->append(" )");
  338. lock();
  339. if (!datenbank->befehl(befehl->getText()))
  340. {
  341. unlock();
  342. befehl->release();
  343. return 0;
  344. }
  345. unlock();
  346. befehl->release();
  347. return 1;
  348. }
  349. int CSDatenbank::getFreundschaftsAnfragen(int accountId, Array< int >* vonAccountIds)
  350. {
  351. Text* befehl = new Text("SELECT account_id FROM freund_anfrage WHERE freund_id = ");
  352. befehl->append(accountId);
  353. lock();
  354. if (!datenbank->befehl(befehl->getText()))
  355. {
  356. unlock();
  357. befehl->release();
  358. return 0;
  359. }
  360. Result res = datenbank->getResult();
  361. unlock();
  362. befehl->setText("DELETE FROM freund_anfrage WHERE freund_id = ");
  363. befehl->append(accountId); lock();
  364. if (!datenbank->befehl(befehl->getText()))
  365. {
  366. unlock();
  367. befehl->release();
  368. res.destroy();
  369. return 0;
  370. }
  371. unlock();
  372. befehl->release();
  373. int anzahl = res.zeilenAnzahl;
  374. for (int i = 0; i < anzahl; i++)
  375. vonAccountIds->set((int)res.values[i], i);
  376. res.destroy();
  377. return anzahl;
  378. }
  379. bool CSDatenbank::neueFreundschaft(int accountId1, int accountId2)
  380. {
  381. Text* befehl = new Text("INSERT INTO freund VALUES( ");
  382. befehl->append(accountId1);
  383. befehl->append(", ");
  384. befehl->append(accountId2);
  385. befehl->append(" )");
  386. lock();
  387. bool ret = datenbank->befehl(befehl->getText());
  388. unlock();
  389. befehl->release();
  390. return ret;
  391. }
  392. Text* CSDatenbank::getAccountRufName(int accountId)
  393. {
  394. Text* befehl = new Text("SELECT ruf_name FROM account WHERE id = ");
  395. befehl->append(accountId);
  396. lock();
  397. datenbank->befehl(befehl->getText());
  398. Result res = datenbank->getResult();
  399. unlock();
  400. befehl->release();
  401. Text* ret = new Text(res.values[0].getText());
  402. res.destroy();
  403. return ret;
  404. }
  405. bool CSDatenbank::accountIstOnline(int accountId)
  406. {
  407. Text* befehl = new Text("SELECT * FROM account_client WHERE account_id = ");
  408. befehl->append(accountId);
  409. lock();
  410. datenbank->befehl(befehl->getText());
  411. int res = datenbank->getZeilenAnzahl();
  412. unlock();
  413. befehl->release();
  414. return res != 0;
  415. }
  416. bool CSDatenbank::accountIstImSpiel(int accountId)
  417. {
  418. Text* befehl = new Text("SELECT b.id FROM spiel_spieler a, spiel b WHERE b.spiel_status_id = 2 "
  419. "AND a.spiel_spieler_status_id = 5 AND a.spiel_id = b.id AND a.account_id = ");
  420. befehl->append(accountId);
  421. lock();
  422. datenbank->befehl(befehl->getText());
  423. int res = datenbank->getZeilenAnzahl();
  424. unlock();
  425. befehl->release();
  426. return res != 0;
  427. }
  428. int CSDatenbank::getChatServerId(int accountId)
  429. {
  430. Text* befehl = new Text("SELECT a.server_id FROM server_client a, account_client b, server c "
  431. "WHERE a.client_id = b.client_id AND a.server_id = c.id AND c.server_typ_name = 'chat' AND b.account_id = ");
  432. befehl->append(accountId);
  433. lock();
  434. datenbank->befehl(befehl->getText());
  435. Result res = datenbank->getResult();
  436. unlock();
  437. befehl->release();
  438. if (!res.zeilenAnzahl)
  439. {
  440. res.destroy();
  441. return 0;
  442. }
  443. int ret = TextZuInt(res.values[0].getText(), 10);
  444. res.destroy();
  445. return ret;
  446. }
  447. bool CSDatenbank::getChatServerIpPort(int serverId, unsigned short* port, char** ip)
  448. {
  449. Text* befehl = new Text("SELECT port, ip FROM server WHERE id = ");
  450. befehl->append(serverId);
  451. lock();
  452. datenbank->befehl(befehl->getText());
  453. Result res = datenbank->getResult();
  454. unlock();
  455. befehl->release();
  456. if (!res.zeilenAnzahl)
  457. {
  458. res.destroy();
  459. return 0;
  460. }
  461. *port = (unsigned short)TextZuInt(res.values[0].getText(), 10);
  462. int len = res.values[1].getLength();
  463. char* ipTmp = new char[len + 1];
  464. ipTmp[len] = 0;
  465. int i = 0;
  466. for (const char* c = res.values[1].getText(); i < len; c++)
  467. {
  468. ipTmp[i] = *c;
  469. i++;
  470. }
  471. res.destroy();
  472. return 1;
  473. }
  474. int CSDatenbank::getChatNachrichten(int accountId, Array< int >* vonAccount, RCArray< Text >* nachricht)
  475. {
  476. Text* befehl = new Text("SELECT von_account_id, nachricht FROM chat_nachricht WHERE zu_account_id = ");
  477. befehl->append(accountId);
  478. lock();
  479. datenbank->befehl(befehl->getText());
  480. Result res = datenbank->getResult();
  481. unlock();
  482. if (!res.zeilenAnzahl)
  483. {
  484. befehl->release();
  485. res.destroy();
  486. return 0;
  487. }
  488. int ret = res.zeilenAnzahl;
  489. for (int i = 0; i < ret; i++)
  490. {
  491. vonAccount->add(TextZuInt(res.values[i * 2].getText(), 10), i);
  492. nachricht->add(new Text(res.values[i * 2 + 1].getText()), i);
  493. }
  494. res.destroy();
  495. befehl->setText("DELETE FROM chat_nachricht WHERE zu_account_id = ");
  496. befehl->append(accountId);
  497. lock();
  498. datenbank->befehl(befehl->getText());
  499. unlock();
  500. befehl->release();
  501. return ret;
  502. }
  503. bool CSDatenbank::speicherChatNachricht(int vonAccount, int zuAccount, const char* nachricht)
  504. {
  505. if (!nachricht)
  506. return 1;
  507. Text* befehl = new Text("INSERT INTO chat_nachricht VALUES( ");
  508. befehl->append(vonAccount);
  509. befehl->append(", ");
  510. befehl->append(zuAccount);
  511. befehl->append(", '");
  512. Text n(nachricht);
  513. n.ersetzen("'", "''");
  514. befehl->append(n);
  515. befehl->append("' )");
  516. lock();
  517. bool ret = datenbank->befehl(befehl->getText());
  518. unlock();
  519. befehl->release();
  520. return ret;
  521. }
  522. int CSDatenbank::getChatroomAccount(int chatroomId, Array< int >* accountId)
  523. {
  524. Text* befehl = new Text("SELECT account_id FROM chatroom_spieler WHERE chatroom_id = ");
  525. befehl->append(chatroomId);
  526. lock();
  527. datenbank->befehl(befehl->getText());
  528. Result res = datenbank->getResult();
  529. unlock();
  530. befehl->release();
  531. if (!res.zeilenAnzahl)
  532. {
  533. res.destroy();
  534. return 0;
  535. }
  536. int ret = res.zeilenAnzahl;
  537. for (int i = 0; i < ret; i++)
  538. accountId->add(TextZuInt(res.values[i].getText(), 10), i);
  539. res.destroy();
  540. return ret;
  541. }
  542. int CSDatenbank::chatroomErstellen(int accountId, const char* name)
  543. {
  544. Text* befehl = new Text("INSERT INTO chatroom( admin_account_id, name ) VALUES( ");
  545. befehl->append(accountId);
  546. befehl->append(", '");
  547. Text n(name);
  548. n.ersetzen("'", "''");
  549. befehl->append(n);
  550. befehl->append("' ) RETURNING id");
  551. lock();
  552. if (!datenbank->befehl(befehl->getText()))
  553. {
  554. unlock();
  555. befehl->release();
  556. return 0;
  557. }
  558. Result res = datenbank->getResult();
  559. unlock();
  560. befehl->setText("INSERT INTO chatroom_spieler VALUES( ( SELECT id FROM chatroom WHERE name = '");
  561. befehl->append(n);
  562. befehl->append("' ), ");
  563. befehl->append(accountId);
  564. befehl->append(" )");
  565. lock();
  566. datenbank->befehl(befehl->getText());
  567. unlock();
  568. befehl->release();
  569. if (!res.zeilenAnzahl)
  570. {
  571. res.destroy();
  572. return 0;
  573. }
  574. int ret = TextZuInt(res.values[0].getText(), 10);
  575. res.destroy();
  576. return ret;
  577. }
  578. bool CSDatenbank::proveChatroomEinladung(int vonAccount, int zuAccount, int chatroomId)
  579. {
  580. Text* befehl = new Text("SELECT pruef_chatroom_einladung( ");
  581. befehl->append(chatroomId);
  582. befehl->append(", ");
  583. befehl->append(vonAccount);
  584. befehl->append(", ");
  585. befehl->append(zuAccount);
  586. befehl->append(" )");
  587. lock();
  588. datenbank->befehl(befehl->getText());
  589. Result res = datenbank->getResult();
  590. unlock();
  591. befehl->release();
  592. if (!res.zeilenAnzahl)
  593. {
  594. res.destroy();
  595. return 0;
  596. }
  597. bool ret = res.values[0].istGleich("t");
  598. res.destroy();
  599. return ret;
  600. }
  601. bool CSDatenbank::chatroomBeitreten(int accountId, int chatroomId)
  602. {
  603. Text* befehl = new Text("INSERT INTO chatroom_spieler values( ");
  604. befehl->append(chatroomId);
  605. befehl->append(" , ");
  606. befehl->append(accountId);
  607. befehl->append(" )");
  608. lock();
  609. bool ret = datenbank->befehl(befehl->getText());
  610. unlock();
  611. befehl->release();
  612. return ret;
  613. }
  614. int CSDatenbank::chatroomVerlassen(int accountId, int chatroomId)
  615. {
  616. Text* befehl = new Text("SELECT chatroom_verlassen( ");
  617. befehl->append(chatroomId);
  618. befehl->append(", ");
  619. befehl->append(accountId);
  620. befehl->append(" )");
  621. lock();
  622. datenbank->befehl(befehl->getText());
  623. Result res = datenbank->getResult();
  624. unlock();
  625. befehl->release();
  626. if (!res.zeilenAnzahl)
  627. {
  628. res.destroy();
  629. return 0;
  630. }
  631. int ret = TextZuInt(res.values[0].getText(), 10);
  632. res.destroy();
  633. return ret;
  634. }
  635. int CSDatenbank::getChatroomAdmin(int chatroomId)
  636. {
  637. Text* befehl = new Text("SELECT admin_account_id FROM chatroom WHERE id = ");
  638. befehl->append(chatroomId);
  639. lock();
  640. datenbank->befehl(befehl->getText());
  641. Result res = datenbank->getResult();
  642. unlock();
  643. befehl->release();
  644. if (!res.zeilenAnzahl)
  645. {
  646. res.destroy();
  647. return 0;
  648. }
  649. int ret = TextZuInt(res.values[0].getText(), 10);
  650. res.destroy();
  651. return ret;
  652. }
  653. // constant
  654. Text* CSDatenbank::getLetzterFehler() const
  655. {
  656. return datenbank->getLetzterFehler();
  657. }