summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Moyer <kopertop@MacPro.local>2010-09-08 17:03:19 -0400
committerChris Moyer <kopertop@MacPro.local>2010-09-08 17:03:19 -0400
commit12f8438a5701c26ff49634ff4cd5e70e4765be7b (patch)
tree27872c5591cabd3f00e1afacab00fffddc1804bd
parent229c33cf5981b1015f31d115026830e34afba4d8 (diff)
downloadboto-12f8438a5701c26ff49634ff4cd5e70e4765be7b.tar.gz
Added Paging support to ECS
-rw-r--r--boto/ecs/__init__.py14
-rw-r--r--boto/ecs/item.py54
2 files changed, 63 insertions, 5 deletions
diff --git a/boto/ecs/__init__.py b/boto/ecs/__init__.py
index 6423fdb0..676325f4 100644
--- a/boto/ecs/__init__.py
+++ b/boto/ecs/__init__.py
@@ -24,9 +24,8 @@ from boto.connection import AWSQueryConnection, AWSAuthConnection
import time
import urllib
import xml.sax
-from boto.ecs.item import Item
+from boto.ecs.item import Item, ItemSet
from boto import handler
-from boto.resultset import ResultSet
class ECSConnection(AWSQueryConnection):
"""ECommerse Connection"""
@@ -64,12 +63,14 @@ class ECSConnection(AWSQueryConnection):
headers=headers)
- def get_response(self, action, params, list_marker):
+ def get_response(self, action, params, page=0, itemSet=None):
"""
Utility method to handle calls to ECS and parsing of responses.
"""
params['Service'] = "AWSECommerceService"
params['Operation'] = action
+ if page:
+ params['ItemPage'] = page
response = self.make_request("GET", params, "/onca/xml")
body = response.read()
boto.log.debug(body)
@@ -79,7 +80,10 @@ class ECSConnection(AWSQueryConnection):
boto.log.error('%s' % body)
raise self.ResponseError(response.status, response.reason, body)
- rs = ResultSet([('Item', Item)])
+ if itemSet == None:
+ rs = ItemSet(self, action, params, [('Item', Item)], page)
+ else:
+ rs = itemSet
h = handler.XmlHandler(rs, self)
xml.sax.parseString(body, h)
return rs
@@ -97,4 +101,4 @@ class ECSConnection(AWSQueryConnection):
:see: http://docs.amazonwebservices.com/AWSECommerceService/2010-09-01/DG/index.html?ItemSearch.html
"""
params['SearchIndex'] = search_index
- return self.get_response('ItemSearch', params, list_marker="Items")
+ return self.get_response('ItemSearch', params)
diff --git a/boto/ecs/item.py b/boto/ecs/item.py
index aec90ae4..1a5fb322 100644
--- a/boto/ecs/item.py
+++ b/boto/ecs/item.py
@@ -38,3 +38,57 @@ class Item(object):
def endElement(self, name, value, connection):
setattr(self, name, value)
+
+class ItemSet(object):
+ """
+ The ItemSet is strongly based off of the ResultSet, but has
+ slightly different functionality, specifically for the paging mechanism
+ that ECS uses (which is page-based, instead of token-based)
+ """
+
+ def __init__(self, connection, action, params, marker_elem=None, page=0):
+ self.objs = []
+ self.iter = None
+ self.page = page
+ self.connection = connection
+ self.action = action
+ self.params = params
+ if isinstance(marker_elem, list):
+ self.markers = marker_elem
+ else:
+ self.markers = [marker_elem]
+
+ def startElement(self, name, attrs, connection):
+ for t in self.markers:
+ if name == t[0]:
+ obj = t[1](connection)
+ self.objs.append(obj)
+ return obj
+ return None
+
+ def endElement(self, name, value, connection):
+ if name == 'TotalResults':
+ self.total_results = value
+ elif name == 'TotalPages':
+ self.total_pages = value
+ else:
+ setattr(self, name, value)
+
+ def next(self):
+ """Special paging functionality"""
+ if self.iter == None:
+ self.iter = iter(self.objs)
+ try:
+ return self.iter.next()
+ except StopIteration:
+ self.iter = None
+ self.objs = []
+ if int(self.page) < int(self.total_pages):
+ self.page += 1
+ self.connection.get_response(self.action, self.params, self.page, self)
+ return self.next()
+ else:
+ raise
+
+ def __iter__(self):
+ return self