- use a separate handler for repomd filelists to remove gobs of
authorpmatilai <pmatilai>
Mon, 31 Jul 2006 20:54:57 +0000 (20:54 +0000)
committerpmatilai <pmatilai>
Mon, 31 Jul 2006 20:54:57 +0000 (20:54 +0000)
  unnecessary processing, cuts down cache generation time by circa 20%

apt-pkg/rpm/rpmhandler.cc
apt-pkg/rpm/rpmhandler.h
apt-pkg/rpm/rpmindexfile.cc
apt-pkg/rpm/rpmindexfile.h
apt-pkg/rpm/rpmrecords.cc
apt-pkg/rpm/rpmsrcrecords.cc

index 30cd616..3901731 100644 (file)
@@ -897,16 +897,13 @@ void RPMDBHandler::Rewind()
 }
 #endif
 
-RPMRepomdHandler::RPMRepomdHandler(string File, bool useFilelist)
+RPMRepomdHandler::RPMRepomdHandler(string File)
 {
-   WithFilelist = useFilelist;
    PrimaryFile = File;
-   FilelistFile = File.substr(0, File.size() - 11) + "filelists.xml";
 
    ID = File;
    Root = NULL;
    Primary = NULL;
-   Filelist = NULL;
    xmlChar *packages = NULL;
    off_t pkgcount = 0;
    
@@ -921,26 +918,6 @@ RPMRepomdHandler::RPMRepomdHandler(string File, bool useFilelist)
       goto error;
    }
 
-   if (WithFilelist && FileExists(FilelistFile)) {
-      Filelist = xmlReaderForFile(FilelistFile.c_str(), NULL,
-                                  XML_PARSE_NONET|XML_PARSE_NOBLANKS);
-      if (Filelist == NULL) {
-        xmlFreeTextReader(Filelist);
-        _error->Error(_("Failed to open filelist index %s"), FilelistFile.c_str());
-        goto error;
-      } 
-
-      // seek into first package in filelists.xml
-      int ret = xmlTextReaderRead(Filelist);
-      while (ret == 1) {
-        if (xmlStrcmp(xmlTextReaderConstName(Filelist), 
-                     (xmlChar*)"package") == 0) {
-           break;
-        }
-        ret = xmlTextReaderRead(Filelist);
-      }
-   }    
-
    packages = xmlGetProp(Root, (xmlChar*)"packages");
    iSize = atoi((char*)packages);
    xmlFree(packages);
@@ -966,9 +943,6 @@ error:
    if (Primary) {
       xmlFreeDoc(Primary);
    }
-   if (Filelist) {
-      xmlFreeTextReader(Filelist);
-   }
 }
 
 bool RPMRepomdHandler::Skip()
@@ -979,12 +953,6 @@ bool RPMRepomdHandler::Skip()
    NodeP = *PkgIter;
    iOffset = PkgIter - Pkgs.begin();
 
-   if (WithFilelist) {
-      if (iOffset > 0) {
-        xmlTextReaderNext(Filelist);
-      }
-   }
-
    PkgIter++;
    return true;
 }
@@ -1183,19 +1151,8 @@ bool RPMRepomdHandler::HasFile(const char *File)
       }
    }
 
-#if 0
-   // look through filelists.xml for the file if not in primary.xml
-   if (! found) {
-      for (xmlNode *n = FlNodeP->children; n; n = n->next) {
-        if (strcmp((char*)n->name, "file") != 0) 
-           continue;
-        if (strcmp(File, (char*)xmlNodeGetContent(n)) == 0) {
-           found = true;
-           break;
-        }
-      }
-   }
-#endif
+   // TODO: somehow look through filelists.xml for the file if not 
+   // primary.xml
    return found;
 
 }
