]> git.saurik.com Git - apt.git/blobdiff - ftparchive/cachedb.cc
merged from lp:~mvo/apt/mvo
[apt.git] / ftparchive / cachedb.cc
index e02f0e1b6dd93b11de51a6093528030454466018..7e4c2e9fec82320baa16ea2739ff6e553dd2412f 100644 (file)
@@ -16,7 +16,7 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/md5.h>
 #include <apt-pkg/sha1.h>
-#include <apt-pkg/sha256.h>
+#include <apt-pkg/sha2.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/configuration.h>
     
@@ -26,7 +26,7 @@
 // CacheDB::ReadyDB - Ready the DB2                                    /*{{{*/
 // ---------------------------------------------------------------------
 /* This opens the DB2 file for caching package information */
-bool CacheDB::ReadyDB(string DB)
+bool CacheDB::ReadyDB(string const &DB)
 {
    int err;
 
@@ -102,9 +102,9 @@ bool CacheDB::OpenFile()
 // ---------------------------------------------------------------------
 /* 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 CacheDB::GetFileStat(bool const &doStat)
 {
-       if ((CurStat.Flags & FlSize) == FlSize)
+       if ((CurStat.Flags & FlSize) == FlSize && doStat == false)
        {
                /* Already worked out the file size */
        }
@@ -160,9 +160,10 @@ bool CacheDB::GetCurStat()
                                                                        /*}}}*/
 // CacheDB::GetFileInfo - Get all the info about the file              /*{{{*/
 // ---------------------------------------------------------------------
-bool CacheDB::GetFileInfo(string FileName, bool DoControl, bool DoContents,
-                               bool GenContentsOnly, 
-                               bool DoMD5, bool DoSHA1, bool DoSHA256)
+bool CacheDB::GetFileInfo(string const &FileName, bool const &DoControl, bool const &DoContents,
+                               bool const &GenContentsOnly, bool const &DoMD5, bool const &DoSHA1,
+                               bool const &DoSHA256,   bool const &DoSHA512, 
+                          bool const &checkMtime)
 {
        this->FileName = FileName;
 
@@ -171,14 +172,18 @@ bool CacheDB::GetFileInfo(string FileName, bool DoControl, bool DoContents,
                return false;
    }   
    OldStat = CurStat;
-       
-       if (GetFileStat() == false)
+
+       if (GetFileStat(checkMtime) == false)
        {
                delete Fd;
                Fd = NULL;
                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++;
 
@@ -186,7 +191,9 @@ bool CacheDB::GetFileInfo(string FileName, bool DoControl, bool DoContents,
                || (DoContents && LoadContents(GenContentsOnly) == false)
                || (DoMD5 && GetMD5(false) == false)
                || (DoSHA1 && GetSHA1(false) == false)
-               || (DoSHA256 && GetSHA256(false) == false))
+               || (DoSHA256 && GetSHA256(false) == false)
+               || (DoSHA512 && GetSHA512(false) == false)
+           )
        {
                delete Fd;
                Fd = NULL;
@@ -247,7 +254,7 @@ bool CacheDB::LoadControl()
 // CacheDB::LoadContents - Load the File Listing                       /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool CacheDB::LoadContents(bool GenOnly)
+bool CacheDB::LoadContents(bool const &GenOnly)
 {
    // Try to read the control information out of the DB.
    if ((CurStat.Flags & FlContents) == FlContents)
@@ -297,7 +304,7 @@ static string bytes2hex(uint8_t *bytes, size_t length) {
    return string(space);
 }
 
-static inline unsigned char xdig2num(char dig) {
+static inline unsigned char xdig2num(char const &dig) {
    if (isdigit(dig)) return dig - '0';
    if ('a' <= dig && dig <= 'f') return dig - 'a' + 10;
    if ('A' <= dig && dig <= 'F') return dig - 'A' + 10;
@@ -318,7 +325,7 @@ static void hex2bytes(uint8_t *bytes, const char *hex, int length) {
 // CacheDB::GetMD5 - Get the MD5 hash                                  /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool CacheDB::GetMD5(bool GenOnly)
+bool CacheDB::GetMD5(bool const &GenOnly)
 {
    // Try to read the control information out of the DB.
    if ((CurStat.Flags & FlMD5) == FlMD5)
@@ -349,7 +356,7 @@ bool CacheDB::GetMD5(bool GenOnly)
 // CacheDB::GetSHA1 - Get the SHA1 hash                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool CacheDB::GetSHA1(bool GenOnly)
+bool CacheDB::GetSHA1(bool const &GenOnly)
 {
    // Try to read the control information out of the DB.
    if ((CurStat.Flags & FlSHA1) == FlSHA1)
@@ -380,7 +387,7 @@ bool CacheDB::GetSHA1(bool GenOnly)
 // CacheDB::GetSHA256 - Get the SHA256 hash                            /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-bool CacheDB::GetSHA256(bool GenOnly)
+bool CacheDB::GetSHA256(bool const &GenOnly)
 {
    // Try to read the control information out of the DB.
    if ((CurStat.Flags & FlSHA256) == FlSHA256)
@@ -408,6 +415,37 @@ bool CacheDB::GetSHA256(bool GenOnly)
    return true;
 }
                                                                        /*}}}*/
+// CacheDB::GetSHA256 - Get the SHA256 hash                            /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool CacheDB::GetSHA512(bool const &GenOnly)
+{
+   // Try to read the control information out of the DB.
+   if ((CurStat.Flags & FlSHA512) == FlSHA512)
+   {
+      if (GenOnly == true)
+        return true;
+
+      SHA512Res = bytes2hex(CurStat.SHA512, sizeof(CurStat.SHA512));
+      return true;
+   }
+   
+   Stats.SHA512Bytes += CurStat.FileSize;
+        
+   if (Fd == NULL && OpenFile() == false)
+   {
+      return false;
+   }
+   SHA512Summation SHA512;
+   if (Fd->Seek(0) == false || SHA512.AddFD(Fd->Fd(),CurStat.FileSize) == false)
+      return false;
+   
+   SHA512Res = SHA512.Result();
+   hex2bytes(CurStat.SHA512, SHA512Res.data(), sizeof(CurStat.SHA512));
+   CurStat.Flags |= FlSHA512;
+   return true;
+}
+                                                                       /*}}}*/
 // CacheDB::Finish - Write back the cache structure                    /*{{{*/
 // ---------------------------------------------------------------------
 /* */