#include "Datenbank.h" #include #include #include #include // Inhalt der SSDatenbank Klasse aus Datenbank.h // Konstruktor SSDatenbank::SSDatenbank( InitDatei *zIni ) { 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 = zIni->getThis(); ref = 1; 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( (char*)n ); befehl->append( "' AND passwort = md5( '" ); Text p( passwort ); p.ersetzen( "'", "''" ); befehl->append( (char*)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->set( TextZuInt( res.values[ i ].getText(), 10 ), i ); 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() ) ) { 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 ); 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 ) ) { inWarteschlange->set( 1, k ); zeit->set( 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->set( TextZuInt( res.values[ i ].getText(), 10 ), i ); 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 = 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 = 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(); } // Reference Counting SSDatenbankV *SSDatenbank::getThis() { ref++; return this; } SSDatenbankV *SSDatenbank::release() { ref--; if( !ref ) delete this; return 0; }