Imported Upstream version 16.0.3
[platform/upstream/libzypp.git] / zypp / sat / Pool.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/sat/Pool.h
10  *
11 */
12 #ifndef ZYPP_SAT_POOL_H
13 #define ZYPP_SAT_POOL_H
14
15 #include <iosfwd>
16
17 #include "zypp/Pathname.h"
18
19 #include "zypp/sat/detail/PoolMember.h"
20 #include "zypp/Repository.h"
21 #include "zypp/sat/WhatProvides.h"
22 #include "zypp/sat/SolvableSet.h"
23 #include "zypp/sat/Queue.h"
24
25 ///////////////////////////////////////////////////////////////////
26 namespace zypp
27 { /////////////////////////////////////////////////////////////////
28
29   class SerialNumber;
30   class RepoInfo;
31
32   ///////////////////////////////////////////////////////////////////
33   namespace sat
34   { /////////////////////////////////////////////////////////////////
35
36     ///////////////////////////////////////////////////////////////////
37     //
38     //  CLASS NAME : Pool
39     //
40     /** Global sat-pool.
41      *
42      * Explicitly shared singleton \ref Pool::instance.
43      */
44     class Pool : protected detail::PoolMember
45     {
46       public:
47         typedef detail::SolvableIterator SolvableIterator;
48         typedef zypp::detail::RepositoryIterator     RepositoryIterator;
49         typedef detail::size_type        size_type;
50
51       public:
52         /** Singleton ctor. */
53         static Pool instance()
54         { return Pool(); }
55
56         /** Ctor from \ref PoolMember. */
57         Pool( const detail::PoolMember & )
58         {}
59
60       public:
61         /** Internal array size for stats only. */
62         size_type capacity() const;
63
64         /** Housekeeping data serial number. */
65         const SerialNumber & serial() const;
66
67         /** Update housekeeping data if necessary (e.g. whatprovides). */
68         void prepare() const;
69
70         /** Get rootdir (for file conflicts check) */
71         Pathname rootDir() const;
72
73         /** Set rootdir (for file conflicts check) */
74         void rootDir( const Pathname & root_r );
75
76       public:
77         /** Whether \ref Pool contains repos. */
78         bool reposEmpty() const;
79
80         /** Number of repos in \ref Pool. */
81         size_type reposSize() const;
82
83         /** Iterator to the first \ref Repository. */
84         RepositoryIterator reposBegin() const;
85
86         /** Iterator behind the last \ref Repository. */
87         RepositoryIterator reposEnd() const;
88
89         /** Iterate the repositories. */
90         Iterable<RepositoryIterator> repos() const
91         { return makeIterable( reposBegin(), reposEnd() ); }
92
93         /** Return a \ref Repository named \c alias_r.
94          * It a such a \ref Repository does not already exist
95          * a new empty \ref Repository is created.
96          */
97         Repository reposInsert( const std::string & alias_r );
98
99         /** Find a \ref Repository named \c alias_r.
100          * Returns \ref noRepository if there is no such \ref Repository.
101          */
102         Repository reposFind( const std::string & alias_r ) const;
103
104         /** Remove a \ref Repository named \c alias_r.
105          * \see \ref Repository::eraseFromPool
106          */
107         void reposErase( const std::string & alias_r )
108         { reposFind( alias_r ).eraseFromPool(); }
109
110         /** Remove all repos from the pool.
111          * This also shrinks a pool which may have become large
112          * after having added and removed repos lots of times.
113          */
114         void reposEraseAll()
115         { while ( ! reposEmpty() ) reposErase( reposBegin()->alias() ); }
116
117       public:
118         /** Reserved system repository alias \c @System. */
119         static const std::string & systemRepoAlias();
120
121         /** Return the system repository if it is on the pool. */
122         Repository findSystemRepo() const;
123
124         /** Return the system repository, create it if missing. */
125         Repository systemRepo();
126
127       public:
128         /** Load \ref Solvables from a solv-file into a \ref Repository named \c name_r.
129          * In case of an exception the \ref Repository is removed from the \ref Pool.
130          * \throws Exception if loading the solv-file fails.
131          * \see \ref Repository::EraseFromPool
132         */
133         Repository addRepoSolv( const Pathname & file_r, const std::string & name_r );
134         /** \overload Using the files basename as \ref Repository name. */
135         Repository addRepoSolv( const Pathname & file_r );
136         /** \overload Using the \ref RepoInfo::alias \ref Repo name.
137          * Additionally stores the \ref RepoInfo. \See \ref Prool::setInfo.
138         */
139         Repository addRepoSolv( const Pathname & file_r, const RepoInfo & info_r );
140
141       public:
142         /** Load \ref Solvables from a helix-file into a \ref Repository named \c name_r.
143          * Supports loading of gzip compressed files (.gz). In case of an exception
144          * the \ref Repository is removed from the \ref Pool.
145          * \throws Exception if loading the helix-file fails.
146          * \see \ref Repository::EraseFromPool
147         */
148         Repository addRepoHelix( const Pathname & file_r, const std::string & name_r );
149         /** \overload Using the files basename as \ref Repository name. */
150         Repository addRepoHelix( const Pathname & file_r );
151         /** \overload Using the \ref RepoInfo::alias \ref Repo name.
152          * Additionally stores the \ref RepoInfo. \See \ref Prool::setInfo.
153         */
154         Repository addRepoHelix( const Pathname & file_r, const RepoInfo & info_r );
155
156       public:
157         /** Whether \ref Pool contains solvables. */
158         bool solvablesEmpty() const;
159
160         /** Number of solvables in \ref Pool. */
161         size_type solvablesSize() const;
162
163         /** Iterator to the first \ref Solvable. */
164         SolvableIterator solvablesBegin() const;
165
166         /** Iterator behind the last \ref Solvable. */
167         SolvableIterator solvablesEnd() const;
168
169         /** Iterate the solvables. */
170         Iterable<SolvableIterator> solvables() const
171         { return makeIterable( solvablesBegin(), solvablesEnd() ); }
172
173       public:
174         /** \name Iterate all Solvables matching a \c TFilter. */
175         //@{
176         template<class TFilter>
177         filter_iterator<TFilter,SolvableIterator> filterBegin( const TFilter & filter_r ) const
178         { return make_filter_iterator( filter_r, solvablesBegin(), solvablesEnd() ); }
179
180         template<class TFilter>
181         filter_iterator<TFilter,SolvableIterator> filterEnd( const TFilter & filter_r ) const
182         { return make_filter_iterator( filter_r, solvablesEnd(), solvablesEnd() ); }
183         //@}
184
185      public:
186         /** Conainer of all \ref Solvable providing \c cap_r.  */
187         WhatProvides whatProvides( Capability cap_r ) const
188         { return WhatProvides( cap_r ); }
189
190       public:
191         /** \name Requested locales. */
192         //@{
193         /** Set the default language for retrieving translated texts.
194          * Updated when calling \ref ZConfig::setTextLocale.
195          */
196         void setTextLocale( const Locale & locale_r );
197
198         /** Set the requested locales.
199          * Languages to be supported by the system, e.g. language specific
200          * packages to be installed.
201          */
202         void setRequestedLocales( const LocaleSet & locales_r );
203
204         /** Add one \ref Locale to the set of requested locales.
205          * Return \c true if \c locale_r was newly added to the set.
206         */
207         bool addRequestedLocale( const Locale & locale_r );
208
209         /** Erase one \ref Locale from the set of requested locales.
210         * Return \c false if \c locale_r was not found in the set.
211          */
212         bool eraseRequestedLocale( const Locale & locale_r );
213
214         /** Return the requested locales.
215          * \see \ref setRequestedLocales
216         */
217         const LocaleSet & getRequestedLocales() const;
218
219         /** Whether this \ref Locale is in the set of requested locales. */
220         bool isRequestedLocale( const Locale & locale_r ) const;
221
222
223         /** Start tracking changes based on this \a locales_r. */
224         void initRequestedLocales( const LocaleSet & locales_r );
225
226         /** Added since last initRequestedLocales. */
227         const LocaleSet & getAddedRequestedLocales() const;
228
229         /** Removed since last initRequestedLocales.*/
230         const LocaleSet & getRemovedRequestedLocales() const;
231
232
233         /** Get the set of available locales.
234          * This is computed from the package data so it actually
235          * represents all locales packages claim to support.
236          */
237         const LocaleSet & getAvailableLocales() const;
238
239         /** Whether this \ref Locale is in the set of available locales. */
240         bool isAvailableLocale( const Locale & locale_r ) const;
241         //@}
242
243       public:
244         /** \name Multiversion install.
245          * Whether the pool contains packages which are multiversion installable.
246          * \see \ref Solvable::multiversionInstall
247          * \see \ref ZConfig::multiversionSpec
248          */
249         //@{
250         typedef SolvableSet MultiversionList;
251         const MultiversionList & multiversion() const;
252         /** \deprecated Legacy, use multiversion().empty() instead. */
253         ZYPP_DEPRECATED bool multiversionEmpty() const { return multiversion().empty(); }
254         //@}
255
256       public:
257         /** \name Autoinstalled */
258         //@{
259         /** Get ident list of all autoinstalled solvables. */
260         Queue autoInstalled() const;
261         /** Set ident list of all autoinstalled solvables. */
262         void setAutoInstalled( const Queue & autoInstalled_r );
263         //@}
264
265       public:
266         /** Expert backdoor. */
267         detail::CPool * get() const;
268       private:
269         /** Default ctor */
270         Pool() {}
271     };
272     ///////////////////////////////////////////////////////////////////
273
274     /** \relates Pool Stream output */
275     std::ostream & operator<<( std::ostream & str, const Pool & obj );
276
277     /** \relates Pool */
278     inline bool operator==( const Pool & lhs, const Pool & rhs )
279     { return lhs.get() == rhs.get(); }
280
281     /** \relates Pool */
282     inline bool operator!=( const Pool & lhs, const Pool & rhs )
283     { return lhs.get() != rhs.get(); }
284
285     /** Create solv file content digest for zypper bash completion */
286     void updateSolvFileIndex( const Pathname & solvfile_r );
287
288     /////////////////////////////////////////////////////////////////
289   } // namespace sat
290   ///////////////////////////////////////////////////////////////////
291   /////////////////////////////////////////////////////////////////
292 } // namespace zypp
293 ///////////////////////////////////////////////////////////////////
294 #endif // ZYPP_SAT_POOL_H