b39031b5c69ba6e0e4036dd4a014592db356b63d
[apt.git] / apt-pkg / pkgrecords.cc
1 // -*- mode: cpp; mode: fold -*-
2 // Description                                                          /*{{{*/
3 // $Id: pkgrecords.cc,v 1.8 2003/09/02 04:52:16 mdz Exp $
4 /* ######################################################################
5    
6    Package Records - Allows access to complete package description records
7                      directly from the file.
8      
9    ##################################################################### */
10                                                                         /*}}}*/
11 // Include Files                                                        /*{{{*/
12 #ifdef __GNUG__
13 #pragma implementation "apt-pkg/pkgrecords.h"
14 #endif
15 #include <apt-pkg/pkgrecords.h>
16 #include <apt-pkg/indexfile.h>
17 #include <apt-pkg/error.h>
18 #include <apt-pkg/configuration.h>
19     
20 #include <apti18n.h>   
21                                                                         /*}}}*/
22
23 // Records::pkgRecords - Constructor                                    /*{{{*/
24 // ---------------------------------------------------------------------
25 /* This will create the necessary structures to access the status files */
26 pkgRecords::pkgRecords(pkgCache &Cache) : Cache(Cache), Files(0)
27 {
28    Files = new Parser *[Cache.HeaderP->PackageFileCount];
29    memset(Files,0,sizeof(*Files)*Cache.HeaderP->PackageFileCount);
30    
31    for (pkgCache::PkgFileIterator I = Cache.FileBegin(); 
32         I.end() == false; I++)
33    {
34       const pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(I.IndexType());
35       if (Type == 0)
36       {
37          _error->Error(_("Index file type '%s' is not supported"),I.IndexType());
38          return;
39       }
40
41       Files[I->ID] = Type->CreatePkgParser(I);
42       if (Files[I->ID] == 0)
43          return;
44    }   
45    
46    // CNC:2002-11-28
47    // We store that to make sure that the destructor won't segfault,
48    // even if the Cache object was destructed before this instance.
49    PackageFileCount = Cache.HeaderP->PackageFileCount;
50 }
51                                                                         /*}}}*/
52 // Records::~pkgRecords - Destructor                                    /*{{{*/
53 // ---------------------------------------------------------------------
54 /* */
55 pkgRecords::~pkgRecords()
56 {
57    // CNC:2002-11-28
58    // See comments above.
59    for (unsigned I = 0; I != PackageFileCount; I++)
60       delete Files[I];
61    delete [] Files;
62 }
63                                                                         /*}}}*/
64 // Records::Lookup - Get a parser for the package version file          /*{{{*/
65 // ---------------------------------------------------------------------
66 /* */
67 pkgRecords::Parser &pkgRecords::Lookup(pkgCache::VerFileIterator const &Ver)
68 {
69    Files[Ver.File()->ID]->Jump(Ver);
70    return *Files[Ver.File()->ID];
71 }
72                                                                         /*}}}*/