Don't decompress blocks that we'll skip.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 3 Sep 2011 13:17:29 +0000 (14:17 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 3 Sep 2011 13:17:29 +0000 (14:17 +0100)
Should help when skipping very big blobs, but don't have such trace
handy now.

trace_snappyfile.cpp
trace_snappyfile.hpp

index ad3dc72..1794a82 100644 (file)
@@ -211,7 +211,7 @@ void SnappyFile::flushWriteCache()
     assert(m_cachePtr == m_cache);
 }
 
-void SnappyFile::flushReadCache()
+void SnappyFile::flushReadCache(size_t skipLength)
 {
     //assert(m_cachePtr == m_cache + m_cacheSize);
     m_currentOffset.chunk = m_stream.tellg();
@@ -223,8 +223,10 @@ void SnappyFile::flushReadCache()
         ::snappy::GetUncompressedLength(m_compressedCache, compressedLength,
                                         &m_cacheSize);
         createCache(m_cacheSize);
-        ::snappy::RawUncompress(m_compressedCache, compressedLength,
-                                m_cache);
+        if (skipLength < m_cacheSize) {
+            ::snappy::RawUncompress(m_compressedCache, compressedLength,
+                                    m_cache);
+        }
     } else {
         createCache(0);
     }
@@ -315,7 +317,7 @@ bool SnappyFile::rawSkip(size_t length)
             m_cachePtr += chunkSize;
             sizeToRead -= chunkSize;
             if (sizeToRead > 0) {
-                flushReadCache();
+                flushReadCache(sizeToRead);
             }
             if (!m_cacheSize) {
                 break;
index bfb3dff..469f29e 100644 (file)
@@ -84,7 +84,7 @@ private:
         return m_stream.eof() && freeCacheSize() == 0;
     }
     void flushWriteCache();
-    void flushReadCache();
+    void flushReadCache(size_t skipLength = 0);
     void createCache(size_t size);
     void writeCompressedLength(size_t length);
     size_t readCompressedLength();