- optimize rpmRepomdIndex::Size() shaving circa 30% from cache generation time
authorpmatilai <pmatilai>
Tue, 18 Apr 2006 19:28:48 +0000 (19:28 +0000)
committerpmatilai <pmatilai>
Tue, 18 Apr 2006 19:28:48 +0000 (19:28 +0000)
- avoid segfaulting on empty repositories

apt-pkg/rpm/rpmhandler.cc
apt-pkg/rpm/rpmindexfile.cc

index cd11bf2..b6f8e7f 100644 (file)
@@ -894,7 +894,9 @@ RPMRepomdHandler::RPMRepomdHandler(string File, bool useFilelist)
       Pkgs.push_back(n);
       pkgcount++;
    }
       Pkgs.push_back(n);
       pkgcount++;
    }
-   NodeP = Pkgs[0];
+   if (iSize > 0) {
+      NodeP = Pkgs[0];
+   }
 
    return;
 
 
    return;
 
@@ -934,7 +936,9 @@ bool RPMRepomdHandler::Jump(unsigned int Offset)
 void RPMRepomdHandler::Rewind()
 {
    iOffset = 0;
 void RPMRepomdHandler::Rewind()
 {
    iOffset = 0;
-   NodeP = Pkgs[0];
+   if (iSize > 0) {
+      NodeP = Pkgs[0];
+   }
 }
 
 xmlNode *RPMRepomdHandler::FindNode(const string Name)
 }
 
 xmlNode *RPMRepomdHandler::FindNode(const string Name)
index b72a7e3..82185b4 100644 (file)
@@ -692,12 +692,26 @@ string rpmRepomdIndex::ReleasePath() const
    return _config->FindDir("Dir::State::lists")+URItoFileName(ReleaseURI("release.xml"));
 }
 
    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
 {
 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) == 0) {
+      Res = 0;
+   } else {
+      xmlChar *pkgs = xmlTextReaderGetAttribute(Index, (xmlChar*)"packages");
+      Res = atoi((char*)pkgs);
+      xmlFree(pkgs);
+   }
+   xmlFreeTextReader(Index);
    return Res;
 }
 
    return Res;
 }