Ver código fonte

Fehler bei der dateiversionskontrolle behoben

Kolja Strohm 5 anos atrás
pai
commit
4bf5374f6a
3 arquivos alterados com 69 adições e 125 exclusões
  1. 65 123
      PatchServer/Datenbank.cpp
  2. 1 1
      PatchServer/Datenbank.h
  3. 3 1
      PatchServer/PatchServer.cpp

+ 65 - 123
PatchServer/Datenbank.cpp

@@ -52,11 +52,11 @@ 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( (char *)n );
     befehl->append( "' AND passwort = md5( '" );
     Text p( passwort );
     p.ersetzen( "'", "''" );
-    befehl->append( (char*)p );
+    befehl->append( (char *)p );
     befehl->append( "' )" );
     lock();
     datenbank->befehl( befehl->getText() );
@@ -102,7 +102,7 @@ bool PSDatenbank::proveKlient( int num, int sNum )
     return ret;
 }
 
-Text *PSDatenbank::getKlientKey( int cId )
+Text * PSDatenbank::getKlientKey( int cId )
 {
     lock();
     if( !datenbank->befehl( Text( "SELECT schluessel FROM client WHERE id = " ) += cId ) )
@@ -505,11 +505,11 @@ int PSDatenbank::getDateiGruppePatchServer( int client, int gruppe )
     return ret;
 }
 
-bool PSDatenbank::getPatchServerPortIp( int server, int *port, Text *zIp )
+bool PSDatenbank::getPatchServerPortIp( int server, int *port, Text * zIp )
 {
     if( !server )
         return 0;
-    Text *befehl = new Text( "SELECT port, ip FROM server WHERE id = " );
+    Text * befehl = new Text( "SELECT port, ip FROM server WHERE id = " );
     befehl->append( server );
     lock();
     if( !datenbank->befehl( befehl->getText() ) )
@@ -565,7 +565,7 @@ int PSDatenbank::getDateiVersion( const char *pfad, int system, int gruppe )
     Text *befehl = new Text( "SELECT version FROM datei WHERE pfad = '" );
     Text p( pfad );
     p.ersetzen( "'", "''" );
-    befehl->append( (char*)p );
+    befehl->append( (char *)p );
     befehl->append( "' AND system_id = " );
     befehl->append( system );
     befehl->append( " AND datei_gruppe_id = " );
@@ -614,7 +614,7 @@ int PSDatenbank::getDateiGruppeVersion( int gruppe )
     return ret;
 }
 
-bool PSDatenbank::getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *list )
+bool PSDatenbank::getFileGroupInfoList( int serverId, Array< FileGroupInfo * > * list )
 {
     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 = ";
@@ -644,9 +644,9 @@ bool PSDatenbank::getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *l
     {
         FileGroupInfo *info = new FileGroupInfo();
         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->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 );
     }
@@ -654,165 +654,107 @@ bool PSDatenbank::getFileGroupInfoList( int serverId, Array< FileGroupInfo* > *l
     return 1;
 }
 
-bool PSDatenbank::updateDatei( const char *pfad, char *letzteAEnderung, int system, int gruppe )
+bool PSDatenbank::updateDatei( const char *pfad, char status, char *letzteAEnderung, int system, int gruppe )
 {
-    Text *befehl = new Text( "SELECT * FROM datei WHERE pfad = '" );
+    Text befehl;
     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() ) )
+    switch( status )
     {
-        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 );
+    case 0: // delete
+        befehl = Text( "UPDATE datei SET geloescht = true WHERE pfad = '" ) + p + "' AND system_id = " + system + " AND datei_gruppe_id = " + gruppe;
         lock();
-        if( !datenbank->befehl( befehl->getText() ) )
+        if( datenbank->befehl( befehl ) )
         {
             unlock();
-            befehl->release();
-            return 0;
+            return 1;
         }
-        int anz = datenbank->getZeilenAnzahl();
-        unlock();
-        if( anz ) // datei wurde noch nicht in die Tabelle datei_loeschen eingetragen
+        else
         {
-            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;
-            }
+            unlock();
+            return 0;
         }
-    }
-    else if( !anz ) // neue Datei erstellt
+        break;
+    case 1: // update
     {
-        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, " );
-        }
+        befehl = Text( "UPDATE datei SET geloescht = false WHERE pfad = '" ) + p + "' AND system_id = " + system + " AND datei_gruppe_id = " + gruppe;
+        lock();
+        if( datenbank->befehl( befehl ) )
+            unlock();
         else
         {
-            befehl->append( "'" );
-            Text l( letzteAEnderung );
-            l.ersetzen( "'", "''" );
-            befehl->append( (char*)l );
-            befehl->append( "', " );
+            unlock();
+            return 0;
         }
