X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=zypp%2FHistoryLogData.cc;h=0307a5d36a18f6bc731110addddf5741eab1fa77;hb=89237084b93beda74ca7a2902bb5900cecf94891;hp=eb92ae63a92aec92870b033bdfc24d7643086252;hpb=48416688b1dd65c2d6424bd78e717798e8f34f58;p=platform%2Fupstream%2Flibzypp.git diff --git a/zypp/HistoryLogData.cc b/zypp/HistoryLogData.cc index eb92ae6..0307a5d 100644 --- a/zypp/HistoryLogData.cc +++ b/zypp/HistoryLogData.cc @@ -21,73 +21,78 @@ using namespace std; +/////////////////////////////////////////////////////////////////// namespace zypp { using parser::ParseException; - /////////////////////////////////////////////////////////////////// // - // CLASS NAME : HistoryActionID + // class HistoryActionID // /////////////////////////////////////////////////////////////////// - static std::map _table; - - const HistoryActionID HistoryActionID::NONE(HistoryActionID::NONE_e); - const HistoryActionID HistoryActionID::INSTALL(HistoryActionID::INSTALL_e); - const HistoryActionID HistoryActionID::REMOVE(HistoryActionID::REMOVE_e); - const HistoryActionID HistoryActionID::REPO_ADD(HistoryActionID::REPO_ADD_e); - const HistoryActionID HistoryActionID::REPO_REMOVE(HistoryActionID::REPO_REMOVE_e); - const HistoryActionID HistoryActionID::REPO_CHANGE_ALIAS(HistoryActionID::REPO_CHANGE_ALIAS_e); - const HistoryActionID HistoryActionID::REPO_CHANGE_URL(HistoryActionID::REPO_CHANGE_URL_e); + const HistoryActionID HistoryActionID::NONE (HistoryActionID::NONE_e); + const HistoryActionID HistoryActionID::INSTALL (HistoryActionID::INSTALL_e); + const HistoryActionID HistoryActionID::REMOVE (HistoryActionID::REMOVE_e); + const HistoryActionID HistoryActionID::REPO_ADD (HistoryActionID::REPO_ADD_e); + const HistoryActionID HistoryActionID::REPO_REMOVE (HistoryActionID::REPO_REMOVE_e); + const HistoryActionID HistoryActionID::REPO_CHANGE_ALIAS (HistoryActionID::REPO_CHANGE_ALIAS_e); + const HistoryActionID HistoryActionID::REPO_CHANGE_URL (HistoryActionID::REPO_CHANGE_URL_e); + const HistoryActionID HistoryActionID::STAMP_COMMAND (HistoryActionID::STAMP_COMMAND_e); + const HistoryActionID HistoryActionID::PATCH_STATE_CHANGE (HistoryActionID::PATCH_STATE_CHANGE_e); HistoryActionID::HistoryActionID(const std::string & strval_r) : _id(parse(strval_r)) {} - HistoryActionID::ID HistoryActionID::parse(const std::string & strval_r) + HistoryActionID::ID HistoryActionID::parse( const std::string & strval_r ) { - if (_table.empty()) + typedef std::map MapType; + static MapType _table; + if ( _table.empty() ) { // initialize it - _table["install"] = INSTALL_e; - _table["remove"] = REMOVE_e; - _table["radd"] = REPO_ADD_e; - _table["rremove"] = REPO_REMOVE_e; - _table["ralias"] = REPO_CHANGE_ALIAS_e; - _table["rurl"] = REPO_CHANGE_URL_e; - _table["NONE"] = _table["none"] = HistoryActionID::NONE_e; + _table["install"] = INSTALL_e; + _table["remove"] = REMOVE_e; + _table["radd"] = REPO_ADD_e; + _table["rremove"] = REPO_REMOVE_e; + _table["ralias"] = REPO_CHANGE_ALIAS_e; + _table["rurl"] = REPO_CHANGE_URL_e; + _table["command"] = STAMP_COMMAND_e; + _table["patch"] = PATCH_STATE_CHANGE_e; + _table["NONE"] = _table["none"] = NONE_e; } - std::map::const_iterator it = - _table.find(strval_r); - - if (it == _table.end()) - WAR << "Unknown history action ID '" + strval_r + "'"; - - return it->second; + MapType::const_iterator it = _table.find( strval_r ); + if ( it != _table.end() ) + return it->second; + // else: + WAR << "Unknown history action ID '" + strval_r + "'" << endl; + return NONE_e; } - const std::string & HistoryActionID::asString(bool pad) const + const std::string & HistoryActionID::asString( bool pad ) const { - static std::map _table; + typedef std::pair PairType; + typedef std::map MapType; + static MapType _table; if ( _table.empty() ) { - // initialize it - _table[INSTALL_e] = "install"; - _table[REMOVE_e] = "remove"; - _table[REPO_ADD_e] = "radd"; - _table[REPO_REMOVE_e] = "rremove"; - _table[REPO_CHANGE_ALIAS_e] = "ralias"; - _table[REPO_CHANGE_URL_e] = "rurl"; - _table[NONE_e] = "NONE"; + // initialize it pad(7) (for now) + _table[INSTALL_e] = PairType( "install" , "install" ); + _table[REMOVE_e] = PairType( "remove" , "remove " ); + _table[REPO_ADD_e] = PairType( "radd" , "radd " ); + _table[REPO_REMOVE_e] = PairType( "rremove" , "rremove" ); + _table[REPO_CHANGE_ALIAS_e] = PairType( "ralias" , "ralias " ); + _table[REPO_CHANGE_URL_e] = PairType( "rurl" , "rurl " ); + _table[STAMP_COMMAND_e] = PairType( "command" , "command" ); + _table[PATCH_STATE_CHANGE_e]= PairType( "patch" , "patch " ); + _table[NONE_e] = PairType( "NONE" , "NONE " ); } - // add spaces so that the size of the returned string is always 7 (for now) - if (pad) - return _table[_id].append(7 - _table[_id].size(), ' '); - return _table[_id]; + + return( pad ? _table[_id].second : _table[_id].first ); } std::ostream & operator << (std::ostream & str, const HistoryActionID & id) @@ -95,161 +100,234 @@ namespace zypp /////////////////////////////////////////////////////////////////// - - ///////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// // - // CLASS NAME: HistoryItem + // class HistoryLogData::Impl // - ///////////////////////////////////////////////////////////////////// - - HistoryItem::HistoryItem(FieldVector & fields) + /////////////////////////////////////////////////////////////////// + class HistoryLogData::Impl { - if (fields.size() <= 2) - ZYPP_THROW(ParseException( - str::form("Bad number of fields. Got %ld, expected more than %d.", - fields.size(), 2))); + public: + Impl( FieldVector & fields_r, size_type expect_r ) + { + _checkFields( fields_r, expect_r ); + _field.swap( fields_r ); + // For whatever reason writer is ' '-padding the action field + // but we don't want to modify the vector before we moved it. + _field[ACTION_INDEX] = str::trim( _field[ACTION_INDEX] ); + _action = HistoryActionID( _field[ACTION_INDEX] ); + } - date = Date(fields[0], HISTORY_LOG_DATE_FORMAT); - action = HistoryActionID(str::trim(fields[1])); - } + Impl( FieldVector & fields_r, HistoryActionID action_r, size_type expect_r ) + { + _checkFields( fields_r, expect_r ); + // For whatever reason writer is ' '-padding the action field + // but we don't want to modify the vector before we moved it. + std::string trimmed( str::trim( fields_r[ACTION_INDEX] ) ); + _action = HistoryActionID( trimmed ); + if ( _action != action_r ) + { + ZYPP_THROW( ParseException( str::form( "Bad action id. Got %s, expected %s.", + _action.asString().c_str(), + action_r.asString().c_str() ) ) ); + } + _field.swap( fields_r ); + // now adjust action field: + _field[ACTION_INDEX] = trimmed; + } + + void _checkFields( const FieldVector & fields_r, size_type expect_r ) + { + if ( expect_r < 2 ) // at least 2 fields (date and action) are required + expect_r = 2; + if ( fields_r.size() < expect_r ) + { + ZYPP_THROW( ParseException( str::form( "Bad number of fields. Got %zd, expected at least %zd.", + fields_r.size(), + expect_r ) ) ); + } + try + { + _date = Date( fields_r[DATE_INDEX], HISTORY_LOG_DATE_FORMAT ); + } + catch ( const std::exception & excpt ) + { + ZYPP_THROW( ParseException( excpt.what() ) ); // invalid date format + } + // _action handled later + } + + public: + FieldVector _field; + Date _date; + HistoryActionID _action; + }; - ///////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// // - // CLASS NAME: HistoryItemInstall + // class HistoryLogData // - ///////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// - HistoryItemInstall::HistoryItemInstall(FieldVector & fields) - : HistoryItem(fields) - { - if (fields.size() != 8) - ZYPP_THROW(ParseException( - str::form("Bad number of fields. Got %lu, expected %u.", - fields.size(), 8))); - - name = fields[2]; - edition = Edition(fields[3]); - arch = Arch(fields[4]); - reqby = fields[5]; - repoalias = fields[6]; - checksum = CheckSum::sha(fields[7]); - } + HistoryLogData::HistoryLogData( FieldVector & fields_r, size_type expect_r ) + : _pimpl( new Impl( fields_r, expect_r ) ) + {} - const std::string HistoryItemInstall::asString() const - { - ostringstream str; - str - << date.form(HISTORY_LOG_DATE_FORMAT) << "|" - << action.asString() << "|" - << name << "|" - << edition << "|" - << arch << "|" - << reqby << "|" - << repoalias << "|" - << checksum; - return str.str(); - } + HistoryLogData::HistoryLogData( FieldVector & fields_r, HistoryActionID expectedId_r, size_type expect_r ) + : _pimpl( new Impl( fields_r, expectedId_r, expect_r ) ) + {} + + HistoryLogData::~HistoryLogData() + {} - std::ostream & operator<<(std::ostream & str, const HistoryItemInstall & obj) + HistoryLogData::Ptr HistoryLogData::create( FieldVector & fields_r ) { - return str << obj.asString(); + if ( fields_r.size() >= 2 ) + { + // str::trim( _field[ACTION_INDEX] ); + switch ( HistoryActionID( str::trim( fields_r[ACTION_INDEX] ) ).toEnum() ) + { +#define OUTS(E,T) case HistoryActionID::E: return Ptr( new T( fields_r ) ); break; + OUTS( INSTALL_e, HistoryLogDataInstall ); + OUTS( REMOVE_e, HistoryLogDataRemove ); + OUTS( REPO_ADD_e, HistoryLogDataRepoAdd ); + OUTS( REPO_REMOVE_e, HistoryLogDataRepoRemove ); + OUTS( REPO_CHANGE_ALIAS_e, HistoryLogDataRepoAliasChange ); + OUTS( REPO_CHANGE_URL_e, HistoryLogDataRepoUrlChange ); + OUTS( STAMP_COMMAND_e, HistoryLogDataStampCommand ); + OUTS( PATCH_STATE_CHANGE_e, HistoryLogPatchStateChange ); +#undef OUTS + // intentionally no default: + case HistoryActionID::NONE_e: + break; + } + } + // unknown action or invalid fields? Ctor will accept or throw. + return Ptr( new HistoryLogData( fields_r ) ); } + bool HistoryLogData::empty() const + { return _pimpl->_field.empty(); } - ///////////////////////////////////////////////////////////////////// - // - // CLASS NAME: HistoryItemRemove - // - ///////////////////////////////////////////////////////////////////// - - HistoryItemRemove::HistoryItemRemove(FieldVector & fields) - : HistoryItem(fields) - { - if (fields.size() != 6) - ZYPP_THROW(ParseException( - str::form("Bad number of fields. Got %lu, expected %u.", - fields.size(), 6))); - - name = fields[2]; - edition = Edition(fields[3]); - arch = Arch(fields[4]); - reqby = fields[5]; - } + HistoryLogData::size_type HistoryLogData::size() const + { return _pimpl->_field.size(); } + HistoryLogData::const_iterator HistoryLogData::begin() const + { return _pimpl->_field.begin(); } - ///////////////////////////////////////////////////////////////////// - // - // CLASS NAME: HistoryItemRepoAdd - // - ///////////////////////////////////////////////////////////////////// + HistoryLogData::const_iterator HistoryLogData::end() const + { return _pimpl->_field.end(); } - HistoryItemRepoAdd::HistoryItemRepoAdd(FieldVector & fields) - : HistoryItem(fields) + const std::string & HistoryLogData::optionalAt( size_type idx_r ) const { - if (fields.size() != 4) - ZYPP_THROW(ParseException( - str::form("Bad number of fields. Got %lu, expected %u.", - fields.size(), 4))); - - alias = fields[2]; - url = Url(fields[3]); + static const std::string _empty; + return( idx_r < size() ? _pimpl->_field[idx_r] : _empty ); } + const std::string & HistoryLogData::at( size_type idx_r ) const + { return _pimpl->_field.at( idx_r ); } - ///////////////////////////////////////////////////////////////////// - // - // CLASS NAME: HistoryItemRepoRemove - // - ///////////////////////////////////////////////////////////////////// - HistoryItemRepoRemove::HistoryItemRepoRemove(FieldVector & fields) - : HistoryItem(fields) - { - if (fields.size() != 3) - ZYPP_THROW(ParseException( - str::form("Bad number of fields. Got %lu, expected %u.", - fields.size(), 3))); - - alias = fields[2]; - } + Date HistoryLogData::date() const + { return _pimpl->_date; } + HistoryActionID HistoryLogData::action() const + { return _pimpl->_action; } - ///////////////////////////////////////////////////////////////////// - // - // CLASS NAME: HistoryItemRepoAliasChange - // - ///////////////////////////////////////////////////////////////////// - HistoryItemRepoAliasChange::HistoryItemRepoAliasChange(FieldVector & fields) - : HistoryItem(fields) - { - if (fields.size() != 4) - ZYPP_THROW(ParseException( - str::form("Bad number of fields. Got %lu, expected %u.", - fields.size(), 4))); + std::ostream & operator<<( std::ostream & str, const HistoryLogData & obj ) + { return str << str::joinEscaped( obj.begin(), obj.end(), '|' ); } - oldalias = fields[2]; - newalias = fields[3]; - } + /////////////////////////////////////////////////////////////////// + // class HistoryLogDataInstall + /////////////////////////////////////////////////////////////////// + HistoryLogDataInstall::HistoryLogDataInstall( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogDataInstall::name() const { return optionalAt( NAME_INDEX ); } + Edition HistoryLogDataInstall::edition() const { return Edition( optionalAt( EDITION_INDEX ) ); } + Arch HistoryLogDataInstall::arch() const { return Arch( optionalAt( ARCH_INDEX ) ); } + std::string HistoryLogDataInstall::reqby() const { return optionalAt( REQBY_INDEX ); } + std::string HistoryLogDataInstall::repoAlias() const { return optionalAt( REPOALIAS_INDEX ); } + CheckSum HistoryLogDataInstall::checksum() const { return optionalAt( CHEKSUM_INDEX ); } + std::string HistoryLogDataInstall::userdata() const { return optionalAt( USERDATA_INDEX ); } + + /////////////////////////////////////////////////////////////////// + // class HistoryLogPatchStateChange + /////////////////////////////////////////////////////////////////// + HistoryLogPatchStateChange::HistoryLogPatchStateChange( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogPatchStateChange::name() const { return optionalAt( NAME_INDEX ); } + Edition HistoryLogPatchStateChange::edition() const { return Edition( optionalAt( EDITION_INDEX ) ); } + Arch HistoryLogPatchStateChange::arch() const { return Arch( optionalAt( ARCH_INDEX ) ); } + std::string HistoryLogPatchStateChange::repoAlias() const { return optionalAt( REPOALIAS_INDEX ); } + Patch::SeverityFlag HistoryLogPatchStateChange::severity() const { return Patch::severityFlag( optionalAt( SEVERITY_INDEX ) ); } + Patch::Category HistoryLogPatchStateChange::category() const { return Patch::categoryEnum( optionalAt( CATEGORY_INDEX ) ); } + string HistoryLogPatchStateChange::oldstate() const { return optionalAt( OLDSTATE_INDEX ); } + string HistoryLogPatchStateChange::newstate() const { return optionalAt( NEWSTATE_INDEX ); } + std::string HistoryLogPatchStateChange::userdata() const { return optionalAt( USERDATA_INDEX ); } + /////////////////////////////////////////////////////////////////// + // class HistoryLogDataRemove + /////////////////////////////////////////////////////////////////// + HistoryLogDataRemove::HistoryLogDataRemove( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogDataRemove::name() const { return optionalAt( NAME_INDEX ); } + Edition HistoryLogDataRemove::edition() const { return Edition( optionalAt( EDITION_INDEX ) ); } + Arch HistoryLogDataRemove::arch() const { return Arch( optionalAt( ARCH_INDEX ) ); } + std::string HistoryLogDataRemove::reqby() const { return optionalAt( REQBY_INDEX ); } + std::string HistoryLogDataRemove::userdata() const { return optionalAt( USERDATA_INDEX ); } - ///////////////////////////////////////////////////////////////////// - // - // CLASS NAME: HistoryItemRepoUrlChange - // - ///////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////// + // class HistoryLogDataRepoAdd + /////////////////////////////////////////////////////////////////// + HistoryLogDataRepoAdd::HistoryLogDataRepoAdd( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogDataRepoAdd::alias() const { return optionalAt( ALIAS_INDEX ); } + Url HistoryLogDataRepoAdd::url() const { return optionalAt( URL_INDEX ); } + std::string HistoryLogDataRepoAdd::userdata() const { return optionalAt( USERDATA_INDEX ); } - HistoryItemRepoUrlChange::HistoryItemRepoUrlChange(FieldVector & fields) - : HistoryItem(fields) - { - if (fields.size() != 4) - ZYPP_THROW(ParseException( - str::form("Bad number of fields. Got %lu, expected %u.", - fields.size(), 4))); + /////////////////////////////////////////////////////////////////// + // class HistoryLogDataRepoRemove + /////////////////////////////////////////////////////////////////// + HistoryLogDataRepoRemove::HistoryLogDataRepoRemove( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogDataRepoRemove::alias() const { return optionalAt( ALIAS_INDEX ); } + std::string HistoryLogDataRepoRemove::userdata() const { return optionalAt( USERDATA_INDEX ); } - alias = fields[2]; - newurl = Url(fields[3]); - } + /////////////////////////////////////////////////////////////////// + // class HistoryLogDataRepoAliasChange + /////////////////////////////////////////////////////////////////// + HistoryLogDataRepoAliasChange::HistoryLogDataRepoAliasChange( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogDataRepoAliasChange::oldAlias() const { return optionalAt( OLDALIAS_INDEX ); } + std::string HistoryLogDataRepoAliasChange::newAlias() const { return optionalAt( NEWALIAS_INDEX ); } + std::string HistoryLogDataRepoAliasChange::userdata() const { return optionalAt( USERDATA_INDEX ); } + /////////////////////////////////////////////////////////////////// + // class HistoryLogDataRepoUrlChange + /////////////////////////////////////////////////////////////////// + HistoryLogDataRepoUrlChange::HistoryLogDataRepoUrlChange( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogDataRepoUrlChange::alias() const { return optionalAt( ALIAS_INDEX ); } + Url HistoryLogDataRepoUrlChange::newUrl() const { return optionalAt( NEWURL_INDEX ); } + std::string HistoryLogDataRepoUrlChange::userdata() const { return optionalAt( USERDATA_INDEX ); } -} + /////////////////////////////////////////////////////////////////// + // class HistoryLogDataStampCommand + /////////////////////////////////////////////////////////////////// + HistoryLogDataStampCommand::HistoryLogDataStampCommand( FieldVector & fields_r ) + : HistoryLogData( fields_r ) + {} + std::string HistoryLogDataStampCommand::executedBy() const { return optionalAt( USER_INDEX ); } + std::string HistoryLogDataStampCommand::command() const { return optionalAt( COMMAND_INDEX ); } + std::string HistoryLogDataStampCommand::userdata() const { return optionalAt( USERDATA_INDEX ); } + +} // namespace zypp +///////////////////////////////////////////////////////////////////