1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/detail/PoolImpl.h
12 #ifndef ZYPP_SAT_DETAIL_POOLIMPL_H
13 #define ZYPP_SAT_DETAIL_POOLIMPL_H
16 #include <satsolver/pool.h>
17 #include <satsolver/repo.h>
18 #include <satsolver/solvable.h>
19 #include <satsolver/poolarch.h>
20 #include <satsolver/repo_solv.h>
24 #include "zypp/base/Tr1hash.h"
25 #include "zypp/base/NonCopyable.h"
26 #include "zypp/base/SerialNumber.h"
27 #include "zypp/sat/detail/PoolMember.h"
28 #include "zypp/RepoInfo.h"
29 #include "zypp/Locale.h"
30 #include "zypp/Capability.h"
31 #include "zypp/IdString.h"
33 ///////////////////////////////////////////////////////////////////
35 { /////////////////////////////////////////////////////////////////
36 ///////////////////////////////////////////////////////////////////
38 { /////////////////////////////////////////////////////////////////
39 ///////////////////////////////////////////////////////////////////
41 { /////////////////////////////////////////////////////////////////
43 ///////////////////////////////////////////////////////////////////
45 // CLASS NAME : PoolImpl
48 class PoolImpl : private base::NonCopyable
57 /** Pointer style access forwarded to sat-pool. */
58 ::_Pool * operator->()
62 /** Serial number changing whenever the content changes. */
63 const SerialNumber & serial() const
66 /** Update housekeeping data (e.g. whatprovides).
67 * \todo actually requires a watcher.
72 /** Invalidate housekeeping data (e.g. whatprovides) if the
73 * pools content changed.
75 void setDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
77 /** Invalidate housekeeping data (e.g. whatprovides) if dependencies changed.
79 void depSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
81 /** Callback to resolve namespace dependencies (language, modalias, filesystem, etc.). */
82 static detail::IdType nsCallback( ::_Pool *, void * data, detail::IdType lhs, detail::IdType rhs );
85 /** Reserved system repository alias \c @System. */
86 static const std::string & systemRepoAlias();
88 bool isSystemRepo( ::_Repo * repo_r ) const
89 { return repo_r && _pool->installed == repo_r; }
92 /** \name Actions invalidating housekeeping data.
94 * All methods expect valid arguments being passed.
97 /** Creating a new repo named \a name_r. */
98 ::_Repo * _createRepo( const std::string & name_r );
100 /** Creating a new repo named \a name_r. */
101 void _deleteRepo( ::_Repo * repo_r );
103 /** Adding solv file to a repo.
104 * Except for \c isSystemRepo_r, solvables of incompatible architecture
107 int _addSolv( ::_Repo * repo_r, FILE * file_r );
109 /** Adding Solvables to a repo. */
110 detail::SolvableIdType _addSolvables( ::_Repo * repo_r, unsigned count_r );
114 /** a \c valid \ref Solvable has a non NULL repo pointer. */
115 bool validSolvable( const ::_Solvable & slv_r ) const
116 { return slv_r.repo; }
117 /** \overload Check also for id_r being in range of _pool->solvables. */
118 bool validSolvable( SolvableIdType id_r ) const
119 { return id_r < unsigned(_pool->nsolvables) && validSolvable( _pool->solvables[id_r] ); }
120 /** \overload Check also for slv_r being in range of _pool->solvables. */
121 bool validSolvable( const ::_Solvable * slv_r ) const
122 { return _pool->solvables <= slv_r && slv_r <= _pool->solvables+_pool->nsolvables && validSolvable( *slv_r ); }
125 ::_Pool * getPool() const
128 /** \todo a quick check whether the repo was meanwhile deleted. */
129 ::_Repo * getRepo( RepoIdType id_r ) const
132 /** Return pointer to the sat-solvable or NULL if it is not valid.
133 * \see \ref validSolvable.
135 ::_Solvable * getSolvable( SolvableIdType id_r ) const
137 if ( validSolvable( id_r ) )
138 return &_pool->solvables[id_r];
143 /** Get id of the first valid \ref Solvable.
144 * This is the next valid after the system solvable.
146 SolvableIdType getFirstId() const
147 { return getNextId( 1 ); }
149 /** Get id of the next valid \ref Solvable.
150 * This goes round robbin. At the end it returns \ref noSolvableId.
151 * Passing \ref noSolvableId it returns the 1st valid \ref Solvable.
152 * \see \ref validSolvable.
154 SolvableIdType getNextId( SolvableIdType id_r ) const
156 for( ++id_r; id_r < unsigned(_pool->nsolvables); ++id_r )
158 if ( validSolvable( _pool->solvables[id_r] ) )
166 const RepoInfo & repoInfo( RepoIdType id_r )
167 { return _repoinfos[id_r]; }
169 void setRepoInfo( RepoIdType id_r, const RepoInfo & info_r )
170 { _repoinfos[id_r] = info_r; }
172 void eraseRepoInfo( RepoIdType id_r )
173 { _repoinfos.erase( id_r ); }
176 /** Returns the id stored at \c offset_r in the internal
177 * whatprovidesdata array.
179 const sat::detail::IdType whatProvidesData( unsigned offset_r )
180 { return _pool->whatprovidesdata[offset_r]; }
182 /** Returns offset into the internal whatprovidesdata array.
183 * Use \ref whatProvidesData to get the stored Id.
185 unsigned whatProvides( Capability cap_r )
186 { prepare(); return ::pool_whatprovides( _pool, cap_r.id() ); }
189 /** \name Requested locales. */
191 void setRequestedLocales( const LocaleSet & locales_r );
192 bool addRequestedLocale( const Locale & locale_r );
193 bool eraseRequestedLocale( const Locale & locale_r );
195 const LocaleSet & getRequestedLocales() const
196 { return _requestedLocales; }
198 bool isRequestedLocale( const Locale & locale_r ) const
200 LocaleSet::const_iterator it( _requestedLocales.find( locale_r ) );
201 return it != _requestedLocales.end();
204 const LocaleSet & getAvailableLocales() const;
206 bool isAvailableLocale( const Locale & locale_r ) const
208 const LocaleSet & avl( getAvailableLocales() );
209 LocaleSet::const_iterator it( avl.find( locale_r ) );
210 return it != avl.end();
217 /** Serial number. */
218 SerialNumber _serial;
219 /** Watch serial number. */
220 SerialNumberWatcher _watcher;
221 /** Additional \ref RepoInfo. */
222 std::map<RepoIdType,RepoInfo> _repoinfos;
225 LocaleSet _requestedLocales;
226 mutable scoped_ptr<LocaleSet> _availableLocalesPtr;
227 mutable std::tr1::unordered_set<IdString> _locale2Solver;
229 ///////////////////////////////////////////////////////////////////
231 /////////////////////////////////////////////////////////////////
232 } // namespace detail
233 ///////////////////////////////////////////////////////////////////
234 /////////////////////////////////////////////////////////////////
236 ///////////////////////////////////////////////////////////////////
237 /////////////////////////////////////////////////////////////////
239 ///////////////////////////////////////////////////////////////////
240 #define POOL_SETDIRTY
241 #endif // ZYPP_SAT_DETAIL_POOLIMPL_H