diff options
author | Chris Moyer <kopertop@MacPro.local> | 2010-09-08 17:03:19 -0400 |
---|---|---|
committer | Chris Moyer <kopertop@MacPro.local> | 2010-09-08 17:03:19 -0400 |
commit | 12f8438a5701c26ff49634ff4cd5e70e4765be7b (patch) | |
tree | 27872c5591cabd3f00e1afacab00fffddc1804bd | |
parent | 229c33cf5981b1015f31d115026830e34afba4d8 (diff) | |
download | boto-12f8438a5701c26ff49634ff4cd5e70e4765be7b.tar.gz |
Added Paging support to ECS
-rw-r--r-- | boto/ecs/__init__.py | 14 | ||||
-rw-r--r-- | boto/ecs/item.py | 54 |
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 |