瀏覽代碼

Weitere SMP Funktionen hinzugefügt

Kolja Strohm 6 年之前
父節點
當前提交
ee7e28a12b
共有 3 個文件被更改,包括 250 次插入10 次删除
  1. 190 8
      PatchServer/Datenbank.cpp
  2. 4 0
      PatchServer/Datenbank.h
  3. 56 2
      PatchServer/PatchServer.cpp

+ 190 - 8
PatchServer/Datenbank.cpp

@@ -563,7 +563,9 @@ Result PSDatenbank::getDateiGruppeListe()
 int PSDatenbank::getDateiVersion( const char *pfad, int system, int gruppe )
 {
     Text *befehl = new Text( "SELECT version FROM datei WHERE pfad = '" );
-    befehl->append( pfad );
+    Text p( pfad );
+    p.ersetzen( "'", "''" );
+    befehl->append( (char*)p );
     befehl->append( "' AND system_id = " );
     befehl->append( system );
     befehl->append( " AND datei_gruppe_id = " );
@@ -614,20 +616,20 @@ int PSDatenbank::getDateiGruppeVersion( int gruppe )
 
 bool PSDatenbank::getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *list )
 {
-    Text befehl = "SELECT a.id, a.name, 'Fehlt' AS status FROM datei_gruppe a "
+    Text befehl = "SELECT a.id, a.name, 'Fehlt' AS status, a.pfad, a.version 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 "
+        "SELECT a.id, a.name, 'Veraltet' AS status, a.pfad, a.version 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 "
+        "SELECT a.id, a.name, 'Update' AS status, a.pfad, a.version 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 "
+        "SELECT a.id, a.name, 'Aktuell' AS status, a.pfad, a.version 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();
@@ -641,15 +643,195 @@ bool PSDatenbank::getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *l
     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 ];
+        info->id = res.values[ 0 + i * 5 ];
+        info->name = (char*)res.values[ 1 + i * 5 ];
+        info->status = (char*)res.values[ 2 + i * 5 ];
+        info->pfad = (char*)res.values[ 3 + i * 5 ];
+        info->version = res.values[ 4 + i * 5 ];
         list->add( info );
     }
     res.destroy();
     return 1;
 }
 
+bool PSDatenbank::updateDatei( const char *pfad, char *letzteAEnderung, int system, int gruppe )
+{
+    Text *befehl = new Text( "SELECT * FROM datei WHERE pfad = '" );
+    Text p( pfad );
+    p.ersetzen( "'", "''" );
+    befehl->append( (char*)p );
+    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;
+    }
+    int anz = datenbank->getZeilenAnzahl();
+    unlock();
+    if( anz && !letzteAEnderung ) // datei existiert nicht mehr
+    {
+        befehl->setText( "SELECT * FROM datei"
+                         "WHERE geloescht = false AND pfad = '" );
+        befehl->append( (char*)p );
+        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;
+        }
+        int anz = datenbank->getZeilenAnzahl();
+        unlock();
+        if( anz ) // datei wurde noch nicht in die Tabelle datei_loeschen eingetragen
+        {
+            befehl->setText( "UPDATE datei SET geloescht = true WHERE pfad = '" );
+            befehl->append( (char*)p );
+            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 1;
+            }
+            else
+            {
+                unlock();
+                befehl->release();
+                return 0;
+            }
+        }
+    }
+    else if( !anz ) // neue Datei erstellt
+    {
+        befehl->setText( "INSERT INTO datei( pfad, version, aenderung_dat, system_id, datei_gruppe_id ) VALUES( '" );
+        befehl->append( (char*)p );
+        befehl->append( "', 1, " );
+        if( !letzteAEnderung )
+        {
+            befehl->append( "NULL, " );
+        }
+        else
+        {
+            befehl->append( "'" );
+            Text l( letzteAEnderung );
+            l.ersetzen( "'", "''" );
+            befehl->append( (char*)l );
+            befehl->append( "', " );
+        }
+        befehl->append( system );
+        befehl->append( ", " );
+        befehl->append( gruppe );
+        befehl->append( " )" );
+        lock();
+        if( datenbank->befehl( befehl->getText() ) )
+        {
+            unlock();
+            befehl->release();
+            return 1;
+        }
+        else
+        {
+            unlock();
+            befehl->release();
+            return 0;
+        }
+    }
+    else if( anz && letzteAEnderung ) // Datei existiert bereits
+    {
+        // Datei aus tabelle datei_loeschen entfernen, wenn sie vorhanden ist
+        befehl->setText( "UPDATE datei SET geloescht = false WHERE pfad = '" );
+        befehl->append( (char*)p );
+        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;
+        }
+        unlock();
+        befehl->setText( "SELECT * FROM datei WHERE pfad = '" );
+        befehl->append( (char*)p );
+        befehl->append( "' AND system_id = " );
+        befehl->append( system );
+        befehl->append( " AND datei_gruppe_id = " );
+        befehl->append( gruppe );
+        befehl->append( " AND aenderung_dat = '" );
+        Text l( letzteAEnderung );
+        l.ersetzen( "'", "''" );
+        befehl->append( (char*)l );
+        befehl->append( "'" );
+        lock();
+        if( !datenbank->befehl( befehl->getText() ) )
+        {
+            unlock();
+            befehl->release();
+            return 0;
+        }
+        anz = datenbank->getZeilenAnzahl();
+        unlock();
+        if( !anz ) // Datei wurde geändert
+        {
+            befehl->setText( "UPDATE datei SET version = version + 1, aenderung_dat = '" );
+            befehl->append( (char*)l );
+            befehl->append( "' WHERE pfad = '" );
+            befehl->append( (char*)p );
+            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 1;
+            }
+            else
+            {
+                unlock();
+                befehl->release();
+                return 0;
+            }
+        }
+    }
+    befehl->release();
+    return 1;
+}
+
+bool PSDatenbank::dateiGruppeUpdate( int gruppe )
+{
+    Text *befehl = new Text( "UPDATE datei_gruppe SET version = version + 1 WHERE id = " );
+    befehl->append( gruppe );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    int z = datenbank->getZeilenAnzahl();
+    unlock();
+    befehl->release();
+    return z != 0;
+}
+
 // constant
 Text *PSDatenbank::getLetzterFehler() const
 {

+ 4 - 0
PatchServer/Datenbank.h

@@ -22,6 +22,8 @@ struct FileGroupInfo
     int id;
     Text name;
     Text status;
+    Text pfad;
+    int version;
 };
 
 class PSDatenbank
