Datenbank.cpp 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062
  1. #include "Datenbank.h"
  2. #include <Zeit.h>
  3. #include "AccountHistorieDaten.h"
  4. #include "KartenLeser.h"
  5. // Inhalt der LSDatenbank Klasse aus Datenbank.h
  6. // Konstruktor
  7. ISDatenbank::ISDatenbank( InitDatei *zIni )
  8. {
  9. if( !zIni->wertExistiert( "DBBenutzer" ) )
  10. zIni->addWert( "DBBenutzer", "informationserveru" );
  11. if( !zIni->wertExistiert( "DBPasswort" ) )
  12. zIni->addWert( "DBPasswort", "LTInformationServerPW" );
  13. if( !zIni->wertExistiert( "DBName" ) )
  14. zIni->addWert( "DBName", "lenck_tech_db" );
  15. if( !zIni->wertExistiert( "DBIP" ) )
  16. zIni->addWert( "DBIP", "127.0.0.1" );
  17. if( !zIni->wertExistiert( "DBPort" ) )
  18. zIni->addWert( "DBPort", "5432" );
  19. datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(),
  20. zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(),
  21. (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) );
  22. InitializeCriticalSection( &cs );
  23. ref = 1;
  24. }
  25. // Destruktor
  26. ISDatenbank::~ISDatenbank()
  27. {
  28. datenbank->release();
  29. DeleteCriticalSection( &cs );
  30. }
  31. // nicht constant
  32. void ISDatenbank::lock()
  33. {
  34. EnterCriticalSection( &cs );
  35. }
  36. void ISDatenbank::unlock()
  37. {
  38. LeaveCriticalSection( &cs );
  39. }
  40. int ISDatenbank::istAdministrator( const char *name, const char *passwort )
  41. {
  42. Text *befehl = new Text( "SELECT id FROM benutzer WHERE name = '" );
  43. befehl->anhängen( name );
  44. befehl->anhängen( "' AND passwort = '" );
  45. befehl->anhängen( passwort );
  46. befehl->anhängen( "'" );
  47. lock();
  48. datenbank->befehl( befehl->getText() );
  49. Result res = datenbank->getResult();
  50. unlock();
  51. befehl->release();
  52. int ret = 0;
  53. if( res.zeilenAnzahl > 0 )
  54. ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  55. res.destroy();
  56. return ret;
  57. }
  58. bool ISDatenbank::adminHatRecht( int id, int recht )
  59. {
  60. Text *befehl = new Text( "SELECT * FROM benutzer_rechte WHERE benutzer_id = " );
  61. befehl->anhängen( id );
  62. befehl->anhängen( " AND rechte_id = " );
  63. befehl->anhängen( recht );
  64. lock();
  65. datenbank->befehl( befehl->getText() );
  66. int ret = datenbank->getZeilenAnzahl();
  67. unlock();
  68. befehl->release();
  69. return ret != 0;
  70. }
  71. bool ISDatenbank::prüfKlient( int num, int sNum )
  72. {
  73. Text *befehl = new Text( "SELECT * FROM server_information_clients WHERE server_information_id = " );
  74. befehl->anhängen( sNum );
  75. befehl->anhängen( " AND client_id = " );
  76. befehl->anhängen( num );
  77. lock();
  78. datenbank->befehl( befehl->getText() );
  79. Result res = datenbank->getResult();
  80. unlock();
  81. befehl->release();
  82. bool ret = 0;
  83. if( res.zeilenAnzahl == 1 )
  84. ret = 1;
  85. res.destroy();
  86. return ret;
  87. }
  88. Text *ISDatenbank::getKlientSchlüssel( int cId )
  89. {
  90. lock();
  91. if( !datenbank->befehl( Text( "SELECT schluessel FROM clients WHERE id = " ) += cId ) )
  92. {
  93. unlock();
  94. return 0;
  95. }
  96. Result res = datenbank->getResult();
  97. unlock();
  98. if( !res.zeilenAnzahl )
  99. {
  100. res.destroy();
  101. return 0;
  102. }
  103. Text *ret = new Text( res.values[ 0 ].getText() );
  104. res.destroy();
  105. return ret;
  106. }
  107. void ISDatenbank::unregisterKlient( int num, int sNum )
  108. {
  109. Text *befehl = new Text( "DELETE FROM server_information_clients WHERE client_id = " );
  110. befehl->anhängen( num );
  111. befehl->anhängen( " AND server_information_id = " );
  112. befehl->anhängen( sNum );
  113. lock();
  114. datenbank->befehl( befehl->getText() );
  115. int za = datenbank->getZeilenAnzahl();
  116. unlock();
  117. if( za == 1 )
  118. {
  119. befehl->setText( "UPDATE server_information SET clients = clients - 1 WHERE id = " );
  120. befehl->anhängen( sNum );
  121. lock();
  122. datenbank->befehl( befehl->getText() );
  123. unlock();
  124. }
  125. befehl->release();
  126. }
  127. bool ISDatenbank::serverAnmelden( InitDatei *zIni )
  128. {
  129. if( !zIni->wertExistiert( "ServerId" ) )
  130. zIni->addWert( "ServerId", "0" );
  131. if( !zIni->wertExistiert( "ServerName" ) )
  132. zIni->addWert( "ServerName", "Name" );
  133. if( !zIni->wertExistiert( "ServerPort" ) )
  134. zIni->addWert( "ServerPort", "49144" );
  135. if( !zIni->wertExistiert( "ServerIP" ) )
  136. zIni->addWert( "ServerIP", "127.0.0.1" );
  137. if( !zIni->wertExistiert( "AdminServerPort" ) )
  138. zIni->addWert( "AdminServerPort", "49143" );
  139. if( !zIni->wertExistiert( "Aktiv" ) )
  140. zIni->addWert( "Aktiv", "FALSE" );
  141. if( !zIni->wertExistiert( "MaxClients" ) )
  142. zIni->addWert( "MaxClients", "50" );
  143. bool insert = 0;
  144. int id = *zIni->zWert( "ServerId" );
  145. if( id )
  146. {
  147. lock();
  148. if( !datenbank->befehl( Text( "SELECT id FROM server_information WHERE id = " ) += id ) )
  149. {
  150. unlock();
  151. return 0;
  152. }
  153. int anz = datenbank->getZeilenAnzahl();
  154. unlock();
  155. insert = anz == 0;
  156. if( !insert )
  157. {
  158. lock();
  159. if( !datenbank->befehl( Text( "SELECT id FROM server_information WHERE server_status_id = 1 AND id = " ) += id ) )
  160. {
  161. unlock();
  162. return 0;
  163. }
  164. int anz = datenbank->getZeilenAnzahl();
  165. unlock();
  166. if( !anz ) // Server läuft bereits
  167. return 0;
  168. }
  169. }
  170. if( insert || !id )
  171. { // Neuer Eintrag in Tabelle server_information
  172. Text *befehl = new Text( "INSERT INTO server_information( " );
  173. if( id )
  174. *befehl += "id, ";
  175. *befehl += "name, ip, port, admin_port, server_status_id, max_clients ) VALUES( ";
  176. if( id )
  177. {
  178. *befehl += id;
  179. *befehl += ", ";
  180. }
  181. *befehl += "'";
  182. *befehl += zIni->zWert( "ServerName" )->getText();
  183. *befehl += "', '";
  184. *befehl += zIni->zWert( "ServerIP" )->getText();
  185. *befehl += "', ";
  186. *befehl += zIni->zWert( "ServerPort" )->getText();
  187. *befehl += ", ";
  188. *befehl += zIni->zWert( "AdminServerPort" )->getText();
  189. *befehl += ", 1, ";
  190. *befehl += zIni->zWert( "MaxClients" )->getText();
  191. *befehl += " ) RETURNING id";
  192. lock();
  193. if( !datenbank->befehl( *befehl ) )
  194. {
  195. unlock();
  196. befehl->release();
  197. return 0;
  198. }
  199. Result res = datenbank->getResult();
  200. unlock();
  201. befehl->release();
  202. if( !res.zeilenAnzahl )
  203. {
  204. res.destroy();
  205. return 0;
  206. }
  207. zIni->setWert( "ServerId", res.values[ 0 ] );
  208. return 1;
  209. }
  210. else
  211. { // Alten Eintrag aus Tabelle server_information ändern
  212. Text *befehl = new Text( "UPDATE server_information SET name = '" );
  213. *befehl += zIni->zWert( "ServerName" )->getText();
  214. *befehl += "', port = ";
  215. *befehl += zIni->zWert( "ServerPort" )->getText();
  216. *befehl += ", ip = '";
  217. *befehl += zIni->zWert( "ServerIP" )->getText();
  218. *befehl += "', max_clients = ";
  219. *befehl += zIni->zWert( "MaxClients" )->getText();
  220. *befehl += ", admin_port = ";
  221. *befehl += zIni->zWert( "AdminServerPort" )->getText();
  222. *befehl += " WHERE id = ";
  223. *befehl += id;
  224. lock();
  225. bool ret = datenbank->befehl( *befehl );
  226. unlock();
  227. befehl->release();
  228. return ret;
  229. }
  230. }
  231. bool ISDatenbank::setServerStatus( int id, int status )
  232. {
  233. Text *befehl = new Text( "UPDATE server_information SET server_status_id = " );
  234. *befehl += status;
  235. *befehl += "WHERE id = ";
  236. *befehl += id;
  237. lock();
  238. if( !datenbank->befehl( befehl->getText() ) )
  239. {
  240. unlock();
  241. befehl->release();
  242. return 0;
  243. }
  244. bool ret = datenbank->getZeilenAnzahl() != 0;
  245. unlock();
  246. befehl->release();
  247. return ret;
  248. }
  249. bool ISDatenbank::setMaxClients( int id, int maxC )
  250. {
  251. Text *befehl = new Text( "UPDATE server_information SET max_clients = " );
  252. befehl->anhängen( maxC );
  253. befehl->anhängen( " WHERE id = " );
  254. befehl->anhängen( id );
  255. lock();
  256. if( !datenbank->befehl( befehl->getText() ) )
  257. {
  258. unlock();
  259. befehl->release();
  260. return 0;
  261. }
  262. bool ret = datenbank->getZeilenAnzahl() > 0;
  263. unlock();
  264. befehl->release();
  265. return ret;
  266. }
  267. int ISDatenbank::getAdminPort( int id )
  268. {
  269. Text *befehl = new Text( "SELECT admin_port FROM server_information WHERE id = " );
  270. befehl->anhängen( id );
  271. lock();
  272. if( !datenbank->befehl( befehl->getText() ) )
  273. {
  274. unlock();
  275. befehl->release();
  276. return 0;
  277. }
  278. Result res = datenbank->getResult();
  279. unlock();
  280. befehl->release();
  281. if( !res.zeilenAnzahl )
  282. {
  283. res.destroy();
  284. return 0;
  285. }
  286. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  287. res.destroy();
  288. return ret;
  289. }
  290. bool ISDatenbank::serverIstNichtPausiert( int id )
  291. {
  292. Text *befehl = new Text( "SELECT server_status_id FROM server_information WHERE id = " );
  293. befehl->anhängen( id );
  294. lock();
  295. if( !datenbank->befehl( befehl->getText() ) )
  296. {
  297. unlock();
  298. befehl->release();
  299. return 0;
  300. }
  301. Result res = datenbank->getResult();
  302. unlock();
  303. befehl->release();
  304. if( !res.zeilenAnzahl )
  305. {
  306. res.destroy();
  307. return 0;
  308. }
  309. bool ret = (int)res.values[ 0 ] == 3;
  310. res.destroy();
  311. return ret;
  312. }
  313. Text *ISDatenbank::getInformationsText( char *typ )
  314. {
  315. lock();
  316. if( !datenbank->befehl( "SELECT text, typ FROM info_text ORDER BY insert_datum DESC LIMIT 1" ) )
  317. {
  318. unlock();
  319. return 0;
  320. }
  321. Result res = datenbank->getResult();
  322. unlock();
  323. if( !res.zeilenAnzahl )
  324. {
  325. res.destroy();
  326. *typ = 0;
  327. return 0;
  328. }
  329. *typ = (char)TextZuInt( res.values[ 1 ].getText(), 10 );
  330. Text *ret = new Text( res.values[ 0 ].getText() );
  331. res.destroy();
  332. return ret;
  333. }
  334. bool ISDatenbank::istSpielErlaubt( int spielId )
  335. {
  336. Text *befehl = new Text( "SELECT erlaubt FROM spiel_art WHERE id = " );
  337. befehl->anhängen( spielId );
  338. lock();
  339. if( !datenbank->befehl( befehl->getText() ) )
  340. {
  341. unlock();
  342. befehl->release();
  343. return 0;
  344. }
  345. Result res = datenbank->getResult();
  346. unlock();
  347. befehl->release();
  348. bool ret = 0;
  349. if( res.zeilenAnzahl > 0 && res.values[ 0 ].istGleich( "t" ) )
  350. ret = 1;
  351. res.destroy();
  352. return ret;
  353. }
  354. bool ISDatenbank::istKarteErlaubt( int karteId )
  355. {
  356. Text *befehl = new Text( "SELECT erlaubt FROM karte WHERE id = " );
  357. befehl->anhängen( karteId );
  358. lock();
  359. if( !datenbank->befehl( befehl->getText() ) )
  360. {
  361. unlock();
  362. befehl->release();
  363. return 0;
  364. }
  365. Result res = datenbank->getResult();
  366. unlock();
  367. befehl->release();
  368. bool ret = 0;
  369. if( res.zeilenAnzahl > 0 && res.values[ 0 ].istGleich( "t" ) )
  370. ret = 1;
  371. res.destroy();
  372. return ret;
  373. }
  374. Text *ISDatenbank::getAccountRufName( int accountId )
  375. {
  376. Text *befehl = new Text( "SELECT ruf_name FROM account WHERE id = " );
  377. befehl->anhängen( accountId );
  378. lock();
  379. if( !datenbank->befehl( befehl->getText() ) )
  380. {
  381. unlock();
  382. befehl->release();
  383. return 0;
  384. }
  385. Result res = datenbank->getResult();
  386. unlock();
  387. befehl->release();
  388. if( !res.zeilenAnzahl )
  389. {
  390. res.destroy();
  391. return 0;
  392. }
  393. Text *ret = new Text( res.values[ 0 ].getText() );
  394. res.destroy();
  395. return ret;
  396. }
  397. int ISDatenbank::getAccountId( char *rufName )
  398. {
  399. Text *befehl = new Text( "SELECT id FROM account WHERE ruf_name = '" );
  400. befehl->anhängen( rufName );
  401. befehl->anhängen( "' LIMIT 1" );
  402. lock();
  403. if( !datenbank->befehl( befehl->getText() ) )
  404. {
  405. unlock();
  406. befehl->release();
  407. return 0;
  408. }
  409. Result res = datenbank->getResult();
  410. unlock();
  411. befehl->release();
  412. if( !res.zeilenAnzahl )
  413. {
  414. res.destroy();
  415. return 0;
  416. }
  417. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  418. res.destroy();
  419. return ret;
  420. }
  421. Array< int > *ISDatenbank::getAccountSpielStatistik( int accountId, int spielId )
  422. {
  423. Text *befehl = new Text( "SELECT gespielt, gewonnen, verloren, punkte, bw0, bw1, bw2, bw3, bw4, bw5 FROM spiel_statistik WHERE account_id = " );
  424. befehl->anhängen( accountId );
  425. befehl->anhängen( " AND spiel_art_id = " );
  426. befehl->anhängen( spielId );
  427. lock();
  428. if( !datenbank->befehl( befehl->getText() ) )
  429. {
  430. unlock();
  431. befehl->release();
  432. return 0;
  433. }
  434. Result res = datenbank->getResult();
  435. unlock();
  436. befehl->release();
  437. Array< int > *ret = new Array< int >();
  438. if( !res.zeilenAnzahl )
  439. {
  440. for( int i = 0; i < res.feldAnzahl; i++ )
  441. ret->add( 0, i );
  442. res.destroy();
  443. return ret;
  444. }
  445. for( int i = 0; i < res.feldAnzahl; i++ )
  446. ret->add( TextZuInt( res.values[ i ].getText(), 10 ), i );
  447. res.destroy();
  448. return ret;
  449. }
  450. int ISDatenbank::getAccountKarteSpiele( int accountId, int karteId )
  451. {
  452. Text *befehl = new Text( "SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.id = b.spiel_id AND b.account_id = " );
  453. befehl->anhängen( accountId );
  454. befehl->anhängen( " AND a.karte_id = " );
  455. befehl->anhängen( karteId );
  456. lock();
  457. if( !datenbank->befehl( befehl->getText() ) )
  458. {
  459. unlock();
  460. befehl->release();
  461. return 0;
  462. }
  463. Result res = datenbank->getResult();
  464. unlock();
  465. befehl->release();
  466. if( !res.zeilenAnzahl )
  467. {
  468. res.destroy();
  469. return 0;
  470. }
  471. int ret = res.values[ 0 ];
  472. res.destroy();
  473. return ret;
  474. }
  475. int ISDatenbank::getAccountKarteSpieleGewonnen( int accountId, int karteId )
  476. {
  477. Text *befehl = new Text( "SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.id = b.spiel_id "
  478. "AND b.spiel_spieler_status_id = 2 AND b.account_id = " );
  479. befehl->anhängen( accountId );
  480. befehl->anhängen( " AND a.karte_id = " );
  481. befehl->anhängen( karteId );
  482. lock();
  483. if( !datenbank->befehl( befehl->getText() ) )
  484. {
  485. unlock();
  486. befehl->release();
  487. return 0;
  488. }
  489. Result res = datenbank->getResult();
  490. unlock();
  491. befehl->release();
  492. if( !res.zeilenAnzahl )
  493. {
  494. res.destroy();
  495. return 0;
  496. }
  497. int ret = res.values[ 0 ];
  498. res.destroy();
  499. return ret;
  500. }
  501. Text *ISDatenbank::getKarteName( int karteId )
  502. {
  503. Text *befehl = new Text( "SELECT name FROM karte WHERE id = " );
  504. befehl->anhängen( karteId );
  505. lock();
  506. if( !datenbank->befehl( befehl->getText() ) )
  507. {
  508. unlock();
  509. befehl->release();
  510. return 0;
  511. }
  512. Result res = datenbank->getResult();
  513. unlock();
  514. befehl->release();
  515. if( !res.zeilenAnzahl )
  516. {
  517. res.destroy();
  518. return 0;
  519. }
  520. Text *ret = new Text( res.values[ 0 ].getText() );
  521. res.destroy();
  522. return ret;
  523. }
  524. Text *ISDatenbank::getSpielName( int spielId )
  525. {
  526. Text *befehl = new Text( "SELECT name FROM spiel_art WHERE id = " );
  527. befehl->anhängen( spielId );
  528. lock();
  529. if( !datenbank->befehl( befehl->getText() ) )
  530. {
  531. unlock();
  532. befehl->release();
  533. return 0;
  534. }
  535. Result res = datenbank->getResult();
  536. unlock();
  537. befehl->release();
  538. if( !res.zeilenAnzahl )
  539. {
  540. res.destroy();
  541. return 0;
  542. }
  543. Text *ret = new Text( res.values[ 0 ].getText() );
  544. res.destroy();
  545. return ret;
  546. }
  547. Text *ISDatenbank::getChatroomName( int chatroomId )
  548. {
  549. Text *befehl = new Text( "SELECT name FROM chatroom WHERE id = " );
  550. befehl->anhängen( chatroomId );
  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->release();
  561. if( !res.zeilenAnzahl )
  562. {
  563. res.destroy();
  564. return 0;
  565. }
  566. Text *ret = new Text( res.values[ 0 ].getText() );
  567. res.destroy();
  568. return ret;
  569. }
  570. int ISDatenbank::getChatroomId( char *name )
  571. {
  572. Text *befehl = new Text( "SELECT id FROM chatroom WHERE name = '" );
  573. befehl->anhängen( name );
  574. befehl->anhängen( "' LIMIT 1" );
  575. lock();
  576. if( !datenbank->befehl( befehl->getText() ) )
  577. {
  578. unlock();
  579. befehl->release();
  580. return 0;
  581. }
  582. Result res = datenbank->getResult();
  583. unlock();
  584. befehl->release();
  585. if( !res.zeilenAnzahl )
  586. {
  587. res.destroy();
  588. return 0;
  589. }
  590. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  591. res.destroy();
  592. return ret;
  593. }
  594. int ISDatenbank::getSpielId( int karteId )
  595. {
  596. Text *befehl = new Text( "SELECT spiel_art_id FROM karte WHERE id = " );
  597. befehl->anhängen( karteId );
  598. lock();
  599. if( !datenbank->befehl( befehl->getText() ) )
  600. {
  601. unlock();
  602. befehl->release();
  603. return 0;
  604. }
  605. Result res = datenbank->getResult();
  606. unlock();
  607. befehl->release();
  608. if( !res.zeilenAnzahl )
  609. {
  610. res.destroy();
  611. return 0;
  612. }
  613. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  614. res.destroy();
  615. return ret;
  616. }
  617. int ISDatenbank::getSpielId( char *name )
  618. {
  619. Text *befehl = new Text( "SELECT id FROM spiel_art WHERE name = '" );
  620. befehl->anhängen( name );
  621. befehl->anhängen( "'" );
  622. lock();
  623. if( !datenbank->befehl( befehl->getText() ) )
  624. {
  625. unlock();
  626. befehl->release();
  627. return 0;
  628. }
  629. Result res = datenbank->getResult();
  630. unlock();
  631. befehl->release();
  632. if( !res.zeilenAnzahl )
  633. {
  634. res.destroy();
  635. return 0;
  636. }
  637. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  638. res.destroy();
  639. return ret;
  640. }
  641. int ISDatenbank::getKarteId( char *name )
  642. {
  643. Text *befehl = new Text( "SELECT id FROM karte WHERE name = '" );
  644. befehl->anhängen( name );
  645. befehl->anhängen( "'" );
  646. lock();
  647. if( !datenbank->befehl( befehl->getText() ) )
  648. {
  649. unlock();
  650. befehl->release();
  651. return 0;
  652. }
  653. Result res = datenbank->getResult();
  654. unlock();
  655. befehl->release();
  656. if( !res.zeilenAnzahl )
  657. {
  658. res.destroy();
  659. return 0;
  660. }
  661. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  662. res.destroy();
  663. return ret;
  664. }
  665. int ISDatenbank::getGruppenKarteId( int gruppeId )
  666. {
  667. Text *befehl = new Text( "SELECT karte_id FROM gruppe WHERE id = " );
  668. befehl->anhängen( gruppeId );
  669. lock();
  670. if( !datenbank->befehl( befehl->getText() ) )
  671. {
  672. unlock();
  673. befehl->release();
  674. return 0;
  675. }
  676. Result res = datenbank->getResult();
  677. unlock();
  678. befehl->release();
  679. if( !res.zeilenAnzahl )
  680. {
  681. res.destroy();
  682. return 0;
  683. }
  684. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  685. res.destroy();
  686. return ret;
  687. }
  688. int ISDatenbank::getGruppeAdminId( int gruppeId )
  689. {
  690. Text *befehl = new Text( "SELECT admin_account_id FROM gruppe WHERE id = " );
  691. befehl->anhängen( gruppeId );
  692. lock();
  693. if( !datenbank->befehl( befehl->getText() ) )
  694. {
  695. unlock();
  696. befehl->release();
  697. return 0;
  698. }
  699. Result res = datenbank->getResult();
  700. unlock();
  701. befehl->release();
  702. if( !res.zeilenAnzahl )
  703. {
  704. res.destroy();
  705. return 0;
  706. }
  707. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  708. res.destroy();
  709. return ret;
  710. }
  711. int ISDatenbank::getSpielerPunkte( int spielId, int accountId )
  712. {
  713. Text *befehl = new Text( "SELECT sum( b.punkte ) FROM spiel a, spiel_spieler b, karte c WHERE a.karte_id = c.id "
  714. "AND a.spiel_status_id = 5 AND c.spiel_art_id = " );
  715. befehl->anhängen( spielId );
  716. befehl->anhängen( " AND b.spiel_id = a.id AND b.account_id = " );
  717. befehl->anhängen( accountId );
  718. lock();
  719. if( !datenbank->befehl( befehl->getText() ) )
  720. {
  721. unlock();
  722. befehl->release();
  723. return 0;
  724. }
  725. Result res = datenbank->getResult();
  726. unlock();
  727. befehl->release();
  728. if( !res.zeilenAnzahl )
  729. {
  730. res.destroy();
  731. return 0;
  732. }
  733. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  734. res.destroy();
  735. return ret;
  736. }
  737. Array< int > *ISDatenbank::getAccountSpielArtListe( int cId )
  738. {
  739. Text *befehl = new Text( "SELECT a.spiel_art_id FROM spiel_art_account a, account_clients b "
  740. "WHERE a.account_id = b.account_id AND a.end_dat IS NULL AND b.client_id = " );
  741. befehl->anhängen( cId );
  742. lock();
  743. if( !datenbank->befehl( befehl->getText() ) )
  744. {
  745. unlock();
  746. befehl->release();
  747. return 0;
  748. }
  749. Result res = datenbank->getResult();
  750. unlock();
  751. befehl->release();
  752. Array< int > *ret = new Array< int >();
  753. for( int i = 0; i < res.zeilenAnzahl; i++ )
  754. ret->add( TextZuInt( res.values[ i ].getText(), 10 ) );
  755. res.destroy();
  756. return ret;
  757. }
  758. int ISDatenbank::getNeusteSpielVersion( int sId )
  759. {
  760. Text *befehl = new Text( "SELECT a.version FROM datei_gruppe a, spiel_art b WHERE a.id = b.datei_gruppe_id AND b.id = " );
  761. befehl->anhängen( sId );
  762. lock();
  763. if( !datenbank->befehl( befehl->getText() ) )
  764. {
  765. unlock();
  766. befehl->release();
  767. return 0;
  768. }
  769. Result res = datenbank->getResult();
  770. unlock();
  771. befehl->release();
  772. if( !res.zeilenAnzahl )
  773. {
  774. res.destroy();
  775. return 0;
  776. }
  777. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  778. res.destroy();
  779. return ret;
  780. }
  781. int ISDatenbank::getKupfer( int cId )
  782. {
  783. Text *befehl = new Text( "SELECT a.kupfer FROM account a, account_clients b WHERE a.id = b.account_id AND b.client_id = " );
  784. befehl->anhängen( cId );
  785. lock();
  786. if( !datenbank->befehl( befehl->getText() ) )
  787. {
  788. unlock();
  789. befehl->release();
  790. return 0;
  791. }
  792. Result res = datenbank->getResult();
  793. unlock();
  794. befehl->release();
  795. if( !res.zeilenAnzahl )
  796. {
  797. res.destroy();
  798. return 0;
  799. }
  800. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  801. res.destroy();
  802. return ret;
  803. }
  804. int ISDatenbank::getDateiGruppeVonSpiel( int sId )
  805. {
  806. Text *befehl = new Text( "SELECT datei_gruppe_id FROM spiel_art WHERE id = " );
  807. befehl->anhängen( sId );
  808. lock();
  809. if( !datenbank->befehl( befehl->getText() ) )
  810. {
  811. unlock();
  812. befehl->release();
  813. return 0;
  814. }
  815. Result res = datenbank->getResult();
  816. unlock();
  817. befehl->release();
  818. if( !res.zeilenAnzahl )
  819. {
  820. res.destroy();
  821. return 0;
  822. }
  823. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  824. res.destroy();
  825. return ret;
  826. }
  827. Text *ISDatenbank::getDateiGruppePfad( int dgId )
  828. {
  829. Text *befehl = new Text( "SELECT pfad FROM datei_gruppe WHERE id = " );
  830. befehl->anhängen( dgId );
  831. lock();
  832. if( !datenbank->befehl( befehl->getText() ) )
  833. {
  834. unlock();
  835. befehl->release();
  836. return 0;
  837. }
  838. Result res = datenbank->getResult();
  839. unlock();
  840. befehl->release();
  841. if( !res.zeilenAnzahl )
  842. {
  843. res.destroy();
  844. return 0;
  845. }
  846. Text *ret = new Text( res.values[ 0 ].getText() );
  847. res.destroy();
  848. return ret;
  849. }
  850. Array< int > *ISDatenbank::getAccountKarteListe( int cId, int sId )
  851. {
  852. Text *befehl = new Text( "SELECT a.karte_id FROM karte_account a, account_clients b, karte c "
  853. "WHERE c.id = a.karte_id AND a.account_id = b.account_id AND a.end_dat IS NULL AND b.client_id = " );
  854. befehl->anhängen( cId );
  855. befehl->anhängen( " AND c.spiel_art_id = " );
  856. befehl->anhängen( sId );
  857. lock();
  858. if( !datenbank->befehl( befehl->getText() ) )
  859. {
  860. unlock();
  861. befehl->release();
  862. return 0;
  863. }
  864. Result res = datenbank->getResult();
  865. unlock();
  866. befehl->release();
  867. Array< int > *ret = new Array< int >();
  868. for( int i = 0; i < res.zeilenAnzahl; i++ )
  869. ret->add( TextZuInt( res.values[ i ].getText(), 10 ) );
  870. res.destroy();
  871. return ret;
  872. }
  873. bool ISDatenbank::hatAccountKarte( int account, int karte )
  874. {
  875. Text *befehl = new Text( "SELECT karte_id FROM karte_account WHERE end_dat IS NULL AND karte_id = " );
  876. befehl->anhängen( karte );
  877. befehl->anhängen( " AND account_id = " );
  878. befehl->anhängen( account );
  879. lock();
  880. if( !datenbank->befehl( befehl->getText() ) )
  881. {
  882. unlock();
  883. befehl->release();
  884. return 0;
  885. }
  886. bool ret = datenbank->getZeilenAnzahl() != 0;
  887. unlock();
  888. befehl->release();
  889. return ret;
  890. }
  891. bool ISDatenbank::hatAccountSpiel( int account, int spiel )
  892. {
  893. Text *befehl = new Text( "SELECT spiel_art_id FROM spiel_art_account WHERE end_dat IS NULL AND spiel_art_id = " );
  894. befehl->anhängen( spiel );
  895. befehl->anhängen( " AND account_id = " );
  896. befehl->anhängen( account );
  897. lock();
  898. if( !datenbank->befehl( befehl->getText() ) )
  899. {
  900. unlock();
  901. befehl->release();
  902. return 0;
  903. }
  904. bool ret = datenbank->getZeilenAnzahl() != 0;
  905. unlock();
  906. befehl->release();
  907. return ret;
  908. }
  909. Array< int > *ISDatenbank::getAccountKarteGespieltListe( int accountId, int spielArt )
  910. {
  911. Text *befehl = new Text( "SELECT distinct( c.id ) FROM spiel a, spiel_spieler b, karte c WHERE "
  912. "a.karte_id = c.id AND b.spiel_id = a.id AND b.account_id = " );
  913. befehl->anhängen( accountId );
  914. befehl->anhängen( " AND c.spiel_art_id = " );
  915. befehl->anhängen( spielArt );
  916. lock();
  917. if( !datenbank->befehl( befehl->getText() ) )
  918. {
  919. unlock();
  920. befehl->release();
  921. return 0;
  922. }
  923. Result res = datenbank->getResult();
  924. unlock();
  925. befehl->release();
  926. Array< int > *ret = new Array< int >();
  927. for( int i = 0; i < res.zeilenAnzahl; i++ )
  928. ret->set( res.values[ i ], i );
  929. res.destroy();
  930. return ret;
  931. }
  932. Array< int > *ISDatenbank::getAccountSpielGespieltListe( int accountId )
  933. {
  934. Text *befehl = new Text( "SELECT distinct( c.spiel_art_id ) FROM spiel a, spiel_spieler b, karte c WHERE "
  935. "a.karte_id = c.id AND b.spiel_id = a.id AND b.account_id = " );
  936. befehl->anhängen( accountId );
  937. lock();
  938. if( !datenbank->befehl( befehl->getText() ) )
  939. {
  940. unlock();
  941. befehl->release();
  942. return 0;
  943. }
  944. Result res = datenbank->getResult();
  945. unlock();
  946. befehl->release();
  947. Array< int > *ret = new Array< int >();
  948. for( int i = 0; i < res.zeilenAnzahl; i++ )
  949. ret->set( res.values[ i ], i );
  950. res.destroy();
  951. return ret;
  952. }
  953. int ISDatenbank::getDateiGruppeVonPfad( char *pfad )
  954. {
  955. Text *befehl = new Text( "SELECT id FROM datei_gruppe WHERE pfad = '" );
  956. befehl->anhängen( pfad );
  957. befehl->anhängen( "'" );
  958. lock();
  959. if( !datenbank->befehl( befehl->getText() ) )
  960. {
  961. unlock();
  962. befehl->release();
  963. return 0;
  964. }
  965. Result res = datenbank->getResult();
  966. unlock();
  967. befehl->release();
  968. if( !res.zeilenAnzahl )
  969. {
  970. res.destroy();
  971. return 0;
  972. }
  973. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  974. res.destroy();
  975. return ret;
  976. }
  977. int ISDatenbank::getNeusteDateiGruppe( int dg )
  978. {
  979. Text *befehl = new Text( "SELECT version FROM datei_gruppe WHERE id = " );
  980. befehl->anhängen( dg );
  981. lock();
  982. if( !datenbank->befehl( befehl->getText() ) )
  983. {
  984. unlock();
  985. befehl->release();
  986. return 0;
  987. }
  988. Result res = datenbank->getResult();
  989. unlock();
  990. befehl->release();
  991. if( !res.zeilenAnzahl )
  992. {
  993. res.destroy();
  994. return 0;
  995. }
  996. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  997. res.destroy();
  998. return ret;
  999. }
  1000. bool ISDatenbank::getGruppeSpielerHinzufügen( int gruppeId )
  1001. {
  1002. Text *befehl = new Text( "SELECT spiel_starten FROM gruppe WHERE id = " );
  1003. befehl->anhängen( gruppeId );
  1004. lock();
  1005. if( !datenbank->befehl( befehl->getText() ) )
  1006. {
  1007. unlock();
  1008. befehl->release();
  1009. return 0;
  1010. }
  1011. Result res = datenbank->getResult();
  1012. unlock();
  1013. befehl->release();
  1014. if( !res.zeilenAnzahl )
  1015. {
  1016. res.destroy();
  1017. return 0;
  1018. }
  1019. bool ret = res.values[ 0 ].istGleich( "f" );
  1020. res.destroy();
  1021. return ret;
  1022. }
  1023. Result ISDatenbank::getSpielerListe( char *suche, int *seite, int *maxSeite, int sortStalte, bool rückwärts )
  1024. {
  1025. Text *befehl = new Text( "SELECT count( a.id ) FROM account a, "
  1026. "( SELECT a.id, max( b.datum ) "
  1027. " FROM account a LEFT JOIN "
  1028. " ( SELECT g.spiel_art_id, i.account_id, max( h.beginn_datum ) "
  1029. " FROM karte g, spiel h, spiel_spieler i "
  1030. " WHERE i.spiel_id = h.id AND h.karte_id = g.id "
  1031. " GROUP BY g.spiel_art_id, i.account_id ) f ON a.id = f.account_id "
  1032. " LEFT JOIN account_online b ON b.account_id = a.id "
  1033. " LEFT JOIN spiel_statistik e ON e.account_id = a.id "
  1034. " LEFT JOIN spiel_art c ON c.id = f.spiel_art_id "
  1035. " LEFT JOIN karte d ON c.id = d.spiel_art_id "
  1036. " WHERE a.name LIKE '" );
  1037. befehl->anhängen( suche );
  1038. befehl->anhängen( "' AND d.spiel_art_id = c.id "
  1039. " AND e.spiel_art_id = f.spiel_art_id "
  1040. " GROUP BY a.id ) b "
  1041. "WHERE a.id = b.id" );
  1042. lock();
  1043. if( !datenbank->befehl( *befehl ) )
  1044. {
  1045. unlock();
  1046. befehl->release();
  1047. Result res = { 0, 0, 0, 0 };
  1048. return res;
  1049. }
  1050. Result res = datenbank->getResult();
  1051. unlock();
  1052. if( !res.zeilenAnzahl )
  1053. {
  1054. res.destroy();
  1055. befehl->release();
  1056. Result res = { 0, 0, 0, 0 };
  1057. return res;
  1058. }
  1059. int einträge = res.values[ 0 ];
  1060. res.destroy();
  1061. *maxSeite = einträge / 21;
  1062. if( einträge % 21 )
  1063. ( *maxSeite )++;
  1064. if( *seite > *maxSeite )
  1065. *seite = *maxSeite;
  1066. if( !( *seite ) )
  1067. {
  1068. befehl->release();
  1069. Result res = { 0, 0, 0, 0 };
  1070. return res;
  1071. }
  1072. befehl->setText( "SELECT a.id, a.ruf_name, max( b.datum ), c.name, d.name, e.punkte "
  1073. "FROM account a LEFT JOIN "
  1074. "( SELECT g.spiel_art_id, i.account_id, max( h.beginn_datum ) "
  1075. " FROM karte g, spiel h, spiel_spieler i "
  1076. " WHERE i.spiel_id = h.id AND h.karte_id = g.id "
  1077. " GROUP BY g.spiel_art_id, i.account_id ) f ON a.id = f.account_id "
  1078. "LEFT JOIN account_online b ON b.account_id = a.id "
  1079. "LEFT JOIN spiel_statistik e ON e.account_id = a.id "
  1080. "LEFT JOIN spiel_art c ON c.id = f.spiel_art_id "
  1081. "LEFT JOIN karte d ON c.id = d.spiel_art_id "
  1082. "WHERE a.name LIKE '" );
  1083. befehl->anhängen( suche );
  1084. befehl->anhängen( "' AND ( d.spiel_art_id = c.id "
  1085. "AND e.spiel_art_id = f.spiel_art_id ) "
  1086. "OR d.spiel_art_id IS NULL "
  1087. "GROUP BY a.id, a.ruf_name, c.name, d.name, e.punkte ORDER BY " );
  1088. befehl->anhängen( sortStalte + 2 );
  1089. if( rückwärts )
  1090. befehl->anhängen( " DESC" );
  1091. befehl->anhängen( " OFFSET " );
  1092. befehl->anhängen( ( ( *seite ) - 1 ) * 21 );
  1093. befehl->anhängen( " LIMIT 21" );
  1094. lock();
  1095. if( !datenbank->befehl( *befehl ) )
  1096. {
  1097. unlock();
  1098. befehl->release();
  1099. Result res = { 0, 0, 0, 0 };
  1100. return res;
  1101. }
  1102. res = datenbank->getResult();
  1103. unlock();
  1104. befehl->release();
  1105. return res;
  1106. }
  1107. bool ISDatenbank::getSpielerAktivität( int accountId, RCArray< Text > *datum, Array< double > *stOnline, Array< double > *stGespielt,
  1108. Array< int > *anzSpiele, Array< int > *anzGewonnen )
  1109. {
  1110. Datum *beg = getDatum();
  1111. Datum *end = getDatum();
  1112. beg->minusTag( 29 );
  1113. end->minusTag( 29 );
  1114. end->plusTag( 1 );
  1115. for( int i = 0; i < 30; i++ )
  1116. { // 30 Tage Rückblick
  1117. datum->set( beg->getDatum( "d-m-y" ), i );
  1118. Text *b = beg->getDatum( "y-m-d" );
  1119. Text *e = end->getDatum( "y-m-d" );
  1120. stOnline->set( getOnlineSeconds( accountId, *b, *e ) / ( 60.0 * 60 ), i );
  1121. stGespielt->set( getGespieltSeconds( accountId, *b, *e ) / ( 60.0 * 60 ), i );
  1122. anzSpiele->set( getGespieltSpiele( accountId, *b, *e ), i );
  1123. anzGewonnen->set( getGewonnenSpiele( accountId, *b, *e ), i );
  1124. b->release();
  1125. e->release();
  1126. beg->plusTag( 1 );
  1127. end->plusTag( 1 );
  1128. }
  1129. return 1;
  1130. }
  1131. int ISDatenbank::getOnlineSeconds( int accountId, char *beg, char *end )
  1132. {
  1133. int sec = 0;
  1134. Text *befehl = new Text( "SELECT date_part( 'epoch', ( SELECT sum( now() - '" );
  1135. befehl->anhängen( beg );
  1136. befehl->anhängen( "' ) FROM account_online WHERE datum < '" );
  1137. befehl->anhängen( beg );
  1138. befehl->anhängen( "' AND now() < '" );
  1139. befehl->anhängen( end );
  1140. befehl->anhängen( "' AND now() > '" );
  1141. befehl->anhängen( beg );
  1142. befehl->anhängen( "' AND end_datum IS NULL AND account_id = " );
  1143. befehl->anhängen( accountId );
  1144. befehl->anhängen( " )::INTERVAL )" );
  1145. lock();
  1146. if( !datenbank->befehl( *befehl ) )
  1147. {
  1148. unlock();
  1149. befehl->release();
  1150. return 0;
  1151. }
  1152. Result res = datenbank->getResult();
  1153. unlock();
  1154. if( res.zeilenAnzahl )
  1155. sec += (int)res.values[ 0 ];
  1156. res.destroy();
  1157. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( now() - datum ) FROM account_online WHERE datum > '" );
  1158. befehl->anhängen( beg );
  1159. befehl->anhängen( "' AND now() < '" );
  1160. befehl->anhängen( end );
  1161. befehl->anhängen( "' AND end_datum IS NULL AND account_id = " );
  1162. befehl->anhängen( accountId );
  1163. befehl->anhängen( " )::INTERVAL )" );
  1164. lock();
  1165. if( !datenbank->befehl( *befehl ) )
  1166. {
  1167. unlock();
  1168. befehl->release();
  1169. return 0;
  1170. }
  1171. res = datenbank->getResult();
  1172. unlock();
  1173. if( res.zeilenAnzahl )
  1174. sec += (int)res.values[ 0 ];
  1175. res.destroy();
  1176. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1177. befehl->anhängen( end );
  1178. befehl->anhängen( "' - datum ) FROM account_online WHERE datum > '" );
  1179. befehl->anhängen( beg );
  1180. befehl->anhängen( "' AND datum < '" );
  1181. befehl->anhängen( end );
  1182. befehl->anhängen( "' AND now() > '" );
  1183. befehl->anhängen( end );
  1184. befehl->anhängen( "' AND end_datum IS NULL AND account_id = " );
  1185. befehl->anhängen( accountId );
  1186. befehl->anhängen( " )::INTERVAL )" );
  1187. lock();
  1188. if( !datenbank->befehl( *befehl ) )
  1189. {
  1190. unlock();
  1191. befehl->release();
  1192. return 0;
  1193. }
  1194. res = datenbank->getResult();
  1195. unlock();
  1196. if( res.zeilenAnzahl )
  1197. sec += (int)res.values[ 0 ];
  1198. res.destroy();
  1199. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1200. befehl->anhängen( end );
  1201. befehl->anhängen( "'::TIMESTAMP WITH TIME ZONE - '" );
  1202. befehl->anhängen( beg );
  1203. befehl->anhängen( "' ) FROM account_online WHERE datum < '" );
  1204. befehl->anhängen( beg );
  1205. befehl->anhängen( "' AND now() > '" );
  1206. befehl->anhängen( end );
  1207. befehl->anhängen( "' AND end_datum IS NULL AND account_id = " );
  1208. befehl->anhängen( accountId );
  1209. befehl->anhängen( " )::INTERVAL )" );
  1210. lock();
  1211. if( !datenbank->befehl( *befehl ) )
  1212. {
  1213. unlock();
  1214. befehl->release();
  1215. return 0;
  1216. }
  1217. res = datenbank->getResult();
  1218. unlock();
  1219. if( res.zeilenAnzahl )
  1220. sec += (int)res.values[ 0 ];
  1221. res.destroy();
  1222. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( end_datum - '" );
  1223. befehl->anhängen( beg );
  1224. befehl->anhängen( "' ) FROM account_online WHERE datum < '" );
  1225. befehl->anhängen( beg );
  1226. befehl->anhängen( "' AND end_datum < '" );
  1227. befehl->anhängen( end );
  1228. befehl->anhängen( "' AND end_datum > '" );
  1229. befehl->anhängen( beg );
  1230. befehl->anhängen( "' AND account_id = " );
  1231. befehl->anhängen( accountId );
  1232. befehl->anhängen( " )::INTERVAL )" );
  1233. lock();
  1234. if( !datenbank->befehl( *befehl ) )
  1235. {
  1236. unlock();
  1237. befehl->release();
  1238. return 0;
  1239. }
  1240. res = datenbank->getResult();
  1241. unlock();
  1242. if( res.zeilenAnzahl )
  1243. sec += (int)res.values[ 0 ];
  1244. res.destroy();
  1245. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( end_datum - datum ) FROM account_online WHERE datum > '" );
  1246. befehl->anhängen( beg );
  1247. befehl->anhängen( "' AND end_datum < '" );
  1248. befehl->anhängen( end );
  1249. befehl->anhängen( "' AND account_id = " );
  1250. befehl->anhängen( accountId );
  1251. befehl->anhängen( " )::INTERVAL )" );
  1252. lock();
  1253. if( !datenbank->befehl( *befehl ) )
  1254. {
  1255. unlock();
  1256. befehl->release();
  1257. return 0;
  1258. }
  1259. res = datenbank->getResult();
  1260. unlock();
  1261. if( res.zeilenAnzahl )
  1262. sec += (int)res.values[ 0 ];
  1263. res.destroy();
  1264. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1265. befehl->anhängen( end );
  1266. befehl->anhängen( "' - datum ) FROM account_online WHERE datum > '" );
  1267. befehl->anhängen( beg );
  1268. befehl->anhängen( "' AND datum < '" );
  1269. befehl->anhängen( end );
  1270. befehl->anhängen( "' AND end_datum > '" );
  1271. befehl->anhängen( end );
  1272. befehl->anhängen( "' AND account_id = " );
  1273. befehl->anhängen( accountId );
  1274. befehl->anhängen( " )::INTERVAL )" );
  1275. lock();
  1276. if( !datenbank->befehl( *befehl ) )
  1277. {
  1278. unlock();
  1279. befehl->release();
  1280. return 0;
  1281. }
  1282. res = datenbank->getResult();
  1283. unlock();
  1284. if( res.zeilenAnzahl )
  1285. sec += (int)res.values[ 0 ];
  1286. res.destroy();
  1287. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1288. befehl->anhängen( end );
  1289. befehl->anhängen( "'::TIMESTAMP WITH TIME ZONE - '" );
  1290. befehl->anhängen( beg );
  1291. befehl->anhängen( "' ) FROM account_online WHERE datum < '" );
  1292. befehl->anhängen( beg );
  1293. befehl->anhängen( "' AND end_datum > '" );
  1294. befehl->anhängen( end );
  1295. befehl->anhängen( "' AND account_id = " );
  1296. befehl->anhängen( accountId );
  1297. befehl->anhängen( " )::INTERVAL )" );
  1298. lock();
  1299. if( !datenbank->befehl( *befehl ) )
  1300. {
  1301. unlock();
  1302. befehl->release();
  1303. return 0;
  1304. }
  1305. res = datenbank->getResult();
  1306. unlock();
  1307. if( res.zeilenAnzahl )
  1308. sec += (int)res.values[ 0 ];
  1309. res.destroy();
  1310. befehl->release();
  1311. return sec;
  1312. }
  1313. int ISDatenbank::getGespieltSeconds( int accountId, char *beg, char *end )
  1314. {
  1315. int sec = 0;
  1316. Text *befehl = new Text( "SELECT date_part( 'epoch', ( SELECT sum( now() - '" );
  1317. befehl->anhängen( beg );
  1318. befehl->anhängen( "' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '" );
  1319. befehl->anhängen( beg );
  1320. befehl->anhängen( "' AND now() < '" );
  1321. befehl->anhängen( end );
  1322. befehl->anhängen( "' AND now() > '" );
  1323. befehl->anhängen( beg );
  1324. befehl->anhängen( "' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = " );
  1325. befehl->anhängen( accountId );
  1326. befehl->anhängen( " )::INTERVAL )" );
  1327. lock();
  1328. if( !datenbank->befehl( *befehl ) )
  1329. {
  1330. unlock();
  1331. befehl->release();
  1332. return 0;
  1333. }
  1334. Result res = datenbank->getResult();
  1335. unlock();
  1336. if( res.zeilenAnzahl )
  1337. sec += (int)res.values[ 0 ];
  1338. res.destroy();
  1339. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( now() - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '" );
  1340. befehl->anhängen( beg );
  1341. befehl->anhängen( "' AND now() < '" );
  1342. befehl->anhängen( end );
  1343. befehl->anhängen( "' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = " );
  1344. befehl->anhängen( accountId );
  1345. befehl->anhängen( " )::INTERVAL )" );
  1346. lock();
  1347. if( !datenbank->befehl( *befehl ) )
  1348. {
  1349. unlock();
  1350. befehl->release();
  1351. return 0;
  1352. }
  1353. res = datenbank->getResult();
  1354. unlock();
  1355. if( res.zeilenAnzahl )
  1356. sec += (int)res.values[ 0 ];
  1357. res.destroy();
  1358. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1359. befehl->anhängen( end );
  1360. befehl->anhängen( "' - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '" );
  1361. befehl->anhängen( beg );
  1362. befehl->anhängen( "' AND a.beginn_datum < '" );
  1363. befehl->anhängen( end );
  1364. befehl->anhängen( "' AND now() > '" );
  1365. befehl->anhängen( end );
  1366. befehl->anhängen( "' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = " );
  1367. befehl->anhängen( accountId );
  1368. befehl->anhängen( " )::INTERVAL )" );
  1369. lock();
  1370. if( !datenbank->befehl( *befehl ) )
  1371. {
  1372. unlock();
  1373. befehl->release();
  1374. return 0;
  1375. }
  1376. res = datenbank->getResult();
  1377. unlock();
  1378. if( res.zeilenAnzahl )
  1379. sec += (int)res.values[ 0 ];
  1380. res.destroy();
  1381. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1382. befehl->anhängen( end );
  1383. befehl->anhängen( "'::TIMESTAMP WITH TIME ZONE - '" );
  1384. befehl->anhängen( beg );
  1385. befehl->anhängen( "' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '" );
  1386. befehl->anhängen( beg );
  1387. befehl->anhängen( "' AND now() > '" );
  1388. befehl->anhängen( end );
  1389. befehl->anhängen( "' AND a.end_datum IS NULL AND a.id = b.spiel_id AND b.account_id = " );
  1390. befehl->anhängen( accountId );
  1391. befehl->anhängen( " )::INTERVAL )" );
  1392. lock();
  1393. if( !datenbank->befehl( *befehl ) )
  1394. {
  1395. unlock();
  1396. befehl->release();
  1397. return 0;
  1398. }
  1399. res = datenbank->getResult();
  1400. unlock();
  1401. if( res.zeilenAnzahl )
  1402. sec += (int)res.values[ 0 ];
  1403. res.destroy();
  1404. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( a.end_datum - '" );
  1405. befehl->anhängen( beg );
  1406. befehl->anhängen( "' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '" );
  1407. befehl->anhängen( beg );
  1408. befehl->anhängen( "' AND a.end_datum < '" );
  1409. befehl->anhängen( end );
  1410. befehl->anhängen( "' AND a.end_datum > '" );
  1411. befehl->anhängen( beg );
  1412. befehl->anhängen( "' AND a.id = b.spiel_id AND b.account_id = " );
  1413. befehl->anhängen( accountId );
  1414. befehl->anhängen( " )::INTERVAL )" );
  1415. lock();
  1416. if( !datenbank->befehl( *befehl ) )
  1417. {
  1418. unlock();
  1419. befehl->release();
  1420. return 0;
  1421. }
  1422. res = datenbank->getResult();
  1423. unlock();
  1424. if( res.zeilenAnzahl )
  1425. sec += (int)res.values[ 0 ];
  1426. res.destroy();
  1427. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( a.end_datum - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '" );
  1428. befehl->anhängen( beg );
  1429. befehl->anhängen( "' AND a.end_datum < '" );
  1430. befehl->anhängen( end );
  1431. befehl->anhängen( "' AND a.id = b.spiel_id AND b.account_id = " );
  1432. befehl->anhängen( accountId );
  1433. befehl->anhängen( " )::INTERVAL )" );
  1434. lock();
  1435. if( !datenbank->befehl( *befehl ) )
  1436. {
  1437. unlock();
  1438. befehl->release();
  1439. return 0;
  1440. }
  1441. res = datenbank->getResult();
  1442. unlock();
  1443. if( res.zeilenAnzahl )
  1444. sec += (int)res.values[ 0 ];
  1445. res.destroy();
  1446. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1447. befehl->anhängen( end );
  1448. befehl->anhängen( "' - a.beginn_datum ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '" );
  1449. befehl->anhängen( beg );
  1450. befehl->anhängen( "' AND a.beginn_datum < '" );
  1451. befehl->anhängen( end );
  1452. befehl->anhängen( "' AND a.end_datum > '" );
  1453. befehl->anhängen( end );
  1454. befehl->anhängen( "' AND a.id = b.spiel_id AND account_id = " );
  1455. befehl->anhängen( accountId );
  1456. befehl->anhängen( " )::INTERVAL )" );
  1457. lock();
  1458. if( !datenbank->befehl( *befehl ) )
  1459. {
  1460. unlock();
  1461. befehl->release();
  1462. return 0;
  1463. }
  1464. res = datenbank->getResult();
  1465. unlock();
  1466. if( res.zeilenAnzahl )
  1467. sec += (int)res.values[ 0 ];
  1468. res.destroy();
  1469. befehl->setText( "SELECT date_part( 'epoch', ( SELECT sum( '" );
  1470. befehl->anhängen( end );
  1471. befehl->anhängen( "'::TIMESTAMP WITH TIME ZONE - '" );
  1472. befehl->anhängen( beg );
  1473. befehl->anhängen( "' ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '" );
  1474. befehl->anhängen( beg );
  1475. befehl->anhängen( "' AND a.end_datum > '" );
  1476. befehl->anhängen( end );
  1477. befehl->anhängen( "' AND a.id = b.spiel_id AND account_id = " );
  1478. befehl->anhängen( accountId );
  1479. befehl->anhängen( " )::INTERVAL )" );
  1480. lock();
  1481. if( !datenbank->befehl( *befehl ) )
  1482. {
  1483. unlock();
  1484. befehl->release();
  1485. return 0;
  1486. }
  1487. res = datenbank->getResult();
  1488. unlock();
  1489. if( res.zeilenAnzahl )
  1490. sec += (int)res.values[ 0 ];
  1491. res.destroy();
  1492. befehl->release();
  1493. return sec;
  1494. }
  1495. int ISDatenbank::getGespieltSpiele( int accountId, char *beg, char *end )
  1496. {
  1497. int anz = 0;
  1498. Text *befehl = new Text( "SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '" );
  1499. befehl->anhängen( beg );
  1500. befehl->anhängen( "' AND a.end_datum < '" );
  1501. befehl->anhängen( end );
  1502. befehl->anhängen( "' AND a.end_datum > '" );
  1503. befehl->anhängen( beg );
  1504. befehl->anhängen( "' AND a.id = b.spiel_id AND b.account_id = " );
  1505. befehl->anhängen( accountId );
  1506. lock();
  1507. if( !datenbank->befehl( *befehl ) )
  1508. {
  1509. unlock();
  1510. befehl->release();
  1511. return 0;
  1512. }
  1513. Result res = datenbank->getResult();
  1514. unlock();
  1515. if( res.zeilenAnzahl )
  1516. anz += (int)res.values[ 0 ];
  1517. res.destroy();
  1518. befehl->setText( "SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '" );
  1519. befehl->anhängen( beg );
  1520. befehl->anhängen( "' AND a.end_datum < '" );
  1521. befehl->anhängen( end );
  1522. befehl->anhängen( "' AND a.id = b.spiel_id AND b.account_id = " );
  1523. befehl->anhängen( accountId );
  1524. lock();
  1525. if( !datenbank->befehl( *befehl ) )
  1526. {
  1527. unlock();
  1528. befehl->release();
  1529. return 0;
  1530. }
  1531. res = datenbank->getResult();
  1532. unlock();
  1533. if( res.zeilenAnzahl )
  1534. anz += (int)res.values[ 0 ];
  1535. res.destroy();
  1536. befehl->release();
  1537. return anz;
  1538. }
  1539. int ISDatenbank::getGewonnenSpiele( int accountId, char *beg, char *end )
  1540. {
  1541. int anz = 0;
  1542. Text *befehl = new Text( "SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum < '" );
  1543. befehl->anhängen( beg );
  1544. befehl->anhängen( "' AND a.end_datum < '" );
  1545. befehl->anhängen( end );
  1546. befehl->anhängen( "' AND a.end_datum > '" );
  1547. befehl->anhängen( beg );
  1548. befehl->anhängen( "' AND a.id = b.spiel_id AND b.spiel_spieler_status_id = 2 AND b.account_id = " );
  1549. befehl->anhängen( accountId );
  1550. lock();
  1551. if( !datenbank->befehl( *befehl ) )
  1552. {
  1553. unlock();
  1554. befehl->release();
  1555. return 0;
  1556. }
  1557. Result res = datenbank->getResult();
  1558. unlock();
  1559. if( res.zeilenAnzahl )
  1560. anz += (int)res.values[ 0 ];
  1561. res.destroy();
  1562. befehl->setText( "SELECT count( a.id ) FROM spiel a, spiel_spieler b WHERE a.beginn_datum > '" );
  1563. befehl->anhängen( beg );
  1564. befehl->anhängen( "' AND a.end_datum < '" );
  1565. befehl->anhängen( end );
  1566. befehl->anhängen( "' AND a.id = b.spiel_id AND b.spiel_spieler_status_id = 2 AND b.account_id = " );
  1567. befehl->anhängen( accountId );
  1568. lock();
  1569. if( !datenbank->befehl( *befehl ) )
  1570. {
  1571. unlock();
  1572. befehl->release();
  1573. return 0;
  1574. }
  1575. res = datenbank->getResult();
  1576. unlock();
  1577. if( res.zeilenAnzahl )
  1578. anz += (int)res.values[ 0 ];
  1579. res.destroy();
  1580. befehl->release();
  1581. return anz;
  1582. }
  1583. Result ISDatenbank::getSpielPartnerListe( int accountId )
  1584. {
  1585. Text *befehl = new Text( "SELECT account_id_b, anzahl, karte_id FROM account_mitspieler WHERE account_id_a = " );
  1586. befehl->anhängen( accountId );
  1587. lock();
  1588. if( !datenbank->befehl( *befehl ) )
  1589. {
  1590. unlock();
  1591. befehl->release();
  1592. Result res = { 0, 0, 0, 0 };
  1593. return res;
  1594. }
  1595. Result res = datenbank->getResult();
  1596. unlock();
  1597. befehl->release();
  1598. return res;
  1599. }
  1600. Result ISDatenbank::getSpielStatistikListe( int accountId, int *seite, int *maxSeite, int sortStalte, bool rückwärts )
  1601. {
  1602. Text *befehl = new Text( "SELECT count( spiel_art_id ) FROM spiel_statistik WHERE account_id = " );
  1603. befehl->anhängen( accountId );
  1604. lock();
  1605. if( !datenbank->befehl( *befehl ) )
  1606. {
  1607. unlock();
  1608. befehl->release();
  1609. Result res = { 0, 0, 0, 0 };
  1610. return res;
  1611. }
  1612. Result res = datenbank->getResult();
  1613. unlock();
  1614. if( !res.zeilenAnzahl )
  1615. {
  1616. res.destroy();
  1617. befehl->release();
  1618. Result res = { 0, 0, 0, 0 };
  1619. return res;
  1620. }
  1621. int einträge = res.values[ 0 ];
  1622. res.destroy();
  1623. *maxSeite = einträge / 21;
  1624. if( einträge % 21 )
  1625. ( *maxSeite )++;
  1626. if( *seite > *maxSeite )
  1627. *seite = *maxSeite;
  1628. if( !( *seite ) )
  1629. {
  1630. befehl->release();
  1631. Result res = { 0, 0, 0, 0 };
  1632. return res;
  1633. }
  1634. befehl->setText( "SELECT a.id, a.name, b.gespielt, b.gewonnen, b.verloren, b.punkte, b.bw0, b.bw1, b.bw2, b.bw3, "
  1635. "b.bw4, b.bw5 FROM spiel_art a, spiel_statistik b WHERE a.id = b.spiel_art_id AND b.account_id = " );
  1636. befehl->anhängen( accountId );
  1637. befehl->anhängen( " ORDER BY " );
  1638. befehl->anhängen( sortStalte + 2 );
  1639. if( rückwärts )
  1640. befehl->anhängen( " DESC" );
  1641. befehl->anhängen( " OFFSET " );
  1642. befehl->anhängen( ( ( *seite ) - 1 ) * 18 );
  1643. befehl->anhängen( " LIMIT 18" );
  1644. lock();
  1645. if( !datenbank->befehl( *befehl ) )
  1646. {
  1647. unlock();
  1648. befehl->release();
  1649. Result res = { 0, 0, 0, 0 };
  1650. return res;
  1651. }
  1652. res = datenbank->getResult();
  1653. unlock();
  1654. befehl->release();
  1655. return res;
  1656. }
  1657. AHDaten *ISDatenbank::getSpielHistorie( int accountId, InformationServer *is )
  1658. {
  1659. Text *befehl = new Text( "SELECT a.id, a.karte_id, c.name, d.name, substring( a.beginn_datum::CHARACTER VARYING FOR 16 ), "
  1660. "b.spiel_spieler_status_id, a.spiel_status_id, count( e.spiel_id ) "
  1661. "FROM spiel a, spiel_spieler b, spiel_art c, karte d, (SELECT spiel_id FROM spiel_spieler) e "
  1662. "WHERE a.id = e.spiel_id AND a.karte_id = d.id AND d.spiel_art_id = c.id "
  1663. "AND a.id = b.spiel_id AND b.account_id = " );
  1664. *befehl += accountId;
  1665. *befehl += " GROUP BY a.id, a.karte_id, c.name, d.name, a.beginn_datum, b.spiel_spieler_status_id, a.spiel_status_id "
  1666. "ORDER BY beginn_datum DESC LIMIT 20";
  1667. lock();
  1668. if( !datenbank->befehl( *befehl ) )
  1669. {
  1670. unlock();
  1671. befehl->release();
  1672. return 0;
  1673. }
  1674. Result spielListe = datenbank->getResult();
  1675. unlock();
  1676. AHDaten *ret = new AHDaten();
  1677. for( int i = 0; i < spielListe.zeilenAnzahl; i++ )
  1678. {
  1679. SpielerTeamStruktur *sts = new SpielerTeamStruktur();
  1680. bool stsOK = 1;
  1681. KartenLeser *reader = new KartenLeser( spielListe.values[ 1 + i * spielListe.feldAnzahl ], is );
  1682. if( !reader->ladeSpielerTeamStruktur( sts ) )
  1683. stsOK = 0;
  1684. reader->release();
  1685. AHSpielDaten *spiel = new AHSpielDaten();
  1686. spiel->id = spielListe.values[ i * spielListe.feldAnzahl ];
  1687. spiel->karteId = spielListe.values[ 1 + i * spielListe.feldAnzahl ];
  1688. spiel->spiel->setText( spielListe.values[ 2 + i * spielListe.feldAnzahl ] );
  1689. spiel->karte->setText( spielListe.values[ 3 + i * spielListe.feldAnzahl ] );
  1690. spiel->datum->setText( spielListe.values[ 4 + i * spielListe.feldAnzahl ] );
  1691. switch( (int)spielListe.values[ 5 + i * spielListe.feldAnzahl ] )
  1692. {
  1693. case 1:
  1694. spiel->status->setText( "Verloren" );
  1695. break;
  1696. case 2:
  1697. spiel->status->setText( "Gewonnen" );
  1698. break;
  1699. case 3:
  1700. spiel->status->setText( "Nicht Anwesend" );
  1701. break;
  1702. case 4:
  1703. spiel->status->setText( "Beobachter" );
  1704. break;
  1705. case 5:
  1706. spiel->status->setText( "Unentschieden" );
  1707. break;
  1708. }
  1709. switch( (int)spielListe.values[ 6 + i * spielListe.feldAnzahl ] )
  1710. {
  1711. case 1:
  1712. spiel->spielStatus->setText( "Beginnt" );
  1713. break;
  1714. case 2:
  1715. spiel->spielStatus->setText( "Läuft" );
  1716. break;
  1717. case 3:
  1718. spiel->spielStatus->setText( "Abgebrochen" );
  1719. break;
  1720. case 4:
  1721. spiel->spielStatus->setText( "Fehlerhaft" );
  1722. break;
  1723. case 5:
  1724. spiel->spielStatus->setText( "Beendet" );
  1725. break;
  1726. case 6:
  1727. spiel->spielStatus->setText( "Unbewertet" );
  1728. break;
  1729. }
  1730. spiel->sAnzahl = spielListe.values[ 7 + i * spielListe.feldAnzahl ];
  1731. *befehl = "SELECT substring( (end_datum - beginn_datum)::CHARACTER VARYING FOR 8) FROM spiel WHERE id = ";
  1732. *befehl += spielListe.values[ i * spielListe.feldAnzahl ].getText();
  1733. lock();
  1734. if( datenbank->befehl( *befehl ) )
  1735. {
  1736. Result dauer = datenbank->getResult();
  1737. unlock();
  1738. if( dauer.zeilenAnzahl && dauer.values[ 0 ].getLänge() )
  1739. spiel->dauer->setText( dauer.values[ 0 ] );
  1740. }
  1741. else
  1742. unlock();
  1743. int gewinnerTeam = -1;
  1744. if( stsOK )
  1745. {
  1746. *befehl = "SELECT team_id FROM spiel_spieler WHERE spiel_spieler_status_id = 2 AND spiel_id = ";
  1747. *befehl += spielListe.values[ i * spielListe.feldAnzahl ].getText();
  1748. lock();
  1749. if( datenbank->befehl( *befehl ) )
  1750. {
  1751. Result team = datenbank->getResult();
  1752. unlock();
  1753. if( team.zeilenAnzahl && team.values[ 0 ].getLänge() && sts->teamName->z( team.values[ 0 ] ) )
  1754. {
  1755. spiel->gewinner->setText( sts->teamName->z( team.values[ 0 ] )->getText() );
  1756. gewinnerTeam = team.values[ 0 ];
  1757. }
  1758. }
  1759. else
  1760. unlock();
  1761. }
  1762. *befehl = "SELECT a.ruf_name, b.team_id, b.punkte, b.spiel_spieler_status_id, b.spieler_nummer FROM account a, spiel_spieler b WHERE b.account_id = a.id AND spiel_id = ";
  1763. *befehl += spielListe.values[ i * spielListe.feldAnzahl ].getText();
  1764. *befehl += " ORDER BY team_id";
  1765. lock();
  1766. if( datenbank->befehl( *befehl ) )
  1767. {
  1768. Result spielerListe = datenbank->getResult();
  1769. unlock();
  1770. for( int j = 0; j < spielerListe.zeilenAnzahl; j++ )
  1771. {
  1772. int tAnz = spiel->teams->getEintragAnzahl();
  1773. int index = -1;
  1774. for( int k = 0; k < tAnz; k++ )
  1775. {
  1776. if( spiel->teams->z( k )->id == (int)spielerListe.values[ 1 + j * spielerListe.feldAnzahl ] )
  1777. {
  1778. index = k;
  1779. break;
  1780. }
  1781. }
  1782. if( index < 0 )
  1783. {
  1784. index = tAnz;
  1785. AHSpielTeamDaten *team = new AHSpielTeamDaten();
  1786. team->id = spielerListe.values[ 1 + j * spielerListe.feldAnzahl ];
  1787. if( sts->teamName->z( team->id ) )
  1788. team->name->setText( sts->teamName->z( team->id )->getText() );
  1789. team->sAnzahl = 0;
  1790. if( team->id == gewinnerTeam )
  1791. team->status->setText( "Gewonnen" );
  1792. else
  1793. team->status->setText( "Verloren" );
  1794. if( sts->teamFarbe->hat( team->id ) )
  1795. team->farbe = sts->teamFarbe->get( team->id );
  1796. else
  1797. team->farbe = 0;
  1798. spiel->teams->set( team, index );
  1799. }
  1800. AHSpielSpielerDaten *spieler = new AHSpielSpielerDaten();
  1801. spieler->name->setText( spielerListe.values[ j * spielerListe.feldAnzahl ] );
  1802. spieler->punkte = spielerListe.values[ 2 + j * spielerListe.feldAnzahl ];
  1803. if( sts->spielerFarbe->hat( (int)spielerListe.values[ 4 + j * spielerListe.feldAnzahl ] - 1 ) )
  1804. spieler->farbe = sts->spielerFarbe->get( (int)spielerListe.values[ 4 + j * spielerListe.feldAnzahl ] - 1 );
  1805. else
  1806. spieler->farbe = 0;
  1807. switch( (int)spielerListe.values[ 3 + j * spielerListe.feldAnzahl ] )
  1808. {
  1809. case 1:
  1810. spieler->status->setText( "Verloren" );
  1811. break;
  1812. case 2:
  1813. spieler->status->setText( "Gewonnen" );
  1814. break;
  1815. case 3:
  1816. spieler->status->setText( "Nicht Anwesend" );
  1817. break;
  1818. case 4:
  1819. spieler->status->setText( "Beobachter" );
  1820. break;
  1821. case 5:
  1822. spieler->status->setText( "Unentschieden" );
  1823. break;
  1824. }
  1825. spiel->teams->z( index )->sAnzahl++;
  1826. spiel->teams->z( index )->spieler->add( spieler );
  1827. }
  1828. }
  1829. else
  1830. unlock();
  1831. sts->release();
  1832. ret->spiele->set( spiel, i );
  1833. }
  1834. return ret;
  1835. }
  1836. bool ISDatenbank::getHistorieServerPortIp( int clientId, int spielId, int *port, Text *ip )
  1837. {
  1838. lock();
  1839. if( !datenbank->befehl( Text( "SELECT a.id, a.port, a.ip FROM server_historie a, server_historie_spiel b "
  1840. "WHERE a.id = b.server_historie_id AND a.clients < a.max_clients - 1 AND "
  1841. "a.server_status_id = 3 AND b.spiel_id = " ) += spielId ) )
  1842. {
  1843. unlock();
  1844. return 0;
  1845. }
  1846. Result res = datenbank->getResult();
  1847. unlock();
  1848. if( !res.zeilenAnzahl )
  1849. {
  1850. res.destroy();
  1851. return 0;
  1852. }
  1853. int id = res.values[ 0 ];
  1854. *port = res.values[ 1 ];
  1855. *ip = res.values[ 2 ].getText();
  1856. res.destroy();
  1857. Text *befehl = new Text( "INSERT INTO server_historie_clients( client_id, server_historie_id ) VALUES ( " );
  1858. befehl->anhängen( clientId );
  1859. befehl->anhängen( ", " );
  1860. befehl->anhängen( id );
  1861. befehl->anhängen( " )" );
  1862. bool ret = 1;
  1863. lock();
  1864. ret &= datenbank->befehl( Text( "SELECT server_historie_id FROM server_historie_clients WHERE client_id = " ) += clientId );
  1865. res = datenbank->getResult();
  1866. if( res.zeilenAnzahl )
  1867. ret &= datenbank->befehl( Text( "UPDATE server_historie SET clients = clients - 1 WHERE id = " ) += res.values[ 0 ] );
  1868. res.destroy();
  1869. ret &= datenbank->befehl( Text( "DELETE FROM server_historie_clients WHERE client_id = " ) += clientId );
  1870. ret &= datenbank->befehl( *befehl );
  1871. ret &= datenbank->befehl( Text( "UPDATE server_historie SET clients = clients + 1 WHERE id = " ) += id );
  1872. unlock();
  1873. befehl->release();
  1874. return ret;
  1875. }
  1876. bool ISDatenbank::hatKlientRecht( int kId, int recht )
  1877. {
  1878. Text befehl = "SELECT a.* FROM account_user_rechte a, account_clients b WHERE a.account_id = b.account_id AND b.client_id = ";
  1879. befehl += kId;
  1880. befehl += " AND a.user_rechte_id = ";
  1881. befehl += recht;
  1882. lock();
  1883. datenbank->befehl( befehl );
  1884. int num = datenbank->getZeilenAnzahl();
  1885. unlock();
  1886. return num == 1;
  1887. }
  1888. Result ISDatenbank::getKartenListe( int kId, char *suchFilter, char sortSpalte, char sortRichtung )
  1889. {
  1890. Text befehl = "SELECT a.id, a.name, b.name, c.kupfer, a.verkauft, a.max_spieler FROM karte a ";
  1891. befehl += "INNER JOIN spiel_art b ON a.spiel_art_id = b.id ";
  1892. befehl += "LEFT JOIN karte_kauf_erlaubt c ON a.id = c.karte_id ";
  1893. befehl += "INNER JOIN account_clients d ON d.account_id = a.account_id ";
  1894. befehl += "WHERE d.client_id = ";
  1895. befehl += kId;
  1896. befehl += " AND a.name LIKE'%";
  1897. befehl += suchFilter;
  1898. befehl += "%' ORDER BY ";
  1899. befehl += sortSpalte + 2;
  1900. if( sortRichtung ) // absteigend
  1901. befehl += " DESC";
  1902. lock();
  1903. if( !datenbank->befehl( befehl ) )
  1904. {
  1905. unlock();
  1906. Result res = { 0, 0, 0, 0 };
  1907. return res;
  1908. }
  1909. Result res = datenbank->getResult();
  1910. unlock();
  1911. return res;
  1912. }
  1913. bool ISDatenbank::getEditorServerPortIp( int clientId, int karteId, int *port, Text *ip )
  1914. {
  1915. Text befehl = "SELECT a.port, a.ip, a.id FROM server_editor a, karte b, account_clients c ";
  1916. befehl += "WHERE a.id = b.server_editor_id AND b.account_id = c.account_id AND a.server_status_id = 3 AND c.client_id = ";
  1917. befehl += clientId;
  1918. befehl += " AND b.id = ";
  1919. befehl += karteId;
  1920. lock();
  1921. if( !datenbank->befehl( befehl ) )
  1922. {
  1923. unlock();
  1924. Result res = { 0, 0, 0, 0 };
  1925. return 0;
  1926. }
  1927. Result res = datenbank->getResult();
  1928. unlock();
  1929. *port = res.values[ 0 ];
  1930. ip->setText( res.values[ 1 ] );
  1931. int id = res.values[ 2 ];
  1932. res.destroy();
  1933. befehl = "INSERT INTO server_editor_clients( client_id, server_editor_id ) VALUES ( ";
  1934. befehl += clientId;
  1935. befehl += ", ";
  1936. befehl += id;
  1937. befehl += " )";
  1938. bool ret = 1;
  1939. lock();
  1940. ret &= datenbank->befehl( Text( "SELECT server_editor_id FROM server_editor_clients WHERE client_id = " ) += clientId );
  1941. ret &= datenbank->befehl( Text( "DELETE FROM server_editor_clients WHERE client_id = " ) += clientId );
  1942. ret &= datenbank->befehl( befehl );
  1943. unlock();
  1944. return 1;
  1945. }
  1946. bool ISDatenbank::getKartenServerPortIp( int clientId, int karteId, int *port, Text *ip )
  1947. {
  1948. Text befehl = "SELECT a.port, a.ip, a.id FROM server_karten a, karte b ";
  1949. befehl += "WHERE a.id = b.server_karten_id AND a.server_status_id = 3 AND b.id = ";
  1950. befehl += karteId;
  1951. if( !karteId )
  1952. befehl = "SELECT port, ip, a.id FROM server_karten WHERE server_status_id = 3 LIMIT 1";
  1953. lock();
  1954. if( !datenbank->befehl( befehl ) )
  1955. {
  1956. unlock();
  1957. return 0;
  1958. }
  1959. Result res = datenbank->getResult();
  1960. unlock();
  1961. if( !res.zeilenAnzahl )
  1962. return 0;
  1963. *port = res.values[ 0 ];
  1964. ip->setText( res.values[ 1 ] );
  1965. int id = res.values[ 2 ];
  1966. res.destroy();
  1967. if( clientId )
  1968. {
  1969. befehl = "INSERT INTO server_karten_clients( client_id, server_karten_id ) VALUES ( ";
  1970. befehl += clientId;
  1971. befehl += ", ";
  1972. befehl += id;
  1973. befehl += " )";
  1974. bool ret = 1;
  1975. lock();
  1976. ret &= datenbank->befehl( Text( "SELECT server_karten_id FROM server_karten_clients WHERE client_id = " ) += clientId );
  1977. ret &= datenbank->befehl( Text( "DELETE FROM server_karten_clients WHERE client_id = " ) += clientId );
  1978. ret &= datenbank->befehl( befehl );
  1979. unlock();
  1980. }
  1981. return 1;
  1982. }
  1983. // constant
  1984. Text *ISDatenbank::getLetzterFehler() const
  1985. {
  1986. return datenbank->getLetzterFehler();
  1987. }
  1988. // Reference Counting
  1989. ISDatenbank *ISDatenbank::getThis()
  1990. {
  1991. ref++;
  1992. return this;
  1993. }
  1994. ISDatenbank *ISDatenbank::release()
  1995. {
  1996. ref--;
  1997. if( !ref )
  1998. delete this;
  1999. return 0;
  2000. }