Browse Source

refactor to make OpenFile/OpenDebFile more robust

tags/debian/1.0.4
Michael Vogt 7 years ago
parent
commit
215b0faf7b
1 changed files with 110 additions and 120 deletions
  1. +110
    -120
      ftparchive/cachedb.cc

+ 110
- 120
ftparchive/cachedb.cc View File

@@ -97,64 +97,92 @@ bool CacheDB::ReadyDB(std::string const &DB)
/* */
bool CacheDB::OpenFile()
{
Fd = new FileFd(FileName,FileFd::ReadOnly);
if (_error->PendingError() == true)
{
CloseFile();
return false;
}
return true;
// its open already
if(Fd && Fd->Name() == this->FileName)
return true;

// a different file is open, close it first
if(Fd && Fd->Name() != this->FileName)
CloseFile();

// open a new file
Fd = new FileFd(FileName,FileFd::ReadOnly);
if (_error->PendingError() == true)
{
CloseFile();
return false;
}
return true;
}
/*}}}*/
// CacheDB::CloseFile - Close the file /*{{{*/
void CacheDB::CloseFile()
{
delete Fd;
Fd = NULL;
if(Fd != NULL)
{
delete Fd;
Fd = NULL;
}
}

/*}}}*/
// CacheDB::OpenDebFile - Open a debfile /*{{{*/
bool CacheDB::OpenDebFile()
{
// debfile is already open
if(DebFile && &DebFile->GetFile() == Fd)
return true;

// a different debfile is open, close it first
if(DebFile && &DebFile->GetFile() != Fd)
CloseDebFile();

// first open the fd, then pass it to the debDebFile
if(OpenFile() == false)
return false;
DebFile = new debDebFile(*Fd);
if (_error->PendingError() == true)
return false;
return true;
}

/*}}}*/
// CacheDB::CloseDebFile - Close a debfile again /*{{{*/
void CacheDB::CloseDebFile()
{
delete DebFile;
DebFile = NULL;
}
CloseFile();

if(DebFile != NULL)
{
delete DebFile;
DebFile = NULL;
}
}
/*}}}*/
// CacheDB::GetFileStat - Get stats from the file /*{{{*/
// ---------------------------------------------------------------------
/* This gets the size from the database if it's there. If we need
* to look at the file, also get the mtime from the file. */
bool CacheDB::GetFileStat(bool const &doStat)
{
if ((CurStat.Flags & FlSize) == FlSize && doStat == false)
{
/* Already worked out the file size */
}
else
{
/* Get it from the file. */
if (Fd == NULL && OpenFile() == false)
{
return false;
}
// Stat the file
struct stat St;
if (fstat(Fd->Fd(),&St) != 0)
{
return _error->Errno("fstat",
_("Failed to stat %s"),FileName.c_str());
}
CurStat.FileSize = St.st_size;
CurStat.mtime = htonl(St.st_mtime);
CurStat.Flags |= FlSize;
}
return true;
if ((CurStat.Flags & FlSize) == FlSize && doStat == false)
return true;

/* Get it from the file. */
if (OpenFile() == false)
return false;
// Stat the file
struct stat St;
if (fstat(Fd->Fd(),&St) != 0)
{
CloseFile();
return _error->Errno("fstat",
_("Failed to stat %s"),FileName.c_str());
}
CurStat.FileSize = St.st_size;
CurStat.mtime = htonl(St.st_mtime);
CurStat.Flags |= FlSize;
return true;
}
/*}}}*/
// CacheDB::GetCurStat - Set the CurStat variable. /*{{{*/
@@ -165,25 +193,25 @@ bool CacheDB::GetCurStat()
{
memset(&CurStat,0,sizeof(CurStat));
if (DBLoaded)
{
/* First see if there is anything about it
in the database */
/* Get the flags (and mtime) */
InitQuery("st");
// Ensure alignment of the returned structure
Data.data = &CurStat;
Data.ulen = sizeof(CurStat);
Data.flags = DB_DBT_USERMEM;
if (Get() == false)
if (DBLoaded)
{
/* First see if there is anything about it
in the database */
/* Get the flags (and mtime) */
InitQuery("st");
// Ensure alignment of the returned structure
Data.data = &CurStat;
Data.ulen = sizeof(CurStat);
Data.flags = DB_DBT_USERMEM;
if (Get() == false)
{
CurStat.Flags = 0;
}
CurStat.Flags = ntohl(CurStat.Flags);
CurStat.FileSize = ntohl(CurStat.FileSize);
CurStat.Flags = ntohl(CurStat.Flags);
CurStat.FileSize = ntohl(CurStat.FileSize);
}
return true;
return true;
}
/*}}}*/
// CacheDB::GetFileInfo - Get all the info about the file /*{{{*/
@@ -200,40 +228,31 @@ bool CacheDB::GetFileInfo(std::string const &FileName, bool const &DoControl,
this->FileName = FileName;

if (GetCurStat() == false)
{
return false;
}
OldStat = CurStat;

if (GetFileStat(checkMtime) == false)
{
CloseFile();
return false;
}

/* if mtime changed, update CurStat from disk */
if (checkMtime == true && OldStat.mtime != CurStat.mtime)
CurStat.Flags = FlSize;

Stats.Bytes += CurStat.FileSize;
Stats.Packages++;

if ((DoControl && LoadControl() == false)
|| (DoContents && LoadContents(GenContentsOnly) == false)
|| (DoSource && LoadSource() == false)
|| (DoMD5 && GetMD5(false) == false)
|| (DoSHA1 && GetSHA1(false) == false)
|| (DoSHA256 && GetSHA256(false) == false)
|| (DoSHA512 && GetSHA512(false) == false)
)
{
result = false;
}
CloseFile();
CloseDebFile();
/* if mtime changed, update CurStat from disk */
if (checkMtime == true && OldStat.mtime != CurStat.mtime)
CurStat.Flags = FlSize;

Stats.Bytes += CurStat.FileSize;
Stats.Packages++;

if ((DoControl && LoadControl() == false)
|| (DoContents && LoadContents(GenContentsOnly) == false)
|| (DoSource && LoadSource() == false)
|| (DoMD5 && GetMD5(false) == false)
|| (DoSHA1 && GetSHA1(false) == false)
|| (DoSHA256 && GetSHA256(false) == false)
|| (DoSHA512 && GetSHA512(false) == false) )
{
result = false;
}
return result;
return result;
}
/*}}}*/

@@ -249,18 +268,9 @@ bool CacheDB::LoadSource()
CurStat.Flags &= ~FlSource;
}
if (Fd == NULL && OpenFile() == false)
{
if (OpenFile() == false)
return false;
}

