[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