@@ -66,6 +68,8 @@ public:
 	int getDateiGruppeVersion( int gruppe );
     int getDateiVersion( const char *pfad, int system, int gruppe );
     bool getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *list );
+    bool updateDatei( const char *pfad, char *letzteAEnderung, int system, int gruppe );
+    bool dateiGruppeUpdate( int gruppe );
 	// constant
 	Text *getLetzterFehler() const;
 	// Reference Counting

+ 56 - 2
PatchServer/PatchServer.cpp

@@ -95,7 +95,7 @@ void PatchServer::thread()
         klient = server->getKlient();
         if( !klient )
             continue;
-		Framework::getThreadRegister()->cleanUpClosedThreads();
+        Framework::getThreadRegister()->cleanUpClosedThreads();
         PSKlient *clHandle = new PSKlient( klient, getThis(), ini->getThis() );
         EnterCriticalSection( &cs );
         klients->set( clHandle, klientAnzahl );
@@ -1036,6 +1036,10 @@ void PSAKlient::thread()
                                 len = (unsigned char)info->status.getLength();
                                 klient->sende( (char*)&len, 1 );
                                 klient->sende( info->status, len );
+                                unsigned short l = (unsigned short)info->pfad.getLength();
+                                klient->sende( (char*)&l, 2 );
+                                klient->sende( info->pfad, l );
+                                klient->sende( (char*)&info->version, 4 );
                                 delete info;
                             }
                         }
@@ -1113,8 +1117,9 @@ void PSAKlient::thread()
                         int group, system;
                         unsigned short len;
                         klient->getNachricht( (char*)&len, 2 );
-                        char *path = new char[ len ];
+                        char *path = new char[ len + 1 ];
                         klient->getNachricht( path, len );
+                        path[ len ] = 0;
                         klient->getNachricht( (char*)&group, 4 );
                         klient->getNachricht( (char*)&system, 4 );
                         int version = ps->zDB()->getDateiVersion( path, system, group );
@@ -1123,6 +1128,55 @@ void PSAKlient::thread()
                     }
                 }
                 break;
+            case 0x14: // Update File
+                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 );
+                        unsigned short len;
+                        klient->getNachricht( (char*)&len, 2 );
+                        char *path = new char[ len + 1 ];
+                        klient->getNachricht( path, len );
+                        path[ len ] = 0;
+                        unsigned char l;
+                        klient->getNachricht( (char*)&l, 1 );
+                        char *time = new char[ l + 1 ];
+                        klient->getNachricht( path, l );
+                        time[ l ] = 0;
+                        int system, gruppe;
+                        klient->getNachricht( (char*)&system, 4 );
+                        klient->getNachricht( (char*)&gruppe, 4 );
+                        if( ps->zDB()->updateDatei( path, time, system, gruppe ) )
+                            klient->sende( "\1", 1 );
+                        else
+                            errorZuKlient( "Fehler beim updaten der Datei." );
+                    }
+                }
+                break;
+            case 0x15: // Update Gruppe
+                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 gruppe;
+                        klient->getNachricht( (char*)&gruppe, 4 );
+                        if( ps->zDB()->dateiGruppeUpdate( gruppe ) )
+                            klient->sende( "\1", 1 );
+                        else
+                            errorZuKlient( "Fehler beim updaten der Gruppe." );
+                    }
+                }
+                break;
             default:
                 errorZuKlient( "Unbekannte Nachricht!" );
                 break;