#include <iosfwd>
-#include "zypp/base/PtrTypes.h"
-#include "zypp/base/NonCopyable.h"
-#include "zypp/base/Iterator.h"
+#include "zypp/Pathname.h"
-#include "zypp/AutoDispose.h"
+#include "zypp/sat/detail/PoolMember.h"
+#include "zypp/Repository.h"
+#include "zypp/sat/WhatProvides.h"
+#include "zypp/sat/Queue.h"
-#include "zypp/sat/Repo.h"
-
-///////////////////////////////////////////////////////////////////
-extern "C"
-{
-struct _Pool;
-}
///////////////////////////////////////////////////////////////////
namespace zypp
{ /////////////////////////////////////////////////////////////////
+
+ class SerialNumber;
+ class RepoInfo;
+
///////////////////////////////////////////////////////////////////
namespace sat
{ /////////////////////////////////////////////////////////////////
//
// CLASS NAME : Pool
//
- /** */
- class Pool
+ /** Global sat-pool.
+ *
+ * Explicitly shared singleton \ref Pool::instance.
+ */
+ class Pool : protected detail::PoolMember
{
public:
- /** Default ctor */
- Pool();
- /** Dtor */
- ~Pool();
+ typedef detail::SolvableIterator SolvableIterator;
+ typedef zypp::detail::RepositoryIterator RepositoryIterator;
+ typedef detail::size_type size_type;
+
+ public:
+ /** Singleton ctor. */
+ static Pool instance()
+ { return Pool(); }
+
+ /** Ctor from \ref PoolMember. */
+ Pool( const detail::PoolMember & )
+ {}
public:
+ /** Internal array size for stats only. */
+ size_type capacity() const;
+
+ /** Housekeeping data serial number. */
+ const SerialNumber & serial() const;
+
+ /** Update housekeeping data if necessary (e.g. whatprovides). */
+ void prepare() const;
+
+ /** \ref prepare plus some expensive checks done before solving only. */
+ void prepareForSolving() const;
+
+ /** Get rootdir (for file conflicts check) */
+ Pathname rootDir() const;
+
+ /** Set rootdir (for file conflicts check) */
+ void rootDir( const Pathname & root_r );
+
+ public:
+ /** Whether \ref Pool contains repos. */
bool reposEmpty() const;
- unsigned reposSize() const;
- RepoIterator reposBegin() const;
- RepoIterator reposEnd() const;
- /** Return a \ref Repo named \c name_r.
- * It a such a \ref Repo does not already exist
- * a new empty \ref Repo is created.
+ /** Number of repos in \ref Pool. */
+ size_type reposSize() const;
+
+ /** Iterator to the first \ref Repository. */
+ RepositoryIterator reposBegin() const;
+
+ /** Iterator behind the last \ref Repository. */
+ RepositoryIterator reposEnd() const;
+
+ /** Return a \ref Repository named \c alias_r.
+ * It a such a \ref Repository does not already exist
+ * a new empty \ref Repository is created.
*/
- Repo reposInsert( const std::string & name_r );
+ Repository reposInsert( const std::string & alias_r );
- /** Find a \ref Repo named \c name_r.
- * Returns \ref norepo if there is no such \ref Repo.
+ /** Find a \ref Repository named \c alias_r.
+ * Returns \ref norepository if there is no such \ref Repository.
*/
- Repo reposFind( const std::string & name_r ) const;
+ Repository reposFind( const std::string & alias_r ) const;
- /** Remove a \ref Repo named \c name_r. */
- void reposErase( const std::string & name_r )
- { reposErase( reposFind( name_r ) ); }
- /** \overload */
- void reposErase( Repo repo_r )
- { repo_r.eraseFromPool(); }
+ /** Remove a \ref Repository named \c alias_r.
+ * \see \ref Repository::eraseFromPool
+ */
+ void reposErase( const std::string & alias_r )
+ { reposFind( alias_r ).eraseFromPool(); }
public:
- /** Functor removing \ref Repo from it's \ref Pool. */
- struct EraseRepo;
+ /** Reserved system repository alias \c @System. */
+ static const std::string & systemRepoAlias();
+
+ /** Return the system repository if it is on the pool. */
+ Repository findSystemRepo() const;
- /** Load \ref Solvables from a solv-file into a \ref Repo named \c name_r.
- * In case of an exception the \ref Repo is removed from the \ref Pool.
+ /** Return the system repository, create it if missing. */
+ Repository systemRepo();
+
+ public:
+ /** Load \ref Solvables from a solv-file into a \ref Repository named \c name_r.
+ * In case of an exception the \ref Repository is removed from the \ref Pool.
* \throws Exception if loading the solv-file fails.
+ * \see \ref Repository::EraseFromPool
+ */
+ Repository addRepoSolv( const Pathname & file_r, const std::string & name_r );
+ /** \overload Using the files basename as \ref Repository name. */
+ Repository addRepoSolv( const Pathname & file_r );
+ /** \overload Using the \ref RepoInfo::alias \ref Repo name.
+ * Additionally stores the \ref RepoInfo. \See \ref Prool::setInfo.
+ */
+ Repository addRepoSolv( const Pathname & file_r, const RepoInfo & info_r );
+
+ public:
+ /** Load \ref Solvables from a helix-file into a \ref Repository named \c name_r.
+ * Supports loading of gzip compressed files (.gz). In case of an exception
+ * the \ref Repository is removed from the \ref Pool.
+ * \throws Exception if loading the helix-file fails.
+ * \see \ref Repository::EraseFromPool
*/
- Repo addRepoSolv( const Pathname & file_r, const std::string & name_r );
- /** \overload Using the files basename as \ref Repo name. */
- Repo addRepoSolv( const Pathname & file_r )
- { return addRepoSolv( file_r, file_r.basename() ); }
+ Repository addRepoHelix( const Pathname & file_r, const std::string & name_r );
+ /** \overload Using the files basename as \ref Repository name. */
+ Repository addRepoHelix( const Pathname & file_r );
+ /** \overload Using the \ref RepoInfo::alias \ref Repo name.
+ * Additionally stores the \ref RepoInfo. \See \ref Prool::setInfo.
+ */
+ Repository addRepoHelix( const Pathname & file_r, const RepoInfo & info_r );
public:
+ /** Whether \ref Pool contains solvables. */
bool solvablesEmpty() const;
- unsigned solvablesSize() const;
+
+ /** Number of solvables in \ref Pool. */
+ size_type solvablesSize() const;
+
+ /** Iterator to the first \ref Solvable. */
SolvableIterator solvablesBegin() const;
+
+ /** Iterator behind the last \ref Solvable. */
SolvableIterator solvablesEnd() const;
+ public:
+ /** \name Iterate all Solvables matching a \c _Filter. */
+ //@{
+ template<class _Filter>
+ filter_iterator<_Filter,SolvableIterator> filterBegin( const _Filter & filter_r ) const
+ { return make_filter_iterator( filter_r, solvablesBegin(), solvablesEnd() ); }
+
+ template<class _Filter>
+ filter_iterator<_Filter,SolvableIterator> filterEnd( const _Filter & filter_r ) const
+ { return make_filter_iterator( filter_r, solvablesEnd(), solvablesEnd() ); }
+ //@}
+
+ public:
+ /** Conainer of all \ref Solvable providing \c cap_r. */
+ WhatProvides whatProvides( Capability cap_r ) const
+ { return WhatProvides( cap_r ); }
+
+ public:
+ /** \name Requested locales. */
+ //@{
+ /** Set the default language for retrieving translated texts.
+ * Updated when calling \ref ZConfig::setTextLocale.
+ */
+ void setTextLocale( const Locale & locale_r );
+
+ /** Set the requested locales.
+ * Languages to be supported by the system, e.g. language specific
+ * packages to be installed.
+ */
+ void setRequestedLocales( const LocaleSet & locales_r );
+
+ /** Add one \ref Locale to the set of requested locales.
+ * Return \c true if \c locale_r was newly added to the set.
+ */
+ bool addRequestedLocale( const Locale & locale_r );
+
+ /** Erase one \ref Locale from the set of requested locales.
+ * Return \c false if \c locale_r was not found in the set.
+ */
+ bool eraseRequestedLocale( const Locale & locale_r );
+
+ /** Return the requested locales.
+ * \see \ref setRequestedLocales
+ */
+ const LocaleSet & getRequestedLocales() const;
+
+ /** Whether this \ref Locale is in the set of requested locales. */
+ bool isRequestedLocale( const Locale & locale_r ) const;
+
+ /** Get the set of available locales.
+ * This is computed from the package data so it actually
+ * represents all locales packages claim to support.
+ */
+ const LocaleSet & getAvailableLocales() const;
+
+ /** Whether this \ref Locale is in the set of available locales. */
+ bool isAvailableLocale( const Locale & locale_r ) const;
+ //@}
+
+ public:
+ /** \name Multiversion install.
+ * Ident list of all packages that can be installed in different version
+ * at the same time. (\see \ref ZConfig::multiversionSpec)
+ */
+ //@{
+ typedef IdStringSet::const_iterator MultiversionIterator;
+
+ bool multiversionEmpty() const;
+ size_t multiversionSize() const;
+ MultiversionIterator multiversionBegin() const;
+ MultiversionIterator multiversionEnd() const;
+
+ bool isMultiversion( IdString ident_r ) const;
+ //@}
+
+ public:
+ /** \name Autoinstalled */
+ //@{
+ /** Get ident list of all autoinstalled solvables. */
+ Queue autoInstalled() const;
+ /** Set ident list of all autoinstalled solvables. */
+ void setAutoInstalled( const Queue & autoInstalled_r );
+ //@}
+
+ public:
+ /** Expert backdoor. */
+ ::_Pool * get() const;
private:
- /** Explicitly shared sat-pool. */
- AutoDispose< ::_Pool *> _raii;
- /** Convenient access. */
- ::_Pool & _pool;
+ /** Default ctor */
+ Pool() {}
};
///////////////////////////////////////////////////////////////////
/** \relates Pool Stream output */
std::ostream & operator<<( std::ostream & str, const Pool & obj );
- ///////////////////////////////////////////////////////////////////
+ /** \relates Pool */
+ inline bool operator==( const Pool & lhs, const Pool & rhs )
+ { return lhs.get() == rhs.get(); }
- ///////////////////////////////////////////////////////////////////
- //
- // CLASS NAME : Pool::EraseRepo
- //
- /** Functor removing \ref Repo from it's \ref Pool.
- * E.g. used as dispose function in. \ref AutoDispose
- * to provide a convenient and exception safe temporary
- * \ref Repo.
- * \code
- * sat::Pool satpool;
- * MIL << "1 " << satpool << endl;
- * {
- * AutoDispose<sat::Repo> tmprepo( (sat::Pool::EraseRepo()) );
- * *tmprepo = satpool.reposInsert( "A" );
- * tmprepo->addSolv( "sl10.1-beta7-packages.solv" );
- * DBG << "2 " << satpool << endl;
- * // Calling 'tmprepo.resetDispose();' here
- * // would keep the Repo.
- * }
- * MIL << "3 " << satpool << endl;
- * \endcode
- * \code
- * 1 sat::pool(){0repos|2slov}
- * 2 sat::pool(){1repos|2612slov}
- * 3 sat::pool(){0repos|2slov}
- * \endcode
- * Leaving the block without calling <tt>tmprepo.resetDispose();</tt>
- * before, will automatically remove the \ref Repo from it's \ref Pool.
- */
- struct Pool::EraseRepo
- {
- void operator()( Repo repo_r ) const
- { repo_r.eraseFromPool(); }
- };
- ///////////////////////////////////////////////////////////////////
+ /** \relates Pool */
+ inline bool operator!=( const Pool & lhs, const Pool & rhs )
+ { return lhs.get() != rhs.get(); }
/////////////////////////////////////////////////////////////////
} // namespace sat