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"
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;
51 typedef sat::detail::SolvableIdType SolvableIdType;
53 typedef PoolTraits::AdditionalCapabilities AdditionalCapabilities;
54 typedef PoolTraits::RepoContainerT KnownRepositories;
64 const sat::Pool satpool() const
65 { return sat::Pool::instance(); }
67 /** Housekeeping data serial number. */
68 const SerialNumber & serial() const
69 { return satpool().serial(); }
71 ///////////////////////////////////////////////////////////////////
73 ///////////////////////////////////////////////////////////////////
77 { return satpool().solvablesEmpty(); }
80 size_type size() const
81 { return satpool().solvablesSize(); }
84 /** Return the corresponding \ref PoolItem.
85 * Pool and sat pool should be in sync. Returns an empty
86 * \ref PoolItem if there is no corresponding \ref PoolItem.
87 * \see \ref PoolItem::satSolvable.
89 PoolItem find( const sat::Solvable & slv_r ) const
91 return store()[slv_r.id()];
94 ///////////////////////////////////////////////////////////////////
96 ///////////////////////////////////////////////////////////////////
98 /** \name Save and restore state. */
100 void SaveState( const ResObject::Kind & kind_r );
102 void RestoreState( const ResObject::Kind & kind_r );
105 ///////////////////////////////////////////////////////////////////
107 ///////////////////////////////////////////////////////////////////
110 * Handling additional requirement. E.G. need package "foo" and package
111 * "foo1" which has a greater version than 1.0:
114 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
115 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo1 > 1.0"));
117 * setAdditionalRequire( capset );
119 void setAdditionalRequire( const AdditionalCapabilities & capset ) const
120 { _additionalRequire = capset; }
121 AdditionalCapabilities & additionalRequire() const
122 { return _additionalRequire; }
125 * Handling additional conflicts. E.G. do not install anything which provides "foo":
128 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
130 * setAdditionalConflict( capset );
132 void setAdditionalConflict( const AdditionalCapabilities & capset ) const
133 { _additionaConflict = capset; }
134 AdditionalCapabilities & additionaConflict() const
135 { return _additionaConflict; }
138 * Handling additional provides. This is used for ignoring a requirement.
139 * e.G. Do ignore the requirement "foo":
142 * capset.insert (CapFactory().parse( ResTraits<Package>::kind, "foo"));
144 * setAdditionalProvide( cap );
146 void setAdditionalProvide( const AdditionalCapabilities & capset ) const
147 { _additionaProvide = capset; }
148 AdditionalCapabilities & additionaProvide() const
149 { return _additionaProvide; }
151 ///////////////////////////////////////////////////////////////////
153 ///////////////////////////////////////////////////////////////////
155 ResPoolProxy proxy( ResPool self ) const
159 _poolProxy.reset( new ResPoolProxy( self ) );
164 /** Access list of Repositories that contribute ResObjects.
167 const KnownRepositories & knownRepositories() const
170 if ( ! _knownRepositoriesPtr )
172 _knownRepositoriesPtr.reset( new KnownRepositories );
174 sat::Pool pool( satpool() );
175 for_( it, pool.reposBegin(), pool.reposEnd() )
177 _knownRepositoriesPtr->push_back( Repository( it->info() ) );
180 return *_knownRepositoriesPtr;
183 ///////////////////////////////////////////////////////////////////
185 ///////////////////////////////////////////////////////////////////
187 const ContainerT & store() const
192 sat::Pool pool( satpool() );
194 if ( pool.capacity() != _store.capacity() )
196 _store.resize( pool.capacity() );
199 if ( pool.capacity() )
201 for ( sat::detail::SolvableIdType i = pool.capacity()-1; i != 0; --i )
203 sat::Solvable s( i );
204 PoolItem & pi( _store[i] );
207 else if ( s && ! pi )
212 // pass 1: delete no longer existing solvables
213 for ( ContainerT::iterator it = _store.begin(); it != _store.end(); /**/ )
215 if ( ! it->first ) // solvable became invalid
216 _store.erase( it++ ); // postfix! Incrementing before erase
221 // pass 2: add new solvables
222 sat::Pool pool( satpool() );
223 if ( _store.size() != pool.solvablesSize() )
225 for_( it, pool.solvablesBegin(), pool.solvablesEnd() )
227 PoolItem & pi( _store[*it] );
228 if ( ! pi ) // newly created
230 pi = PoolItem( *it );
240 ///////////////////////////////////////////////////////////////////
242 ///////////////////////////////////////////////////////////////////
244 void checkSerial() const
246 if ( _watcher.remember( serial() ) )
250 void invalidate() const
254 _knownRepositoriesPtr.reset();
258 /** Watch sat pools serial number. */
259 SerialNumberWatcher _watcher;
260 mutable ContainerT _store;
261 mutable DefaultIntegral<bool,true> _storeDirty;
264 mutable AdditionalCapabilities _additionalRequire;
265 mutable AdditionalCapabilities _additionaConflict;
266 mutable AdditionalCapabilities _additionaProvide;
268 mutable shared_ptr<ResPoolProxy> _poolProxy;
269 mutable scoped_ptr<KnownRepositories> _knownRepositoriesPtr;
272 /** \bug FAKE capindex */
273 const PoolTraits::CapItemContainerT _caphashfake;
275 ///////////////////////////////////////////////////////////////////
277 /////////////////////////////////////////////////////////////////
279 ///////////////////////////////////////////////////////////////////
280 /////////////////////////////////////////////////////////////////
282 ///////////////////////////////////////////////////////////////////
283 #endif // ZYPP_POOL_POOLIMPL_H