// Read the .dsc file
if (Fd == NULL)
{
if(OpenFile() == false)
return false;
}
Stats.Misses++;
if (Dsc.Read(FileName) == false)
return false;
@@ -291,16 +301,8 @@ bool CacheDB::LoadControl()
CurStat.Flags &= ~FlControl;
}
if (Fd == NULL && OpenFile() == false)
{
if(OpenDebFile() == false)
return false;
}
// Create a deb instance to read the archive
if (DebFile == NULL)
{
if(OpenDebFile() == false)
return false;
}
Stats.Misses++;
if (Control.Read(*DebFile) == false)
@@ -338,16 +340,8 @@ bool CacheDB::LoadContents(bool const &GenOnly)
CurStat.Flags &= ~FlContents;
}
if (Fd == NULL && OpenFile() == false)
{
if(OpenDebFile() == false)
return false;
}
// Create a deb instance to read the archive
if (DebFile == 0)
{
if(OpenDebFile() == false)
return false;
}

Stats.Misses++;
if (Contents.Read(*DebFile) == false)
@@ -404,14 +398,13 @@ bool CacheDB::GetMD5(bool const &GenOnly)
MD5Res = bytes2hex(CurStat.MD5, sizeof(CurStat.MD5));
return true;
}
}
Stats.MD5Bytes += CurStat.FileSize;
if (Fd == NULL && OpenFile() == false)
{
if (OpenFile() == false)
return false;
}
MD5Summation MD5;
if (Fd->Seek(0) == false || MD5.AddFD(*Fd, CurStat.FileSize) == false)
return false;
@@ -439,10 +432,9 @@ bool CacheDB::GetSHA1(bool const &GenOnly)
Stats.SHA1Bytes += CurStat.FileSize;
if (Fd == NULL && OpenFile() == false)
{
if (OpenFile() == false)
return false;
}
SHA1Summation SHA1;
if (Fd->Seek(0) == false || SHA1.AddFD(*Fd, CurStat.FileSize) == false)
return false;
@@ -470,10 +462,9 @@ bool CacheDB::GetSHA256(bool const &GenOnly)
Stats.SHA256Bytes += CurStat.FileSize;
if (Fd == NULL && OpenFile() == false)
{
if (OpenFile() == false)
return false;
}
SHA256Summation SHA256;
if (Fd->Seek(0) == false || SHA256.AddFD(*Fd, CurStat.FileSize) == false)
return false;
@@ -501,10 +492,9 @@ bool CacheDB::GetSHA512(bool const &GenOnly)
Stats.SHA512Bytes += CurStat.FileSize;
if (Fd == NULL && OpenFile() == false)
{
if (OpenFile() == false)
return false;
}
SHA512Summation SHA512;
if (Fd->Seek(0) == false || SHA512.AddFD(*Fd, CurStat.FileSize) == false)
return false;


Loading…
Cancel
Save