Beispiel #1
0
 def test_c(self):
     f = File()
     s = Shelf(f)
     f.seek(0)
     p = Shelf(f)
     f.seek(0)
     q = Shelf(f)
Beispiel #2
0
 def __init__(self, file=None, items=None, repair=False, readonly=False):
     """(File:str:None, [(str:str)], boolean)
     """
     if file is None:
         file = File()
         assert not readonly
         assert not repair
     elif not hasattr(file, 'seek'):
         file = File(file, readonly=readonly)
     if not readonly:
         file.obtain_lock()
     file.seek(0, 2)  # seek end
     if file.tell() == 0:
         # The file is empty.
         for result in self.generate_shelf(file=file, items=items or []):
             pass
     else:
         assert items is None
     # The file is not empty.
     assert self.has_format(file)
     self.file = file
     self.file.seek(len(self.prefix))
     n = read_int8(self.file)  # bytes in first transaction
     self.file.seek(self.file.tell() + n)
     self.offset_map = OffsetMap(self.file)
     # Initialize the memory index.
     self.memory_index = {}
     while True:
         transaction_offsets = read_transaction_offsets(self.file,
                                                        repair=repair)
         if transaction_offsets is None:
             break
         self.memory_index.update(transaction_offsets)
     self.file.seek_end()
     self.unused_name_generator = None
Beispiel #3
0
 def __init__(self, file=None, items=None, repair=False, readonly=False):
     """(File:str:None, [(str:str)], boolean)
     """
     if file is None:
         file = File()
         assert not readonly
         assert not repair
     elif not hasattr(file, 'seek'):
         file = File(file, readonly=readonly)
     if not readonly:
         file.obtain_lock()
     file.seek(0, 2) # seek end
     if file.tell() == 0:
         # The file is empty.
         for result in self.generate_shelf(file=file, items=items or []):
             pass
     else:
         assert items is None
     # The file is not empty.
     assert self.has_format(file)
     self.file = file
     self.file.seek(len(self.prefix))
     n = read_int8(self.file) # bytes in first transaction
     self.file.seek(self.file.tell() + n)
     self.offset_map = OffsetMap(self.file)
     # Initialize the memory index.
     self.memory_index = {}
     while True:
         transaction_offsets = read_transaction_offsets(
             self.file, repair=repair)
         if transaction_offsets is None:
             break
         self.memory_index.update(transaction_offsets)
     self.file.seek_end()
     self.unused_name_generator = None
Beispiel #4
0
 def c(self):
     f = File()
     s = Shelf(f)
     f.seek(0)
     p = Shelf(f)
     f.seek(0)
     q = Shelf(f)
Beispiel #5
0
 def _packer(self):
     name = self.fp.get_name()
     prepack_name = name + '.prepack'
     pack_name = name + '.pack'
     packed = File(pack_name)
     if len(packed) > 0:
         # packed contains data left from an incomplete pack attempt.
         packed.seek(0)
         packed.truncate()
     self._write_header(packed)
     # find all reachable objects.  Note that when we yield, new
     # commits may happen and pack_extra will contain new or modified
     # OIDs.
     index = {}
     def gen_reachable_records():
         # we order the todo queue by file offset. The hope is that the
         # packed file will be mostly the same as the old file in order
         # to speed up the rsync delta process.
         default_rank = 2**64
         pack_todo = [(0, durus.connection.ROOT_OID)]
         while pack_todo or self.pack_extra:
             if self.pack_extra:
                 oid = self.pack_extra.pop()
                 # note we don't check 'index' because it could be an
                 # object that got updated since the pack began and in
                 # that case we have to write the new record to the pack
                 # file
             else:
                 rank, oid = heapq.heappop(pack_todo)
                 if oid in index:
                     # we already wrote this object record
                     continue
             record = self.load(oid)
             oid2, data, refdata = unpack_record(record)
             assert oid == oid2
             # ensure we have records for objects referenced
             for ref_oid in split_oids(refdata):
                 item = (self.index.get(ref_oid, default_rank), ref_oid)
                 heapq.heappush(pack_todo, item)
             yield (oid, record)
     for z in self._write_transaction(
         packed, gen_reachable_records(), index):
         yield None # incremental pack, allow clients to be served
     self._write_index(packed, index)
     packed.flush()
     packed.fsync()
     if self.fp.is_temporary():
         self.fp.close()
     else:
         self.fp.rename(prepack_name)
     packed.rename(name)
     self.fp = packed
     for oid in self.index:
         if oid not in index:
             self.invalid.add(oid)
     self.index = index
     self.pack_extra = None
