1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/LookupAttr.cc
16 #include "zypp/base/LogTools.h"
17 #include "zypp/base/String.h"
19 #include "zypp/sat/detail/PoolImpl.h"
21 #include "zypp/sat/LookupAttr.h"
22 #include "zypp/CheckSum.h"
26 ///////////////////////////////////////////////////////////////////
28 { /////////////////////////////////////////////////////////////////
29 ///////////////////////////////////////////////////////////////////
31 { /////////////////////////////////////////////////////////////////
33 LookupAttr::iterator LookupAttr::begin() const
35 if ( _attr == SolvAttr::noAttr )
38 #warning Need to call dataiterator_free
39 scoped_ptr< ::_Dataiterator> dip( new ::Dataiterator );
40 // needed while LookupAttr::iterator::dip_equal does ::memcmp:
41 ::memset( dip.get(), 0, sizeof(::_Dataiterator) );
45 ::dataiterator_init( dip.get(), _solv.repository().id(), _solv.id(), _attr.id(), 0, 0 );
47 ::dataiterator_init( dip.get(), _repo.id(), 0, _attr.id(), 0, 0 );
48 else if ( ! sat::Pool::instance().reposEmpty() )
50 ::dataiterator_init( dip.get(), sat::Pool::instance().reposBegin()->id(), 0, _attr.id(), 0, 0 );
56 return iterator( dip, chain ); // iterator takes over ownership!
59 LookupAttr::iterator LookupAttr::end() const
64 bool LookupAttr::empty() const
65 { return begin() == end(); }
67 LookupAttr::size_type LookupAttr::size() const
70 for_( it, begin(), end() )
75 std::ostream & operator<<( std::ostream & str, const LookupAttr & obj )
77 if ( obj.attr() == SolvAttr::noAttr )
78 return str << "search nothing";
81 str << "seach " << obj.attr() << " in ";
83 str << "seach ALL in ";
86 return str << obj.solvable();
88 return str << obj.repo();
92 std::ostream & dumpOn( std::ostream & str, const LookupAttr & obj )
94 return dumpRange( str << obj, obj.begin(), obj.end() );
97 ///////////////////////////////////////////////////////////////////
99 // CLASS NAME : LookupAttr::iterator
101 ///////////////////////////////////////////////////////////////////
103 ///////////////////////////////////////////////////////////////////
104 // position and moving
105 ///////////////////////////////////////////////////////////////////
107 Repository LookupAttr::iterator::inRepo() const
108 { return _dip ? Repository( _dip->repo ) : Repository::noRepository; }
110 Solvable LookupAttr::iterator::inSolvable() const
111 { return _dip ? Solvable( _dip->entry ) : Solvable::noSolvable; }
113 SolvAttr LookupAttr::iterator::inSolvAttr() const
114 { return _dip ? SolvAttr( _dip->key->name ) : SolvAttr::noAttr; }
116 void LookupAttr::iterator::nextSkipSolvAttr()
117 { if ( _dip ) ::dataiterator_skip_attribute( _dip.get() ); }
119 void LookupAttr::iterator::nextSkipSolvable()
120 { if ( _dip ) ::dataiterator_skip_solvable( _dip.get() ); }
122 void LookupAttr::iterator::nextSkipRepo()
123 { if ( _dip ) ::dataiterator_skip_repo( _dip.get() ); }
125 ///////////////////////////////////////////////////////////////////
126 // attr value type test
127 ///////////////////////////////////////////////////////////////////
129 detail::IdType LookupAttr::iterator::solvAttrType() const
130 { return _dip ? _dip->key->type : detail::noId; }
132 bool LookupAttr::iterator::solvAttrNumeric() const
134 switch ( solvAttrType() )
136 case REPOKEY_TYPE_U32:
137 case REPOKEY_TYPE_NUM:
138 case REPOKEY_TYPE_CONSTANT:
145 bool LookupAttr::iterator::solvAttrString() const
147 switch ( solvAttrType() )
149 case REPOKEY_TYPE_ID:
150 case REPOKEY_TYPE_IDARRAY:
151 case REPOKEY_TYPE_CONSTANTID:
152 case REPOKEY_TYPE_STR:
153 case REPOKEY_TYPE_DIRSTRARRAY:
160 bool LookupAttr::iterator::solvAttrIdString() const
162 switch ( solvAttrType() )
164 case REPOKEY_TYPE_ID:
165 case REPOKEY_TYPE_IDARRAY:
166 case REPOKEY_TYPE_CONSTANTID:
173 bool LookupAttr::iterator::solvAttrCheckSum() const
175 switch ( solvAttrType() )
177 case REPOKEY_TYPE_MD5:
178 case REPOKEY_TYPE_SHA1:
179 case REPOKEY_TYPE_SHA256:
186 ///////////////////////////////////////////////////////////////////
187 // attr value retrieval
188 ///////////////////////////////////////////////////////////////////
190 int LookupAttr::iterator::asInt() const
194 switch ( solvAttrType() )
196 case REPOKEY_TYPE_U32:
197 case REPOKEY_TYPE_NUM:
198 case REPOKEY_TYPE_CONSTANT:
206 unsigned LookupAttr::iterator::asUnsigned() const
209 bool LookupAttr::iterator::asBool() const
213 const char * LookupAttr::iterator::c_str() const
217 switch ( solvAttrType() )
219 case REPOKEY_TYPE_ID:
220 case REPOKEY_TYPE_IDARRAY:
221 case REPOKEY_TYPE_CONSTANTID:
222 if ( _dip->data && _dip->data->localpool )
223 return ::stringpool_id2str( &_dip->data->spool, _dip->kv.id ); // in local pool
225 return IdString( _dip->kv.id ).c_str(); // in global pool
228 case REPOKEY_TYPE_STR:
232 case REPOKEY_TYPE_DIRSTRARRAY:
233 return ::repodata_dir2str( _dip->data, _dip->kv.id, _dip->kv.str );
240 std::string LookupAttr::iterator::asString() const
244 switch ( solvAttrType() )
246 case REPOKEY_TYPE_ID:
247 case REPOKEY_TYPE_IDARRAY:
248 case REPOKEY_TYPE_CONSTANTID:
249 case REPOKEY_TYPE_STR:
250 case REPOKEY_TYPE_DIRSTRARRAY:
252 const char * ret( c_str() );
253 return ret ? ret : "";
257 case REPOKEY_TYPE_U32:
258 case REPOKEY_TYPE_NUM:
259 case REPOKEY_TYPE_CONSTANT:
260 return str::numstring( asInt() );
263 case REPOKEY_TYPE_MD5:
264 case REPOKEY_TYPE_SHA1:
265 case REPOKEY_TYPE_SHA256:
267 std::ostringstream str;
274 return std::string();
277 IdString LookupAttr::iterator::idStr() const
281 switch ( solvAttrType() )
283 case REPOKEY_TYPE_ID:
284 case REPOKEY_TYPE_IDARRAY:
285 case REPOKEY_TYPE_CONSTANTID:
286 return IdString( ::repodata_globalize_id( _dip->data, _dip->kv.id ) );
293 CheckSum LookupAttr::iterator::asCheckSum() const
297 switch ( solvAttrType() )
299 case REPOKEY_TYPE_MD5:
300 return CheckSum::md5( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
303 case REPOKEY_TYPE_SHA1:
304 return CheckSum::sha1( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
307 case REPOKEY_TYPE_SHA256:
308 return CheckSum::sha256( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
315 ///////////////////////////////////////////////////////////////////
316 // internal stuff below
317 ///////////////////////////////////////////////////////////////////
319 LookupAttr::iterator::~iterator()
322 LookupAttr::iterator::iterator()
323 : iterator_adaptor_( 0 )
326 LookupAttr::iterator::iterator( const iterator & rhs )
327 : iterator_adaptor_( cloneFrom( rhs.base() ) )
329 , _chainRepos(rhs._chainRepos)
332 LookupAttr::iterator & LookupAttr::iterator::operator=( const iterator & rhs )
336 _dip.reset( cloneFrom( rhs.base() ) );
337 base_reference() = _dip.get();
338 _chainRepos = rhs._chainRepos;
343 LookupAttr::iterator::iterator( scoped_ptr< ::_Dataiterator> & dip_r, bool chain_r )
344 : iterator_adaptor_( dip_r.get() )
345 , _chainRepos( chain_r )
347 _dip.swap( dip_r ); // take ownership!
351 ///////////////////////////////////////////////////////////////////
353 ::_Dataiterator * LookupAttr::iterator::cloneFrom( const ::_Dataiterator * rhs )
357 ::_Dataiterator * ret( new ::_Dataiterator );
362 bool LookupAttr::iterator::dip_equal( const ::_Dataiterator & lhs, const ::_Dataiterator & rhs ) const
364 // requires ::memset in LookupAttr::begin
365 return ::memcmp( &lhs, &rhs, sizeof(::_Dataiterator) ) == 0;
368 detail::IdType LookupAttr::iterator::dereference() const
370 return _dip ? ::repodata_globalize_id( _dip->data, _dip->kv.id )
374 void LookupAttr::iterator::increment()
376 if ( _dip && ! ::dataiterator_step( _dip.get() ) )
378 bool haveNext = false;
381 Repository nextRepo( inRepo().nextInPool() );
384 ::dataiterator_jump_to_repo( _dip.get(), nextRepo.get() );
385 haveNext = ::dataiterator_step( _dip.get() );
391 base_reference() = 0;
396 std::ostream & operator<<( std::ostream & str, const LookupAttr::iterator & obj )
398 const ::_Dataiterator * dip = obj.get();
400 return str << "EndOfQuery";
402 if ( obj.inSolvable() )
403 str << obj.inSolvable();
404 else if ( obj.inRepo() )
407 str << '<' << obj.inSolvAttr()
408 << ">(" << obj.solvAttrType() << ") = " << obj.asString();
412 /////////////////////////////////////////////////////////////////
414 ///////////////////////////////////////////////////////////////////
415 /////////////////////////////////////////////////////////////////
417 ///////////////////////////////////////////////////////////////////