Relax history reader to accept entries with additional fields
authorMichael Andres <ma@suse.de>
Mon, 19 Nov 2012 14:00:55 +0000 (15:00 +0100)
committerMichael Andres <ma@suse.de>
Wed, 21 Nov 2012 13:35:28 +0000 (14:35 +0100)
zypp/HistoryLogData.cc
zypp/parser/HistoryLogReader.cc

index a66154a..0e0f69e 100644 (file)
@@ -134,7 +134,7 @@ namespace zypp
   HistoryItemInstall::HistoryItemInstall(FieldVector & fields)
     : HistoryItem(fields)
   {
-    if (fields.size() != 8)
+    if (fields.size() < 8)
       ZYPP_THROW(ParseException(
         str::form("Bad number of fields. Got %zu, expected %u.",
           fields.size(), 8)));
@@ -175,7 +175,7 @@ namespace zypp
   HistoryItemRemove::HistoryItemRemove(FieldVector & fields)
     : HistoryItem(fields)
   {
-    if (fields.size() != 6)
+    if (fields.size() < 6)
       ZYPP_THROW(ParseException(
         str::form("Bad number of fields. Got %zu, expected %u.",
           fields.size(), 6)));
@@ -212,7 +212,7 @@ namespace zypp
   HistoryItemRepoAdd::HistoryItemRepoAdd(FieldVector & fields)
     : HistoryItem(fields)
   {
-    if (fields.size() != 4)
+    if (fields.size() < 4)
       ZYPP_THROW(ParseException(
         str::form("Bad number of fields. Got %zu, expected %u.",
           fields.size(), 4)));
@@ -245,7 +245,7 @@ namespace zypp
   HistoryItemRepoRemove::HistoryItemRepoRemove(FieldVector & fields)
     : HistoryItem(fields)
   {
-    if (fields.size() != 3)
+    if (fields.size() < 3)
       ZYPP_THROW(ParseException(
         str::form("Bad number of fields. Got %zu, expected %u.",
           fields.size(), 3)));
@@ -275,7 +275,7 @@ namespace zypp
   HistoryItemRepoAliasChange::HistoryItemRepoAliasChange(FieldVector & fields)
     : HistoryItem(fields)
   {
-    if (fields.size() != 4)
+    if (fields.size() < 4)
       ZYPP_THROW(ParseException(
         str::form("Bad number of fields. Got %zu, expected %u.",
           fields.size(), 4)));
@@ -306,7 +306,7 @@ namespace zypp
   HistoryItemRepoUrlChange::HistoryItemRepoUrlChange(FieldVector & fields)
     : HistoryItem(fields)
   {
-    if (fields.size() != 4)
+    if (fields.size() < 4)
       ZYPP_THROW(ParseException(
         str::form("Bad number of fields. Got %zu, expected %u.",
           fields.size(), 4)));
index 53b284f..99e0748 100644 (file)
@@ -44,108 +44,112 @@ namespace zypp
     HistoryItem::Ptr createHistoryItem(HistoryItem::FieldVector & fields);
     void parseLine(const string & line, unsigned int lineNr);
 
-    void readAll(const ProgressData::ReceiverFnc & progress);
-    void readFrom(const Date & date,
-        const ProgressData::ReceiverFnc & progress);
-    void readFromTo(
-        const Date & fromDate, const Date & toDate,
-        const ProgressData::ReceiverFnc & progress);
+    void readAll( const ProgressData::ReceiverFnc & progress );
+    void readFrom( const Date & date, const ProgressData::ReceiverFnc & progress );
+    void readFromTo( const Date & fromDate, const Date & toDate, const ProgressData::ReceiverFnc & progress );
 
     Pathname _filename;
     ProcessItem _callback;
     bool _ignoreInvalid;
   };
 
-  HistoryLogReader::Impl::Impl( const Pathname & historyFile,
-                                const ProcessItem & callback )
-    : _filename(historyFile), _callback(callback), _ignoreInvalid(false)
+
+  HistoryLogReader::Impl::Impl( const Pathname & historyFile, const ProcessItem & callback )
+    : _filename( historyFile )
+    , _callback( callback )
+    , _ignoreInvalid( false )
   {}
 
-  HistoryItem::Ptr
-  HistoryLogReader::Impl::createHistoryItem(HistoryItem::FieldVector & fields)
+
+  HistoryItem::Ptr HistoryLogReader::Impl::createHistoryItem( HistoryItem::FieldVector & fields )
   {
-    HistoryActionID aid(str::trim(fields[1]));
-    switch (aid.toEnum())
+    HistoryActionID aid( str::trim( fields[1] ) );
+    switch ( aid.toEnum() )
     {
     case HistoryActionID::INSTALL_e:
-        return HistoryItemInstall::Ptr(new HistoryItemInstall(fields));
+      return HistoryItemInstall::Ptr( new HistoryItemInstall( fields ) );
       break;
 
     case HistoryActionID::REMOVE_e:
-      return HistoryItemRemove::Ptr(new HistoryItemRemove(fields));
+      return HistoryItemRemove::Ptr( new HistoryItemRemove( fields ) );
       break;
 
     case HistoryActionID::REPO_ADD_e:
-      return HistoryItemRepoAdd::Ptr(new HistoryItemRepoAdd(fields));
+      return HistoryItemRepoAdd::Ptr( new HistoryItemRepoAdd( fields ) );
       break;
 
     case HistoryActionID::REPO_REMOVE_e:
-      return HistoryItemRepoRemove::Ptr(new HistoryItemRepoRemove(fields));
+      return HistoryItemRepoRemove::Ptr( new HistoryItemRepoRemove( fields ) );
       break;
 
     case HistoryActionID::REPO_CHANGE_ALIAS_e:
-      return HistoryItemRepoAliasChange::Ptr(new HistoryItemRepoAliasChange(fields));
+      return HistoryItemRepoAliasChange::Ptr( new HistoryItemRepoAliasChange( fields ) );
       break;
 
     case HistoryActionID::REPO_CHANGE_URL_e:
-      return HistoryItemRepoUrlChange::Ptr(new HistoryItemRepoUrlChange(fields));
+      return HistoryItemRepoUrlChange::Ptr( new HistoryItemRepoUrlChange( fields ) );
       break;
-
-    default:
-      WAR << "Unknown history log action type: " << fields[1] << endl;
     }
-
     return HistoryItem::Ptr();
   }
 
-  void HistoryLogReader::Impl::parseLine(const string & line, unsigned int lineNr)
-  {
-    HistoryItem::FieldVector fields;
-    HistoryItem::Ptr item_ptr;
 
+  void HistoryLogReader::Impl::parseLine( const string & line, unsigned int lineNr )
+  {
     // parse into fields
-    str::splitEscaped(line, back_inserter(fields), "|", true);
+    HistoryItem::FieldVector fields;
+    str::splitEscaped( line, back_inserter(fields), "|", true );
 
-    if (fields.size() <= 2)
+    if ( fields.size() <= 2 )
     {
-      ParseException
-        e(str::form("Error in history log on line #%u.", lineNr));
-      e.addHistory(
-          str::form("Bad number of fields. Got %zd, expected more than %d.",
-              fields.size(), 2));
-      ZYPP_THROW(e);
+      if ( !_ignoreInvalid )
+      {
+       ParseException e( str::form( "Error in history log on line #%u.", lineNr ) );
+       e.addHistory( str::form( "Bad number of fields. Got %zd, expected more than %d.", fields.size(), 2 ) );
+       ZYPP_THROW( e );
+      }
+      else
+      {
+       WAR << "Ignoring suspicious non-comment entry on line #" << lineNr << endl;
+       return;
+      }
     }
 
+    HistoryItem::Ptr item_ptr;
     try
     {
-      item_ptr = createHistoryItem(fields);
+      item_ptr = createHistoryItem( fields );
     }
-    catch (const Exception & e)
+    catch ( const Exception & e )
     {
       ZYPP_CAUGHT(e);
-      ERR << "Invalid history log entry on line #" << lineNr << ":" << endl
-          << line << endl;
+      ERR << "Invalid history log entry on line #" << lineNr << " '"<< line << "'" << endl;
 
-      if (!_ignoreInvalid)
+      if ( !_ignoreInvalid )
       {
-        ParseException newe(
-            str::form("Error in history log on line #%u.", lineNr ) );
-        newe.remember(e);
-        ZYPP_THROW(newe);
+        ParseException newe( str::form( "Error in history log on line #%u.", lineNr ) );
+       newe.remember( e );
+       ZYPP_THROW( newe );
       }
     }
 
-    if (item_ptr)
-      _callback(item_ptr);
-    else if (!_ignoreInvalid)
+    if ( item_ptr )
     {
-      ParseException
-        e(str::form("Error in history log on line #%u.", lineNr));
-      e.addHistory("Unknown entry type.");
-      ZYPP_THROW(e);
+      _callback( item_ptr );
+    }
+    else if ( !_ignoreInvalid )
+    {
+      ParseException e( str::form( "Error in history log on line #%u.", lineNr ) );
+      e.addHistory( "Unknown entry type." );
+      ZYPP_THROW( e );
+    }
+    else
+    {
+      WAR << "Unknown history log action type: " << fields[1] << " on line #" << lineNr << endl;
     }
   }
 
+
   void HistoryLogReader::Impl::readAll(const ProgressData::ReceiverFnc & progress)
   {
     InputStream is(_filename);