ソースを参照

Funktionalitäten für SMP hinzugefügt

Kolja Strohm 6 年 前
コミット
0882ebc4ea
3 ファイル変更648 行追加437 行削除
  1. 523 436
      PatchServer/Datenbank.cpp
  2. 10 0
      PatchServer/Datenbank.h
  3. 115 1
      PatchServer/PatchServer.cpp

+ 523 - 436
PatchServer/Datenbank.cpp

@@ -5,16 +5,16 @@
 // Konstruktor
 PSDatenbank::PSDatenbank( 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 ) );
+    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 << "PS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
         exit( 1 );
     }
-	InitializeCriticalSection( &cs );
-	ref = 1;
+    InitializeCriticalSection( &cs );
+    ref = 1;
     Text befehl = "SELECT port, admin_port  FROM server WHERE id = ";
     befehl += zIni->zWert( "ServerId" )->getText();
     lock();
@@ -32,554 +32,641 @@ PSDatenbank::PSDatenbank( InitDatei *zIni )
 // Destruktor
 PSDatenbank::~PSDatenbank()
 {
-	datenbank->release();
-	DeleteCriticalSection( &cs );
+    datenbank->release();
+    DeleteCriticalSection( &cs );
 }
 
 // nicht constant
 void PSDatenbank::lock()
 {
-	EnterCriticalSection( &cs );
+    EnterCriticalSection( &cs );
 }
 
 void PSDatenbank::unlock()
 {
-	LeaveCriticalSection( &cs );
+    LeaveCriticalSection( &cs );
 }
 
 int PSDatenbank::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;
+    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 PSDatenbank::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;
+    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 PSDatenbank::proveKlient( int num, int sNum )
 {
-	Text *befehl = new Text( "SELECT * FROM server_client WHERE server_id = " );
-	befehl->append( sNum );
-	befehl->append( " AND client_id = " );
-	befehl->append( num );
-	lock();
-	datenbank->befehl( befehl->getText() );
-	Result res = datenbank->getResult();
-	unlock();
-	befehl->release();
-	bool ret = 0;
-	if( res.zeilenAnzahl == 1 )
-		ret = 1;
-	res.destroy();
-	return ret;
+    Text *befehl = new Text( "SELECT * FROM server_client WHERE server_id = " );
+    befehl->append( sNum );
+    befehl->append( " AND client_id = " );
+    befehl->append( num );
+    lock();
+    datenbank->befehl( befehl->getText() );
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    bool ret = 0;
+    if( res.zeilenAnzahl == 1 )
+        ret = 1;
+    res.destroy();
+    return ret;
 }
 
 Text *PSDatenbank::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;
+    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;
 }
 
 void PSDatenbank::unregisterKlient( int num, int sNum )
 {
-	Text *befehl = new Text( "DELETE FROM server_client WHERE client_id = " );
-	befehl->append( num );
-	befehl->append( " AND server_id = " );
-	befehl->append( sNum );
-	lock();
-	datenbank->befehl( befehl->getText() );
-	int za = datenbank->getZeilenAnzahl();
-	unlock();
-	if( za == 1 )
-	{
-		befehl->setText( "UPDATE server SET tasks = tasks - 1 WHERE id = " );
-		befehl->append( sNum );
-		lock();
-		datenbank->befehl( befehl->getText() );
-		unlock();
-	}
-	befehl->release();
+    Text *befehl = new Text( "DELETE FROM server_client WHERE client_id = " );
+    befehl->append( num );
+    befehl->append( " AND server_id = " );
+    befehl->append( sNum );
+    lock();
+    datenbank->befehl( befehl->getText() );
+    int za = datenbank->getZeilenAnzahl();
+    unlock();
+    if( za == 1 )
+    {
+        befehl->setText( "UPDATE server SET tasks = tasks - 1 WHERE id = " );
+        befehl->append( sNum );
+        lock();
+        datenbank->befehl( befehl->getText() );
+        unlock();
+    }
+    befehl->release();
 }
 
 bool PSDatenbank::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;
