backup
[platform/upstream/libzypp.git] / zypp / sat / LookupAttr.cc
index b283609..e12ddd9 100644 (file)
 
 using std::endl;
 
+#if 0
+#undef  XXX
+#define XXX MIL
+#warning Remove dummy debug output defines
+#endif
+
 ///////////////////////////////////////////////////////////////////
 namespace zypp
 { /////////////////////////////////////////////////////////////////
@@ -35,19 +41,27 @@ 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();
@@ -63,6 +77,14 @@ namespace zypp
     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 )
@@ -90,35 +112,61 @@ namespace zypp
     // 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
     {
@@ -175,18 +223,21 @@ namespace zypp
     }
 
     ///////////////////////////////////////////////////////////////////
-    // 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;
     }
@@ -200,90 +251,102 @@ namespace zypp
 
     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();
     }
@@ -302,6 +365,7 @@ namespace zypp
     LookupAttr::iterator::iterator( const iterator & rhs )
     : iterator_adaptor_( cloneFrom( rhs.base() ) )
     , _dip( base() )
+    , _chainRepos(rhs._chainRepos)
     {}
 
     LookupAttr::iterator & LookupAttr::iterator::operator=( const iterator & rhs )
@@ -310,6 +374,7 @@ namespace zypp
       {
         _dip.reset( cloneFrom( rhs.base() ) );
         base_reference() = _dip.get();
+        _chainRepos = rhs._chainRepos;
       }
       return *this;
     }
@@ -319,7 +384,9 @@ namespace zypp
     , _chainRepos( chain_r )
     {
       _dip.swap( dip_r ); // take ownership!
+      XXX << _dip << endl;
       increment();
+      XXX << *this << endl;
     }
 
     ///////////////////////////////////////////////////////////////////
@@ -371,7 +438,7 @@ namespace zypp
     {
       const ::_Dataiterator * dip = obj.get();
       if ( ! dip )
-        return str << "EndOfQuery" << endl;
+        return str << "EndOfQuery";
 
       if ( obj.inSolvable() )
         str << obj.inSolvable();