Datenbank.cpp 10.0 KB

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