- xmlTextReaderRead() can fail with non-zero values as well
[apt.git] / apt-pkg / rpm / rpmindexfile.cc
index ce77a86..9aaa72e 100644 (file)
@@ -17,6 +17,8 @@
 
 #ifdef HAVE_RPM
 
+#include <cassert>
+
 #include <apt-pkg/rpmindexfile.h>
 #include <apt-pkg/rpmsrcrecords.h>
 #include <apt-pkg/rpmlistparser.h>
@@ -581,14 +583,19 @@ pkgCache::PkgFileIterator rpmRepomdIndex::FindInCache(pkgCache &Cache) const
 }
 string rpmRepomdIndex::ReleaseURI(string Type) const
 {
-   string Res;
-   Res = URI + Dist + "/repodata/" + "repomd.xml";
+   string Res = URI + Dist;
+   assert( Res.size() > 0 );
+   if ( Res[Res.size() - 1] != '/' )
+     Res += '/';
+   Res += "repodata/";
+   Res += "repomd.xml";
    return Res;
 }
 
 string rpmRepomdIndex::ReleaseInfo(string Type) const
 {
    string Info = ::URI::SiteOnly(URI) + ' ';
+   assert( Dist.size() > 0 );
    if (Dist[Dist.size() - 1] == '/')
    {
       if (Dist != "/")
@@ -604,6 +611,7 @@ string rpmRepomdIndex::ReleaseInfo(string Type) const
 string rpmRepomdIndex::Info(string Type) const 
 {
    string Info = ::URI::SiteOnly(URI) + ' ';
+   assert( Dist.size() > 0 );
    if (Dist[Dist.size() - 1] == '/')
    {
       if (Dist != "/")
@@ -619,6 +627,7 @@ string rpmRepomdIndex::Info(string Type) const
 string rpmRepomdIndex::IndexURI(string Type) const
 {
    string Res = URI + Dist;
+   assert( Dist.size() > 0 );
    if (Dist[Dist.size() - 1] != '/') {
         Res += "/";
    }
@@ -683,12 +692,26 @@ string rpmRepomdIndex::ReleasePath() const
    return _config->FindDir("Dir::State::lists")+URItoFileName(ReleaseURI("release.xml"));
 }
 
+// This gets called several times per each index during cache generation,
+// only for progress percentage reporting. A rough estimate would do just
+// fine but using xmlReader appears to be cheap enough. OTOH creating a new 
+// handler like is done for rpmPkgDirIndex is hideously expensive.
 unsigned long rpmRepomdIndex::Size() const
 {
-   // ugh.. all this just to get the package count ;(
-   RPMHandler *Handler = CreateHandler();
-   unsigned long Res = Handler->Size();
-   delete Handler;
+   xmlTextReaderPtr Index;
+   unsigned long Res;
+   Index = xmlReaderForFile(IndexPath().c_str(), NULL,
+                         XML_PARSE_NONET|XML_PARSE_NOBLANKS);
+   if (Index == NULL) return 0;
+
+   if (xmlTextReaderRead(Index) == 1) {
+      xmlChar *pkgs = xmlTextReaderGetAttribute(Index, (xmlChar*)"packages");
+      Res = atoi((char*)pkgs);
+      xmlFree(pkgs);
+   } else {
+      Res = 0;
+   }
+   xmlFreeTextReader(Index);
    return Res;
 }