From 3e4aaf95382a3a7c9bf699c3a532bec0ad444c1a Mon Sep 17 00:00:00 2001 From: Colin Patrick McCabe Date: Thu, 17 Feb 2011 10:47:41 -0800 Subject: [PATCH] pybind/rados: implement Pool.write_full Signed-off-by: Colin McCabe --- src/pybind/rados.py | 23 ++++++++++++++++++----- src/test/pybind-test.py | 11 +++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/pybind/rados.py b/src/pybind/rados.py index c29187f367cad..384f36a3ebf9d 100755 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -241,24 +241,37 @@ class Pool(object): self.require_pool_open() return Object(self, key) - def write(self, key, string_to_write, offset = 0): + def write(self, key, data, offset = 0): self.require_pool_open() - length = len(string_to_write) + length = len(data) ret = self.librados.rados_write(self.pool_id, c_char_p(key), - c_size_t(offset), c_char_p(string_to_write), - c_size_t(length)) + c_size_t(offset), c_char_p(data), + c_size_t(length)) if ret == length: return ret elif ret < 0: raise make_ex(ret, "Pool.write(%s): failed to write %s" % \ (self.name, key)) elif ret < length: - raise IncompleteWriteError("Wrote only %ld/%ld bytes" % (ret, length)) + raise IncompleteWriteError("Wrote only %ld out of %ld bytes" % \ + (ret, length)) else: raise make_ex("Pool.write(%s): logic error: rados_write \ returned %d, but %d was the maximum number of bytes it could have \ written." % (self.name, ret, length)) + def write_full(self, key, data, full = False, offset = 0): + self.require_pool_open() + length = len(data) + ret = self.librados.rados_write_full(self.pool_id, c_char_p(key), + c_size_t(offset), c_char_p(data), + c_size_t(length)) + if ret == 0: + return ret + else: + raise make_ex(ret, "Pool.write(%s): failed to write_full %s" % \ + (self.name, key)) + def read(self, key, offset = 0, length = 8192): self.require_pool_open() ret_buf = create_string_buffer(length) diff --git a/src/test/pybind-test.py b/src/test/pybind-test.py index 120a330d6fe2b..d5f9cd72a1c39 100755 --- a/src/test/pybind-test.py +++ b/src/test/pybind-test.py @@ -32,6 +32,17 @@ except rados.ObjectExists: foo3_pool = r.open_pool("foo3") foo3_pool.write("abc", "abc") foo3_pool.write("def", "def") +abc_str = foo3_pool.read("abc") +if (abc_str != "abc"): + raise RuntimeError("error reading object abc: expected value abc, \ +got %s" % abc_str) +# write_full replaces the whole 'def' object +foo3_pool.write_full("def", "d") +def_str = foo3_pool.read("def") +if (def_str != "d"): + raise RuntimeError("error reading object def: expected value d, \ +got %s" % def_str) + for obj in foo3_pool.list_objects(): print str(obj) -- 2.39.5