1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/pool/PoolImpl.h
12 #ifndef ZYPP_POOL_POOLIMPL_H
13 #define ZYPP_POOL_POOLIMPL_H
18 #include "zypp/base/Easy.h"
19 #include "zypp/base/SerialNumber.h"
20 #include "zypp/base/Deprecated.h"
22 #include "zypp/pool/PoolTraits.h"
23 #include "zypp/ResPoolProxy.h"
25 #include "zypp/sat/Pool.h"
27 ///////////////////////////////////////////////////////////////////
29 { /////////////////////////////////////////////////////////////////
30 ///////////////////////////////////////////////////////////////////
32 { /////////////////////////////////////////////////////////////////
34 ///////////////////////////////////////////////////////////////////
36 // CLASS NAME : PoolImpl
41 friend std::ostream & operator<<( std::ostream & str, const PoolImpl & obj );
45 typedef PoolTraits::ItemContainerT ContainerT;
46 typedef PoolTraits::size_type size_type;
47 typedef PoolTraits::const_iterator const_iterator;
49 typedef sat::detail::SolvableIdType SolvableIdType;
51 typedef PoolTraits::AdditionalCapabilities AdditionalCapabilities;
52 typedef PoolTraits::RepoContainerT KnownRepositories;
62 const sat::Pool satpool() const
63 { return sat::Pool::instance(); }
65 /** Housekeeping data serial number. */
66 const SerialNumber & serial() const
67 { return satpool().serial(); }
69 ///////////////////////////////////////////////////////////////////
71 ///////////////////////////////////////////////////////////////////
75 { return satpool().solvablesEmpty(); }
78 size_type size() const
79 { return satpool().solvablesSize(); }
82 const_iterator begin() const
83 { return make_map_value_begin( store() ); }
86 const_iterator end() const
87 { return make_map_value_end( store() ); }
90 /** Return the corresponding \ref PoolItem.
91 * Pool and sat pool should be in sync. Returns an empty
92 * \ref PoolItem if there is no corresponding \ref PoolItem.
93 * \see \ref PoolItem::satSolvable.
95 PoolItem find( const sat::Solvable & slv_r ) const
97 const ContainerT & c( store() );
98 ContainerT::const_iterator it( c.find( slv_r ) );
104 ///////////////////////////////////////////////////////////////////
106 ///////////////////////////////////////////////////////////////////
108 /** \name Save and restore state. */
110 void SaveState( const ResObject::Kind & kind_r );
112 void RestoreState( const ResObject::Kind & kind_r );
115 ///////////////////////////////////////////////////////////////////
117 ///////////////////////////////////////////////////////////////////
120 * Handling additional requirement. E.G. need package "foo" and package
121 * "foo1" which has a greater version than 1.0:
124 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
125 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo1 > 1.0"));
127 * setAdditionalRequire( capset );
129 void setAdditionalRequire( const AdditionalCapabilities & capset ) const
130 { _additionalRequire = capset; }
131 AdditionalCapabilities & additionalRequire() const
132 { return _additionalRequire; }
135 * Handling additional conflicts. E.G. do not install anything which provides "foo":
138 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
140 * setAdditionalConflict( capset );
142 void setAdditionalConflict( const AdditionalCapabilities & capset ) const
143 { _additionaConflict = capset; }
144 AdditionalCapabilities & additionaConflict() const
145 { return _additionaConflict; }
148 * Handling additional provides. This is used for ignoring a requirement.
149 * e.G. Do ignore the requirement "foo":
152 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
154 * setAdditionalProvide( cap );
156 void setAdditionalProvide( const AdditionalCapabilities & capset ) const
157 { _additionaProvide = capset; }
158 AdditionalCapabilities & additionaProvide() const
159 { return _additionaProvide; }
161 ///////////////////////////////////////////////////////////////////
163 ///////////////////////////////////////////////////////////////////
165 ResPoolProxy proxy( ResPool self ) const
169 _poolProxy.reset( new ResPoolProxy( self ) );
174 /** Access list of Repositories that contribute ResObjects.
177 const KnownRepositories & knownRepositories() const
180 if ( ! _knownRepositoriesPtr )
182 _knownRepositoriesPtr.reset( new KnownRepositories );
183 const ContainerT & c( store() );
184 for_( it, c.begin(), c.end() )
186 if ( (*it).second->repository() != Repository::noRepository )
188 _knownRepositoriesPtr->insert( (*it).second->repository() );
192 return *_knownRepositoriesPtr;
195 ///////////////////////////////////////////////////////////////////
197 ///////////////////////////////////////////////////////////////////
199 const ContainerT & store() const
204 // pass 1: delete no longer existing solvables
205 for ( ContainerT::iterator it = _store.begin(); it != _store.end(); /**/ )
207 if ( ! it->first ) // solvable became invalid
208 _store.erase( it++ ); // postfix! Incrementing before erase
213 // pass 2: add new solvables
214 sat::Pool pool( satpool() );
215 if ( _store.size() != pool.solvablesSize() )
217 for_( it, pool.solvablesBegin(), pool.solvablesEnd() )
219 PoolItem & pi( _store[*it] );
220 if ( ! pi ) // newly created
222 pi = PoolItem( *it );
232 ///////////////////////////////////////////////////////////////////
234 ///////////////////////////////////////////////////////////////////
236 void checkSerial() const
238 if ( _watcher.remember( serial() ) )
242 void invalidate() const
246 _knownRepositoriesPtr.reset();
250 /** Watch sat pools serial number. */
251 SerialNumberWatcher _watcher;
252 mutable ContainerT _store;
253 mutable DefaultIntegral<bool,true> _storeDirty;
256 mutable AdditionalCapabilities _additionalRequire;
257 mutable AdditionalCapabilities _additionaConflict;
258 mutable AdditionalCapabilities _additionaProvide;
260 mutable shared_ptr<ResPoolProxy> _poolProxy;
261 mutable scoped_ptr<KnownRepositories> _knownRepositoriesPtr;
264 /** \bug FAKE capindex */
265 const PoolTraits::CapItemContainerT _caphashfake;
267 ///////////////////////////////////////////////////////////////////
269 /** \relates PoolImpl Stream output */
270 std::ostream & operator<<( std::ostream & str, const PoolImpl & obj );
272 /////////////////////////////////////////////////////////////////
274 ///////////////////////////////////////////////////////////////////
275 /////////////////////////////////////////////////////////////////
277 ///////////////////////////////////////////////////////////////////
278 #endif // ZYPP_POOL_POOLIMPL_H