1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/pool/PoolImpl.h
12 #ifndef ZYPP_POOL_POOLIMPL_H
13 #define ZYPP_POOL_POOLIMPL_H
17 #include "zypp/base/Easy.h"
18 #include "zypp/base/LogTools.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"
29 ///////////////////////////////////////////////////////////////////
31 { /////////////////////////////////////////////////////////////////
32 ///////////////////////////////////////////////////////////////////
34 { /////////////////////////////////////////////////////////////////
36 ///////////////////////////////////////////////////////////////////
38 // CLASS NAME : PoolImpl
43 friend std::ostream & operator<<( std::ostream & str, const PoolImpl & obj );
47 typedef PoolTraits::ItemContainerT ContainerT;
48 typedef PoolTraits::size_type size_type;
49 typedef PoolTraits::const_iterator const_iterator;
50 typedef PoolTraits::Id2ItemT Id2ItemT;
52 typedef sat::detail::SolvableIdType SolvableIdType;
54 typedef PoolTraits::AdditionalCapabilities AdditionalCapabilities;
55 typedef PoolTraits::RepoContainerT KnownRepositories;
65 const sat::Pool satpool() const
66 { return sat::Pool::instance(); }
68 /** Housekeeping data serial number. */
69 const SerialNumber & serial() const
70 { return satpool().serial(); }
72 ///////////////////////////////////////////////////////////////////
74 ///////////////////////////////////////////////////////////////////
78 { return satpool().solvablesEmpty(); }
81 size_type size() const
82 { return satpool().solvablesSize(); }
84 const_iterator begin() const
85 { return make_filter_begin( pool::ByPoolItem(), store() ); }
87 const_iterator end() const
88 { return make_filter_end( pool::ByPoolItem(), store() ); }
91 /** Return the corresponding \ref PoolItem.
92 * Pool and sat pool should be in sync. Returns an empty
93 * \ref PoolItem if there is no corresponding \ref PoolItem.
94 * \see \ref PoolItem::satSolvable.
96 PoolItem find( const sat::Solvable & slv_r ) const
98 const ContainerT & mystore( store() );
99 return( slv_r.id() < mystore.size() ? mystore[slv_r.id()] : PoolItem() );
102 ///////////////////////////////////////////////////////////////////
104 ///////////////////////////////////////////////////////////////////
106 /** \name Save and restore state. */
108 void SaveState( const ResObject::Kind & kind_r );
110 void RestoreState( const ResObject::Kind & kind_r );
113 ///////////////////////////////////////////////////////////////////
115 ///////////////////////////////////////////////////////////////////
118 * Handling additional requirement. E.G. need package "foo" and package
119 * "foo1" which has a greater version than 1.0:
122 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
123 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo1 > 1.0"));
125 * setAdditionalRequire( capset );
127 void setAdditionalRequire( const AdditionalCapabilities & capset ) const
128 { _additionalRequire = capset; }
129 AdditionalCapabilities & additionalRequire() const
130 { return _additionalRequire; }
133 * Handling additional conflicts. E.G. do not install anything which provides "foo":
136 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
138 * setAdditionalConflict( capset );
140 void setAdditionalConflict( const AdditionalCapabilities & capset ) const
141 { _additionaConflict = capset; }
142 AdditionalCapabilities & additionaConflict() const
143 { return _additionaConflict; }
146 * Handling additional provides. This is used for ignoring a requirement.
147 * e.G. Do ignore the requirement "foo":
150 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
152 * setAdditionalProvide( cap );
154 void setAdditionalProvide( const AdditionalCapabilities & capset ) const
155 { _additionaProvide = capset; }
156 AdditionalCapabilities & additionaProvide() const
157 { return _additionaProvide; }
159 ///////////////////////////////////////////////////////////////////
161 ///////////////////////////////////////////////////////////////////
163 ResPoolProxy proxy( ResPool self ) const
167 _poolProxy.reset( new ResPoolProxy( self ) );
172 /** Access list of Repositories that contribute ResObjects.
175 const KnownRepositories & knownRepositories() const
178 if ( ! _knownRepositoriesPtr )
180 _knownRepositoriesPtr.reset( new KnownRepositories );
182 sat::Pool pool( satpool() );
183 for_( it, pool.reposBegin(), pool.reposEnd() )
185 _knownRepositoriesPtr->push_back( *it );
188 return *_knownRepositoriesPtr;
191 ///////////////////////////////////////////////////////////////////
193 ///////////////////////////////////////////////////////////////////
195 const ContainerT & store() const
200 sat::Pool pool( satpool() );
202 if ( pool.capacity() != _store.capacity() )
204 _store.resize( pool.capacity() );
207 if ( pool.capacity() )
209 for ( sat::detail::SolvableIdType i = pool.capacity()-1; i != 0; --i )
211 sat::Solvable s( i );
212 PoolItem & pi( _store[i] );
215 else if ( s && ! pi )
216 pi = PoolItem::makePoolItem( s ); // the only way to create a new one!
224 const Id2ItemT & id2item () const
230 _id2item = Id2ItemT( size() );
231 for_( it, begin(), end() )
233 const sat::Solvable &s = (*it)->satSolvable();
234 sat::detail::IdType id = s.ident().id();
235 if ( s.isKind( ResKind::srcpackage ) )
237 _id2item.insert( std::make_pair( id, *it ) );
239 //INT << _id2item << endl;
240 _id2itemDirty = false;
246 ///////////////////////////////////////////////////////////////////
248 ///////////////////////////////////////////////////////////////////
250 void checkSerial() const
252 if ( _watcher.remember( serial() ) )
254 satpool().prepare(); // always ajust dependencies.
257 void invalidate() const
260 _id2itemDirty = true;
263 _knownRepositoriesPtr.reset();
267 /** Watch sat pools serial number. */
268 SerialNumberWatcher _watcher;
269 mutable ContainerT _store;
270 mutable DefaultIntegral<bool,true> _storeDirty;
271 mutable Id2ItemT _id2item;
272 mutable DefaultIntegral<bool,true> _id2itemDirty;
275 mutable AdditionalCapabilities _additionalRequire;
276 mutable AdditionalCapabilities _additionaConflict;
277 mutable AdditionalCapabilities _additionaProvide;
279 mutable shared_ptr<ResPoolProxy> _poolProxy;
280 mutable scoped_ptr<KnownRepositories> _knownRepositoriesPtr;
283 /** \bug FAKE capindex */
284 const PoolTraits::CapItemContainerT _caphashfake;
286 ///////////////////////////////////////////////////////////////////
288 /////////////////////////////////////////////////////////////////
290 ///////////////////////////////////////////////////////////////////
291 /////////////////////////////////////////////////////////////////
293 ///////////////////////////////////////////////////////////////////
294 #endif // ZYPP_POOL_POOLIMPL_H