class IronBank::LocalRecords

Utility class to save records locally.

Constants

BACKOFF
RESOURCE_QUERY_FIELDS

Attributes

query_attempts[R]
resource[R]

Public Class Methods

directory() click to toggle source
# File lib/iron_bank/local_records.rb, line 16
def self.directory
  IronBank.configuration.export_directory
end
export() click to toggle source
# File lib/iron_bank/local_records.rb, line 20
def self.export
  FileUtils.mkdir_p(directory) unless Dir.exist?(directory)
  RESOURCE_QUERY_FIELDS.each_key { |resource| new(resource).save_file }
end
new(resource) click to toggle source
# File lib/iron_bank/local_records.rb, line 47
def initialize(resource)
  @resource       = resource
  @query_attempts = 0
end

Public Instance Methods

save_file() click to toggle source
# File lib/iron_bank/local_records.rb, line 25
def save_file
  until completed? || max_query?
    IronBank.logger.info(export_query_info)
    sleep backoff_time
  end

  File.open(file_path, "w") do |file|
    file.write(export.content.force_encoding("UTF-8"))
  end
end

Private Instance Methods

backoff_time() click to toggle source
# File lib/iron_bank/local_records.rb, line 89
def backoff_time
  BACKOFF[:interval] * (BACKOFF[:factor]**query_attempts)
end
completed?() click to toggle source
# File lib/iron_bank/local_records.rb, line 68
def completed?
  return false unless (status = export.reload.status)

  case status
  when "Pending", "Processing" then false
  when "Completed"             then true
  else                         raise_export_error
  end
end
export() click to toggle source
# File lib/iron_bank/local_records.rb, line 52
def export
  @export ||= IronBank::Export.create(
    "select #{RESOURCE_QUERY_FIELDS[resource].join(', ')} from #{resource}"
  )
end
export_query_info() click to toggle source
# File lib/iron_bank/local_records.rb, line 62
def export_query_info
  "Waiting for export #{export.id} (#{resource}) to complete " \
    "(attempt #{query_attempts} of #{BACKOFF[:max]}; #{backoff_time}s " \
    "sleeping time)"
end
file_path() click to toggle source
# File lib/iron_bank/local_records.rb, line 58
def file_path
  File.expand_path("#{resource}.csv", self.class.directory)
end
max_query?() click to toggle source
# File lib/iron_bank/local_records.rb, line 82
def max_query?
  @query_attempts += 1
  return false unless @query_attempts > BACKOFF[:max]

  raise IronBank::Error, "Export query attempts exceeded"
end
raise_export_error() click to toggle source
# File lib/iron_bank/local_records.rb, line 78
def raise_export_error
  raise IronBank::Error, "Export #{export.id} has status #{export.status}"
end