From 0d6568c23656c056af1ff46b9b8d63ff4e6be8ce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl>
Date: Fri, 9 Jul 2021 17:50:28 +0200
Subject: [PATCH] fixed bugs

---
 setup.cfg            |  2 +-
 tempsdb/varlen.pyx   | 19 +++++++++++++------
 tests/test_varlen.py | 11 ++++++++---
 3 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/setup.cfg b/setup.cfg
index a01c3e7..f57ca6c 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 3f4e1df..e92e495 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 f028b46..e458402 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):
-- 
GitLab