18d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom boto.compat import six 28d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ 38d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 48d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Permission is hereby granted, free of charge, to any person obtaining a 58d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# copy of this software and associated documentation files (the 68d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# "Software"), to deal in the Software without restriction, including 78d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# without limitation the rights to use, copy, modify, merge, publish, dis- 88d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# tribute, sublicense, and/or sell copies of the Software, and to permit 98d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# persons to whom the Software is furnished to do so, subject to the fol- 108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# lowing conditions: 118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# The above copyright notice and this permission notice shall be included 138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# in all copies or substantial portions of the Software. 148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- 178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# IN THE SOFTWARE. 228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoidef query_lister(domain, query='', max_items=None, attr_names=None): 248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi more_results = True 258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi num_results = 0 268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi next_token = None 278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while more_results: 288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi rs = domain.connection.query_with_attributes(domain, query, attr_names, 298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi next_token=next_token) 308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi for item in rs: 318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if max_items: 328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if num_results == max_items: 338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi raise StopIteration 348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi yield item 358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi num_results += 1 368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi next_token = rs.next_token 378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi more_results = next_token is not None 388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass QueryResultSet(object): 408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def __init__(self, domain=None, query='', max_items=None, attr_names=None): 428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.max_items = max_items 438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.domain = domain 448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.query = query 458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.attr_names = attr_names 468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def __iter__(self): 488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return query_lister(self.domain, self.query, self.max_items, self.attr_names) 498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoidef select_lister(domain, query='', max_items=None): 518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi more_results = True 528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi num_results = 0 538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi next_token = None 548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while more_results: 558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi rs = domain.connection.select(domain, query, next_token=next_token) 568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi for item in rs: 578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if max_items: 588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if num_results == max_items: 598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi raise StopIteration 608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi yield item 618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi num_results += 1 628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi next_token = rs.next_token 638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi more_results = next_token is not None 648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass SelectResultSet(object): 668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def __init__(self, domain=None, query='', max_items=None, 688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi next_token=None, consistent_read=False): 698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.domain = domain 708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.query = query 718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.consistent_read = consistent_read 728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.max_items = max_items 738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.next_token = next_token 748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def __iter__(self): 768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi more_results = True 778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi num_results = 0 788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while more_results: 798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi rs = self.domain.connection.select(self.domain, self.query, 808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi next_token=self.next_token, 818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi consistent_read=self.consistent_read) 828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi for item in rs: 838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if self.max_items and num_results >= self.max_items: 848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi raise StopIteration 858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi yield item 868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi num_results += 1 878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.next_token = rs.next_token 888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if self.max_items and num_results >= self.max_items: 898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi raise StopIteration 908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi more_results = self.next_token is not None 918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def next(self): 938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return next(self.__iter__()) 94