From: Duncan Mac-Vicar P Date: Wed, 8 Feb 2006 17:47:09 +0000 (+0000) Subject: - completed integration of the backend in the target. X-Git-Tag: 6.6.0~5112 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=eddcd9de0cefe252bce8207844a9eb787dc7a5a6;p=platform%2Fupstream%2Flibzypp.git - completed integration of the backend in the target. Its is disabled to avoid breaking stanos and Klaus tests, so to enable it, comment //#define STORAGE_DISABLED and it will be enabled, I dont know how to test, thats why it is disabled by default. --- diff --git a/zypp/target/TargetImpl.cc b/zypp/target/TargetImpl.cc index c512957c6..83a0d3878 100644 --- a/zypp/target/TargetImpl.cc +++ b/zypp/target/TargetImpl.cc @@ -59,6 +59,9 @@ namespace zypp : _root(root_r) { _rpm.initDatabase(_root); +#ifndef STORAGE_DISABLED + _storage.init(root_r); +#endif MIL << "Initialized target on " << _root << endl; } @@ -84,7 +87,18 @@ namespace zypp { _store.insert(*it); } - // TODO objects from the XML store + +#ifndef STORAGE_DISABLED + // resolvables stored in the zypp storage database + std::list resolvables = _storage.storedObjects(); + for (std::list::iterator it = resolvables.begin(); + it != resolvables.end(); + it++) + { + _store.insert(*it); + } +#endif + return _store; } @@ -119,52 +133,53 @@ namespace zypp getResolvablesToInsDel( pool_r, to_uninstall, to_install, to_srcinstall ); if ( medianr ) { - MIL << "Restrict to media number " << medianr << endl; + MIL << "Restrict to media number " << medianr << endl; } commit (to_uninstall); if (medianr == 0) { // commit all - remaining_r = commit( to_install ); - srcremaining_r = commit( to_srcinstall ); + remaining_r = commit( to_install ); + srcremaining_r = commit( to_srcinstall ); } - else { - PoolItemList current_install; - PoolItemList current_srcinstall; - - for (PoolItemList::iterator it = to_install.begin(); it != to_install.end(); ++it) { - Resolvable::constPtr res( it->resolvable() ); - Package::constPtr pkg( asKind(res) ); - if (pkg - && medianr != pkg->mediaId()) // check medianr for packages only - { - MIL << "Package " << *pkg << ", wrong media " << pkg->mediaId() << endl; - remaining_r.push_back( *it ); - } - else { - current_install.push_back( *it ); - } - } - PoolItemList bad = commit (current_install); - remaining_r.insert(remaining_r.end(), bad.begin(), bad.end()); - - for (PoolItemList::iterator it = to_srcinstall.begin(); it != to_srcinstall.end(); ++it) { - Resolvable::constPtr res( it->resolvable() ); - Package::constPtr pkg( asKind(res) ); - if (pkg - && medianr != pkg->mediaId()) // check medianr for packages only - { - MIL << "Package " << *pkg << ", wrong media " << pkg->mediaId() << endl; - srcremaining_r.push_back( *it ); - } - else { - current_srcinstall.push_back( *it ); - } - } - bad = commit (current_srcinstall); - srcremaining_r.insert(remaining_r.end(), bad.begin(), bad.end()); + else + { + PoolItemList current_install; + PoolItemList current_srcinstall; + + for (PoolItemList::iterator it = to_install.begin(); it != to_install.end(); ++it) + { + Resolvable::constPtr res( it->resolvable() ); + Package::constPtr pkg( asKind(res) ); + if (pkg && medianr != pkg->mediaId()) // check medianr for packages only + { + MIL << "Package " << *pkg << ", wrong media " << pkg->mediaId() << endl; + remaining_r.push_back( *it ); + } + else + { + current_install.push_back( *it ); + } + } + PoolItemList bad = commit (current_install); + remaining_r.insert(remaining_r.end(), bad.begin(), bad.end()); + + for (PoolItemList::iterator it = to_srcinstall.begin(); it != to_srcinstall.end(); ++it) + { + Resolvable::constPtr res( it->resolvable() ); + Package::constPtr pkg( asKind(res) ); + if (pkg && medianr != pkg->mediaId()) // check medianr for packages only + { + MIL << "Package " << *pkg << ", wrong media " << pkg->mediaId() << endl; + srcremaining_r.push_back( *it ); + } + else { + current_srcinstall.push_back( *it ); + } + } + bad = commit (current_srcinstall); + srcremaining_r.insert(remaining_r.end(), bad.begin(), bad.end()); } - return; } @@ -175,84 +190,111 @@ namespace zypp PoolItemList remaining; MIL << "TargetImpl::commit()" << endl; - for (PoolItemList::const_iterator it = items_r.begin(); - it != items_r.end(); it++) + for (PoolItemList::const_iterator it = items_r.begin(); it != items_r.end(); it++) { - if (isKind(it->resolvable())) - { - Package::constPtr p = dynamic_pointer_cast(it->resolvable()); - if (it->status().isToBeInstalled()) - { - Pathname localfile = getRpmFile(p); - + if (isKind(it->resolvable())) + { + Package::constPtr p = dynamic_pointer_cast(it->resolvable()); + if (it->status().isToBeInstalled()) + { + Pathname localfile = getRpmFile(p); #warning Exception handling - // create a installation progress report proxy - RpmInstallPackageReceiver progress(it->resolvable()); - - progress.connect(); - bool success = true; - - try { - progress.tryLevel( target::rpm::InstallResolvableReport::RPM ); - - rpm().installPackage(localfile, - p->installOnly() ? rpm::RpmDb::RPMINST_NOUPGRADE : 0); - } - catch (Exception & excpt_r) { - ZYPP_CAUGHT(excpt_r); - - WAR << "Install failed, retrying with --nodeps" << endl; - try { - progress.tryLevel( target::rpm::InstallResolvableReport::RPM_NODEPS ); - rpm().installPackage(localfile, - p->installOnly() ? rpm::RpmDb::RPMINST_NOUPGRADE : rpm::RpmDb::RPMINST_NODEPS); - } - catch (Exception & excpt_r) { - ZYPP_CAUGHT(excpt_r); - WAR << "Install failed again, retrying with --force --nodeps" << endl; - - try { - progress.tryLevel( target::rpm::InstallResolvableReport::RPM_NODEPS_FORCE ); - rpm().installPackage(localfile, - p->installOnly() ? rpm::RpmDb::RPMINST_NOUPGRADE : (rpm::RpmDb::RPMINST_NODEPS|rpm::RpmDb::RPMINST_FORCE)); - } - catch (Exception & excpt_r) { - remaining.push_back( *it ); - success = false; - ZYPP_CAUGHT(excpt_r); - } - } - } - if (success) { - it->status().setStatus( ResStatus::installed ); - } - progress.disconnect(); - - } - else - { - RpmRemovePackageReceiver progress(it->resolvable()); - - progress.connect(); - - try { - rpm().removePackage(p); - } - catch (Exception & excpt_r) { - ZYPP_CAUGHT(excpt_r); - WAR << "Remove failed, retrying with --nodeps" << endl; - rpm().removePackage(p, rpm::RpmDb::RPMINST_NODEPS); - } - progress.disconnect(); - it->status().setStatus( ResStatus::uninstalled ); - } - - } -#warning FIXME other resolvables - } - + // create a installation progress report proxy + RpmInstallPackageReceiver progress(it->resolvable()); + progress.connect(); + bool success = true; + + try { + progress.tryLevel( target::rpm::InstallResolvableReport::RPM ); + + rpm().installPackage(localfile, + p->installOnly() ? rpm::RpmDb::RPMINST_NOUPGRADE : 0); + } + catch (Exception & excpt_r) { + ZYPP_CAUGHT(excpt_r); + WAR << "Install failed, retrying with --nodeps" << endl; + try { + progress.tryLevel( target::rpm::InstallResolvableReport::RPM_NODEPS ); + rpm().installPackage(localfile, + p->installOnly() ? rpm::RpmDb::RPMINST_NOUPGRADE : rpm::RpmDb::RPMINST_NODEPS); + } + catch (Exception & excpt_r) + { + ZYPP_CAUGHT(excpt_r); + WAR << "Install failed again, retrying with --force --nodeps" << endl; + + try { + progress.tryLevel( target::rpm::InstallResolvableReport::RPM_NODEPS_FORCE ); + rpm().installPackage(localfile, + p->installOnly() ? rpm::RpmDb::RPMINST_NOUPGRADE : (rpm::RpmDb::RPMINST_NODEPS|rpm::RpmDb::RPMINST_FORCE)); + } + catch (Exception & excpt_r) { + remaining.push_back( *it ); + success = false; + ZYPP_CAUGHT(excpt_r); + } + } + } + if (success) { + it->status().setStatus( ResStatus::installed ); + } + progress.disconnect(); + } + else + { + RpmRemovePackageReceiver progress(it->resolvable()); + progress.connect(); + try { + rpm().removePackage(p); + } + catch (Exception & excpt_r) { + ZYPP_CAUGHT(excpt_r); + WAR << "Remove failed, retrying with --nodeps" << endl; + rpm().removePackage(p, rpm::RpmDb::RPMINST_NODEPS); + } + progress.disconnect(); + it->status().setStatus( ResStatus::uninstalled ); + } + } +#ifndef STORAGE_DISABLED + else // other resolvables + { + if (it->status().isToBeInstalled()) + { + bool success = false; + try + { + _storage.storeObject(it->resolvable()); + success = true; + } + catch (Exception & excpt_r) + { + ZYPP_CAUGHT(excpt_r); + WAR << "Install of Resolvable from storage failed" << endl; + } + if (success) + it->status().setStatus( ResStatus::installed ); + } + else + { + bool success = false; + try + { + _storage.deleteObject(it->resolvable()); + success = true; + } + catch (Exception & excpt_r) + { + ZYPP_CAUGHT(excpt_r); + WAR << "Uninstall of Resolvable from storage failed" << endl; + } + if (success) + it->status().setStatus( ResStatus::uninstalled ); + } + } + #endif + } return remaining; - } rpm::RpmDb & TargetImpl::rpm() diff --git a/zypp/target/TargetImpl.h b/zypp/target/TargetImpl.h index 119fea2c8..2668913e0 100644 --- a/zypp/target/TargetImpl.h +++ b/zypp/target/TargetImpl.h @@ -23,8 +23,11 @@ #include "zypp/media/MediaAccess.h" #include "zypp/Target.h" #include "zypp/target/rpm/RpmDb.h" +#include "zypp/target/store/PersistentStorage.h" #include "zypp/solver/detail/Types.h" +#define STORAGE_DISABLED + /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// @@ -100,6 +103,9 @@ namespace zypp Pathname _root; /** RPM database */ rpm::RpmDb _rpm; +#ifndef STORAGE_DISABLED + zypp::storage::PersistentStorage _storage; +#endif private: /** Null implementation */ static TargetImpl_Ptr _nullimpl; diff --git a/zypp/target/store/Backend.h b/zypp/target/store/Backend.h index f572e3cef..c8782de9b 100644 --- a/zypp/target/store/Backend.h +++ b/zypp/target/store/Backend.h @@ -56,25 +56,25 @@ public: /** * Stores a Resolvable in the active backend. */ - virtual void storeObject( Resolvable::constPtr resolvable ) = 0; + virtual void storeObject( ResObject::constPtr resolvable ) = 0; /** * Deletes a Resolvable from the active backend. */ - virtual void deleteObject( Resolvable::Ptr resolvable ) = 0; + virtual void deleteObject( ResObject::constPtr resolvable ) = 0; /** * Query for installed Resolvables. */ - virtual std::list storedObjects() const = 0; + virtual std::list storedObjects() const = 0; /** * Query for installed Resolvables of a certain kind */ - virtual std::list storedObjects(const Resolvable::Kind) const = 0; + virtual std::list storedObjects(const Resolvable::Kind) const = 0; /** * Query for installed Resolvables of a certain kind by name * \a partial_match allows for text search. */ - virtual std::list storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const = 0; + virtual std::list storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const = 0; ///////////////////////////////////////////////////////// diff --git a/zypp/target/store/PersistentStorage.cc b/zypp/target/store/PersistentStorage.cc index fd93d7f91..8bc267a28 100644 --- a/zypp/target/store/PersistentStorage.cc +++ b/zypp/target/store/PersistentStorage.cc @@ -78,32 +78,32 @@ void PersistentStorage::doTest() } void -PersistentStorage::storeObject( Resolvable::constPtr resolvable ) +PersistentStorage::storeObject( ResObject::constPtr resolvable ) { d->backend->storeObject(resolvable); } void -PersistentStorage::deleteObject( Resolvable::Ptr resolvable ) +PersistentStorage::deleteObject( ResObject::constPtr resolvable ) { } -std::list +std::list PersistentStorage::storedObjects() const { return d->backend->storedObjects(); } -std::list +std::list PersistentStorage::storedObjects(const Resolvable::Kind kind) const { - //list::iterator it; + //list::iterator it; //it = find(nums.begin(), nums.end(), 3); // Search the list. return d->backend->storedObjects(kind); } -std::list +std::list PersistentStorage::storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match) const { return d->backend->storedObjects(kind, name, partial_match); diff --git a/zypp/target/store/PersistentStorage.h b/zypp/target/store/PersistentStorage.h index 033c6df50..c888f569f 100644 --- a/zypp/target/store/PersistentStorage.h +++ b/zypp/target/store/PersistentStorage.h @@ -68,24 +68,24 @@ namespace zypp /** * Stores a Resolvable in the active backend. */ - void storeObject( Resolvable::constPtr resolvable ); + void storeObject( ResObject::constPtr resolvable ); /** * Deletes a Resolvable from the active backend. */ - void deleteObject( Resolvable::Ptr resolvable ); + void deleteObject( ResObject::constPtr resolvable ); /** * Query for installed Resolvables. */ - std::list storedObjects() const; + std::list storedObjects() const; /** * Query for installed Resolvables of a certain kind. */ - std::list storedObjects(const Resolvable::Kind kind) const; + std::list storedObjects(const Resolvable::Kind kind) const; /** * Query for installed Resolvables of a certain kind by name * \a partial_match allows for text search. */ - std::list storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match = false) const; + std::list storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match = false) const; ///////////////////////////////////////////////////////// // SOURCES API diff --git a/zypp/target/store/XMLFilesBackend.cc b/zypp/target/store/XMLFilesBackend.cc index 032b1c8df..d20e1eed9 100644 --- a/zypp/target/store/XMLFilesBackend.cc +++ b/zypp/target/store/XMLFilesBackend.cc @@ -219,13 +219,13 @@ XMLFilesBackend::dirForResolvableKind( Resolvable::Kind kind ) const } std::string -XMLFilesBackend::dirForResolvable( Resolvable::constPtr resolvable ) const +XMLFilesBackend::dirForResolvable( ResObject::constPtr resolvable ) const { return dirForResolvableKind(resolvable->kind()); } std::string -XMLFilesBackend::fullPathForResolvable( Resolvable::constPtr resolvable ) const +XMLFilesBackend::fullPathForResolvable( ResObject::constPtr resolvable ) const { std::string filename; // only append edition if there is one @@ -235,7 +235,7 @@ XMLFilesBackend::fullPathForResolvable( Resolvable::constPtr resolvable ) const } void -XMLFilesBackend::storeObject( Resolvable::constPtr resolvable ) +XMLFilesBackend::storeObject( ResObject::constPtr resolvable ) { std::string xml = castedToXML(resolvable); std::string filename = fullPathForResolvable(resolvable); @@ -256,7 +256,7 @@ XMLFilesBackend::storeObject( Resolvable::constPtr resolvable ) } void -XMLFilesBackend::deleteObject( Resolvable::Ptr resolvable ) +XMLFilesBackend::deleteObject( ResObject::constPtr resolvable ) { // only remove the file std::string filename = fullPathForResolvable(resolvable); @@ -271,10 +271,10 @@ XMLFilesBackend::deleteObject( Resolvable::Ptr resolvable ) } } -Resolvable::Ptr XMLFilesBackend::resolvableFromFile( std::string file_path, Resolvable::Kind kind ) const +ResObject::Ptr XMLFilesBackend::resolvableFromFile( std::string file_path, Resolvable::Kind kind ) const { //DBG << "[" << resolvableKindToString( kind, false ) << "] - " << file_path << std::endl; - Resolvable::Ptr resolvable; + ResObject::Ptr resolvable; std::ifstream res_file(file_path.c_str()); if ( kind == ResTraits::kind ) { @@ -338,18 +338,18 @@ Resolvable::Ptr XMLFilesBackend::resolvableFromFile( std::string file_path, Reso return resolvable; } -std::list +std::list XMLFilesBackend::storedObjects() const { DBG << std::endl; - std::list objects; + std::list objects; std::set::const_iterator it_kinds; for ( it_kinds = d->kinds.begin() ; it_kinds != d->kinds.end(); ++it_kinds ) { Resolvable::Kind kind = (*it_kinds); - std::list objects_for_kind = storedObjects(kind); - std::list::iterator it; + std::list objects_for_kind = storedObjects(kind); + std::list::iterator it; for( it = objects_for_kind.begin(); it != objects_for_kind.end(); ++it) { //DBG << "adding objects back" << std::endl; @@ -359,10 +359,10 @@ XMLFilesBackend::storedObjects() const return objects; } -std::list +std::list XMLFilesBackend::storedObjects(const Resolvable::Kind kind) const { - std::list objects; + std::list objects; std::string dir_path = dirForResolvableKind(kind); DBG << "Reading objects of kind " << resolvableKindToString(kind) << " in " << dir_path << std::endl; directory_iterator end_iter; @@ -370,7 +370,7 @@ XMLFilesBackend::storedObjects(const Resolvable::Kind kind) const if ( !exists( dir_path ) ) { ERR << "path " << dir_path << " does not exists. Required to read objects of kind " << resolvableKindToString(kind) << std::endl; - return std::list(); + return std::list(); } for ( directory_iterator dir_itr( dir_path ); dir_itr != end_iter; ++dir_itr ) @@ -382,16 +382,16 @@ XMLFilesBackend::storedObjects(const Resolvable::Kind kind) const return objects; } -std::list +std::list XMLFilesBackend::storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match) const { - std::list result; - std::list all; + std::list result; + std::list all; all = storedObjects(kind); - std::list::const_iterator it; + std::list::const_iterator it; for( it = all.begin(); it != all.end(); ++it) { - Resolvable::Ptr item = *it; + ResObject::Ptr item = *it; if (item->name() == name ) result.push_back(item); } diff --git a/zypp/target/store/XMLFilesBackend.h b/zypp/target/store/XMLFilesBackend.h index da871c300..f5c9b2b00 100644 --- a/zypp/target/store/XMLFilesBackend.h +++ b/zypp/target/store/XMLFilesBackend.h @@ -66,24 +66,24 @@ public: /** * Stores a Resolvable in the active backend. */ - virtual void storeObject( Resolvable::constPtr resolvable ) ; + virtual void storeObject( ResObject::constPtr resolvable ) ; /** * Deletes a Resolvable from the active backend. */ - virtual void deleteObject( Resolvable::Ptr resolvable ); + virtual void deleteObject( ResObject::constPtr resolvable ); /** * Deletes a Resolvable from the active backend. */ - virtual std::list storedObjects() const; + virtual std::list storedObjects() const; /** * Query for installed Resolvables of a certain kind */ - virtual std::list storedObjects(const Resolvable::Kind) const; + virtual std::list storedObjects(const Resolvable::Kind) const; /** * Query for installed Resolvables of a certain kind by name * \a partial_match allows for text search. */ - virtual std::list storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const; + virtual std::list storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const; ///////////////////////////////////////////////////////// // SOURCES API @@ -110,7 +110,7 @@ public: /** * Directory where the xml file is stored (for the given resolvable) */ - std::string dirForResolvable( Resolvable::constPtr resolvable ) const; + std::string dirForResolvable( ResObject::constPtr resolvable ) const; /** * Directory where the xml file is stored (for the given resolvable kind) */ @@ -119,12 +119,12 @@ public: * Full path to the xml file for a given resolvable * Does not care if the resolvable is yet stored or not */ - std::string fullPathForResolvable( Resolvable::constPtr resolvable ) const; + std::string fullPathForResolvable( ResObject::constPtr resolvable ) const; /** * Full path to the xml file for a given resolvable * Does not care if the resolvable is yet stored or not */ - Resolvable::Ptr resolvableFromFile( std::string file_path, Resolvable::Kind kind ) const; + ResObject::Ptr resolvableFromFile( std::string file_path, Resolvable::Kind kind ) const; Patch::Ptr createPatch( const zypp::parser::yum::YUMPatchData & parsed ) const; Message::Ptr createMessage( const zypp::parser::yum::YUMPatchMessage & parsed ) const;