1 __all__ = ('BlockStorageMMap',)
6 from pyoram.storage.block_storage import \
7 BlockStorageTypeFactory
8 from pyoram.storage.block_storage_file import \
11 log = logging.getLogger("pyoram")
13 class _BlockStorageMemoryImpl(object):
15 This class implementents the BlockStorageInterface read/write
16 methods for classes with a private attribute _f that can be
17 accessed using __getslice__/__setslice__ notation.
20 def read_blocks(self, indices):
23 assert 0 <= i < self.block_count
24 self._bytes_received += self.block_size
25 pos_start = self._header_offset + i * self.block_size
26 pos_stop = pos_start + self.block_size
27 blocks.append(self._f[pos_start:pos_stop])
30 def yield_blocks(self, indices):
32 assert 0 <= i < self.block_count
33 self._bytes_received += self.block_size
34 pos_start = self._header_offset + i * self.block_size
35 pos_stop = pos_start + self.block_size
36 yield self._f[pos_start:pos_stop]
38 def read_block(self, i):
39 assert 0 <= i < self.block_count
40 self._bytes_received += self.block_size
41 pos_start = self._header_offset + i * self.block_size
42 pos_stop = pos_start + self.block_size
43 return self._f[pos_start:pos_stop]
45 def write_blocks(self, indices, blocks, callback=None):
46 for i, block in zip(indices, blocks):
47 assert 0 <= i < self.block_count
48 self._bytes_sent += self.block_size
49 pos_start = self._header_offset + i * self.block_size
50 pos_stop = pos_start + self.block_size
51 self._f[pos_start:pos_stop] = block
52 if callback is not None:
55 def write_block(self, i, block):
56 assert 0 <= i < self.block_count
57 self._bytes_sent += self.block_size
58 pos_start = self._header_offset + i * self.block_size
59 pos_stop = pos_start + self.block_size
60 self._f[pos_start:pos_stop] = block
62 class BlockStorageMMap(_BlockStorageMemoryImpl,
65 A class implementing the block storage interface by creating a
66 memory map over a local file. This class uses the same storage
67 format as BlockStorageFile. Thus, a block storage space can be
68 created using this class and then, after saving the raw storage
69 data to disk, reopened with any other class compatible with
70 BlockStorageFile (and visa versa).
73 def __init__(self, *args, **kwds):
74 mm = kwds.pop('mm', None)
75 self._mmap_owned = True
76 super(BlockStorageMMap, self).__init__(*args, **kwds)
79 mm = mmap.mmap(self._f.fileno(), 0)
81 self._mmap_owned = False
86 # Define BlockStorageInterface Methods
87 # (override what is defined on BlockStorageFile)
91 #def compute_storage_size(...)
93 def clone_device(self):
94 f = BlockStorageMMap(self.storage_name,
108 f = BlockStorageFile.setup(storage_name,
113 return BlockStorageMMap(storage_name)
115 #def update_header_data(...)
118 self._prep_for_close()
119 if self._f is not None:
123 except OSError: # pragma: no cover
124 pass # pragma: no cover
127 #def read_blocks(...)
129 #def yield_blocks(...)
133 #def write_blocks(...)
135 #def write_block(...)
141 #def bytes_received(...)
143 BlockStorageTypeFactory.register_device("mmap", BlockStorageMMap)