Datenbank.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. #include "Datenbank.h"
  2. #include <Zeit.h>
  3. // Inhalt der LSDatenbank Klasse aus Datenbank.h
  4. // Konstruktor
  5. KSDatenbank::KSDatenbank( InitDatei *zIni )
  6. {
  7. if( !zIni->wertExistiert( "DBBenutzer" ) )
  8. zIni->addWert( "DBBenutzer", "kartenserveru" );
  9. if( !zIni->wertExistiert( "DBPasswort" ) )
  10. zIni->addWert( "DBPasswort", "LTKitorServerPW" );
  11. if( !zIni->wertExistiert( "DBName" ) )
  12. zIni->addWert( "DBName", "koljadb" );
  13. if( !zIni->wertExistiert( "DBIP" ) )
  14. zIni->addWert( "DBIP", "127.0.0.1" );
  15. if( !zIni->wertExistiert( "DBPort" ) )
  16. zIni->addWert( "DBPort", "5432" );
  17. datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(),
  18. zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(),
  19. (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) );
  20. InitializeCriticalSection( &cs );
  21. ref = 1;
  22. }
  23. // Destruktor
  24. KSDatenbank::~KSDatenbank()
  25. {
  26. datenbank->release();
  27. DeleteCriticalSection( &cs );
  28. }
  29. // nicht constant
  30. void KSDatenbank::lock()
  31. {
  32. EnterCriticalSection( &cs );
  33. }
  34. void KSDatenbank::unlock()
  35. {
  36. LeaveCriticalSection( &cs );
  37. }
  38. int KSDatenbank::istAdministrator( const char *name, const char *passwort )
  39. {
  40. Text *befehl = new Text( "SELECT id FROM benutzer WHERE name = '" );
  41. befehl->append( name );
  42. befehl->append( "' AND passwort = '" );
  43. befehl->append( passwort );
  44. befehl->append( "'" );
  45. lock();
  46. datenbank->befehl( befehl->getText() );
  47. Result res = datenbank->getResult();
  48. unlock();
  49. befehl->release();
  50. int ret = 0;
  51. if( res.zeilenAnzahl > 0 )
  52. ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  53. res.destroy();
  54. return ret;
  55. }
  56. bool KSDatenbank::adminHatRecht( int id, int recht )
  57. {
  58. Text *befehl = new Text( "SELECT * FROM benutzer_rechte WHERE benutzer_id = " );
  59. befehl->append( id );
  60. befehl->append( " AND rechte_id = " );
  61. befehl->append( recht );
  62. lock();
  63. datenbank->befehl( befehl->getText() );
  64. int ret = datenbank->getZeilenAnzahl();
  65. unlock();
  66. befehl->release();
  67. return ret != 0;
  68. }
  69. bool KSDatenbank::proveKlient( int num, int sNum )
  70. {
  71. Text *befehl = new Text( "SELECT * FROM server_karten_clients WHERE server_karten_id = " );
  72. befehl->append( sNum );
  73. befehl->append( " AND client_id = " );
  74. befehl->append( num );
  75. lock();
  76. datenbank->befehl( befehl->getText() );
  77. Result res = datenbank->getResult();
  78. unlock();
  79. befehl->release();
  80. bool ret = 0;
  81. if( res.zeilenAnzahl == 1 )
  82. ret = 1;
  83. res.destroy();
  84. return ret;
  85. }
  86. Text *KSDatenbank::getKlientKey( int cId )
  87. {
  88. lock();
  89. if( !datenbank->befehl( Text( "SELECT schluessel FROM clients WHERE id = " ) += cId ) )
  90. {
  91. unlock();
  92. return 0;
  93. }
  94. Result res = datenbank->getResult();
  95. unlock();
  96. if( !res.zeilenAnzahl )
  97. {
  98. res.destroy();
  99. return 0;
  100. }
  101. Text *ret = new Text( res.values[ 0 ].getText() );
  102. res.destroy();
  103. return ret;
  104. }
  105. void KSDatenbank::unregisterKlient( int num, int sNum )
  106. {
  107. Text *befehl = new Text( "DELETE FROM server_karten_clients WHERE client_id = " );
  108. befehl->append( num );
  109. befehl->append( " AND server_karten_id = " );
  110. befehl->append( sNum );
  111. lock();
  112. datenbank->befehl( befehl->getText() );
  113. unlock();
  114. befehl->release();
  115. }
  116. bool KSDatenbank::serverAnmelden( InitDatei *zIni )
  117. {
  118. if( !zIni->wertExistiert( "ServerId" ) )
  119. zIni->addWert( "ServerId", "0" );
  120. if( !zIni->wertExistiert( "ServerName" ) )
  121. zIni->addWert( "ServerName", "Name" );
  122. if( !zIni->wertExistiert( "ServerPort" ) )
  123. zIni->addWert( "ServerPort", "49144" );
  124. if( !zIni->wertExistiert( "ServerIP" ) )
  125. zIni->addWert( "ServerIP", "127.0.0.1" );
  126. if( !zIni->wertExistiert( "AdminServerPort" ) )
  127. zIni->addWert( "AdminServerPort", "49143" );
  128. if( !zIni->wertExistiert( "Aktiv" ) )
  129. zIni->addWert( "Aktiv", "FALSE" );
  130. if( !zIni->wertExistiert( "MaxKarten" ) )
  131. zIni->addWert( "MaxKarten", "50" );
  132. bool insert = 0;
  133. int id = *zIni->zWert( "ServerId" );
  134. if( id )
  135. {
  136. lock();
  137. if( !datenbank->befehl( Text( "SELECT id FROM server_karten WHERE id = " ) += id ) )
  138. {
  139. unlock();
  140. return 0;
  141. }
  142. int anz = datenbank->getZeilenAnzahl();
  143. unlock();
  144. insert = anz == 0;
  145. if( !insert )
  146. {
  147. lock();
  148. if( !datenbank->befehl( Text( "SELECT id FROM server_karten WHERE server_status_id = 1 AND id = " ) += id ) )
  149. {
  150. unlock();
  151. return 0;
  152. }
  153. int anz = datenbank->getZeilenAnzahl();
  154. unlock();
  155. if( !anz ) // Server läuft bereits
  156. return 0;
  157. }
  158. }
  159. if( insert || !id )
  160. { // Neuer Eintrag in Tabelle server_karten
  161. Text *befehl = new Text( "INSERT INTO server_karten( " );
  162. if( id )
  163. *befehl += "id, ";
  164. *befehl += "name, ip, port, admin_port, server_status_id, max_karten ) VALUES( ";
  165. if( id )
  166. {
  167. *befehl += id;
  168. *befehl += ", ";
  169. }
  170. *befehl += "'";
  171. *befehl += zIni->zWert( "ServerName" )->getText();
  172. *befehl += "', '";
  173. *befehl += zIni->zWert( "ServerIP" )->getText();
  174. *befehl += "', ";
  175. *befehl += zIni->zWert( "ServerPort" )->getText();
  176. *befehl += ", ";
  177. *befehl += zIni->zWert( "AdminServerPort" )->getText();
  178. *befehl += ", 1, ";
  179. *befehl += zIni->zWert( "MaxKarten" )->getText();
  180. *befehl += " ) RETURNING id";
  181. lock();
  182. if( !datenbank->befehl( *befehl ) )
  183. {
  184. unlock();
  185. befehl->release();
  186. return 0;
  187. }
  188. Result res = datenbank->getResult();
  189. unlock();
  190. befehl->release();
  191. if( !res.zeilenAnzahl )
  192. {
  193. res.destroy();
  194. return 0;
  195. }
  196. zIni->setWert( "ServerId", res.values[ 0 ] );
  197. return 1;
  198. }
  199. else
  200. { // Alten Eintrag aus Tabelle server_karten ändern
  201. Text *befehl = new Text( "UPDATE server_karten SET name = '" );
  202. *befehl += zIni->zWert( "ServerName" )->getText();
  203. *befehl += "', port = ";
  204. *befehl += zIni->zWert( "ServerPort" )->getText();
  205. *befehl += ", ip = '";
  206. *befehl += zIni->zWert( "ServerIP" )->getText();
  207. *befehl += "', max_karten = ";
  208. *befehl += zIni->zWert( "MaxKarten" )->getText();
  209. *befehl += ", admin_port = ";
  210. *befehl += zIni->zWert( "AdminServerPort" )->getText();
  211. *befehl += " WHERE id = ";
  212. *befehl += id;
  213. lock();
  214. bool ret = datenbank->befehl( *befehl );
  215. unlock();
  216. befehl->release();
  217. return ret;
  218. }
  219. }
  220. bool KSDatenbank::setServerStatus( int id, int status )
  221. {
  222. Text *befehl = new Text( "UPDATE server_karten SET server_status_id = " );
  223. *befehl += status;
  224. *befehl += "WHERE id = ";
  225. *befehl += id;
  226. lock();
  227. if( !datenbank->befehl( befehl->getText() ) )
  228. {
  229. unlock();
  230. befehl->release();
  231. return 0;
  232. }
  233. bool ret = datenbank->getZeilenAnzahl() != 0;
  234. unlock();
  235. befehl->release();
  236. return ret;
  237. }
  238. bool KSDatenbank::setMaxKarten( int id, int maxK )
  239. {
  240. Text *befehl = new Text( "UPDATE server_karten SET max_karten = " );
  241. befehl->append( maxK );
  242. befehl->append( " WHERE id = " );
  243. befehl->append( id );
  244. lock();
  245. if( !datenbank->befehl( befehl->getText() ) )
  246. {
  247. unlock();
  248. befehl->release();
  249. return 0;
  250. }
  251. bool ret = datenbank->getZeilenAnzahl() > 0;
  252. unlock();
  253. befehl->release();
  254. return ret;
  255. }
  256. int KSDatenbank::getAdminPort( int id )
  257. {
  258. Text *befehl = new Text( "SELECT admin_port FROM server_karten WHERE id = " );
  259. befehl->append( id );
  260. lock();
  261. if( !datenbank->befehl( befehl->getText() ) )
  262. {
  263. unlock();
  264. befehl->release();
  265. return 0;
  266. }
  267. Result res = datenbank->getResult();
  268. unlock();
  269. befehl->release();
  270. if( !res.zeilenAnzahl )
  271. {
  272. res.destroy();
  273. return 0;
  274. }
  275. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  276. res.destroy();
  277. return ret;
  278. }
  279. bool KSDatenbank::serverIstNichtPausiert( int id )
  280. {
  281. Text *befehl = new Text( "SELECT server_status_id FROM server_karten WHERE id = " );
  282. befehl->append( id );
  283. lock();
  284. if( !datenbank->befehl( befehl->getText() ) )
  285. {
  286. unlock();
  287. befehl->release();
  288. return 0;
  289. }
  290. Result res = datenbank->getResult();
  291. unlock();
  292. befehl->release();
  293. if( !res.zeilenAnzahl )
  294. {
  295. res.destroy();
  296. return 0;
  297. }
  298. bool ret = (int)res.values[ 0 ] == 3;
  299. res.destroy();
  300. return ret;
  301. }
  302. bool KSDatenbank::proveKarte( int id, int sNum )
  303. {
  304. Text befehl = "SELECT id FROM karte WHERE id = ";
  305. befehl += id;
  306. befehl += " AND server_karten_id = ";
  307. befehl += sNum;
  308. lock();
  309. if( !datenbank->befehl( befehl ) )
  310. {
  311. unlock();
  312. return 0;
  313. }
  314. bool ret = datenbank->getZeilenAnzahl() != 0;
  315. unlock();
  316. return ret;
  317. }
  318. int KSDatenbank::getUpdateKarte( int serverId )
  319. {
  320. Text befehl = "SELECT id FROM karte WHERE erlaubt = FALSE AND server_karten_id = ";
  321. befehl += serverId;
  322. lock();
  323. if( !datenbank->befehl( befehl ) )
  324. {
  325. unlock();
  326. return 0;
  327. }
  328. Result r = datenbank->getResult();
  329. unlock();
  330. for( int i = 0; i < r.zeilenAnzahl; i++ )
  331. {
  332. int karte = r.values[ i ];
  333. befehl = "SELECT karte_update_warten( ";
  334. befehl += karte;
  335. befehl += " )";
  336. lock();
  337. if( !datenbank->befehl( befehl ) )
  338. {
  339. unlock();
  340. continue;
  341. }
  342. Result res = datenbank->getResult();
  343. unlock();
  344. if( !res.zeilenAnzahl )
  345. {
  346. res.destroy();
  347. continue;
  348. }
  349. if( res.values[ 0 ].istGleich( "f" ) )
  350. {
  351. res.destroy();
  352. r.destroy();
  353. return karte;
  354. }
  355. res.destroy();
  356. }
  357. r.destroy();
  358. return 0;
  359. }
  360. bool KSDatenbank::endUpdateKarte( int karteId )
  361. {
  362. Text befehl = "SELECT karte_update_ende( ";
  363. befehl += karteId;
  364. befehl += " )";
  365. lock();
  366. if( !datenbank->befehl( befehl ) )
  367. {
  368. unlock();
  369. return 0;
  370. }
  371. Result r = datenbank->getResult();
  372. unlock();
  373. if( !r.zeilenAnzahl )
  374. {
  375. r.destroy();
  376. return 0;
  377. }
  378. bool ret = r.values[ 0 ].istGleich( "t" );
  379. r.destroy();
  380. return ret;
  381. }
  382. bool KSDatenbank::getEditorServerPortIp( int karteId, int *port, Text *ip )
  383. {
  384. if( !port || !ip )
  385. return 0;
  386. Text befehl = "SELECT a.port, a.ip FROM server_editor a, karte b WHERE a.id = b.server_editor_id AND b.id = ";
  387. befehl += karteId;
  388. lock();
  389. if( !datenbank->befehl( befehl ) )
  390. {
  391. unlock();
  392. return 0;
  393. }
  394. Result r = datenbank->getResult();
  395. unlock();
  396. if( !r.zeilenAnzahl )
  397. {
  398. r.destroy();
  399. return 0;
  400. }
  401. *port = r.values[ 0 ];
  402. ip->setText( r.values[ 1 ] );
  403. r.destroy();
  404. return 1;
  405. }
  406. bool KSDatenbank::setKarteSpielerAnzahl( int karteId, int sAnz )
  407. {
  408. Text befehl = "UPDATE karte SET max_spieler = ";
  409. befehl += sAnz;
  410. befehl += " WHERE id = ";
  411. befehl += karteId;
  412. lock();
  413. if( !datenbank->befehl( befehl ) )
  414. {
  415. unlock();
  416. return 0;
  417. }
  418. int anz = datenbank->getZeilenAnzahl();
  419. unlock();
  420. if( !anz )
  421. return 0;
  422. return 1;
  423. }
  424. // constant
  425. Text *KSDatenbank::getLetzterFehler() const
  426. {
  427. return datenbank->getLetzterFehler();
  428. }
  429. // Reference Counting
  430. KSDatenbank *KSDatenbank::getThis()
  431. {
  432. ref++;
  433. return this;
  434. }
  435. KSDatenbank *KSDatenbank::release()
  436. {
  437. ref--;
  438. if( !ref )
  439. delete this;
  440. return 0;
  441. }