diff options
Diffstat (limited to 'apt-pkg/cachefile.cc')
-rw-r--r-- | apt-pkg/cachefile.cc | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/apt-pkg/cachefile.cc b/apt-pkg/cachefile.cc new file mode 100644 index 000000000..285eb310f --- /dev/null +++ b/apt-pkg/cachefile.cc @@ -0,0 +1,96 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: cachefile.cc,v 1.1 1999/04/18 06:36:36 jgg Exp $ +/* ###################################################################### + + CacheFile - Simple wrapper class for opening, generating and whatnot + + This class implements a simple 2 line mechanism to open various sorts + of caches. It can operate as root, as not root, show progress and so on, + it transparently handles everything necessary. + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#ifdef __GNUG__ +#pragma implementation "apt-pkg/cachefile.h" +#endif + +#include <apt-pkg/cachefile.h> +#include <apt-pkg/error.h> +#include <apt-pkg/sourcelist.h> +#include <apt-pkg/pkgcachegen.h> +#include <apt-pkg/configuration.h> + /*}}}*/ + +// CacheFile::CacheFile - Constructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgCacheFile::pkgCacheFile() : Map(0), Cache(0), Lock() +{ +} + /*}}}*/ +// CacheFile::~CacheFile - Destructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +pkgCacheFile::~pkgCacheFile() +{ + delete Cache; + delete Map; + delete Lock; +} + /*}}}*/ +// CacheFile::Open - Open the cache files, creating if necessary /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool pkgCacheFile::Open(OpProgress &Progress,bool WithLock) +{ + if (WithLock == true) + Lock = new pkgDpkgLock; + + if (_error->PendingError() == true) + return false; + + // Read the source list + pkgSourceList List; + if (List.ReadMainList() == false) + return _error->Error("The list of sources could not be read."); + + /* Build all of the caches, using the cache files if we are locking + (ie as root) */ + if (WithLock == true) + { + pkgMakeStatusCache(List,Progress); + Progress.Done(); + if (_error->PendingError() == true) + return _error->Error("The package lists or status file could not be parsed or opened."); + if (_error->empty() == false) + _error->Warning("You may want to run apt-get update to correct theses missing files"); + + // Open the cache file + FileFd File(_config->FindFile("Dir::Cache::pkgcache"),FileFd::ReadOnly); + if (_error->PendingError() == true) + return false; + + Map = new MMap(File,MMap::Public | MMap::ReadOnly); + if (_error->PendingError() == true) + return false; + } + else + { + Map = pkgMakeStatusCacheMem(List,Progress); + Progress.Done(); + if (Map == 0) + return false; + } + + // Create the dependency cache + Cache = new pkgDepCache(*Map,Progress); + if (_error->PendingError() == true) + return false; + + Progress.Done(); + + return true; +} + /*}}}*/ |