X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/f55ece0eae40e44dca027528a6f11091279d72b3..e0c4f06387ade5761e644b5b96e41284c12da23c:/apt-pkg/pkgrecords.cc diff --git a/apt-pkg/pkgrecords.cc b/apt-pkg/pkgrecords.cc index b3105da44..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.1 1998/08/09 00:51:35 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,8 +13,11 @@ #pragma implementation "apt-pkg/pkgrecords.h" #endif #include -#include +#include #include +#include + +#include /*}}}*/ // Records::pkgRecords - Constructor /*{{{*/ @@ -22,17 +25,26 @@ /* This will create the necessary structures to access the status files */ pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0) { - Files = new PkgFile[Cache.HeaderP->PackageFileCount]; + Files = new Parser *[Cache.HeaderP->PackageFileCount]; + memset(Files,0,sizeof(*Files)*Cache.HeaderP->PackageFileCount); + for (pkgCache::PkgFileIterator I = Cache.FileBegin(); I.end() == false; I++) { - Files[I->ID].File = new FileFd(I.FileName(),FileFd::ReadOnly); - if (_error->PendingError() == true) + const pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(I.IndexType()); + if (Type == 0) + { + _error->Error(_("Index file type '%s' is not supported"),I.IndexType()); return; - 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 /*{{{*/ @@ -40,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]; } /*}}}*/