X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/c5162d564ac98a1e97812ec5d290d2375c0820d8..a4edf53b885ce8559115eaf2c4836ec1f76b07ec:/apt-pkg/pkgcachegen.cc?ds=sidebyside diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index 46ae33c83..7cf332b68 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.16 1998/09/18 02:42:38 jgg Exp $ +// $Id: pkgcachegen.cc,v 1.26 1998/12/14 03:39:15 jgg Exp $ /* ###################################################################### Package Cache Generator - Generator for the cache structure. @@ -94,7 +94,7 @@ bool pkgCacheGenerator::MergeList(ListParser &List) } pkgCache::VerIterator Ver = Pkg.VersionList(); - unsigned long *Last = &Pkg->VersionList; + __apt_ptrloc *Last = &Pkg->VersionList; int Res = 1; for (; Ver.end() == false; Last = &Ver->NextVer, Ver++) { @@ -176,12 +176,20 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver, pkgCache::VerFileIterator VF(Cache,Cache.VerFileP + VerFile); VF->File = CurrentFile - Cache.PkgFileP; - VF->NextFile = Ver->FileList; - Ver->FileList = VF.Index(); + + // Link it to the end of the list + __apt_ptrloc *Last = &Ver->FileList; + for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; V++) + Last = &V->NextFile; + VF->NextFile = *Last; + *Last = VF.Index(); + VF->Offset = List.Offset(); VF->Size = List.Size(); if (Cache.HeaderP->MaxVerFileSize < VF->Size) Cache.HeaderP->MaxVerFileSize = VF->Size; + Cache.HeaderP->VerFileCount++; + return true; } /*}}}*/ @@ -247,19 +255,28 @@ bool pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator Ver, if ((Dep->Version = WriteString(Version)) == 0) return false; } - + // Link it to the package Dep->Package = Pkg.Index(); Dep->NextRevDepends = Pkg->RevDepends; Pkg->RevDepends = Dep.Index(); - // Link it to the version (at the end of the list) - unsigned long *Last = &Ver->DependsList; - for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++) - Last = &D->NextDepends; - Dep->NextDepends = *Last; - *Last = Dep.Index(); + /* Link it to the version (at the end of the list) + Caching the old end point speeds up generation substantially */ + static pkgCache::VerIterator OldVer(Cache); + static __apt_ptrloc *OldLast; + if (OldVer != Ver) + { + OldLast = &Ver->DependsList; + for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++) + OldLast = &D->NextDepends; + OldVer = Ver; + } + Dep->NextDepends = *OldLast; + *OldLast = Dep.Index(); + OldLast = &Dep->NextDepends; + return true; } /*}}}*/ @@ -280,6 +297,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator Ver, unsigned long Provides = Owner->Map.Allocate(sizeof(pkgCache::Provides)); if (Provides == 0) return false; + Cache.HeaderP->ProvidesCount++; // Fill it in pkgCache::PrvIterator Prv(Cache,Cache.ProvideP + Provides,Cache.PkgP); @@ -323,6 +341,7 @@ bool pkgCacheGenerator::SelectFile(string File,unsigned long Flags) CurrentFile->mtime = Buf.st_mtime; CurrentFile->NextFile = Cache.HeaderP->FileList; CurrentFile->Flags = Flags; + CurrentFile->ID = Cache.HeaderP->PackageFileCount; PkgFileName = File; Cache.HeaderP->FileList = CurrentFile - Cache.PkgFileP; Cache.HeaderP->PackageFileCount++; @@ -344,7 +363,7 @@ unsigned long pkgCacheGenerator::WriteUniqString(const char *S, // Search for an insertion point pkgCache::StringItem *I = Cache.StringItemP + Cache.HeaderP->StringList; int Res = 1; - unsigned long *Last = &Cache.HeaderP->StringList; + __apt_ptrloc *Last = &Cache.HeaderP->StringList; for (; I != Cache.StringItemP; Last = &I->NextItem, I = Cache.StringItemP + I->NextItem) { @@ -382,10 +401,25 @@ bool pkgSrcCacheCheck(pkgSourceList &List) { if (_error->PendingError() == true) return false; - - // Open the source package cache - string CacheFile = _config->FindDir("Dir::Cache::srcpkgcache"); + + string CacheFile = _config->FindFile("Dir::Cache::srcpkgcache"); string ListDir = _config->FindDir("Dir::State::lists"); + + // Count the number of missing files + int Missing = 0; + for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); I++) + { + string File = ListDir + URItoFileName(I->PackagesURI()); + struct stat Buf; + if (stat(File.c_str(),&Buf) != 0) + { + _error->WarningE("stat","Couldn't stat source package list '%s' (%s)", + I->PackagesInfo().c_str(),File.c_str()); + Missing++; + } + } + + // Open the source package cache if (FileExists(CacheFile) == false) return false; @@ -397,7 +431,7 @@ bool pkgSrcCacheCheck(pkgSourceList &List) } MMap Map(CacheF,MMap::Public | MMap::ReadOnly); - if (_error->PendingError() == true) + if (_error->PendingError() == true || Map.Size() == 0) { _error->Discard(); return false; @@ -410,20 +444,6 @@ bool pkgSrcCacheCheck(pkgSourceList &List) return false; } - // Count the number of missing files - int Missing = 0; - for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); I++) - { - string File = ListDir + URItoFileName(I->PackagesURI()); - struct stat Buf; - if (stat(File.c_str(),&Buf) != 0) - { - _error->WarningE("stat","Couldn't stat source package list '%s' (%s)", - I->PackagesInfo().c_str(),File.c_str()); - Missing++; - } - } - // They are certianly out of sync if (Cache.Head().PackageFileCount != List.size() - Missing) return false; @@ -472,7 +492,7 @@ bool pkgPkgCacheCheck(string CacheFile) } MMap Map(CacheF,MMap::Public | MMap::ReadOnly); - if (_error->PendingError() == true) + if (_error->PendingError() == true || Map.Size() == 0) { _error->Discard(); return false; @@ -485,10 +505,31 @@ bool pkgPkgCacheCheck(string CacheFile) return false; } + // Status files that must be in the cache + string Status[3]; + Status[0] = _config->FindFile("Dir::State::xstatus"); + Status[1]= _config->FindFile("Dir::State::userstatus"); + Status[2] = _config->FindFile("Dir::State::status"); + // Cheack each file for (pkgCache::PkgFileIterator F(Cache); F.end() == false; F++) + { if (F.IsOk() == false) return false; + + // See if this is one of the status files + for (int I = 0; I != 3; I++) + if (F.FileName() == Status[I]) + Status[I] = string(); + } + + // Make sure all the status files are loaded. + for (int I = 0; I != 3; I++) + { + if (Status[I].empty() == false && FileExists(Status[I]) == true) + return false; + } + return true; } /*}}}*/ @@ -498,9 +539,9 @@ bool pkgPkgCacheCheck(string CacheFile) static bool pkgAddSourcesSize(unsigned long &TotalSize) { // Grab the file names - string xstatus = _config->FindDir("Dir::State::xstatus"); - string userstatus = _config->FindDir("Dir::State::userstatus"); - string status = _config->FindDir("Dir::State::status"); + string xstatus = _config->FindFile("Dir::State::xstatus"); + string userstatus = _config->FindFile("Dir::State::userstatus"); + string status = _config->FindFile("Dir::State::status"); // Grab the sizes struct stat Buf; @@ -523,9 +564,9 @@ static bool pkgMergeStatus(OpProgress &Progress,pkgCacheGenerator &Gen, { // Grab the file names string Status[3]; - Status[0] = _config->FindDir("Dir::State::xstatus"); - Status[1]= _config->FindDir("Dir::State::userstatus"); - Status[2] = _config->FindDir("Dir::State::status"); + Status[0] = _config->FindFile("Dir::State::xstatus"); + Status[1]= _config->FindFile("Dir::State::userstatus"); + Status[2] = _config->FindFile("Dir::State::status"); for (int I = 0; I != 3; I++) { @@ -561,16 +602,15 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) { Progress.OverallProgress(0,1,1,"Reading Package Lists"); - string CacheFile = _config->FindDir("Dir::Cache::pkgcache"); + string CacheFile = _config->FindFile("Dir::Cache::pkgcache"); bool SrcOk = pkgSrcCacheCheck(List); - bool PkgOk = pkgPkgCacheCheck(CacheFile); + bool PkgOk = SrcOk && pkgPkgCacheCheck(CacheFile); // Rebuild the source and package caches if (SrcOk == false) { - string SCacheFile = _config->FindDir("Dir::Cache::srcpkgcache"); + string SCacheFile = _config->FindFile("Dir::Cache::srcpkgcache"); string ListDir = _config->FindDir("Dir::State::lists"); - FileFd SCacheF(SCacheFile,FileFd::WriteEmpty); FileFd CacheF(CacheFile,FileFd::WriteEmpty); DynamicMMap Map(CacheF,MMap::Public); @@ -598,8 +638,8 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); I++) { string File = ListDir + URItoFileName(I->PackagesURI()); - - if (stat(File.c_str(),&Buf) != 0) + + if (FileExists(File) == false) continue; FileFd Pkg(File,FileFd::ReadOnly); @@ -615,6 +655,16 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) if (Gen.MergeList(Parser) == false) return _error->Error("Problem with MergeList %s",File.c_str()); + + // Check the release file + string RFile = ListDir + URItoFileName(I->ReleaseURI()); + if (FileExists(RFile) == true) + { + FileFd Rel(RFile,FileFd::ReadOnly); + if (_error->PendingError() == true) + return false; + Parser.LoadReleaseInfo(Gen.GetCurFile(),Rel); + } } // Write the src cache @@ -634,7 +684,7 @@ bool pkgMakeStatusCache(pkgSourceList &List,OpProgress &Progress) } // We use the source cache to generate the package cache - string SCacheFile = _config->FindDir("Dir::Cache::srcpkgcache"); + string SCacheFile = _config->FindFile("Dir::Cache::srcpkgcache"); FileFd SCacheF(SCacheFile,FileFd::ReadOnly); FileFd CacheF(CacheFile,FileFd::WriteEmpty);