#include "Datenbank.h" #include #include #include #include // Inhalt der SSDatenbank Klasse aus Datenbank.h // Konstruktor SSDatenbank::SSDatenbank(InitDatei* zIni) : ReferenceCounter() { datenbank = new Datenbank(zIni->zWert("DBBenutzer")->getText(), zIni->zWert("DBPasswort")->getText(), zIni->zWert("DBName")->getText(), zIni->zWert("DBIP")->getText(), (unsigned short)TextZuInt(zIni->zWert("DBPort")->getText(), 10)); if (!datenbank->istOk()) { std::cout << "SS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet."; exit(1); } InitializeCriticalSection(&cs); ini = dynamic_cast(zIni->getThis()); Text befehl = "SELECT port, admin_port, ip FROM server WHERE id = "; befehl += zIni->zWert("ServerId")->getText(); lock(); datenbank->befehl(befehl); Result res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl == 1) { zIni->addWert("ServerPort", res.values[0]); zIni->addWert("AdminServerPort", res.values[1]); zIni->addWert("ServerIp", res.values[2]); } res.destroy(); } // Destruktor SSDatenbank::~SSDatenbank() { datenbank->release(); DeleteCriticalSection(&cs); ini->release(); } // nicht constant void SSDatenbank::lock() { EnterCriticalSection(&cs); } void SSDatenbank::unlock() { LeaveCriticalSection(&cs); } Text* SSDatenbank::getKlientKey(int cId) { lock(); if (!datenbank->befehl(Text("SELECT schluessel FROM client WHERE id = ") += cId)) { unlock(); return 0; } Result res = datenbank->getResult(); unlock(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } Text* ret = new Text(res.values[0].getText()); res.destroy(); return ret; } int SSDatenbank::istAdministrator(const char* name, const char* passwort) { Text* befehl = new Text("SELECT id FROM benutzer WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' AND passwort = md5( '"); Text p(passwort); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = 0; if (res.zeilenAnzahl > 0) ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } bool SSDatenbank::adminHatRecht(int id, int recht) { Text* befehl = new Text("SELECT * FROM benutzer_rechte WHERE benutzer_id = "); befehl->append(id); befehl->append(" AND rechte_id = "); befehl->append(recht); lock(); datenbank->befehl(befehl->getText()); int ret = datenbank->getZeilenAnzahl(); unlock(); befehl->release(); return ret != 0; } bool SSDatenbank::setServerStatus(int id, int status) { Text* befehl = new Text("UPDATE server SET server_status_id = "); *befehl += status; *befehl += "WHERE id = "; *befehl += id; lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } bool ret = datenbank->getZeilenAnzahl() != 0; unlock(); befehl->release(); return ret; } bool SSDatenbank::setMaxSpiele(int id, int maxS) { Text* befehl = new Text("UPDATE server SET max_tasks = "); befehl->append(maxS); befehl->append(" WHERE id = "); befehl->append(id); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } bool ret = datenbank->getZeilenAnzahl() > 0; unlock(); befehl->release(); return ret; } bool SSDatenbank::serverIstNichtPausiert(int id) { Text* befehl = new Text("SELECT server_status_id FROM server WHERE id = "); befehl->append(id); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } bool ret = (int)res.values[0] == 3; res.destroy(); return ret; } int SSDatenbank::getAccountId(int clientId) { if (!clientId) return 0; Text* befehl = new Text("SELECT account_id FROM account_client WHERE client_id = "); befehl->append(clientId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } Text* SSDatenbank::getSpielArtName(int spielId) { if (!spielId) return new Text(""); Text* befehl = new Text("SELECT name FROM spiel_art WHERE id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return new Text(""); } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return new Text(""); } Text* ret = new Text(res.values[0].getText()); res.destroy(); return ret; } Text* SSDatenbank::getKarteName(int karteId) { if (!karteId) return new Text("Inoffiziell"); Text* befehl = new Text("SELECT name FROM karte WHERE id = "); befehl->append(karteId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return new Text("Inoffiziell"); } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return new Text("Inoffiziell"); } Text* ret = new Text(res.values[0].getText()); res.destroy(); return ret; } int SSDatenbank::getSpielArtId(int karteId) { if (!karteId) return 0; Text* befehl = new Text("SELECT spiel_art_id FROM karte WHERE id = "); befehl->append(karteId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } int SSDatenbank::erstelleSpiel(int serverId) { if (!serverId) return 0; Text* befehl = new Text("SELECT such_spieler_fuer_spiel( "); befehl->append(serverId); befehl->append(")"); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } bool SSDatenbank::deleteSpielErstelltNext(int serverId) { if (!serverId) return 0; Text* befehl = new Text("DELETE FROM server_spiel_next WHERE server_spiel_id = "); befehl->append(serverId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->release(); return 1; } int SSDatenbank::getSpielErstelltId(int serverId) { if (!serverId) return 0; Text* befehl = new Text("SELECT spiel_erstellt_id FROM server_spiel_next WHERE server_spiel_id = "); befehl->append(serverId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } int SSDatenbank::getSpielErstelltSpieler(int spielErstelltId, Array< int >* accountIds) { if (!spielErstelltId) return 0; Text* befehl = new Text("SELECT a.account_id FROM spiel_erstellt_spieler a WHERE a.spiel_erstellt_id = "); befehl->append(spielErstelltId); befehl->append(" UNION SELECT a.account_id FROM gruppe_spieler a, spiel_erstellt_gruppe b WHERE a.gruppe_id = b.gruppe_id AND b.spiel_erstellt_id = "); befehl->append(spielErstelltId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = res.zeilenAnzahl; for (int i = 0; i < ret; i++) accountIds->add(TextZuInt(res.values[i].getText(), 10)); res.destroy(); return ret; } int SSDatenbank::getKarteVonErstelltemSpiel(int spielErstelltId) { if (!spielErstelltId) return 0; Text* befehl = new Text("SELECT karte_id FROM spiel_erstellt WHERE id = "); befehl->append(spielErstelltId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } bool SSDatenbank::getChatServerPortIp(int accountId, int* port, Text* zIp) { if (!accountId) return 0; Text* befehl = new Text("SELECT a.port, a.ip FROM server a, account_client b, server_client c WHERE a.server_typ_name = 'chat' AND a.id = c.server_id AND c.client_id = b.client_id AND b.account_id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } *port = TextZuInt(res.values[0].getText(), 10); zIp->setText(res.values[1].getText()); res.destroy(); return 1; } bool SSDatenbank::spielErstelltAbbruch(int spielErstelltId, int anzahl, Array< int >* accounts, Array< int >* status, Array< bool >* inWarteschlange, RCArray< Zeit >* zeit) { if (!spielErstelltId || !anzahl) return 0; Text* befehl = new Text("BEGIN"); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } befehl->setText("UPDATE server_spiel_regel SET jetzt_spiele = jetzt_spiele - 1 FROM spiel_erstellt " "WHERE server_spiel_regel.server_spiel_id = spiel_erstellt.server_spiel_id " "AND server_spiel_regel.karte_id = spiel_erstellt.karte_id AND spiel_erstellt.id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); return 0; } befehl->setText("UPDATE server SET tasks = tasks - 1 FROM spiel_erstellt " "WHERE server.id = spiel_erstellt.server_spiel_id AND spiel_erstellt.id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); return 0; } befehl->setText("SELECT karte_id FROM spiel_erstellt WHERE id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); if (!res.zeilenAnzahl) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); res.destroy(); return 0; } int karteId = TextZuInt(res.values[0].getText(), 10); res.destroy(); befehl->setText("SELECT account_id, anmeldung_zeit FROM spiel_erstellt_spieler WHERE spiel_erstellt_id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); return 0; } Result acc = datenbank->getResult(); befehl->setText("SELECT gruppe_id, anmeldung_zeit FROM spiel_erstellt_gruppe WHERE spiel_erstellt_id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); acc.destroy(); befehl->release(); return 0; } Result gru = datenbank->getResult(); befehl->setText("DELETE FROM spiel_erstellt_spieler WHERE spiel_erstellt_id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); acc.destroy(); gru.destroy(); befehl->release(); return 0; } befehl->setText("DELETE FROM spiel_erstellt_gruppe WHERE spiel_erstellt_id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); acc.destroy(); gru.destroy(); befehl->release(); return 0; } befehl->setText("DELETE FROM spiel_erstellt WHERE id = "); befehl->append(spielErstelltId); if (!datenbank->befehl(befehl->getText())) { befehl->setText("ROLLBACK"); datenbank->befehl(befehl->getText()); unlock(); acc.destroy(); gru.destroy(); befehl->release(); return 0; } for (int i = 0; i < acc.zeilenAnzahl; i++) { int accId = TextZuInt(acc.values[i * 2].getText(), 10); for (int j = 0; j < anzahl; j++) { if (accounts->hat(j) && accId == accounts->get(j)) { if (status->hat(j) && status->get(j) == 2) { // zurück in Warteschlange befehl->setText("INSERT INTO account_anmeldung_fuer_spiel( account_id, karte_id, anmeldung_zeit ) VALUES( "); befehl->append(accId); befehl->append(", "); befehl->append(karteId); befehl->append(", '"); befehl->append(acc.values[i * 2 + 1].getText()); befehl->append("' )"); if (datenbank->befehl(befehl->getText())) { while (!inWarteschlange->hat(j)) inWarteschlange->add(0); inWarteschlange->set(1, j); Zeit* jetzt = getZeit(); Zeit* anmeldung = new Zeit(); anmeldung->setZeit("y-m-d h:i:s", acc.values[i * 2 + 1].getText()); jetzt->minusZeit(anmeldung); while (!zeit->hat(j)) zeit->add(0); zeit->set(jetzt, j); } } break; } } } acc.destroy(); for (int i = 0; i < gru.zeilenAnzahl; i++) { bool backInWarteschlange = 1; Array< int >* mitglieder = new Array< int >(); int mAnzahl = getSpielerAusGruppe(TextZuInt(gru.values[i * 2].getText(), 10), mitglieder); for (int j = 0; j < mAnzahl; j++) { if (mitglieder->hat(j)) { int akkId = mitglieder->get(j); for (int k = 0; k < anzahl; k++) { if (accounts->hat(k) && akkId == accounts->get(k)) backInWarteschlange &= status->hat(k) && status->get(k) == 2; } if (!backInWarteschlange) break; } } if (backInWarteschlange) { befehl->setText("INSERT INTO grupe_aneldung_fuer_spiel( gruppe_id, anmeldung_zeit ) VALUES( "); befehl->append(TextZuInt(gru.values[i * 2].getText(), 10)); befehl->append(", '"); befehl->append(gru.values[i * 2 + 1].getText()); befehl->append("' )"); if (datenbank->befehl(befehl->getText())) { Zeit* jetzt = getZeit(); Zeit* anmeldung = new Zeit(); anmeldung->setZeit("y-m-d h:i:s", gru.values[i * 2 + 1].getText()); jetzt->minusZeit(anmeldung); for (int j = 0; j < mAnzahl; j++) { int akkId = mitglieder->get(j); for (int k = 0; k < anzahl; k++) { if (accounts->hat(k) && akkId == accounts->get(k)) { while (!inWarteschlange->hat(j)) inWarteschlange->add(0); inWarteschlange->set(1, k); while (!zeit->hat(j)) zeit->add(0); zeit->set(dynamic_cast(jetzt->getThis()), k); } } } jetzt->release(); } } mitglieder->release(); } gru.destroy(); befehl->setText("COMMIT"); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->release(); return 1; } int SSDatenbank::spielErstelltFortsetzen(int spielErstelltId) { if (!spielErstelltId) return 0; Text* befehl = new Text("SELECT spiel_erstellt_fortsetzen( "); befehl->append(spielErstelltId); befehl->append(" )"); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } void SSDatenbank::spielSetTeams(int spielId, int sAnzahl, Array< int >* accounts, Array< int >* team) { Text* befehl = new Text(""); for (int i = 0; i < sAnzahl; i++) { if (team->hat(i) && accounts->hat(i)) { befehl->setText("UPDATE spiel_spieler SET team_id = "); befehl->append(team->get(i)); befehl->append(" WHERE account_id = "); befehl->append(accounts->get(i)); befehl->append(" AND spiel_id = "); befehl->append(spielId); lock(); datenbank->befehl(befehl->getText()); unlock(); } } befehl->release(); } void SSDatenbank::spielSetSpielerNummern(int spielId, int sAnzahl, Array< int >* accounts, Array< int >* spielerNummern) { Text* befehl = new Text(""); for (int i = 0; i < sAnzahl; i++) { if (spielerNummern->hat(i) && accounts->hat(i)) { befehl->setText("UPDATE spiel_spieler SET spieler_nummer = "); befehl->append(spielerNummern->get(i)); befehl->append(" WHERE account_id = "); befehl->append(accounts->get(i)); befehl->append(" AND spiel_id = "); befehl->append(spielId); lock(); datenbank->befehl(befehl->getText()); unlock(); } } befehl->release(); } int SSDatenbank::getSpielerAusGruppe(int gruppeId, Array< int >* accounts) { Text* befehl = new Text("SELECT account_id FROM gruppe_spieler WHERE gruppe_id = "); befehl->append(gruppeId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = res.zeilenAnzahl; for (int i = 0; i < ret; i++) accounts->add(TextZuInt(res.values[i].getText(), 10)); res.destroy(); return ret; } int SSDatenbank::getAktionForKlient(int serverId, int accountId, int* id) { if (!serverId || !accountId) return 0; Text* befehl = new Text("SELECT a.id FROM spiel_erstellt a, spiel_erstellt_spieler b " "WHERE b.spiel_erstellt_id = a.id AND b.account_id = "); befehl->append(accountId); befehl->append(" AND a.server_spiel_id = "); befehl->append(serverId); befehl->append(" UNION SELECT a.id FROM spiel_erstellt a, spiel_erstellt_gruppe b, gruppe_spieler d " "WHERE b.spiel_erstellt_id = a.id AND d.gruppe_id = b.gruppe_id AND d.account_id = "); befehl->append(accountId); befehl->append(" AND a.server_spiel_id = "); befehl->append(serverId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl) { befehl->release(); *id = TextZuInt(res.values[0].getText(), 10); res.destroy(); return 1; } res.destroy(); befehl->setText("SELECT a.id FROM spiel a, spiel_spieler b WHERE a.id = b.spiel_id AND a.spiel_status_id < 3 AND a.spiel_server_id = "); befehl->append(serverId); befehl->append(" AND b.account_id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl) { *id = TextZuInt(res.values[0].getText(), 10); res.destroy(); return 2; } res.destroy(); return 0; } bool SSDatenbank::setSpielStatusIsRunning(int spielId) { if (!spielId) return 0; Text* befehl = new Text("UPDATE spiel SET spiel_status_id = 2 WHERE id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->release(); return 1; } bool SSDatenbank::setSpielStatusBeendet(int spielId, int status) { if (!spielId) return 0; Text* befehl = new Text("UPDATE spiel SET spiel_status_id = "); befehl->append(status); befehl->append(" WHERE id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->setText("UPDATE spiel SET end_datum = now() WHERE id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->setText("UPDATE server SET tasks = tasks - 1 FROM spiel WHERE server.id = spiel.spiel_server_id AND spiel.id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->setText("UPDATE server_spiel_regel SET jetzt_spiele = jetzt_spiele - 1 FROM spiel WHERE server_spiel_regel.server_spiel_id = spiel.spiel_server_id AND server_spiel_regel.karte_id = spiel.karte_id AND spiel.id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->release(); return 1; } bool SSDatenbank::setSpielSpielerStatus(int spielId, int accountId, int punkte, int status) { if (!spielId || !accountId) return 0; Text* befehl = new Text("UPDATE spiel_spieler SET spiel_spieler_status_id = "); befehl->append(status); befehl->append(" WHERE spiel_id = "); befehl->append(spielId); befehl->append(" AND account_id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->setText("UPDATE spiel_spieler SET punkte = "); befehl->append(punkte); befehl->append(" WHERE spiel_id = "); befehl->append(spielId); befehl->append(" AND account_id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); if ((punkte / 10 + status - 1) > 0 && (status == 1 || status == 2)) { int kupfer = punkte / 10; kupfer += status - 1; befehl->setText("UPDATE account SET kupfer = kupfer + "); befehl->append(kupfer); befehl->append(" WHERE id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); } befehl->release(); return 1; } bool SSDatenbank::addSpielerStatistik(int accountId, int spielId) { if (!spielId || !accountId) return 0; Text* befehl = new Text("SELECT spiel_statistik.* FROM spiel_statistik, spiel, karte " "WHERE spiel_statistik.spiel_art_id = karte.spiel_art_id AND karte.id = spiel.karte_id " "AND spiel_statistik.account_id = "); befehl->append(accountId); befehl->append(" AND spiel.id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } int anz = datenbank->getZeilenAnzahl(); unlock(); if (!anz) { befehl->setText("INSERT INTO spiel_statistik( account_id, spiel_art_id ) SELECT "); befehl->append(accountId); befehl->append(" AS account_id, spiel_art.id FROM spiel_art, karte, spiel " "WHERE spiel_art.id = karte.spiel_art_id AND karte.id = spiel.karte_id AND spiel.id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); } befehl->setText("SELECT spiel_spieler_status_id FROM spiel_spieler WHERE account_id = "); befehl->append(accountId); befehl->append(" AND spiel_id = "); befehl->append(spielId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); if (!res.zeilenAnzahl) { res.destroy(); befehl->release(); return 0; } int status = TextZuInt(res.values[0].getText(), 10); res.destroy(); befehl->setText("UPDATE spiel_statistik SET gespielt = gespielt + 1, "); if (status == 1) befehl->append(" verloren = spiel_statistik.verloren + 1, "); if (status == 2) befehl->append(" gewonnen = spiel_statistik.gewonnen + 1, "); befehl->append(" punkte = spiel_statistik.punkte + spiel_spieler.punkte FROM spiel_spieler, karte, spiel " "WHERE spiel_statistik.account_id = spiel_spieler.account_id " "AND spiel_statistik.spiel_art_id = karte.spiel_art_id " "AND karte.id = spiel.karte_id AND spiel_spieler.spiel_id = spiel.id AND spiel.id = "); befehl->append(spielId); befehl->append(" AND spiel_statistik.account_id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } unlock(); befehl->release(); return 1; } Text* SSDatenbank::getAccountRufName(int accountId) { if (!accountId) return 0; Text* befehl = new Text("SELECT ruf_name FROM account WHERE id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } Text* ret = new Text(res.values[0].getText()); res.destroy(); return ret; } bool SSDatenbank::suchHistorieServer(short* port, Text* ip) { lock(); if (!datenbank->befehl("SELECT such_historie_server()")) { unlock(); return 0; } Result res = datenbank->getResult(); unlock(); if (!res.zeilenAnzahl || (int)res.values[0] == 0) { res.destroy(); return 0; } lock(); if (!datenbank->befehl(Text("SELECT port, ip FROM server WHERE id = ") += res.values[0].getText())) { unlock(); res.destroy(); return 0; } res.destroy(); res = datenbank->getResult(); unlock(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } *port = (short)(int)res.values[0]; *ip = res.values[1].getText(); res.destroy(); return 1; } bool SSDatenbank::getKartenServer(int karteId, int* port, Text* ip) { Text befehl = "SELECT a.port, a.ip FROM server a, karte b "; befehl += "WHERE a.id = b.server_karten_id AND a.server_status_id = 3 AND b.id = "; befehl += karteId; lock(); if (!datenbank->befehl(befehl)) { unlock(); return 0; } Result res = datenbank->getResult(); unlock(); *port = (int)res.values[0]; ip->setText(res.values[1]); res.destroy(); return 1; } Text* SSDatenbank::getSpielPfad(int karteId) { Text befehl = "SELECT a.id FROM spiel_art a, karte b WHERE b.spiel_art_id = a.id AND b.id = "; befehl += karteId; lock(); if (!datenbank->befehl(befehl)) { unlock(); return 0; } Result res = datenbank->getResult(); unlock(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } int id = (int)res.values[0]; res.destroy(); Text* ret = new Text(ini->zWert("SpielePfad")->getText()); ret->append("/"); ret->append(id); return ret; } // constant Text* SSDatenbank::getLetzterFehler() const { return datenbank->getLetzterFehler(); }