From 948e917b6e433f0a06d8442fdac775b5d2e3f831 Mon Sep 17 00:00:00 2001 From: Daniel Lundin Date: Fri, 5 Feb 2010 11:27:22 +0100 Subject: [PATCH] GridFS Issue: Account for buffer size when calculating chunk number. --- gridfs/grid_file.py | 2 +- test/test_grid_file.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletions(-) diff --git a/gridfs/grid_file.py b/gridfs/grid_file.py index 5ba81a0..0ab1631 100644 --- a/gridfs/grid_file.py +++ b/gridfs/grid_file.py @@ -306,7 +306,7 @@ class GridFile(object): size = remainder bytes = self.__buffer - chunk_number = math.floor(self.__position / self.__chunk_size) + chunk_number = (len(bytes) + self.__position) / self.__chunk_size while len(bytes) < size: chunk = self.__collection.chunks.find_one({"files_id": self.__id, "n": chunk_number}) diff --git a/test/test_grid_file.py b/test/test_grid_file.py index 867aa00..40026c7 100644 --- a/test/test_grid_file.py +++ b/test/test_grid_file.py @@ -313,6 +313,26 @@ class TestGridFile(unittest.TestCase): qcheck.check_unittest(self, helper, qcheck.gen_string(qcheck.gen_range(0, 20))) + def test_read_chunks_unaligned_buffer_size(self): + self.db.fs.files.remove({}) + self.db.fs.chunks.remove({}) + + in_data = "This is a text that doesn't quite fit in a single 16-byte chunk." + f = GridFile({"filename":"test", "chunkSize":16}, self.db, "w") + f.write(in_data) + f.close() + + f = GridFile({"filename":"test"}, self.db) + out_data = '' + while 1: + s = f.read(13) + if not s: + break + out_data += s + f.close() + + self.assertEqual(in_data, out_data) + def test_seek(self): self.db.fs.files.remove({}) self.db.fs.chunks.remove({}) -- 1.6.6.1