diff --git a/setup.cfg b/setup.cfg index a01c3e7276af6cf1eca10f89972368ed177caea6..f57ca6c58e8e36e72b04da020cb7a294318ef8cb 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ # coding: utf-8 [metadata] name = tempsdb -version = 0.6.4a8 +version = 0.6.4rc1 long-description = file: README.md long-description-content-type = text/markdown; charset=UTF-8 license_files = LICENSE diff --git a/tempsdb/varlen.pyx b/tempsdb/varlen.pyx index 3f4e1df507991fed4965247870348cf702d11358..e92e495d6979ea864793fd5566a45be9cbffee65 100644 --- a/tempsdb/varlen.pyx +++ b/tempsdb/varlen.pyx @@ -83,7 +83,6 @@ cdef class VarlenEntry: else: if len_v > self.length(): return False - cdef bytes b = self.slice(self.len-len_v, self.len) return b == v @@ -183,7 +182,7 @@ cdef class VarlenEntry: int segment = 0 int pointer = 0 int next_chunk_len - int start_reading_at + int start_reading_at = 0 # Track down the right segment to start the read while pointer < start: @@ -196,13 +195,17 @@ cdef class VarlenEntry: cdef: int write_pointer = 0 - int chunk_len = self.parent.get_length_for(segment) + int chunk_len = self.parent.get_length_for(segment) - start_reading_at int len_to_read = self.parent.get_length_for(segment) - start_reading_at Chunk chunk = self.chunks[segment] bytes temp_data - int offset = self.parent.size_field + int offset = start_reading_at + + if segment == 0: + offset += self.parent.size_field while write_pointer < length: + if chunk_len-start_reading_at >= + (length - write_pointer): # We have all the data that we require try: @@ -214,15 +217,19 @@ cdef class VarlenEntry: b[write_pointer:length] = temp_data return bytes(b) - if chunk_len > length - write_pointer: - chunk_len = length - write_pointer try: temp_data = chunk.get_slice_of_piece_at(self.item_no[segment], offset, offset+chunk_len) except IndexError: raise ValueError('Invalid indices') + b[write_pointer:write_pointer+chunk_len] = temp_data write_pointer += chunk_len segment += 1 + try: + chunk = self.chunks[segment] + except IndexError: + raise ValueError('Invalid indices') + chunk_len = self.parent.get_length_for(segment) start_reading_at = 0 offset = 0 return bytes(b) diff --git a/tests/test_varlen.py b/tests/test_varlen.py index f028b46de9693bf16be925f8fafde7a055de50ae..e458402fc5b496aefeb5ddd636bd83516e4f60e6 100644 --- a/tests/test_varlen.py +++ b/tests/test_varlen.py @@ -35,11 +35,11 @@ class TestVarlen(unittest.TestCase): ve = iterator.get_next() while ve is not None: self.assertTrue(ve.startswith(b'test ')) - # self.assertTrue(ve.endswith(b'skarabeusza')) + self.assertTrue(ve.endswith(b'skarabeusza')) self.assertEqual(ve.get_byte_at(3), ord('t')) self.assertFalse(ve.startswith(b'tost')) self.assertTrue(ve.slice(0, 4), b'test') - # self.assertFalse(ve.endswith(b'skerabeusza')) + self.assertFalse(ve.endswith(b'skerabeusza')) self.assertGreater(ve, b'tes') self.assertLess(ve, b'tez') self.assertGreaterEqual(ve, b'tes') @@ -47,7 +47,12 @@ class TestVarlen(unittest.TestCase): self.assertLessEqual(ve, b'tez') hash(ve) self.assertNotEqual(ve, b'test') - + self.assertTrue(ve.startswith(b'test ')) + self.assertTrue(ve.endswith(b'skarabeusza')) + self.assertEqual(ve.get_byte_at(3), ord('t')) + self.assertFalse(ve.startswith(b'tost')) + self.assertTrue(ve.slice(0, 4), b'test') + self.assertFalse(ve.endswith(b'skerabeusza')) ve = iterator.get_next() def test_varlen_gzip(self):