[Python-modules-commits] r19011 - in packages/python-riak/trunk/debian/patches (4 files)

soren-guest at users.alioth.debian.org soren-guest at users.alioth.debian.org
Wed Oct 19 20:59:57 UTC 2011


    Date: Wednesday, October 19, 2011 @ 20:59:56
  Author: soren-guest
Revision: 19011

Import patches from gstein to ensure keys set by Riak are passed back into the RiakObjects.

Added:
  packages/python-riak/trunk/debian/patches/0035-First-draft-at-fixing-issue-53.patch
  packages/python-riak/trunk/debian/patches/0036-Test-the-retrieval-of-a-new-object-s-key-and-its-for.patch
  packages/python-riak/trunk/debian/patches/0037-Fix-extraction-of-the-key-from-the-Location-header.patch
Modified:
  packages/python-riak/trunk/debian/patches/series

Added: packages/python-riak/trunk/debian/patches/0035-First-draft-at-fixing-issue-53.patch
===================================================================
--- packages/python-riak/trunk/debian/patches/0035-First-draft-at-fixing-issue-53.patch	                        (rev 0)
+++ packages/python-riak/trunk/debian/patches/0035-First-draft-at-fixing-issue-53.patch	2011-10-19 20:59:56 UTC (rev 19011)
@@ -0,0 +1,197 @@
+From 0e8a97a265344d74a99703c3abc6e549fe173f3f Mon Sep 17 00:00:00 2001
+From: Greg Stein <gstein at gmail.com>
+Date: Thu, 15 Sep 2011 21:44:54 -0400
+Subject: [PATCH] First draft at fixing issue #53.
+
+Introduce transport.put_new() to deal with returning the key generated by
+the server (the signature for .put() has no place to return it).
+
+* riak/riak_object.py:
+  (RiakObject.store): if the object does not (yet) have a key, then use
+    the .put_new() method to save the object and get the new key.
+
+* riak/transports/transport.py:
+  (RiakTransport.put_new): new abstract method for storing an object and
+    allowing the server to generate the key
+
+* riak/transports/http.py:
+  (RiakHttpTransport.put): factor the header creation out into ...
+  (RiakHttpTransport.build_put_headers): ... this.
+  (RiakHttpTransport.put_new): new method to store the new object and
+    return the server-generated key
+
+* riak/transport/pbc.py:
+  (RiakHttpTransport.put_new): add a draft stub for implementing put_new
+    and returning the server-generated key (doesn't work).
+---
+ riak/riak_object.py          |   16 +++++++--
+ riak/transports/http.py      |   67 +++++++++++++++++++++++++++--------------
+ riak/transports/pbc.py       |   10 ++++++
+ riak/transports/transport.py |   10 ++++++
+ 4 files changed, 76 insertions(+), 27 deletions(-)
+
+diff --git a/riak/riak_object.py b/riak/riak_object.py
+index 7ad0503..b836e13 100644
+--- a/riak/riak_object.py
++++ b/riak/riak_object.py
+@@ -336,11 +336,19 @@ class RiakObject(object):
+         w = self._bucket.get_w(w)
+         dw = self._bucket.get_dw(dw)
+ 
+-        # Issue the get over our transport
++        # Issue the put over our transport
+         t = self._client.get_transport()
+-        Result = t.put(self, w, dw, return_body)
+-        if Result is not None:
+-            self.populate(Result)
++
++        if self._key is None:
++            key, vclock, metadata = t.put_new(self, w, dw, return_body)
++            self._exists = True
++            self._key = key
++            self._vclock = vclock
++            self.set_metadata(metadata)
++        else:
++            Result = t.put(self, w, dw, return_body)
++            if Result is not None:
++                self.populate(Result)
+ 
+         return self
+ 
+diff --git a/riak/transports/http.py b/riak/transports/http.py
+index 264ffad..a66a2f2 100644
+--- a/riak/transports/http.py
++++ b/riak/transports/http.py
+@@ -110,29 +110,7 @@ class RiakHttpTransport(RiakTransport) :
+         params = {'returnbody' : str(return_body).lower(), 'w' : w, 'dw' : dw}
+         url = self.build_rest_path(bucket=robj.get_bucket(), key=robj.get_key(),
+                                    params=params)
+-
+-        # Construct the headers...
+-        headers = MultiDict({'Accept' : 'text/plain, */*; q=0.5',
+-                             'Content-Type' : robj.get_content_type(),
+-                             'X-Riak-ClientId' : self._client_id})
+-
+-        # Add the vclock if it exists...
+-        if robj.vclock() is not None:
+-            headers['X-Riak-Vclock'] = robj.vclock()
+-
+-        # Create the header from metadata
+-        links = self.add_links_for_riak_object(robj, headers)
+-
+-        for key, value in robj.get_usermeta().iteritems():
+-            headers['X-Riak-Meta-%s' % key] = value
+-
+-        for rie in robj.get_indexes():
+-            key = 'X-Riak-Index-%s' % rie.get_field()
+-            if key in headers:
+-                headers[key] += ", " + rie.get_value()
+-            else:
+-                headers[key] = rie.get_value()
+-
++        headers = self.build_put_headers(robj)
+         content = robj.get_encoded_data()
+         return self.do_put(url, headers, content, return_body, key=robj.get_key())
+ 
+@@ -148,6 +126,22 @@ class RiakHttpTransport(RiakTransport) :
+           self.check_http_code(response, [204])
+           return None
+ 
++    def put_new(self, robj, w=None, dw=None, return_meta=True):
++        """Put a new object into the Riak store, returning its (new) key."""
++        # Construct the URL...
++        params = {'returnbody' : str(return_meta).lower(), 'w' : w, 'dw' : dw}
++        url = self.build_rest_path(bucket=robj.get_bucket(), params=params)
++        headers = self.build_put_headers(robj)
++        content = robj.get_encoded_data()
++        response = self.http_request('POST', url, headers, content)
++        key = response[0]['location']
++        if return_meta:
++            vclock, [(metadata, data)] = self.parse_body(response, [201])
++            return key, vclock, metadata
++        else:
++            self.check_http_code(response, [201])
++            return key, None, None
++
+     def delete(self, robj, rw):
+         # Construct the URL...
+         params = {'rw' : rw}
+@@ -421,6 +415,33 @@ class RiakHttpTransport(RiakTransport) :
+         # Return.
+         return path
+ 
++    def build_put_headers(self, robj):
++        """Build the headers for a POST/PUT request."""
++
++        # Construct the headers...
++        headers = MultiDict({'Accept' : 'text/plain, */*; q=0.5',
++                             'Content-Type' : robj.get_content_type(),
++                             'X-Riak-ClientId' : self._client_id})
++
++        # Add the vclock if it exists...
++        if robj.vclock() is not None:
++            headers['X-Riak-Vclock'] = robj.vclock()
++
++        # Create the header from metadata
++        links = self.add_links_for_riak_object(robj, headers)
++
++        for key, value in robj.get_usermeta().iteritems():
++            headers['X-Riak-Meta-%s' % key] = value
++
++        for rie in robj.get_indexes():
++            key = 'X-Riak-Index-%s' % rie.get_field()
++            if key in headers:
++                headers[key] += ", " + rie.get_value()
++            else:
++                headers[key] = rie.get_value()
++
++        return headers
++
+     def http_request(self, method, uri, headers=None, body='') :
+         """
+         Given a Method, URL, Headers, and Body, perform and HTTP request,
+diff --git a/riak/transports/pbc.py b/riak/transports/pbc.py
+index 77abe7e..65a75d2 100644
+--- a/riak/transports/pbc.py
++++ b/riak/transports/pbc.py
+@@ -217,6 +217,16 @@ class RiakPbcTransport(RiakTransport):
+                 contents.append(self.decode_content(c))
+             return resp.vclock, contents
+ 
++    def put_new(self, robj, w=None, dw=None, return_meta=True):
++        ### not sure about all this. just use put() for now. we need the
++        ### resp.key value from self.put(). maybe refactor.
++        response = self.put(robj, w, dw, return_meta)
++        if response is None:
++            return None, None, None
++        assert len(response[1]) == 1
++        return None, response[0], response[1][0][0]
++        
++
+     def delete(self, robj, rw = None):
+         """
+         Serialize get request and deserialize response
+diff --git a/riak/transports/transport.py b/riak/transports/transport.py
+index 5fb57be..4454f48 100644
+--- a/riak/transports/transport.py
++++ b/riak/transports/transport.py
+@@ -75,6 +75,16 @@ class RiakTransport(object):
+         """
+         raise RiakError("not implemented")
+ 
++    def put_new(self, robj, w=None, dw=None, return_meta=True):
++        """Put a new object into the Riak store, returning its (new) key.
++
++        If return_meta is False, then the vlock and metadata return values
++        will be None.
++
++        @return (key, vclock, metadata)
++        """
++        raise RiakError("not implemented")
++
+     def delete(self, robj, rw = None):
+         """
+         Serialize delete request and deserialize response
+-- 
+1.7.5.4
+

Added: packages/python-riak/trunk/debian/patches/0036-Test-the-retrieval-of-a-new-object-s-key-and-its-for.patch
===================================================================
--- packages/python-riak/trunk/debian/patches/0036-Test-the-retrieval-of-a-new-object-s-key-and-its-for.patch	                        (rev 0)
+++ packages/python-riak/trunk/debian/patches/0036-Test-the-retrieval-of-a-new-object-s-key-and-its-for.patch	2011-10-19 20:59:56 UTC (rev 19011)
@@ -0,0 +1,29 @@
+From 028a36e0adaa4b12948fc8a3c4e7808efed2667d Mon Sep 17 00:00:00 2001
+From: Greg Stein <gstein at gmail.com>
+Date: Fri, 16 Sep 2011 11:40:49 -0400
+Subject: [PATCH] Test the retrieval of a new object's key, and its format.
+
+---
+ riak/tests/test_all.py |    6 +++++-
+ 1 files changed, 5 insertions(+), 1 deletions(-)
+
+diff --git a/riak/tests/test_all.py b/riak/tests/test_all.py
+index 6377b68..8d8bee3 100644
+--- a/riak/tests/test_all.py
++++ b/riak/tests/test_all.py
+@@ -911,7 +911,11 @@ class RiakHttpTransportTestCase(BaseTestCase, MapReduceAliasTestMixIn, unittest.
+         bucket = self.client.bucket('random_key_bucket')
+         for key in bucket.get_keys():
+             bucket.get(str(key)).delete()
+-        bucket.new(None, data={}).store()
++        o = bucket.new(None, data={})
++        self.assertIsNone(o.get_key())
++        o.store()
++        self.assertIsNotNone(o.get_key())
++        self.assertNotIn('/', o.get_key())
+         self.assertEqual(len(bucket.get_keys()), 1)
+ 
+     def test_too_many_link_headers_shouldnt_break_http(self):
+-- 
+1.7.5.4
+

Added: packages/python-riak/trunk/debian/patches/0037-Fix-extraction-of-the-key-from-the-Location-header.patch
===================================================================
--- packages/python-riak/trunk/debian/patches/0037-Fix-extraction-of-the-key-from-the-Location-header.patch	                        (rev 0)
+++ packages/python-riak/trunk/debian/patches/0037-Fix-extraction-of-the-key-from-the-Location-header.patch	2011-10-19 20:59:56 UTC (rev 19011)
@@ -0,0 +1,27 @@
+From fdd8ce7a4100d93dec2cd172218d90156ef28ac7 Mon Sep 17 00:00:00 2001
+From: Greg Stein <gstein at gmail.com>
+Date: Fri, 16 Sep 2011 12:09:16 -0400
+Subject: [PATCH] Fix extraction of the key from the Location: header.
+
+---
+ riak/transports/http.py |    4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+diff --git a/riak/transports/http.py b/riak/transports/http.py
+index a66a2f2..4ef0e08 100644
+--- a/riak/transports/http.py
++++ b/riak/transports/http.py
+@@ -134,7 +134,9 @@ class RiakHttpTransport(RiakTransport) :
+         headers = self.build_put_headers(robj)
+         content = robj.get_encoded_data()
+         response = self.http_request('POST', url, headers, content)
+-        key = response[0]['location']
++        location = response[0]['location']
++        idx = location.rindex('/')
++        key = location[idx+1:]
+         if return_meta:
+             vclock, [(metadata, data)] = self.parse_body(response, [201])
+             return key, vclock, metadata
+-- 
+1.7.5.4
+

Modified: packages/python-riak/trunk/debian/patches/series
===================================================================
--- packages/python-riak/trunk/debian/patches/series	2011-10-19 20:33:11 UTC (rev 19010)
+++ packages/python-riak/trunk/debian/patches/series	2011-10-19 20:59:56 UTC (rev 19011)
@@ -32,3 +32,6 @@
 0032-riak_search_header.patch
 0033-move-erl-src.patch
 0034-urllib3-not-required.patch
+0035-First-draft-at-fixing-issue-53.patch
+0036-Test-the-retrieval-of-a-new-object-s-key-and-its-for.patch
+0037-Fix-extraction-of-the-key-from-the-Location-header.patch




More information about the Python-modules-commits mailing list