@@ -1350,37 +1307,115 @@ bool RPMRepomdHandler::Provides(vector<Dependency*> &Provs)
 
 bool RPMRepomdHandler::FileProvides(vector<string> &FileProvs)
 {
-   // XXX maybe this should be made runtime configurable?
-   if ( !WithFilelist ) {
-      xmlNode *format = FindNode("format");
-      for (xmlNode *n = format->children; n; n = n->next) {
-         if (xmlStrcmp(n->name, (xmlChar*)"file") != 0)  continue;
-         xmlChar *Filename = xmlNodeGetContent(n);
-         FileProvs.push_back(string((char*)Filename));
-         xmlFree(Filename);
+   xmlNode *format = FindNode("format");
+   for (xmlNode *n = format->children; n; n = n->next) {
+      if (xmlStrcmp(n->name, (xmlChar*)"file") != 0)  continue;
+      xmlChar *Filename = xmlNodeGetContent(n);
+      FileProvs.push_back(string((char*)Filename));
+      xmlFree(Filename);
+   }
+   return true;
+}
+
+RPMRepomdHandler::~RPMRepomdHandler()
+{
+   xmlFreeDoc(Primary);
+}
+
+RPMRepomdFLHandler::RPMRepomdFLHandler(string File) : RPMHandler()
+{
+   FilelistFile = File.substr(0, File.size() - 11) + "filelists.xml";
+
+   ID = File;
+   Filelist = NULL;
+   NodeP = NULL;
+   iOffset = -1;
+
+   if (FileExists(FilelistFile)) {
+      Filelist = xmlReaderForFile(FilelistFile.c_str(), NULL,
+                                  XML_PARSE_NONET|XML_PARSE_NOBLANKS);
+      if (Filelist == NULL) {
+        xmlFreeTextReader(Filelist);
+        _error->Error(_("Failed to open filelist index %s"), FilelistFile.c_str());
+        goto error;
       }
-   } else {
-      xmlNode *FlP = xmlTextReaderExpand(Filelist);
-      if (FlP == NULL) {
-        return false;
+
+      // seek into first package in filelists.xml
+      int ret = xmlTextReaderRead(Filelist);
+      if (ret == 1) {
+        xmlChar *pkgs = xmlTextReaderGetAttribute(Filelist, (xmlChar*)"packages");
+        iSize = atoi((char*)pkgs);
+        xmlFree(pkgs);
       }
-      for (xmlNode *n = FlP->children; n; n = n->next) {
-         if (xmlStrcmp(n->name, (xmlChar*)"file") != 0) 
-           continue;
-         xmlChar *Filename = xmlNodeGetContent(n);
-         FileProvs.push_back(string((char*)Filename));
-         xmlFree(Filename);
+      while (ret == 1) {
+        if (xmlStrcmp(xmlTextReaderConstName(Filelist),
+                     (xmlChar*)"package") == 0) {
+           break;
+        }
+        ret = xmlTextReaderRead(Filelist);
       }
    }
+   return;
+
+error:
+   if (Filelist) {
+       xmlFreeTextReader(Filelist);
+   }
+}
+
+bool RPMRepomdFLHandler::Jump(off_t Offset)
+{
+   //cerr << "RepomdFLHandler::Jump() called but not implemented!" << endl;
+   return false;
+}
+
+void RPMRepomdFLHandler::Rewind()
+{
+   //cerr << "RepomdFLHandler::Rewind() called but not implemented!" << endl;
+}
+
+bool RPMRepomdFLHandler::Skip()
+{
+   if (iOffset +1 >= iSize) {
+      return false;
+   }
+   if (iOffset >= 0) {
+      xmlTextReaderNext(Filelist);
+   }
+   NodeP = xmlTextReaderExpand(Filelist);
+   iOffset++;
+
    return true;
 }
 
-RPMRepomdHandler::~RPMRepomdHandler()
+bool RPMRepomdFLHandler::FileProvides(vector<string> &FileProvs)
 {
-   xmlFreeDoc(Primary);
-   if (WithFilelist) {
-      xmlFreeTextReader(Filelist);
+   for (xmlNode *n = NodeP->children; n; n = n->next) {
+      if (xmlStrcmp(n->name, (xmlChar*)"file") != 0)  continue;
+      xmlChar *Filename = xmlNodeGetContent(n);
+      FileProvs.push_back(string((char*)Filename));
+      xmlFree(Filename);
    }
+   return true;
 }
 
+string RPMRepomdFLHandler::FindTag(char *Tag)
+{
+     string str = "";
+     if (NodeP) {
+         xmlChar *attr = xmlGetProp(NodeP, (xmlChar*)Tag);
+         if (attr) {
+            str = (char*)attr;
+            xmlFree(attr);
+         }
+     }
+     return str;
+};
+
+RPMRepomdFLHandler::~RPMRepomdFLHandler()
+{
+   xmlFreeTextReader(Filelist);
+}
+
+
 // vim:sts=3:sw=3
index 273c23d..48650ac 100644 (file)
@@ -120,6 +120,7 @@ class RPMFileHandler : public RPMHandler
    virtual bool Jump(off_t Offset);
    virtual void Rewind();
    virtual inline bool IsDatabase() {return false;};
+   virtual bool OrderedOffset() {return true;};
 
    virtual string FileName();
    virtual string Directory();
@@ -223,15 +224,13 @@ class RPMRepomdHandler : public RPMHandler
 {
 
    xmlDocPtr Primary;
-   xmlTextReaderPtr Filelist;
    xmlNode *Root;
    xmlNode *NodeP;
 
    vector<xmlNode *> Pkgs;
    vector<xmlNode *>::iterator PkgIter;
 
-   bool WithFilelist;
-   string PrimaryFile, FilelistFile;
+   string PrimaryFile;
 
    xmlNode *FindNode(const string Name);
    xmlNode *FindNode(xmlNode *Node, const string Name);
@@ -272,8 +271,42 @@ class RPMRepomdHandler : public RPMHandler
    virtual bool Provides(vector<Dependency*> &Provs);
    virtual bool FileProvides(vector<string> &FileProvs);
 
-   RPMRepomdHandler(string File, bool useFilelist);
+   RPMRepomdHandler(string File);
    virtual ~RPMRepomdHandler();
 };
 
+class RPMRepomdFLHandler : public RPMHandler
+{
+   protected:
+   xmlTextReaderPtr Filelist;
+   string FilelistFile;
+   xmlNode *NodeP;
+
+   string FindTag(char *Tag);
+
+   public:
+   virtual bool Skip();
+   virtual bool Jump(off_t Offset);
+   virtual void Rewind();
+   virtual bool IsDatabase() {return false;};
+
+   virtual string FileName() {return FilelistFile;};
+   virtual string Directory() {return "";};
+   virtual unsigned long FileSize() {return 0;};
+   virtual unsigned long InstalledSize() {return 0;};
+   virtual string MD5Sum() {return "";};
+   virtual string SHA1Sum() {return "";};
+
+   virtual string Name() {return FindTag("name");};
+   virtual string Arch() {return FindTag("arch");};
+   virtual string Epoch() {return FindTag("epoch");};
+   virtual string Version() {return FindTag("version");};
+   virtual string Release() {return FindTag("release");};
+   virtual bool Depends(unsigned int Type, vector<Dependency*> &Deps)
+       {return true;};
+
+   virtual bool FileProvides(vector<string> &FileProvs);
+   RPMRepomdFLHandler(string File);
+   virtual ~RPMRepomdFLHandler();
+};
 #endif
index 5e2d45a..77f3b5a 100644 (file)
@@ -768,7 +768,7 @@ bool rpmRepomdIndex::MergeFileProvides(pkgCacheGenerator &Gen,
                                        OpProgress &Prog) const
 {
    string PackageFile = IndexPath();
-   RPMHandler *Handler = CreateHandler();
+   RPMHandler *Handler = new RPMRepomdFLHandler(IndexPath());
    rpmListParser Parser(Handler);
    if (_error->PendingError() == true) {
       delete Handler;
index bfd4129..92f25dc 100644 (file)
@@ -302,7 +302,7 @@ class rpmRepomdIndex : public rpmIndexFile
 
    // Creates a RPMHandler suitable for usage with this object
    virtual RPMHandler *CreateHandler() const
-          { return new RPMRepomdHandler(IndexPath(), true); };
+          { return new RPMRepomdHandler(IndexPath()); };
 
    virtual bool GetReleases(pkgAcquire *Owner) const;
 
index b1f9445..461d391 100644 (file)
@@ -44,7 +44,7 @@ rpmRecordParser::rpmRecordParser(string File, pkgCache &Cache)
       else if (flExtension(File) == "rpm")
         Handler = new RPMSingleFileHandler(File);
       else if (flExtension(File) == "xml")
-        Handler = new RPMRepomdHandler(File, false);
+        Handler = new RPMRepomdHandler(File);
       else
         Handler = new RPMFileHandler(File);
    }
index 7d4064b..da205bf 100644 (file)
@@ -41,7 +41,7 @@ rpmSrcRecordParser::rpmSrcRecordParser(string File,pkgIndexFile const *Index)
    else if (flExtension(File) == "rpm")
       Handler = new RPMSingleFileHandler(File);
    else if (flExtension(File) == "xml")
-      Handler = new RPMRepomdHandler(File, false);
+      Handler = new RPMRepomdHandler(File);
    else
       Handler = new RPMFileHandler(File);
 }