From 731a538e81df3fc507f402ebc7d7e25c30a43d94 Mon Sep 17 00:00:00 2001 From: Michael Andres Date: Mon, 19 Nov 2012 15:00:55 +0100 Subject: [PATCH] Relax history reader to accept entries with additional fields --- zypp/HistoryLogData.cc | 12 ++--- zypp/parser/HistoryLogReader.cc | 106 +++++++++++++++++++++------------------- 2 files changed, 61 insertions(+), 57 deletions(-) diff --git a/zypp/HistoryLogData.cc b/zypp/HistoryLogData.cc index a66154a..0e0f69e 100644 --- a/zypp/HistoryLogData.cc +++ b/zypp/HistoryLogData.cc @@ -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))); diff --git a/zypp/parser/HistoryLogReader.cc b/zypp/parser/HistoryLogReader.cc index 53b284f..99e0748 100644 --- a/zypp/parser/HistoryLogReader.cc +++ b/zypp/parser/HistoryLogReader.cc @@ -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); -- 2.7.4