HP-UX fixes
[ntk/apt.git] / apt-pkg / pkgcachegen.cc
index 4787789..4033dc5 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: pkgcachegen.cc,v 1.40 1999/07/15 03:15:48 jgg Exp $
+// $Id: pkgcachegen.cc,v 1.43 1999/12/10 23:40:29 jgg Exp $
 /* ######################################################################
    
    Package Cache Generator - Generator for the cache structure.
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/deblistparser.h>
 #include <apt-pkg/strutl.h>
-#include <system.h>
 
 #include <sys/stat.h>
 #include <unistd.h>
 #include <errno.h>
+
+#include <system.h>
                                                                        /*}}}*/
 
 // CacheGenerator::pkgCacheGenerator - Constructor                     /*{{{*/
 // ---------------------------------------------------------------------
 /* We set the diry flag and make sure that is written to the disk */
 pkgCacheGenerator::pkgCacheGenerator(DynamicMMap &Map,OpProgress &Prog) :
-                    Map(Map), Cache(Map), Progress(Prog)
+                    Map(Map), Cache(Map), Progress(&Prog)
 {
+   CurrentFile = 0;
+   
    if (_error->PendingError() == true)
       return;
    
@@ -68,7 +71,8 @@ pkgCacheGenerator::~pkgCacheGenerator()
 // ---------------------------------------------------------------------
 /* This provides the generation of the entries in the cache. Each loop
    goes through a single package record from the underlying parse engine. */
-bool pkgCacheGenerator::MergeList(ListParser &List)
+bool pkgCacheGenerator::MergeList(ListParser &List,
+                                 pkgCache::VerIterator *OutVer)
 {
    List.Owner = this;
 
@@ -84,8 +88,8 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
       if (NewPackage(Pkg,PackageName) == false)
         return _error->Error("Error occured while processing %s (NewPackage)",PackageName.c_str());
       Counter++;
-      if (Counter % 100 == 0)
-        Progress.Progress(List.Offset());
+      if (Counter % 100 == 0 && Progress != 0)
+        Progress->Progress(List.Offset());
 
       /* Get a pointer to the version structure. We know the list is sorted
          so we use that fact in the search. Insertion of new versions is
@@ -120,6 +124,13 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
         if (NewFileVer(Ver,List) == false)
            return _error->Error("Error occured while processing %s (NewFileVer1)",PackageName.c_str());
         
+        // Read only a single record and return
+        if (OutVer != 0)
+        {
+           *OutVer = Ver;
+           return true;
+        }
+        
         continue;
       }      
 
@@ -147,6 +158,13 @@ bool pkgCacheGenerator::MergeList(ListParser &List)
       
       if (NewFileVer(Ver,List) == false)
         return _error->Error("Error occured while processing %s (NewVersion2)",PackageName.c_str());
+
+      // Read only a single record and return
+      if (OutVer != 0)
+      {
+        *OutVer = Ver;
+        return true;
+      }      
    }
 
    return true;
@@ -188,6 +206,9 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,string Name)
 bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
                                   ListParser &List)
 {
+   if (CurrentFile == 0)
+      return true;
+   
    // Get a structure
    unsigned long VerFile = Map.Allocate(sizeof(pkgCache::VerFile));
    if (VerFile == 0)
@@ -366,7 +387,8 @@ bool pkgCacheGenerator::SelectFile(string File,unsigned long Flags)
    if (CurrentFile->FileName == 0)
       return false;
    
-   Progress.SubProgress(Buf.st_size);
+   if (Progress != 0)
+      Progress->SubProgress(Buf.st_size);
    return true;
 }
                                                                        /*}}}*/
@@ -572,10 +594,10 @@ bool pkgPkgCacheCheck(string CacheFile)
    return true;
 }
                                                                        /*}}}*/
-// AddSourcesSize - Add the size of the status files                   /*{{{*/
+// AddStatusSize - Add the size of the status files                    /*{{{*/
 // ---------------------------------------------------------------------
 /* This adds the size of all the status files to the size counter */
-static bool pkgAddSourcesSize(unsigned long &TotalSize)
+bool pkgAddStatusSize(unsigned long &TotalSize)
 {
    // Grab the file names
    string xstatus = _config->FindFile("Dir::State::xstatus");
@@ -598,8 +620,8 @@ static bool pkgAddSourcesSize(unsigned long &TotalSize)
 // MergeStatus - Add the status files to the cache                     /*{{{*/
 // ---------------------------------------------------------------------
 /* This adds the status files to the map */
-static bool pkgMergeStatus(OpProgress &Progress,pkgCacheGenerator &Gen,
-                          unsigned long &CurrentSize,unsigned long TotalSize)
+bool pkgMergeStatus(OpProgress &Progress,pkgCacheGenerator &Gen,
+                   unsigned long &CurrentSize,unsigned long TotalSize)
 {
    // Grab the file names   
    string Status[3];
@@ -653,7 +675,7 @@ bool pkgGenerateSrcCache(pkgSourceList &List,OpProgress &Progress,
       TotalSize += Buf.st_size;
    }
    
-   if (pkgAddSourcesSize(TotalSize) == false)
+   if (pkgAddStatusSize(TotalSize) == false)
       return false;
    
    // Generate the pkg source cache
@@ -703,6 +725,8 @@ bool pkgGenerateSrcCache(pkgSourceList &List,OpProgress &Progress,
    xstatus files into it. */
 bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress)
 {
+   unsigned long MapSize = _config->FindI("APT::Cache-Limit",4*1024*1024);
+   
    Progress.OverallProgress(0,1,1,"Reading Package Lists");
    
    string CacheFile = _config->FindFile("Dir::Cache::pkgcache");
@@ -715,7 +739,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress)
       string SCacheFile = _config->FindFile("Dir::Cache::srcpkgcache");
       FileFd SCacheF(SCacheFile,FileFd::WriteEmpty);
       FileFd CacheF(CacheFile,FileFd::WriteEmpty);
-      DynamicMMap Map(CacheF,MMap::Public);
+      DynamicMMap Map(CacheF,MMap::Public,MapSize);
       if (_error->PendingError() == true)
         return false;
 
@@ -746,7 +770,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress)
 
    FileFd SCacheF(SCacheFile,FileFd::ReadOnly);
    FileFd CacheF(CacheFile,FileFd::WriteEmpty);
-   DynamicMMap Map(CacheF,MMap::Public);
+   DynamicMMap Map(CacheF,MMap::Public,MapSize);
    if (_error->PendingError() == true)
       return false;
    
@@ -759,7 +783,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress)
    
    // Compute the progress
    unsigned long TotalSize = 0;
-   if (pkgAddSourcesSize(TotalSize) == false)
+   if (pkgAddStatusSize(TotalSize) == false)
       return false;
 
    unsigned long CurrentSize = 0;
@@ -773,6 +797,8 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress)
    creates a memory block and puts the cache in there. */
 MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
 {
+   unsigned long MapSize = _config->FindI("APT::Cache-Limit",4*1024*1024);
+   
    /* If the cache file is writeable this is just a wrapper for
       MakeStatusCache */
    string CacheFile = _config->FindFile("Dir::Cache::pkgcache");
@@ -807,7 +833,7 @@ MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
    // Rebuild the source and package caches   
    if (SrcOk == false)
    {
-      DynamicMMap *Map = new DynamicMMap(MMap::Public);
+      DynamicMMap *Map = new DynamicMMap(MMap::Public,MapSize);
       if (_error->PendingError() == true)
       {
         delete Map;
@@ -854,7 +880,7 @@ MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
    // We use the source cache to generate the package cache
    string SCacheFile = _config->FindFile("Dir::Cache::srcpkgcache");
    FileFd SCacheF(SCacheFile,FileFd::ReadOnly);
-   DynamicMMap *Map = new DynamicMMap(MMap::Public);
+   DynamicMMap *Map = new DynamicMMap(MMap::Public,MapSize);
    if (_error->PendingError() == true)
    {
       delete Map;
@@ -873,7 +899,7 @@ MMap *pkgMakeStatusCacheMem(pkgSourceList &List,OpProgress &Progress)
    
    // Compute the progress
    unsigned long TotalSize = 0;
-   if (pkgAddSourcesSize(TotalSize) == false)
+   if (pkgAddStatusSize(TotalSize) == false)
    {
       delete Map;
       return 0;