-        befehl->append( system );
-        befehl->append( ", " );
-        befehl->append( gruppe );
-        befehl->append( " )" );
+        Text l( letzteAEnderung );
+        l.ersetzen( "'", "''" );
+        befehl = Text( "UPDATE datei SET version = version + 1, aenderung_dat = '" ) + l + "' WHERE pfad = '" + p + "' AND system_id = " + system + " AND aenderung_dat != '" + l + "' AND datei_gruppe_id = " + gruppe;
         lock();
-        if( datenbank->befehl( befehl->getText() ) )
+        if( datenbank->befehl( befehl ) )
         {
             unlock();
-            befehl->release();
             return 1;
         }
         else
         {
             unlock();
-            befehl->release();
             return 0;
         }
+        break;
     }
-    else if( anz && letzteAEnderung ) // Datei existiert bereits
+    case 2: // new
     {
-        // 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 );
+        befehl = Text( "SELECT * FROM datei WHERE pfad = '" ) + p + "' AND system_id = " + system + " AND datei_gruppe_id = " + gruppe;
         lock();
-        if( !datenbank->befehl( befehl->getText() ) )
+        if( !datenbank->befehl( befehl ) )
         {
             unlock();
-            befehl->release();
             return 0;
         }
+        int anz = datenbank->getZeilenAnzahl();
         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() ) )
+        if( anz > 0 )
         {
-            unlock();
-            befehl->release();
-            return 0;
+            befehl = Text( "UPDATE datei SET geloescht = true WHERE pfad = '" ) + p + "' AND system_id = " + system + " AND datei_gruppe_id = " + gruppe;
+            lock();
+            if( datenbank->befehl( befehl ) )
+            {
+                unlock();
+                return 1;
+            }
+            else
+            {
+                unlock();
+                return 0;
+            }
         }
-        anz = datenbank->getZeilenAnzahl();
-        unlock();
-        if( !anz ) // Datei wurde geändert
+        else
         {
-            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() ) )
+            befehl = Text( "INSERT INTO datei( pfad, version, aenderung_dat, system_id, datei_gruppe_id ) VALUES( '" ) + p + "', 1, ";
+            if( !letzteAEnderung )
+                befehl += "NULL, ";
+            else
+            {
+                Text l( letzteAEnderung );
+                l.ersetzen( "'", "''" );
+                befehl += Text( "'" ) + l + "', ";
+            }
+            befehl += Text( system ) + ", " + gruppe + " )";
+            if( datenbank->befehl( befehl ) )
             {
                 unlock();
-                befehl->release();
                 return 1;
             }
             else
             {
                 unlock();
-                befehl->release();
                 return 0;
             }
         }
+        break;
     }
-    befehl->release();
-    return 1;
+    }
+    return 0;
 }
 
 bool PSDatenbank::dateiGruppeUpdate( int gruppe )

+ 1 - 1
PatchServer/Datenbank.h

@@ -68,7 +68,7 @@ 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 updateDatei( const char *pfad, char status, char *letzteAEnderung, int system, int gruppe );
     bool dateiGruppeUpdate( int gruppe );
 	// constant
 	Text *getLetzterFehler() const;

+ 3 - 1
PatchServer/PatchServer.cpp

@@ -1129,6 +1129,8 @@ void PSAKlient::thread()
                         char *path = new char[ len + 1 ];
                         klient->getNachricht( path, len );
                         path[ len ] = 0;
+                        char status = 0; // 0: delete, 1: update, 2: new
+                        klient->getNachricht( &status, 1 );
                         unsigned char l;
                         klient->getNachricht( (char *)& l, 1 );
                         char *time = 0;
@@ -1141,7 +1143,7 @@ void PSAKlient::thread()
                         int system, gruppe;
                         klient->getNachricht( (char *)& system, 4 );
                         klient->getNachricht( (char *)& gruppe, 4 );
-                        if( ps->zDB()->updateDatei( path, time, system, gruppe ) )
+                        if( ps->zDB()->updateDatei( path, status, time, system, gruppe ) )
                             klient->sende( "\1", 1 );
                         else
                             errorZuKlient( "Fehler beim updaten der Datei." );