Module: Mongoid::Ids::Collisions

Defined in:
lib/mongoid/ids/collisions.rb

Instance Method Summary collapse

Instance Method Details

#is_duplicate_token_error?(err, document, field_name) ⇒ Boolean

Returns:

  • (Boolean)


26
27
28
29
30
# File 'lib/mongoid/ids/collisions.rb', line 26

def is_duplicate_token_error?(err, document, field_name)
  [11000, 11001].include?(err.details['code']) &&
    err.details['err'] =~ /dup key/ &&
    err.details['err'] =~ /"#{document.send(field_name)}"/
end

#raise_collision_retries_exceeded_error(field_name, retry_count) ⇒ Object



21
22
23
24
# File 'lib/mongoid/ids/collisions.rb', line 21

def raise_collision_retries_exceeded_error(field_name, retry_count)
  Rails.logger.warn "[Mongoid::Ids] Warning: Maximum token generation retries (#{retry_count}) exceeded on `#{field_name}'." if defined?(Rails)
  raise Mongoid::Ids::CollisionRetriesExceeded.new(self, retry_count)
end

#resolve_token_collisions(resolver) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/mongoid/ids/collisions.rb', line 4

def resolve_token_collisions(resolver)
  retries = resolver.retry_count
  begin
    yield
  rescue Moped::Errors::OperationFailure => e
    if is_duplicate_token_error?(e, self, resolver.field_name)
      if (retries -= 1) >= 0
        resolver.create_new_token_for(self)
        retry
      end
      raise_collision_retries_exceeded_error resolver.field_name, resolver.retry_count
    else
      raise e
    end
  end
end