+    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 PSDatenbank::setMaxClients( int id, int maxC )
 {
-	Text *befehl = new Text( "UPDATE server SET max_tasks = " );
-	befehl->append( maxC );
-	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;
+    Text *befehl = new Text( "UPDATE server SET max_tasks = " );
+    befehl->append( maxC );
+    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 PSDatenbank::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;
+    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;
 }
 
 Result PSDatenbank::getSystemListe()
 {
-	lock();
-	if( !datenbank->befehl( "SELECT id, name FROM system" ) )
-	{
-		unlock();
-		Result res = { 0, 0, 0, 0 };
-		return res;
-	}
-	Result res = datenbank->getResult();
-	unlock();
-	return res;
+    lock();
+    if( !datenbank->befehl( "SELECT id, name FROM system" ) )
+    {
+        unlock();
+        Result res = { 0, 0, 0, 0 };
+        return res;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    return res;
 }
 
 Result PSDatenbank::getDateiListe( int system, int gruppe )
 {
-	Text *befehl = new Text( "SELECT pfad, version FROM datei WHERE geloescht = false AND ( system_id = " );
-	befehl->append( system );
-	befehl->append( " OR system_id IS NULL ) AND datei_gruppe_id = " );
-	befehl->append( gruppe );
-	lock();
-	if( !datenbank->befehl( befehl->getText() ) )
-	{
-		unlock();
-		befehl->release();
-		Result res = { 0, 0, 0, 0 };
-		return res;
-	}
-	Result res = datenbank->getResult();
-	unlock();
-	befehl->release();
-	return res;
+    Text *befehl = new Text( "SELECT pfad, version FROM datei WHERE geloescht = false AND ( system_id = " );
+    befehl->append( system );
+    befehl->append( " OR system_id IS NULL ) AND datei_gruppe_id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        Result res = { 0, 0, 0, 0 };
+        return res;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    return res;
+}
+
+Result PSDatenbank::getDateiListeSMP( int system, int gruppe )
+{
+    Text *befehl = new Text( "SELECT id, pfad, version, aenderung_dat FROM datei "
+                             "WHERE geloescht = false AND system_id = " );
+    befehl->append( system );
+    befehl->append( " AND datei_gruppe_id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        Result res = { 0, 0, 0, 0 };
+        return res;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    return res;
 }
 
 Result PSDatenbank::getDateiListeOhneOrdner( int system, int gruppe )
 {
-	Text *befehl = new Text( "SELECT pfad, version FROM datei "
-							 "WHERE geloescht = false AND aenderung_dat IS NOT NULL AND ( system_id = " );
-	befehl->append( system );
-	befehl->append( " OR system_id IS NULL ) AND datei_gruppe_id = " );
-	befehl->append( gruppe );
-	lock();
-	if( !datenbank->befehl( befehl->getText() ) )
-	{
-		unlock();
-		befehl->release();
-		Result res = { 0, 0, 0, 0 };
-		return res;
-	}
-	Result res = datenbank->getResult();
-	unlock();
-	befehl->release();
-	return res;
+    Text *befehl = new Text( "SELECT pfad, version FROM datei "
+                             "WHERE geloescht = false AND aenderung_dat IS NOT NULL AND ( system_id = " );
+    befehl->append( system );
+    befehl->append( " OR system_id IS NULL ) AND datei_gruppe_id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        Result res = { 0, 0, 0, 0 };
+        return res;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    return res;
 }
 
 Result PSDatenbank::getDeletedFiles( int system, int gruppe )
 {
-	Text *befehl = new Text( "SELECT pfad FROM datei WHERE geloescht = true AND ( system_id = " );
-	befehl->append( system );
-	befehl->append( " OR system_id IS NULL ) AND datei_gruppe_id = " );
-	befehl->append( gruppe );
-	lock();
-	if( !datenbank->befehl( befehl->getText() ) )
-	{
-		unlock();
-		befehl->release();
-		Result res = { 0, 0, 0, 0 };
-		return res;
-	}
-	Result res = datenbank->getResult();
-	unlock();
-	befehl->release();
-	return res;
+    Text *befehl = new Text( "SELECT pfad FROM datei WHERE geloescht = true AND ( system_id = " );
+    befehl->append( system );
+    befehl->append( " OR system_id IS NULL ) AND datei_gruppe_id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        Result res = { 0, 0, 0, 0 };
+        return res;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    return res;
 }
 
 Text *PSDatenbank::getSystemName( int system )
 {
-	Text *befehl = new Text( "SELECT name FROM system WHERE id = " );
-	befehl->append( system );
-	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;
+    Text *befehl = new Text( "SELECT name FROM system WHERE id = " );
+    befehl->append( system );
+    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;
 }
 
 Text *PSDatenbank::getDateiGruppeName( int gruppe )
 {
-	Text *befehl = new Text( "SELECT name FROM datei_gruppe WHERE id = " );
-	befehl->append( gruppe );
-	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;
+    Text *befehl = new Text( "SELECT name FROM datei_gruppe WHERE id = " );
+    befehl->append( gruppe );
+    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 PSDatenbank::supportedDateiGruppe( int server, int gruppe )
 {
-	Text *befehl = new Text( "SELECT * FROM server_patch_datei_gruppe a, datei_gruppe b "
-							 "WHERE a.datei_gruppe_id = b.id AND a.version = b.version AND a.server_patch_id = " );
-	befehl->append( server );
-	befehl->append( " AND b.id = " );
-	befehl->append( gruppe );
-	lock();
-	if( !datenbank->befehl( befehl->getText() ) )
-	{
-		unlock();
-		befehl->release();
-		return 0;
-	}
-	int zeilen = datenbank->getZeilenAnzahl();
-	unlock();
-	befehl->release();
-	return zeilen != 0;
+    Text *befehl = new Text( "SELECT * FROM server_patch_datei_gruppe a, datei_gruppe b "
+                             "WHERE a.datei_gruppe_id = b.id AND a.version = b.version AND a.server_patch_id = " );
+    befehl->append( server );
+    befehl->append( " AND b.id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    int zeilen = datenbank->getZeilenAnzahl();
+    unlock();
+    befehl->release();
+    return zeilen != 0;
 }
 
 bool PSDatenbank::istDateigruppeStatusUpdate( int server, int gruppe )
 {
-	Text *befehl = new Text( "SELECT * FROM server_patch_datei_gruppe a, datei_gruppe b "
-							 "WHERE a.datei_gruppe_id = b.id AND a.server_patch_datei_gruppe_status_id = 2 AND a.server_patch_id = " );
-	befehl->append( server );
-	befehl->append( " AND b.id = " );
-	befehl->append( gruppe );
-	lock();
-	if( !datenbank->befehl( befehl->getText() ) )
-	{
-		unlock();
-		befehl->release();
-		return 0;
-	}
-	int zeilen = datenbank->getZeilenAnzahl();
-	unlock();
-	befehl->release();
-	return zeilen != 0;
+    Text *befehl = new Text( "SELECT * FROM server_patch_datei_gruppe a, datei_gruppe b "
+                             "WHERE a.datei_gruppe_id = b.id AND a.server_patch_datei_gruppe_status_id = 2 AND a.server_patch_id = " );
+    befehl->append( server );
+    befehl->append( " AND b.id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    int zeilen = datenbank->getZeilenAnzahl();
+    unlock();
+    befehl->release();
+    return zeilen != 0;
 }
 
 bool PSDatenbank::setDateiGruppe( int server, int gruppe, int version )
 {
-	Text befehl = "SELECT server_patch_id FROM server_patch_datei_gruppe WHERE server_patch_id = ";
-	befehl += server;
-	befehl += " AND datei_gruppe_id = ";
-	befehl += gruppe;
-	lock();
-	if( !datenbank->befehl( befehl ) )
-	{
-		unlock();
-		return 0;
-	}
-	unlock();
-	if( !datenbank->getZeilenAnzahl() )
-	{
-		befehl = "INSERT INTO server_patch_datei_gruppe( server_patch_id, datei_gruppe_id, version, server_patch_datei_gruppe_status_id ) VALUES( ";
-		befehl += server;
-		befehl += ", ";
-		befehl += gruppe;
-		befehl += ", ";
-		befehl += version;
-		befehl += ", 1 )";
-		lock();
-		if( !datenbank->befehl( befehl ) )
-		{
-			unlock();
-			return 0;
-		}
-		unlock();
-	}
-	else
-	{
-		befehl = "UPDATE server_patch_datei_gruppe SET server_patch_datei_gruppe_status_id = 1, version = ";
-		befehl += version;
-		befehl += " WHERE server_patch_id = ";
-		befehl += server;
-		befehl += " AND datei_gruppe_id = ";
-		befehl += gruppe;
-		lock();
-		if( !datenbank->befehl( befehl ) )
-		{
-			unlock();
-			return 0;
-		}
-		unlock();
-	}
-	return 1;
+    Text befehl = "SELECT server_patch_id FROM server_patch_datei_gruppe WHERE server_patch_id = ";
+    befehl += server;
+    befehl += " AND datei_gruppe_id = ";
+    befehl += gruppe;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    unlock();
+    if( !datenbank->getZeilenAnzahl() )
+    {
+        befehl = "INSERT INTO server_patch_datei_gruppe( server_patch_id, datei_gruppe_id, version, server_patch_datei_gruppe_status_id ) VALUES( ";
+        befehl += server;
+        befehl += ", ";
+        befehl += gruppe;
+        befehl += ", ";
+        befehl += version;
+        befehl += ", 1 )";
+        lock();
+        if( !datenbank->befehl( befehl ) )
+        {
+            unlock();
+            return 0;
+        }
+        unlock();
+    }
+    else
+    {
+        befehl = "UPDATE server_patch_datei_gruppe SET server_patch_datei_gruppe_status_id = 1, version = ";
+        befehl += version;
+        befehl += " WHERE server_patch_id = ";
+        befehl += server;
+        befehl += " AND datei_gruppe_id = ";
+        befehl += gruppe;
+        lock();
+        if( !datenbank->befehl( befehl ) )
+        {
+            unlock();
+            return 0;
+        }
+        unlock();
+    }
+    return 1;
 }
 
 bool PSDatenbank::setDateiGruppe( int server, int gruppe, bool update )
 {
-	Text *befehl = new Text( "UPDATE server_patch_datei_gruppe SET server_patch_datei_gruppe_status_id = " );
-	befehl->append( update ? 2 : 1 );
-	befehl->append( " WHERE server_patch_id = " );
-	befehl->append( server );
-	befehl->append( " AND datei_gruppe_id = " );
-	befehl->append( gruppe );
-	lock();
-	if( !datenbank->befehl( befehl->getText() ) )
-	{
-		unlock();
-		befehl->release();
-		return 0;
-	}
-	unlock();
-	befehl->release();
-	return 1;
+    Text *befehl = new Text( "UPDATE server_patch_datei_gruppe SET server_patch_datei_gruppe_status_id = " );
+    befehl->append( update ? 2 : 1 );
+    befehl->append( " WHERE server_patch_id = " );
+    befehl->append( server );
+    befehl->append( " AND datei_gruppe_id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    unlock();
+    befehl->release();
+    return 1;
 }
 
 bool PSDatenbank::dateiGruppeUpdateFertig( int server, int gruppe )
 {
-	Text *befehl = new Text( "UPDATE server_patch_datei_gruppe a SET version = b.version "
-							 "FROM datei_gruppe b WHERE a.datei_gruppe_id = b.id AND a.server_patch_id = " );
-	befehl->append( server );
-	befehl->append( " AND b.id = " );
-	befehl->append( gruppe );
-	lock();
-	if( !datenbank->befehl( befehl->getText() ) )
-	{
-		unlock();
-		befehl->release();
-		return 0;
-	}
-	unlock();
-	befehl->release();
-	setDateiGruppe( server, gruppe, false );
-	return 1;
+    Text *befehl = new Text( "UPDATE server_patch_datei_gruppe a SET version = b.version "
+                             "FROM datei_gruppe b WHERE a.datei_gruppe_id = b.id AND a.server_patch_id = " );
+    befehl->append( server );
+    befehl->append( " AND b.id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    unlock();
+    befehl->release();
+    setDateiGruppe( server, gruppe, false );
+    return 1;
 }
 
 int PSDatenbank::getDateiGruppePatchServer( int client, int gruppe )
 {
-	Text *befehl = new Text( "select such_datei_gruppe_patch_server( " );
-	befehl->append( client );
-	befehl->append( ", " );
-	befehl->append( gruppe );
-	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;
+    Text *befehl = new Text( "select such_datei_gruppe_patch_server( " );
+    befehl->append( client );
+    befehl->append( ", " );
+    befehl->append( gruppe );
+    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;
 }
 
 bool PSDatenbank::getPatchServerPortIp( int server, int *port, Text *zIp )
 {
-	if( !server )
-		return 0;
-	Text *befehl = new Text( "SELECT port, ip FROM server WHERE id = " );
-	befehl->append( server );
-	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;
+    if( !server )
+        return 0;
+    Text *befehl = new Text( "SELECT port, ip FROM server WHERE id = " );
+    befehl->append( server );
+    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;
 }
 
 Result PSDatenbank::getGruppeIds()
 {
-	lock();
-	if( !datenbank->befehl( "SELECT id FROM datei_gruppe" ) )
-	{
-		unlock();
-		Result res = { 0, 0, 0, 0 };
-		return res;
-	}
-	Result res = datenbank->getResult();
-	unlock();
-	return res;
+    lock();
+    if( !datenbank->befehl( "SELECT id FROM datei_gruppe" ) )
+    {
+        unlock();
+        Result res = { 0, 0, 0, 0 };
+        return res;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    return res;
 }
 
 Result PSDatenbank::getDateiGruppeListe()
 {
-	lock();
-	if( !datenbank->befehl( "SELECT id, pfad, version FROM datei_gruppe" ) )
-	{
-		unlock();
-		Result res = { 0, 0, 0, 0 };
-		return res;
-	}
-	Result res = datenbank->getResult();
-	unlock();
-	return res;
+    lock();
+    if( !datenbank->befehl( "SELECT id, pfad, version FROM datei_gruppe" ) )
+    {
+        unlock();
+        Result res = { 0, 0, 0, 0 };
+        return res;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    return res;
+}
+
+int PSDatenbank::getDateiVersion( const char *pfad, int system, int gruppe )
+{
+    Text *befehl = new Text( "SELECT version FROM datei WHERE pfad = '" );
+    befehl->append( pfad );
+    befehl->append( "' AND system_id = " );
+    befehl->append( system );
+    befehl->append( " AND datei_gruppe_id = " );
+    befehl->append( gruppe );
+    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 PSDatenbank::getDateiGruppeVersion( int gruppe )
 {
-	Text *befehl = new Text( "SELECT version FROM datei_gruppe WHERE id = " );
-	befehl->append( gruppe );
-	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 *befehl = new Text( "SELECT version FROM datei_gruppe WHERE id = " );
+    befehl->append( gruppe );
+    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 PSDatenbank::getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *list )
+{
+    Text befehl = "SELECT a.id, a.name, 'Fehlt' AS status FROM datei_gruppe a "
+        "LEFT JOIN server_patch_datei_gruppe b ON a.id = b.datei_gruppe_id AND b.server_patch_id = ";
+    befehl += serverId;
+    befehl += " WHERE b.datei_gruppe_id IS NULL "
+        "UNION "
+        "SELECT a.id, a.name, 'Veraltet' AS status FROM datei_gruppe a, server_patch_datei_gruppe b "
+        "WHERE a.id = b.datei_gruppe_id AND a.version != b.version AND b.server_patch_datei_gruppe_status_id = 1 AND b.server_patch_id = ";
+    befehl += serverId;
+    befehl += " UNION "
+        "SELECT a.id, a.name, 'Update' AS status FROM datei_gruppe a, server_patch_datei_gruppe b "
+        "WHERE a.id = b.datei_gruppe_id AND a.version != b.version AND b.server_patch_datei_gruppe_status_id = 2 AND b.server_patch_id = ";
+    befehl += serverId;
+    befehl += " UNION "
+        "SELECT a.id, a.name, 'Aktuell' AS status FROM datei_gruppe a, server_patch_datei_gruppe b "
+        "WHERE a.id = b.datei_gruppe_id AND a.version = b.version AND b.server_patch_id = ";
+    befehl += serverId;
+    lock();
+    if( !datenbank->befehl( befehl ) )
+    {
+        unlock();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    for( int i = 0; i < res.zeilenAnzahl; i++ )
+    {
+        FileGroupInfo *info = new FileGroupInfo();
+        info->id = res.values[ 0 + i * 3 ];
+        info->name = (char*)res.values[ 1 + i * 3 ];
+        info->status = (char*)res.values[ 2 + i * 3 ];
+        list->add( info );
+    }
+    res.destroy();
+    return 1;
 }
 
 // constant
 Text *PSDatenbank::getLetzterFehler() const
 {
-	return datenbank->getLetzterFehler();
+    return datenbank->getLetzterFehler();
 }
 
 // Reference Counting
 PSDatenbank *PSDatenbank::getThis()
 {
-	ref++;
-	return this;
+    ref++;
+    return this;
 }
 
 PSDatenbank *PSDatenbank::release()
 {
-	ref--;
-	if( !ref )
-		delete this;
-	return 0;
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
 }

+ 10 - 0
PatchServer/Datenbank.h

@@ -17,6 +17,13 @@ namespace Admin_Recht
 	const int KSGCUpdate = 7;
 }
 
+struct FileGroupInfo
+{
+    int id;
+    Text name;
+    Text status;
+};
+
 class PSDatenbank
 {
 private:
@@ -42,6 +49,7 @@ public:
 	bool serverIstNichtPausiert( int id );
 	Result getSystemListe();
 	Result getDateiListe( int system, int gruppe );
+    Result getDateiListeSMP( int system, int gruppe );
 	Result getDateiListeOhneOrdner( int system, int gruppe );
 	Result getDeletedFiles( int system, int gruppe );
 	Text *getSystemName( int system );
@@ -56,6 +64,8 @@ public:
 	Result getGruppeIds();
 	Result getDateiGruppeListe();
 	int getDateiGruppeVersion( int gruppe );
+    int getDateiVersion( const char *pfad, int system, int gruppe );
+    bool getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *list );
 	// constant
 	Text *getLetzterFehler() const;
 	// Reference Counting

+ 115 - 1
PatchServer/PatchServer.cpp

@@ -998,7 +998,9 @@ void PSAKlient::thread()
                 }
                 break;
             case 0xF: // klient absturtz
-                if( 1 )
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
                 {
                     klient->sende( "\1", 1 );
                     int klientId = 0;
@@ -1009,6 +1011,118 @@ void PSAKlient::thread()
                         klient->sende( "\0", 1 );
                 }
                 break;
+            case 0x10: // SMP Frage nach Datei Gruppen Status
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
+                        errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
+                    else
+                    {
+                        Array< FileGroupInfo* > list;
+                        if( ps->zDB()->getFileGroupInfoList( ps->getId(), &list ) )
+                        {
+                            klient->sende( "\1", 1 );
+                            int anz = list.getEintragAnzahl();
+                            klient->sende( (char*)&anz, 4 );
+                            for( int i = 0; i < anz; i++ )
+                            {
+                                FileGroupInfo *info = list.get( i );
+                                klient->sende( (char*)&info->id, 4 );
+                                unsigned char len = (unsigned char)info->name.getLength();
+                                klient->sende( (char*)&len, 1 );
+                                klient->sende( info->name, len );
+                                len = (unsigned char)info->status.getLength();
+                                klient->sende( (char*)&len, 1 );
+                                klient->sende( info->status, len );
+                                delete info;
+                            }
+                        }
+                        else
+                            errorZuKlient( "Fehler beim abrufen der Datei Gruppen Informationen." );
+                    }
+                }
+                break;
+            case 0x11: // SMP Get System List
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
+                        errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
+                    else
+                    {
+                        klient->sende( "\1", 1 );
+                        Result res = ps->zDB()->getSystemListe();
+                        klient->sende( (char*)&res.zeilenAnzahl, 4 );
+                        for( int i = 0; i < res.zeilenAnzahl; i++ )
+                        {
+                            int id = res.values[ i * 2 ];
+                            klient->sende( (char*)&id, 4 );
+                            unsigned char len = (unsigned char)res.values[ i * 2 + 1 ].getLength();
+                            klient->sende( (char*)&len, 1 );
+                            klient->sende( res.values[ i * 2 + 1 ], len );
+                        }
+                        res.destroy();
+                    }
+                }
+                break;
+            case 0x12: // SMP Get File List
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
+                        errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
+                    else
+                    {
+                        klient->sende( "\1", 1 );
+                        int system, group;
+                        klient->getNachricht( (char*)&system, 4 );
+                        klient->getNachricht( (char*)&group, 4 );
+                        Result res = ps->zDB()->getDateiListeSMP( system, group );
+                        klient->sende( (char*)&res.zeilenAnzahl, 4 );
+                        for( int i = 0; i < res.zeilenAnzahl; i++ )
+                        {
+                            int id = res.values[ i * 4 ];
+                            klient->sende( (char*)&id, 4 );
+                            unsigned short len = (unsigned short)res.values[ i * 4 + 1 ].getLength();
+                            klient->sende( (char*)&len, 2 );
+                            klient->sende( res.values[ i * 4 + 1 ], len );
+                            int version = res.values[ i * 4 + 2 ];
+                            klient->sende( (char*)&version, 4 );
+                            unsigned char l = (unsigned char)res.values[ i * 4 + 3 ].getLength();
+                            klient->sende( (char*)&l, 1 );
+                            klient->sende( res.values[ i * 4 + 3 ], l );
+                        }
+                        res.destroy();
+                    }
+                }
+                break;
+            case 0x13: // Get File Version
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( !ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
+                        errorZuKlient( "Du hast kein Recht diese Operation durchzuführen." );
+                    else
+                    {
+                        klient->sende( "\1", 1 );
+                        int group, system;
+                        unsigned short len;
+                        klient->getNachricht( (char*)&len, 2 );
+                        char *path = new char[ len ];
+                        klient->getNachricht( path, len );
+                        klient->getNachricht( (char*)&group, 4 );
+                        klient->getNachricht( (char*)&system, 4 );
+                        int version = ps->zDB()->getDateiVersion( path, system, group );
+                        delete[] path;
+                        klient->sende( (char*)&version, 4 );
+                    }
+                }
+                break;
             default:
                 errorZuKlient( "Unbekannte Nachricht!" );
                 break;