Datenbank.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. #include "Datenbank.h"
  2. #include <iostream>
  3. // Inhalt der LSDatenbank Klasse aus Datenbank.h
  4. // Konstruktor
  5. ShSDatenbank::ShSDatenbank( InitDatei *zIni )
  6. {
  7. datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(),
  8. zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(),
  9. (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) );
  10. if( !datenbank->istOk() )
  11. {
  12. std::cout << "ShS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
  13. exit( 1 );
  14. }
  15. InitializeCriticalSection( &cs );
  16. ref = 1;
  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( (char*)n );
  52. befehl->append( "' AND passwort = md5( '" );
  53. Text p( passwort );
  54. p.ersetzen( "'", "''" );
  55. befehl->append( (char*)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_shop 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( (char*)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 a.id FROM karte a, karte_shop_update b WHERE b.karte_id = a.id AND a.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 = 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 = 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 = r.values[ 0 ];
  615. *port = 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 = r.values[ 0 ];
  665. *port = 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. }
  684. // Reference Counting
  685. ShSDatenbank *ShSDatenbank::getThis()
  686. {
  687. ref++;
  688. return this;
  689. }
  690. ShSDatenbank *ShSDatenbank::release()
  691. {
  692. ref--;
  693. if( !ref )
  694. delete this;
  695. return 0;
  696. }