X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/3b5421b4c75f5c85b48cbb61bf22642ff52a6352..e0c4f06387ade5761e644b5b96e41284c12da23c:/apt-pkg/pkgrecords.cc diff --git a/apt-pkg/pkgrecords.cc b/apt-pkg/pkgrecords.cc index 59bc2a1bc..f62f945b5 100644 --- a/apt-pkg/pkgrecords.cc +++ b/apt-pkg/pkgrecords.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: pkgrecords.cc,v 1.3 1998/10/20 02:39:23 jgg Exp $ +// $Id: pkgrecords.cc,v 1.8 2003/09/02 04:52:16 mdz Exp $ /* ###################################################################### Package Records - Allows access to complete package description records @@ -13,9 +13,11 @@ #pragma implementation "apt-pkg/pkgrecords.h" #endif #include -#include +#include #include #include + +#include /*}}}*/ // Records::pkgRecords - Constructor /*{{{*/ @@ -23,29 +25,26 @@ /* This will create the necessary structures to access the status files */ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0) { - string ListDir = _config->FindFile("Dir::State::lists"); + Files = new Parser *[Cache.HeaderP->PackageFileCount]; + memset(Files,0,sizeof(*Files)*Cache.HeaderP->PackageFileCount); - Files = new PkgFile[Cache.HeaderP->PackageFileCount]; for (pkgCache::PkgFileIterator I = Cache.FileBegin(); I.end() == false; I++) { - // We can not initialize if the cache is out of sync. - if (I.IsOk() == false) + const pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(I.IndexType()); + if (Type == 0) { - _error->Error("Package file %s is out of sync.",I.FileName()); + _error->Error(_("Index file type '%s' is not supported"),I.IndexType()); return; } - - // Create the file - Files[I->ID].File = new FileFd(ListDir + I.FileName(),FileFd::ReadOnly); - if (_error->PendingError() == true) - return; - - // Create the parser - Files[I->ID].Parse = new debRecordParser(*Files[I->ID].File); - if (_error->PendingError() == true) + + Files[I->ID] = Type->CreatePkgParser(I); + if (Files[I->ID] == 0) return; } + // We store that to make sure that the destructor won't segfault, + // even if the Cache object was destructed before this instance. + PackageFileCount = Cache.HeaderP->PackageFileCount; } /*}}}*/ // Records::~pkgRecords - Destructor /*{{{*/ @@ -53,26 +52,26 @@ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0) /* */ pkgRecords::~pkgRecords() { + for (unsigned I = 0; I != PackageFileCount; I++) + delete Files[I]; delete [] Files; } /*}}}*/ // Records::Lookup - Get a parser for the package version file /*{{{*/ // --------------------------------------------------------------------- /* */ -pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator &Ver) -{ - PkgFile &File = Files[Ver.File()->ID]; - File.Parse->Jump(Ver); - - return *File.Parse; +pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator const &Ver) +{ + Files[Ver.File()->ID]->Jump(Ver); + return *Files[Ver.File()->ID]; } /*}}}*/ -// Records::Pkgfile::~PkgFile - Destructor /*{{{*/ +// Records::Lookup - Get a parser for the package description file /*{{{*/ // --------------------------------------------------------------------- /* */ -pkgRecords::PkgFile::~PkgFile() +pkgRecords::Parser &pkgRecords::Lookup(pkgCache::DescFileIterator const &Desc) { - delete Parse; - delete File; + Files[Desc.File()->ID]->Jump(Desc); + return *Files[Desc.File()->ID]; } /*}}}*/