From 88bc71ff92026d889125bc0c4b14b450e41e62c4 Mon Sep 17 00:00:00 2001 From: Thiago da Silva Date: Sat, 12 Apr 2014 12:40:44 -0400 Subject: Added option to read whole file Added option to read whole file if caller send -1 as the buflen to read function. Also added a copy of getsize to File class, now called fgetsize, which returns the size of the file as reported by fstat Removed flags paramater from read function as it is never used by libgfapi. Change-Id: Ia1c04ef9717d9ca098e1961300d6ee216381c989 Signed-off-by: Thiago da Silva Signed-off-by: Prashanth Pai --- glusterfs/gfapi.py | 19 +++++++++++++++++-- test/unit/gluster/test_gfapi.py | 12 ++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/glusterfs/gfapi.py b/glusterfs/gfapi.py index 2d51a96..af25d18 100755 --- a/glusterfs/gfapi.py +++ b/glusterfs/gfapi.py @@ -104,6 +104,12 @@ class File(object): raise OSError(err, os.strerror(err)) return ret + def fgetsize(self): + """ + Return the size of a file, reported by fstat() + """ + return self.fstat().st_size + def fstat(self): """ Returns Stat object for this file. @@ -137,9 +143,18 @@ class File(object): """ return api.glfs_lseek(self.fd, pos, how) - def read(self, buflen, flags=0): + def read(self, buflen=-1): + """ + read file + + :param buflen: length of read buffer. If less than 0, then whole + file is read. Default is -1. + :returns: buffer of size buflen + """ + if buflen < 0: + buflen = self.fgetsize() rbuf = ctypes.create_string_buffer(buflen) - ret = api.glfs_read(self.fd, rbuf, buflen, flags) + ret = api.glfs_read(self.fd, rbuf, buflen, 0) if ret > 0: return rbuf elif ret < 0: diff --git a/test/unit/gluster/test_gfapi.py b/test/unit/gluster/test_gfapi.py index 1608332..0d73a32 100644 --- a/test/unit/gluster/test_gfapi.py +++ b/test/unit/gluster/test_gfapi.py @@ -180,6 +180,18 @@ class TestFile(unittest.TestCase): b = self.fd.read(5) self.assertEqual(b, 0) + def test_read_buflen_negative(self): + _mock_fgetsize = Mock(return_value=12345) + + def _mock_glfs_read(fd, rbuf, buflen, flags): + self.assertEqual(buflen, 12345) + return buflen + + for buflen in (-1,-2,-999): + with patch("glusterfs.gfapi.api.glfs_read", _mock_glfs_read): + with patch("glusterfs.gfapi.File.fgetsize", _mock_fgetsize): + b = self.fd.read(buflen) + def test_write_success(self): mock_glfs_write = Mock() mock_glfs_write.return_value = 5 -- cgit