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>
23 #include <tr1/unordered_set>
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 static detail::IdType nsCallback( ::_Pool *, void * data, detail::IdType lhs, detail::IdType rhs );
84 /** \name Actions invalidating housekeeping data.
86 * All methods expect valid arguments being passed.
89 /** Creating a new repo named \a name_r. */
90 RepoIdType _createRepo( const std::string & name_r )
92 setDirty(__FUNCTION__, name_r.c_str() );
93 return ::repo_create( _pool, name_r.c_str() );
96 /** Creating a new repo named \a name_r. */
97 void _deleteRepo( ::_Repo * repo_r )
99 setDirty(__FUNCTION__, repo_r->name );
100 ::repo_free( repo_r, /*reuseids*/false );
101 eraseRepoInfo( repo_r );
104 /** Adding solv file to a repo.
105 * Except for \c isSystemRepo_r, solvables of incompatible architecture
108 int _addSolv( ::_Repo * repo_r, FILE * file_r, bool isSystemRepo_r = false );
110 /** Adding Solvables to a repo. */
111 detail::SolvableIdType _addSolvables( ::_Repo * repo_r, unsigned count_r )
113 setDirty(__FUNCTION__, repo_r->name );
114 return ::repo_add_solvable_block( repo_r, count_r );
119 /** a \c valid \ref Solvable has a non NULL repo pointer. */
120 bool validSolvable( const ::_Solvable & slv_r ) const
121 { return slv_r.repo; }
122 /** \overload Check also for id_r being in range of _pool->solvables. */
123 bool validSolvable( SolvableIdType id_r ) const
124 { return id_r < unsigned(_pool->nsolvables) && validSolvable( _pool->solvables[id_r] ); }
125 /** \overload Check also for slv_r being in range of _pool->solvables. */
126 bool validSolvable( const ::_Solvable * slv_r ) const
127 { return _pool->solvables <= slv_r && slv_r <= _pool->solvables+_pool->nsolvables && validSolvable( *slv_r ); }
130 ::_Pool * getPool() const
133 /** \todo a quick check whether the repo was meanwhile deleted. */
134 ::_Repo * getRepo( RepoIdType id_r ) const
137 /** Return pointer to the sat-solvable or NULL if it is not valid.
138 * \see \ref validSolvable.
140 ::_Solvable * getSolvable( SolvableIdType id_r ) const
142 if ( validSolvable( id_r ) )
143 return &_pool->solvables[id_r];
148 /** Get id of the first valid \ref Solvable.
149 * This is the next valid after the system solvable.
151 SolvableIdType getFirstId() const
152 { return getNextId( 1 ); }
154 /** Get id of the next valid \ref Solvable.
155 * This goes round robbin. At the end it returns \ref noSolvableId.
156 * Passing \ref noSolvableId it returns the 1st valid \ref Solvable.
157 * \see \ref validSolvable.
159 SolvableIdType getNextId( SolvableIdType id_r ) const
161 for( ++id_r; id_r < unsigned(_pool->nsolvables); ++id_r )
163 if ( validSolvable( _pool->solvables[id_r] ) )
171 const RepoInfo & repoInfo( RepoIdType id_r )
172 { return _repoinfos[id_r]; }
174 void setRepoInfo( RepoIdType id_r, const RepoInfo & info_r )
175 { _repoinfos[id_r] = info_r; }
177 void eraseRepoInfo( RepoIdType id_r )
178 { _repoinfos.erase( id_r ); }
181 const sat::detail::IdType * whatProvides( Capability cap_r )
182 { prepare(); return ::pool_whatprovides( _pool, cap_r.id() ); }
185 /** \name Requested locales. */
187 void setRequestedLocales( const LocaleSet & locales_r );
188 bool addRequestedLocale( const Locale & locale_r );
189 bool eraseRequestedLocale( const Locale & locale_r );
191 const LocaleSet & getRequestedLocales() const
192 { return _requestedLocales; }
194 bool isRequestedLocale( const Locale & locale_r ) const
196 LocaleSet::const_iterator it( _requestedLocales.find( locale_r ) );
197 return it != _requestedLocales.end();
200 const LocaleSet & getAvailableLocales() const;
202 bool isAvailableLocale( const Locale & locale_r ) const
204 const LocaleSet & avl( getAvailableLocales() );
205 LocaleSet::const_iterator it( avl.find( locale_r ) );
206 return it != avl.end();
213 /** Serial number. */
214 SerialNumber _serial;
215 /** Watch serial number. */
216 SerialNumberWatcher _watcher;
217 /** Additional \ref RepoInfo. */
218 std::map<RepoIdType,RepoInfo> _repoinfos;
221 LocaleSet _requestedLocales;
222 mutable scoped_ptr<LocaleSet> _availableLocalesPtr;
223 mutable std::tr1::unordered_set<IdString> _locale2Solver;
225 ///////////////////////////////////////////////////////////////////
227 /////////////////////////////////////////////////////////////////
228 } // namespace detail
229 ///////////////////////////////////////////////////////////////////
230 /////////////////////////////////////////////////////////////////
232 ///////////////////////////////////////////////////////////////////
233 /////////////////////////////////////////////////////////////////
235 ///////////////////////////////////////////////////////////////////
236 #define POOL_SETDIRTY
237 #endif // ZYPP_SAT_DETAIL_POOLIMPL_H