]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rados.py: make Rados and Ioctx objects context managers
authorJosh Durgin <josh.durgin@dreamhost.com>
Wed, 21 Sep 2011 22:44:04 +0000 (15:44 -0700)
committerJosh Durgin <josh.durgin@dreamhost.com>
Tue, 27 Sep 2011 01:10:39 +0000 (18:10 -0700)
Signed-off-by: Josh Durgin <josh.durgin@dreamhost.com>
src/pybind/rados.py

index bc2ce185252d31c80c1f85f914797d2189992baf..9356f754be8cc8bf78a0dda21e1896d9d2def063 100755 (executable)
@@ -112,6 +112,14 @@ Rados object in state %s." % (self.state))
             self.librados.rados_shutdown(self.cluster)
             self.state = "shutdown"
 
+    def __enter__(self):
+        self.connect()
+        return self
+
+    def __exit__(self, type_, value, traceback):
+        self.shutdown()
+        return False
+
     def __del__(self):
         self.shutdown()
 
@@ -321,9 +329,15 @@ class Ioctx(object):
         self.io = io
         self.state = "open"
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type_, value, traceback):
+        self.close()
+        return False
+
     def __del__(self):
-        if (self.state == "open"):
-            self.close()
+        self.close()
 
     def require_ioctx_open(self):
         if self.state != "open":
@@ -346,9 +360,10 @@ class Ioctx(object):
                 (self.name, loc_key))
 
     def close(self):
-        self.require_ioctx_open()
-        self.librados.rados_ioctx_destroy(self.io)
-        self.state = "closed"
+        if self.state == "open":
+            self.require_ioctx_open()
+            self.librados.rados_ioctx_destroy(self.io)
+            self.state = "closed"
 
     def write(self, key, data, offset = 0):
         self.require_ioctx_open()