module RetryOnDuplicate::ClassMethods

Public Instance Methods

retry_on_duplicate() { || ... } click to toggle source
# File lib/retry_on_duplicate.rb, line 10
def retry_on_duplicate
  retried = false
  begin
    yield
  rescue *retry_on_duplicate_rescue_messages => err
    if retry_on_duplicate_on_retry?(err, retried)
      retried = true
      retry
    else
      raise err
    end
  end
end

Private Instance Methods

extra_retry_on_duplicate_rescue_messages() click to toggle source
# File lib/retry_on_duplicate.rb, line 31
def extra_retry_on_duplicate_rescue_messages
  arr = []
  arr << PG::UniqueViolation if defined?(PG::UniqueViolation)
  arr << Mysql2::Error if defined?(Mysql2::Error)
  arr
end
retry_on_duplicate_on_retry?(err, retried) click to toggle source
# File lib/retry_on_duplicate.rb, line 38
def retry_on_duplicate_on_retry?(err, retried)
  !retried &&
    (err.message.include?("Duplicate entry") ||
      err.message.include?("PG::UniqueViolation") ||
      err.message.include?("has already been taken"))
end
retry_on_duplicate_rescue_messages() click to toggle source
# File lib/retry_on_duplicate.rb, line 26
def retry_on_duplicate_rescue_messages
  @retry_on_duplicate_rescue_messages ||=
    [ ActiveRecord::RecordNotUnique ] | extra_retry_on_duplicate_rescue_messages
end