X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/803fafcbaa2fe4e1c49249e589d50f892b1b2424..a146c9273ae8e19b0fb8f74580a51c5b0a391ade:/apt-pkg/pkgcachegen.cc diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index fd4f8965b..5aaba78f3 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgcachegen.cc,v 1.37 1999/04/19 02:35:38 jgg Exp $ +// $Id: pkgcachegen.cc,v 1.42 1999/10/29 04:49:37 jgg Exp $ /* ###################################################################### Package Cache Generator - Generator for the cache structure. @@ -33,8 +33,10 @@ // --------------------------------------------------------------------- /* 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 +70,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 +87,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 @@ -99,7 +102,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List) } pkgCache::VerIterator Ver = Pkg.VersionList(); - __apt_ptrloc *Last = &Pkg->VersionList; + map_ptrloc *Last = &Pkg->VersionList; int Res = 1; for (; Ver.end() == false; Last = &Ver->NextVer, Ver++) { @@ -111,20 +114,41 @@ bool pkgCacheGenerator::MergeList(ListParser &List) /* We already have a version for this item, record that we saw it */ - if (Res == 0) + unsigned long Hash = List.VersionHash(); + if (Res == 0 && Ver->Hash == Hash) { if (List.UsePackage(Pkg,Ver) == false) return _error->Error("Error occured while processing %s (UsePackage2)",PackageName.c_str()); - + 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; } + // Skip to the end of the same version set. + if (Res == 0) + { + for (; Ver.end() == false; Last = &Ver->NextVer, Ver++) + { + Res = pkgVersionCompare(Version.begin(),Version.end(),Ver.VerStr(), + Ver.VerStr() + strlen(Ver.VerStr())); + if (Res != 0) + break; + } + } + // Add a new version *Last = NewVersion(Ver,Version,*Last); Ver->ParentPkg = Pkg.Index(); + Ver->Hash = Hash; if (List.NewVersion(Ver) == false) return _error->Error("Error occured while processing %s (NewVersion1)",PackageName.c_str()); @@ -133,6 +157,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; @@ -174,6 +205,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) @@ -183,7 +217,7 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver, VF->File = CurrentFile - Cache.PkgFileP; // Link it to the end of the list - __apt_ptrloc *Last = &Ver->FileList; + map_ptrloc *Last = &Ver->FileList; for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; V++) Last = &V->NextFile; VF->NextFile = *Last; @@ -352,7 +386,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; } /*}}}*/ @@ -373,7 +408,7 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S, // Search for an insertion point pkgCache::StringItem *I = Cache.StringItemP + Cache.HeaderP->StringList; int Res = 1; - __apt_ptrloc *Last = &Cache.HeaderP->StringList; + map_ptrloc *Last = &Cache.HeaderP->StringList; for (; I != Cache.StringItemP; Last = &I->NextItem, I = Cache.StringItemP + I->NextItem) { @@ -558,10 +593,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"); @@ -584,8 +619,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]; @@ -639,7 +674,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 @@ -689,6 +724,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"); @@ -701,7 +738,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; @@ -732,7 +769,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; @@ -745,7 +782,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; @@ -759,6 +796,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"); @@ -793,7 +832,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; @@ -840,7 +879,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; @@ -859,7 +898,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;