]> git.phdru.name Git - m_lib.git/blob - m_lib/hash/zshelve.py
b9feb144f5ec0b5266d3be21643948f82fd42453
[m_lib.git] / m_lib / hash / zshelve.py
1 """Compressed shelves.
2 Author: Oleg Broytman <phd@phd.pp.ru>
3 Copyright (C) 2001-2003 PhiloSoft Design
4 License: Python"""
5
6
7 from shelve import DbfilenameShelf
8 from zlib import compress, decompress
9
10 try:
11    from cPickle import dumps, loads
12 except ImportError:
13    from Pickle import dumps, loads
14
15
16 class CompressedShelf(DbfilenameShelf):
17     """Shelf implementation using zlib for compressing data."""
18
19     compress_level = 6 # default compression
20
21     def __getitem__(self, key):
22         return loads(decompress(self.dict[key]))
23
24     def __setitem__(self, key, value):
25         self.dict[key] = compress(dumps(value), self.compress_level)
26
27
28 class CompressedKeysShelf(CompressedShelf):
29     """CompressedShelf implementation that also compresses keys."""
30
31     def keys(self):
32         _keys = []
33         for key in self.dict.keys():
34             _keys.append(decompress(key))
35         return _keys
36
37     def has_key(self, key):
38         return self.dict.has_key(compress(key, self.compress_level))
39
40     def __getitem__(self, key):
41         return CompressedShelf.__getitem__(self, compress(key, self.compress_level))
42
43     def __setitem__(self, key, value):
44         CompressedShelf.__setitem__(self, compress(key, self.compress_level), value)
45
46     def __delitem__(self, key):
47         del self.dict[compress(key, self.compress_level)]