Adapt to satsolver helix stuff being moved to libsatsolverext.
[platform/upstream/libzypp.git] / zypp / sat / detail / PoolImpl.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/detail/PoolImpl.h
10  *
11 */
12 #ifndef ZYPP_SAT_DETAIL_POOLIMPL_H
13 #define ZYPP_SAT_DETAIL_POOLIMPL_H
14 extern "C"
15 {
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>
21 }
22 #include <iosfwd>
23
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"
32
33 ///////////////////////////////////////////////////////////////////
34 namespace zypp
35 { /////////////////////////////////////////////////////////////////
36   ///////////////////////////////////////////////////////////////////
37   namespace sat
38   { /////////////////////////////////////////////////////////////////
39     ///////////////////////////////////////////////////////////////////
40     namespace detail
41     { /////////////////////////////////////////////////////////////////
42
43       ///////////////////////////////////////////////////////////////////
44       //
45       //        CLASS NAME : PoolImpl
46       //
47       /** */
48       class PoolImpl : private base::NonCopyable
49       {
50         public:
51           /** Default ctor */
52           PoolImpl();
53
54           /** Dtor */
55           ~PoolImpl();
56
57           /** Pointer style access forwarded to sat-pool. */
58           ::_Pool * operator->()
59           { return _pool; }
60
61         public:
62           /** Serial number changing whenever the content changes. */
63           const SerialNumber & serial() const
64           { return _serial; }
65
66           /** Update housekeeping data (e.g. whatprovides).
67            * \todo actually requires a watcher.
68            */
69           void prepare() const;
70
71         private:
72           /** Invalidate housekeeping data (e.g. whatprovides) if the
73            *  pools content changed.
74            */
75           void setDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
76
77           /** Invalidate housekeeping data (e.g. whatprovides) if dependencies changed.
78            */
79           void depSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 );
80
81           /** Callback to resolve namespace dependencies (language, modalias, filesystem, etc.). */
82           static detail::IdType nsCallback( ::_Pool *, void * data, detail::IdType lhs, detail::IdType rhs );
83
84         public:
85           /** Reserved system repository alias \c @System. */
86           static const std::string & systemRepoAlias();
87
88           bool isSystemRepo( ::_Repo * repo_r ) const
89           { return repo_r && _pool->installed == repo_r; }
90
91           ::_Repo * systemRepo() const
92           { return _pool->installed; }
93
94         public:
95           /** \name Actions invalidating housekeeping data.
96            *
97            * All methods expect valid arguments being passed.
98            */
99           //@{
100           /** Creating a new repo named \a name_r. */
101           ::_Repo * _createRepo( const std::string & name_r );
102
103           /** Creating a new repo named \a name_r. */
104           void _deleteRepo( ::_Repo * repo_r );
105
106           /** Adding solv file to a repo.
107            * Except for \c isSystemRepo_r, solvables of incompatible architecture
108            * are filtered out.
109           */
110           int _addSolv( ::_Repo * repo_r, FILE * file_r );
111
112           /** Adding helix file to a repo.
113            * Except for \c isSystemRepo_r, solvables of incompatible architecture
114            * are filtered out.
115           */
116           int _addHelix( ::_Repo * repo_r, FILE * file_r );
117
118           /** Adding Solvables to a repo. */
119           detail::SolvableIdType _addSolvables( ::_Repo * repo_r, unsigned count_r );
120           //@}
121
122           /** Helper postprocessing the repo aftr adding solv or helix files. */
123           void _postRepoAdd( ::_Repo * repo_r );
124
125         public:
126           /** a \c valid \ref Solvable has a non NULL repo pointer. */
127           bool validSolvable( const ::_Solvable & slv_r ) const
128           { return slv_r.repo; }
129           /** \overload Check also for id_r being in range of _pool->solvables. */
130           bool validSolvable( SolvableIdType id_r ) const
131           { return id_r < unsigned(_pool->nsolvables) && validSolvable( _pool->solvables[id_r] ); }
132           /** \overload Check also for slv_r being in range of _pool->solvables. */
133           bool validSolvable( const ::_Solvable * slv_r ) const
134           { return _pool->solvables <= slv_r && slv_r <= _pool->solvables+_pool->nsolvables && validSolvable( *slv_r ); }
135
136         public:
137           ::_Pool * getPool() const
138           { return _pool; }
139
140           /** \todo a quick check whether the repo was meanwhile deleted. */
141           ::_Repo * getRepo( RepoIdType id_r ) const
142           { return id_r; }
143
144           /** Return pointer to the sat-solvable or NULL if it is not valid.
145            * \see \ref validSolvable.
146            */
147           ::_Solvable * getSolvable( SolvableIdType id_r ) const
148           {
149             if ( validSolvable( id_r ) )
150               return &_pool->solvables[id_r];
151             return 0;
152           }
153
154         public:
155           /** Get id of the first valid \ref Solvable.
156            * This is the next valid after the system solvable.
157            */
158           SolvableIdType getFirstId()  const
159           { return getNextId( 1 ); }
160
161           /** Get id of the next valid \ref Solvable.
162            * This goes round robbin. At the end it returns \ref noSolvableId.
163            * Passing \ref noSolvableId it returns the 1st valid  \ref Solvable.
164            * \see \ref validSolvable.
165            */
166           SolvableIdType getNextId( SolvableIdType id_r ) const
167           {
168             for( ++id_r; id_r < unsigned(_pool->nsolvables); ++id_r )
169             {
170               if ( validSolvable( _pool->solvables[id_r] ) )
171                 return id_r;
172             }
173             return noSolvableId;
174           }
175
176         public:
177           /** */
178           const RepoInfo & repoInfo( RepoIdType id_r )
179           { return _repoinfos[id_r]; }
180           /** */
181           void setRepoInfo( RepoIdType id_r, const RepoInfo & info_r )
182           { _repoinfos[id_r] = info_r; }
183           /** */
184           void eraseRepoInfo( RepoIdType id_r )
185           { _repoinfos.erase( id_r ); }
186
187         public:
188           /** Returns the id stored at \c offset_r in the internal
189            * whatprovidesdata array.
190           */
191           const sat::detail::IdType whatProvidesData( unsigned offset_r )
192           { return _pool->whatprovidesdata[offset_r]; }
193
194           /** Returns offset into the internal whatprovidesdata array.
195            * Use \ref whatProvidesData to get the stored Id.
196           */
197           unsigned whatProvides( Capability cap_r )
198           { prepare(); return ::pool_whatprovides( _pool, cap_r.id() ); }
199
200         public:
201           /** \name Requested locales. */
202           //@{
203           void setRequestedLocales( const LocaleSet & locales_r );
204           bool addRequestedLocale( const Locale & locale_r );
205           bool eraseRequestedLocale( const Locale & locale_r );
206
207           const LocaleSet & getRequestedLocales() const
208           { return _requestedLocales; }
209
210           bool isRequestedLocale( const Locale & locale_r ) const
211           {
212             LocaleSet::const_iterator it( _requestedLocales.find( locale_r ) );
213             return it != _requestedLocales.end();
214           }
215
216           const LocaleSet & getAvailableLocales() const;
217
218           bool isAvailableLocale( const Locale & locale_r ) const
219           {
220             const LocaleSet & avl( getAvailableLocales() );
221             LocaleSet::const_iterator it( avl.find( locale_r ) );
222             return it != avl.end();
223           }
224           //@}
225
226         private:
227           /** sat-pool. */
228           ::_Pool * _pool;
229           /** Serial number. */
230           SerialNumber _serial;
231           /** Watch serial number. */
232           SerialNumberWatcher _watcher;
233           /** Additional \ref RepoInfo. */
234           std::map<RepoIdType,RepoInfo> _repoinfos;
235
236           /**  */
237           LocaleSet _requestedLocales;
238           mutable scoped_ptr<LocaleSet> _availableLocalesPtr;
239           mutable std::tr1::unordered_set<IdString> _locale2Solver;
240       };
241       ///////////////////////////////////////////////////////////////////
242
243       /////////////////////////////////////////////////////////////////
244     } // namespace detail
245     ///////////////////////////////////////////////////////////////////
246     /////////////////////////////////////////////////////////////////
247   } // namespace sat
248   ///////////////////////////////////////////////////////////////////
249   /////////////////////////////////////////////////////////////////
250 } // namespace zypp
251 ///////////////////////////////////////////////////////////////////
252 #define POOL_SETDIRTY
253 #endif // ZYPP_SAT_DETAIL_POOLIMPL_H