lib/heirloom/aws/simpledb.rb in heirloom-0.12.5 vs lib/heirloom/aws/simpledb.rb in heirloom-0.12.7

- old
+ new

@@ -1,6 +1,7 @@ require 'fog' +require 'retries' module Heirloom module AWS class SimpleDB @@ -18,43 +19,60 @@ end @sdb = Fog::AWS::SimpleDB.new fog_args end + def retry_options + {:max_retries => 3, + :rescue => Excon::Errors::ServiceUnavailable, + :base_sleep_seconds => 10, + :max_sleep_seconds => 60} + end + def domains - @sdb.list_domains.body['Domains'] + with_retries(retry_options) do + @sdb.list_domains.body['Domains'] + end end def domain_exists?(domain) domains.include? domain end def create_domain(domain) - @sdb.create_domain(domain) unless domain_exists?(domain) + with_retries(retry_options) do + @sdb.create_domain(domain) unless domain_exists?(domain) + end end def delete_domain(domain) - @sdb.delete_domain(domain) + with_retries(retry_options) do + @sdb.delete_domain(domain) + end end def domain_empty?(domain) count(domain).zero? end def put_attributes(domain, key, attributes, options = {}) - @sdb.put_attributes domain, key, attributes, options + with_retries(retry_options) do + @sdb.put_attributes domain, key, attributes, options + end end def select(query, opts = {}) has_more = true next_token = nil results = {} logger.debug "Executing simpledb query '#{query}'." if opts[:offset] && opts[:offset] > 0 - limit = @sdb.select("#{query} limit #{opts[:offset]}").body + limit = with_retries(retry_options) do + @sdb.select("#{query} limit #{opts[:offset]}").body + end if limit['NextToken'] logger.debug "Next token found. Retrieving results." next_token = limit['NextToken'] else logger.debug "No more results. Query complete." @@ -62,11 +80,13 @@ end end while has_more logger.debug "Retrieving results from next token '#{next_token}'." if next_token - more = @sdb.select(query, 'NextToken' => next_token).body + more = with_retries(retry_options) do + @sdb.select(query, 'NextToken' => next_token).body + end more['Items'].each do |k, v| block_given? ? yield(k, v) : results[k] = v end if more['NextToken'] logger.debug "Next token found. Retrieving results." @@ -78,20 +98,26 @@ end results unless block_given? end def delete(domain, key) - @sdb.delete_attributes domain, key + with_retries(retry_options) do + @sdb.delete_attributes domain, key + end end def count(domain) - body = @sdb.select("SELECT count(*) FROM `#{domain}`").body - body['Items']['Domain']['Count'].first.to_i + with_retries(retry_options) do + body = @sdb.select("SELECT count(*) FROM `#{domain}`").body + body['Items']['Domain']['Count'].first.to_i + end end def item_count(domain, item) - query = "SELECT count(*) FROM `#{domain}` WHERE itemName() = '#{item}'" - @sdb.select(query).body['Items']['Domain']['Count'].first.to_i + with_retries(retry_options) do + query = "SELECT count(*) FROM `#{domain}` WHERE itemName() = '#{item}'" + @sdb.select(query).body['Items']['Domain']['Count'].first.to_i + end end def logger @logger end