Source code for pocolog2msgpack.BufferedFileDecompressor

import msgpack
import zlib
from .FifoFileBuffer import FifoFileBuffer

[docs] class BufferedFileDecompressor: CHUNKSIZE = 32*1024 def __init__(self, path): #print("BufferedFileDecompressor.__init__({})".format(path)) self.fp = None self.path = "" self.dec = None self.dat = FifoFileBuffer() self.done = False self.seek_pos = 0 self.path = path self.dec = zlib.decompressobj() self.seek_pos = 0
[docs] def open(self): if not self.fp: self.fp = open(self.path, "rb") self.fp.seek(0)
[docs] def close(self): if self.fp: self.fp.close() self.fp = None
[docs] def read(self, n): while (self.dat.available < n and not self.done): buf = self.fp.read(self.CHUNKSIZE) if buf: decompressed_data = self.dec.decompress(buf) self.dat.write(decompressed_data) elif not self.done: self.done = True decompressed_data = self.dec.flush() self.dat.write(decompressed_data) self.seek_pos += min(self.dat.available, n) return self.dat.read(n)
[docs] def seek(self, n): if n < self.seek_pos: self.reset() while self.seek_pos < n: if self.done: raise IndexError("Target seek position beyond stream end.") self.read(min(n-self.seek_pos, self.CHUNKSIZE))
[docs] def reset(self): del self.dec self.dec = zlib.decompressobj() del self.dat self.dat = FifoFileBuffer() self.seek_pos = 0 self.done = False