1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/sat/LookupAttr.cc
14 #include "zypp/base/Logger.h"
16 #include "zypp/sat/detail/PoolImpl.h"
18 #include "zypp/sat/LookupAttr.h"
22 ///////////////////////////////////////////////////////////////////
24 { /////////////////////////////////////////////////////////////////
25 ///////////////////////////////////////////////////////////////////
27 { /////////////////////////////////////////////////////////////////
29 LookupAttr::iterator LookupAttr::begin() const
31 if ( _attr == SolvAttr::noAttr )
34 scoped_ptr< ::_Dataiterator> dip( new ::Dataiterator );
35 // needed while LookupAttr::iterator::dip_equal does ::memcmp:
36 ::memset( dip.get(), 0, sizeof(::_Dataiterator) );
40 ::dataiterator_init( dip.get(), _solv.repository().id(), _solv.id(), _attr.id(), 0, SEARCH_NO_STORAGE_SOLVABLE );
42 ::dataiterator_init( dip.get(), _repo.id(), 0, _attr.id(), 0, SEARCH_NO_STORAGE_SOLVABLE );
43 else if ( ! sat::Pool::instance().reposEmpty() )
45 ::dataiterator_init( dip.get(), sat::Pool::instance().reposBegin()->id(), 0, _attr.id(), 0, SEARCH_NO_STORAGE_SOLVABLE );
51 return iterator( dip, chain ); // iterator takes over ownership!
54 LookupAttr::iterator LookupAttr::end() const
59 std::ostream & operator<<( std::ostream & str, const LookupAttr & obj )
61 if ( obj.attr() == SolvAttr::noAttr )
62 return str << "search nothing";
65 str << "seach " << obj.attr() << " in ";
67 str << "seach ALL in ";
70 return str << obj.solvable();
72 return str << obj.repo();
76 std::ostream & dumpOn( std::ostream & str, const LookupAttr & obj )
79 for_( it, obj.begin(), obj.end() )
81 str << " " << it << endl;
83 return str << "<EndOfSerach>";
86 ///////////////////////////////////////////////////////////////////
88 // CLASS NAME : LookupAttr::iterator
90 ///////////////////////////////////////////////////////////////////
92 Repository LookupAttr::iterator::inRepo() const
93 { return Repository( _dip->repo ); }
95 Solvable LookupAttr::iterator::inSolvable() const
96 { return Solvable( _dip->solvid ); }
98 SolvAttr LookupAttr::iterator::inSolvAttr() const
99 { return SolvAttr( _dip->key->name ); }
101 detail::IdType LookupAttr::iterator::solvAttrType() const
102 { return _dip->key->type; }
104 void LookupAttr::iterator::nextSkipSolvAttr()
105 { ::dataiterator_skip_attribute( _dip.get() ); }
107 void LookupAttr::iterator::nextSkipSolvable()
108 { ::dataiterator_skip_solvable( _dip.get() ); }
110 void LookupAttr::iterator::nextSkipRepo()
111 { ::dataiterator_skip_repo( _dip.get() ); }
113 ///////////////////////////////////////////////////////////////////
114 // internal stuff below
115 ///////////////////////////////////////////////////////////////////
117 ::_Dataiterator * LookupAttr::iterator::cloneFrom( const ::_Dataiterator * rhs )
121 ::_Dataiterator * ret( new ::_Dataiterator );
126 bool LookupAttr::iterator::dip_equal( const ::_Dataiterator & lhs, const ::_Dataiterator & rhs ) const
128 // requires ::memset in LookupAttr::begin
129 return ::memcmp( &lhs, &rhs, sizeof(::_Dataiterator) ) == 0;
132 detail::IdType LookupAttr::iterator::dereference() const
134 return _dip ? ::repodata_globalize_id( _dip->data, _dip->kv.id )
138 void LookupAttr::iterator::increment()
140 if ( _dip && ! ::dataiterator_step( _dip.get() ) )
142 bool haveNext = false;
145 Repository nextRepo( inRepo().nextInPool() );
148 ::dataiterator_jump_to_repo( _dip.get(), nextRepo.get() );
149 haveNext = ::dataiterator_step( _dip.get() );
155 base_reference() = 0;
160 std::ostream & operator<<( std::ostream & str, const LookupAttr::iterator & obj )
162 const ::_Dataiterator * dip = obj.get();
164 return str << "EndOfQuery" << endl;
166 str << obj.inSolvable()
167 << '<' << obj.inSolvAttr()
168 << "> = " << obj.solvAttrType()
169 << "(" << dip->kv.id << ")" << (dip->data && dip->data->localpool ? "*" : "" );
173 /////////////////////////////////////////////////////////////////
175 ///////////////////////////////////////////////////////////////////
176 /////////////////////////////////////////////////////////////////
178 ///////////////////////////////////////////////////////////////////