Beispiel #6
0
 def test_a(self):
     f = File()
     s = Shelf(f)
     name1 = s.next_name()
     name2 = s.next_name()
     assert name1 != name2
     r = s.store([(name1, name1 + name1), (name2, name2 + name2)])
     assert s.get_value(name1) == name1 + name1, (name1, s.get_value(name1))
     assert s.get_value(name2) == name2 + name2
     f.seek(0)
     other = Shelf(f)
     names = sorted(other.__iter__())
     index = sorted(other.iterindex())
     items = sorted(other.items())
     assert names == [name1, name2], (name1, name2, names)
     assert items == [(n, n+n) for n in names]
     assert index == [(n, other.get_position(n)) for n in names]
Beispiel #7
0
 def a(self):
     f = File()
     s = Shelf(f)
     name1 = s.next_name()
     name2 = s.next_name()
     assert name1 != name2
     r = s.store([(name1, name1 + name1), (name2, name2 + name2)])
     assert s.get_value(name1) == name1 + name1, (name1, s.get_value(name1))
     assert s.get_value(name2) == name2 + name2
     f.seek(0)
     other = Shelf(f)
     names = sorted(other.__iter__())
     index = sorted(other.iterindex())
     items = sorted(other.items())
     assert names == [name1, name2], (name1, name2, names)
     assert items == [(n, n+n) for n in names]
     assert index == [(n, other.get_position(n)) for n in names]
Beispiel #8
0
 def a(self):
     f = File()
     f.rename(f.get_name())
     assert f.is_temporary()
     raises(AssertionError, f.rename, f.get_name() + '.renamed')
     test_name = f.get_name() + '.test'
     assert not exists(test_name)
     tmp = open(test_name, 'w+b')
     tmp.close()
     g = File(test_name)
     assert not g.is_temporary()
     g.rename(g.get_name() + '.renamed')
     assert g.get_name() == test_name + '.renamed'
     f.write(as_bytes('abc'))
     f.seek(0)
     assert len(f) == 3
     assert as_bytes('a') == f.read(1)
     assert as_bytes('bc') == f.read()
     f.close()
     assert not exists(f.get_name())
     raises(OSError, f.__len__) # tmpfile removed on close
     h = File(g.get_name())
     g.write(as_bytes('a'))
     g.seek(0)
     assert g.tell() == 0
     g.seek_end()
     assert g.tell() == 1
     assert g.has_lock
     assert not h.has_lock
     raises(IOError, h.write, as_bytes('b'))
     g.flush()
     g.fsync()
     g.seek(0)
     g.truncate()
     g.close()
     h.close()
     unlink(g.get_name())
Beispiel #9
0
 def a(self):
     f = File()
     f.rename(f.get_name())
     assert f.is_temporary()
     raises(AssertionError, f.rename, f.get_name() + '.renamed')
     test_name = f.get_name() + '.test'
     assert not exists(test_name)
     tmp = open(test_name, 'w+b')
     tmp.close()
     g = File(test_name)
     assert not g.is_temporary()
     g.rename(g.get_name() + '.renamed')
     assert g.get_name() == test_name + '.renamed'
     f.write(as_bytes('abc'))
     f.seek(0)
     assert len(f) == 3
     assert as_bytes('a') == f.read(1)
     assert as_bytes('bc') == f.read()
     f.close()
     assert not exists(f.get_name())
     raises(OSError, f.__len__)  # tmpfile removed on close
     h = File(g.get_name())
     g.write(as_bytes('a'))
     g.seek(0)
     assert g.tell() == 0
     g.seek_end()
     assert g.tell() == 1
     assert g.has_lock
     assert not h.has_lock
     raises(IOError, h.write, as_bytes('b'))
     g.flush()
     g.fsync()
     g.seek(0)
     g.truncate()
     g.close()
     h.close()
     unlink(g.get_name())
Beispiel #10
0
 def c(self):
     file = File()
     int_array = IntArray(file=file, number_of_ints=0, maximum_int=0)
     file.seek(0)
     int_array2 = IntArray(file=file)
Beispiel #11
0
 def b(self):
     file = File()
     int_array = IntArray(file=file, number_of_ints=10, maximum_int=10)
     file.seek(0)
     int_array2 = IntArray(file=file)
     assert len(int_array2) == 10
Beispiel #12
0
 def d(self):
     file = File()
     word_array = WordArray(file=file, number_of_words=1, bytes_per_word=8)
     file.seek(0)
     word_array2 = WordArray(file=file, number_of_words=1, bytes_per_word=8)