: _root(root_r)
{
_rpm.initDatabase(_root);
+#ifndef STORAGE_DISABLED
+ _storage.init(root_r);
+#endif
MIL << "Initialized target on " << _root << endl;
}
{
_store.insert(*it);
}
- // TODO objects from the XML store
+
+#ifndef STORAGE_DISABLED
+ // resolvables stored in the zypp storage database
+ std::list<ResObject::Ptr> resolvables = _storage.storedObjects();
+ for (std::list<ResObject::Ptr>::iterator it = resolvables.begin();
+ it != resolvables.end();
+ it++)
+ {
+ _store.insert(*it);
+ }
+#endif
+
return _store;
}
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<Package>(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<Package>(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<Package>(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<Package>(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;
}
PoolItemList remaining;
MIL << "TargetImpl::commit(<list>)" << 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<Package>(it->resolvable()))
- {
- Package::constPtr p = dynamic_pointer_cast<const Package>(it->resolvable());
- if (it->status().isToBeInstalled())
- {
- Pathname localfile = getRpmFile(p);
-
+ if (isKind<Package>(it->resolvable()))
+ {
+ Package::constPtr p = dynamic_pointer_cast<const Package>(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()
#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
{ /////////////////////////////////////////////////////////////////
Pathname _root;
/** RPM database */
rpm::RpmDb _rpm;
+#ifndef STORAGE_DISABLED
+ zypp::storage::PersistentStorage _storage;
+#endif
private:
/** Null implementation */
static TargetImpl_Ptr _nullimpl;
/**
* 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<Resolvable::Ptr> storedObjects() const = 0;
+ virtual std::list<ResObject::Ptr> storedObjects() const = 0;
/**
* Query for installed Resolvables of a certain kind
*/
- virtual std::list<Resolvable::Ptr> storedObjects(const Resolvable::Kind) const = 0;
+ virtual std::list<ResObject::Ptr> 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<Resolvable::Ptr> storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const = 0;
+ virtual std::list<ResObject::Ptr> storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const = 0;
/////////////////////////////////////////////////////////
}
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<Resolvable::Ptr>
+std::list<ResObject::Ptr>
PersistentStorage::storedObjects() const
{
return d->backend->storedObjects();
}
-std::list<Resolvable::Ptr>
+std::list<ResObject::Ptr>
PersistentStorage::storedObjects(const Resolvable::Kind kind) const
{
- //list<Resolvable::Ptr>::iterator it;
+ //list<ResObject::Ptr>::iterator it;
//it = find(nums.begin(), nums.end(), 3); // Search the list.
return d->backend->storedObjects(kind);
}
-std::list<Resolvable::Ptr>
+std::list<ResObject::Ptr>
PersistentStorage::storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match) const
{
return d->backend->storedObjects(kind, name, partial_match);
/**
* 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<Resolvable::Ptr> storedObjects() const;
+ std::list<ResObject::Ptr> storedObjects() const;
/**
* Query for installed Resolvables of a certain kind.
*/
- std::list<Resolvable::Ptr> storedObjects(const Resolvable::Kind kind) const;
+ std::list<ResObject::Ptr> 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<Resolvable::Ptr> storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match = false) const;
+ std::list<ResObject::Ptr> storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match = false) const;
/////////////////////////////////////////////////////////
// SOURCES API
}
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
}
void
-XMLFilesBackend::storeObject( Resolvable::constPtr resolvable )
+XMLFilesBackend::storeObject( ResObject::constPtr resolvable )
{
std::string xml = castedToXML(resolvable);
std::string filename = fullPathForResolvable(resolvable);
}
void
-XMLFilesBackend::deleteObject( Resolvable::Ptr resolvable )
+XMLFilesBackend::deleteObject( ResObject::constPtr resolvable )
{
// only remove the file
std::string filename = fullPathForResolvable(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<zypp::Patch>::kind )
{
return resolvable;
}
-std::list<Resolvable::Ptr>
+std::list<ResObject::Ptr>
XMLFilesBackend::storedObjects() const
{
DBG << std::endl;
- std::list<Resolvable::Ptr> objects;
+ std::list<ResObject::Ptr> objects;
std::set<Resolvable::Kind>::const_iterator it_kinds;
for ( it_kinds = d->kinds.begin() ; it_kinds != d->kinds.end(); ++it_kinds )
{
Resolvable::Kind kind = (*it_kinds);
- std::list<Resolvable::Ptr> objects_for_kind = storedObjects(kind);
- std::list<Resolvable::Ptr>::iterator it;
+ std::list<ResObject::Ptr> objects_for_kind = storedObjects(kind);
+ std::list<ResObject::Ptr>::iterator it;
for( it = objects_for_kind.begin(); it != objects_for_kind.end(); ++it)
{
//DBG << "adding objects back" << std::endl;
return objects;
}
-std::list<Resolvable::Ptr>
+std::list<ResObject::Ptr>
XMLFilesBackend::storedObjects(const Resolvable::Kind kind) const
{
- std::list<Resolvable::Ptr> objects;
+ std::list<ResObject::Ptr> objects;
std::string dir_path = dirForResolvableKind(kind);
DBG << "Reading objects of kind " << resolvableKindToString(kind) << " in " << dir_path << std::endl;
directory_iterator end_iter;
if ( !exists( dir_path ) )
{
ERR << "path " << dir_path << " does not exists. Required to read objects of kind " << resolvableKindToString(kind) << std::endl;
- return std::list<Resolvable::Ptr>();
+ return std::list<ResObject::Ptr>();
}
for ( directory_iterator dir_itr( dir_path ); dir_itr != end_iter; ++dir_itr )
return objects;
}
-std::list<Resolvable::Ptr>
+std::list<ResObject::Ptr>
XMLFilesBackend::storedObjects(const Resolvable::Kind kind, const std::string & name, bool partial_match) const
{
- std::list<Resolvable::Ptr> result;
- std::list<Resolvable::Ptr> all;
+ std::list<ResObject::Ptr> result;
+ std::list<ResObject::Ptr> all;
all = storedObjects(kind);
- std::list<Resolvable::Ptr>::const_iterator it;
+ std::list<ResObject::Ptr>::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);
}
/**
* 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<Resolvable::Ptr> storedObjects() const;
+ virtual std::list<ResObject::Ptr> storedObjects() const;
/**
* Query for installed Resolvables of a certain kind
*/
- virtual std::list<Resolvable::Ptr> storedObjects(const Resolvable::Kind) const;
+ virtual std::list<ResObject::Ptr> 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<Resolvable::Ptr> storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const;
+ virtual std::list<ResObject::Ptr> storedObjects(const Resolvable::Kind, const std::string & name, bool partial_match = false) const;
/////////////////////////////////////////////////////////
// SOURCES API
/**
* 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)
*/
* 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;