using std::endl;
+#if 0
+#undef XXX
+#define XXX MIL
+#warning Remove dummy debug output defines
+#endif
+
///////////////////////////////////////////////////////////////////
namespace zypp
{ /////////////////////////////////////////////////////////////////
if ( _attr == SolvAttr::noAttr )
return iterator();
+#warning Need to call dataiterator_free
scoped_ptr< ::_Dataiterator> dip( new ::Dataiterator );
// needed while LookupAttr::iterator::dip_equal does ::memcmp:
::memset( dip.get(), 0, sizeof(::_Dataiterator) );
bool chain = false;
if ( _solv )
- ::dataiterator_init( dip.get(), _solv.repository().id(), _solv.id(), _attr.id(), 0, SEARCH_NO_STORAGE_SOLVABLE );
+ {
+ ::dataiterator_init( dip.get(), sat::Pool::instance().get(), _solv.repository().id(), _solv.id(), _attr.id(), 0, 0 );
+ XXX << "Solv " << _solv << endl;
+ }
else if ( _repo )
- ::dataiterator_init( dip.get(), _repo.id(), 0, _attr.id(), 0, SEARCH_NO_STORAGE_SOLVABLE );
+ {
+ ::dataiterator_init( dip.get(), sat::Pool::instance().get(), _repo.id(), 0, _attr.id(), 0, 0 );
+ XXX << "Repo " << _repo << endl;
+ }
else if ( ! sat::Pool::instance().reposEmpty() )
{
- ::dataiterator_init( dip.get(), sat::Pool::instance().reposBegin()->id(), 0, _attr.id(), 0, SEARCH_NO_STORAGE_SOLVABLE );
+ ::dataiterator_init( dip.get(), sat::Pool::instance().get(), sat::Pool::instance().reposBegin()->id(), 0, _attr.id(), 0, 0 );
chain = true;
+ XXX << "ALL " << endl;
}
else
return iterator();
bool LookupAttr::empty() const
{ return begin() == end(); }
+ LookupAttr::size_type LookupAttr::size() const
+ {
+ size_type c = 0;
+ for_( it, begin(), end() )
+ ++c;
+ return c;
+ }
+
std::ostream & operator<<( std::ostream & str, const LookupAttr & obj )
{
if ( obj.attr() == SolvAttr::noAttr )
// CLASS NAME : LookupAttr::iterator
//
///////////////////////////////////////////////////////////////////
+ std::ostream & operator<<( std::ostream & str, const ::_Dataiterator * obj )
+ {
+
+ str << "::_Dataiterator(";
+ if ( ! obj )
+ {
+ str << "NULL";
+ }
+ else
+ {
+ str << '|' << obj->pool;
+ str << '|' << Repository(obj->repo);
+ str << '|' << obj->key;
+ str << '|' << obj->keyname;
+ str << '|' << obj->repodataid;
+ str << '|' << obj->solvid;
+ str << '|' << obj->repoid;
+ }
+ return str << ")";
+ }
+
+ std::ostream & operator<<( std::ostream & str, const scoped_ptr< ::_Dataiterator> & obj )
+ {
+ return str << obj.get();
+ }
+
///////////////////////////////////////////////////////////////////
// position and moving
///////////////////////////////////////////////////////////////////
Repository LookupAttr::iterator::inRepo() const
- { return Repository( _dip->repo ); }
+ { return _dip ? Repository( _dip->repo ) : Repository::noRepository; }
Solvable LookupAttr::iterator::inSolvable() const
- { return Solvable( _dip->solvid ); }
+ { return _dip ? Solvable( _dip->solvid ) : Solvable::noSolvable; }
SolvAttr LookupAttr::iterator::inSolvAttr() const
- { return SolvAttr( _dip->key->name ); }
+ { return _dip ? SolvAttr( _dip->key->name ) : SolvAttr::noAttr; }
void LookupAttr::iterator::nextSkipSolvAttr()
- { ::dataiterator_skip_attribute( _dip.get() ); }
+ { if ( _dip ) ::dataiterator_skip_attribute( _dip.get() ); }
void LookupAttr::iterator::nextSkipSolvable()
- { ::dataiterator_skip_solvable( _dip.get() ); }
+ { if ( _dip ) ::dataiterator_skip_solvable( _dip.get() ); }
void LookupAttr::iterator::nextSkipRepo()
- { ::dataiterator_skip_repo( _dip.get() ); }
+ { if ( _dip ) ::dataiterator_skip_repo( _dip.get() ); }
///////////////////////////////////////////////////////////////////
// attr value type test
///////////////////////////////////////////////////////////////////
detail::IdType LookupAttr::iterator::solvAttrType() const
- { return _dip->key->type; }
+ { return _dip ? _dip->key->type : detail::noId; }
bool LookupAttr::iterator::solvAttrNumeric() const
{
}
///////////////////////////////////////////////////////////////////
- // attr value type test
+ // attr value retrieval
///////////////////////////////////////////////////////////////////
int LookupAttr::iterator::asInt() const
{
- switch ( solvAttrType() )
+ if ( _dip )
{
- case REPOKEY_TYPE_U32:
- case REPOKEY_TYPE_NUM:
- case REPOKEY_TYPE_CONSTANT:
- return _dip->kv.num;
- break;
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_U32:
+ case REPOKEY_TYPE_NUM:
+ case REPOKEY_TYPE_CONSTANT:
+ return _dip->kv.num;
+ break;
+ }
}
return 0;
}
const char * LookupAttr::iterator::c_str() const
{
- switch ( solvAttrType() )
+ if ( _dip )
{
- case REPOKEY_TYPE_ID:
- case REPOKEY_TYPE_IDARRAY:
- case REPOKEY_TYPE_CONSTANTID:
- if ( _dip->data && _dip->data->localpool )
- return ::stringpool_id2str( &_dip->data->spool, _dip->kv.id ); // in local pool
- else
- return IdString( _dip->kv.id ).c_str(); // in global pool
- break;
-
- case REPOKEY_TYPE_STR:
- return _dip->kv.str;
- break;
-
- case REPOKEY_TYPE_DIRSTRARRAY:
- return ::repodata_dir2str( _dip->data, _dip->kv.id, _dip->kv.str );
- break;
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ if ( _dip->data && _dip->data->localpool )
+ return ::stringpool_id2str( &_dip->data->spool, _dip->kv.id ); // in local pool
+ else
+ return IdString( _dip->kv.id ).c_str(); // in global pool
+ break;
+
+ case REPOKEY_TYPE_STR:
+ return _dip->kv.str;
+ break;
+
+ case REPOKEY_TYPE_DIRSTRARRAY:
+ return ::repodata_dir2str( _dip->data, _dip->kv.id, _dip->kv.str );
+ break;
+ }
}
return 0;
}
std::string LookupAttr::iterator::asString() const
{
- switch ( solvAttrType() )
+ if ( _dip )
{
- case REPOKEY_TYPE_ID:
- case REPOKEY_TYPE_IDARRAY:
- case REPOKEY_TYPE_CONSTANTID:
- case REPOKEY_TYPE_STR:
- case REPOKEY_TYPE_DIRSTRARRAY:
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ case REPOKEY_TYPE_STR:
+ case REPOKEY_TYPE_DIRSTRARRAY:
{
const char * ret( c_str() );
return ret ? ret : "";
}
break;
- case REPOKEY_TYPE_U32:
- case REPOKEY_TYPE_NUM:
- case REPOKEY_TYPE_CONSTANT:
- return str::numstring( asInt() );
- break;
+ case REPOKEY_TYPE_U32:
+ case REPOKEY_TYPE_NUM:
+ case REPOKEY_TYPE_CONSTANT:
+ return str::numstring( asInt() );
+ break;
- case REPOKEY_TYPE_MD5:
- case REPOKEY_TYPE_SHA1:
- case REPOKEY_TYPE_SHA256:
+ case REPOKEY_TYPE_MD5:
+ case REPOKEY_TYPE_SHA1:
+ case REPOKEY_TYPE_SHA256:
{
std::ostringstream str;
str << asCheckSum();
return str.str();
}
break;
+ }
}
- return std::string();
+ return std::string();
}
IdString LookupAttr::iterator::idStr() const
{
- switch ( solvAttrType() )
+ if ( _dip )
{
- case REPOKEY_TYPE_ID:
- case REPOKEY_TYPE_IDARRAY:
- case REPOKEY_TYPE_CONSTANTID:
- return IdString( ::repodata_globalize_id( _dip->data, _dip->kv.id ) );
- break;
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_ID:
+ case REPOKEY_TYPE_IDARRAY:
+ case REPOKEY_TYPE_CONSTANTID:
+ return IdString( ::repodata_globalize_id( _dip->data, _dip->kv.id ) );
+ break;
+ }
}
return IdString();
}
CheckSum LookupAttr::iterator::asCheckSum() const
{
- switch ( solvAttrType() )
+ if ( _dip )
{
- case REPOKEY_TYPE_MD5:
- return CheckSum::md5( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
- break;
+ switch ( solvAttrType() )
+ {
+ case REPOKEY_TYPE_MD5:
+ return CheckSum::md5( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
+ break;
- case REPOKEY_TYPE_SHA1:
- return CheckSum::sha1( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
- break;
+ case REPOKEY_TYPE_SHA1:
+ return CheckSum::sha1( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
+ break;
- case REPOKEY_TYPE_SHA256:
- return CheckSum::sha256( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
- break;
+ case REPOKEY_TYPE_SHA256:
+ return CheckSum::sha256( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) );
+ break;
+ }
}
return CheckSum();
}
LookupAttr::iterator::iterator( const iterator & rhs )
: iterator_adaptor_( cloneFrom( rhs.base() ) )
, _dip( base() )
+ , _chainRepos(rhs._chainRepos)
{}
LookupAttr::iterator & LookupAttr::iterator::operator=( const iterator & rhs )
{
_dip.reset( cloneFrom( rhs.base() ) );
base_reference() = _dip.get();
+ _chainRepos = rhs._chainRepos;
}
return *this;
}
, _chainRepos( chain_r )
{
_dip.swap( dip_r ); // take ownership!
+ XXX << _dip << endl;
increment();
+ XXX << *this << endl;
}
///////////////////////////////////////////////////////////////////
{
const ::_Dataiterator * dip = obj.get();
if ( ! dip )
- return str << "EndOfQuery" << endl;
+ return str << "EndOfQuery";
if ( obj.inSolvable() )
str << obj.inSolvable();