Module: Mongo::Id Private

Included in:
Monitoring, Protocol::Message, Server::Connection
Defined in:
lib/mongo/id.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

This module abstracts the functionality for generating sequential unique integer IDs for instances of the class. It defines the method #next_id on the class that includes it. The implementation ensures that the IDs will be unique even when called from multiple threads.

Classes which include Id should not access ‘@@id` or `@@id_lock` directly; instead, they should call `#next_id` in `#initialize` and save the result in the instance being created.

Examples:

Include the Id module.

class Foo
  include Mongo::Id
end

f = Foo.new
foo.next_id # => 1
foo.next_id # => 2

Save the ID in the instance of the including class.

class Bar
  include Mongo::Id

  attr_reader :id

  def initialize
    @id = self.class.next_id
  end
end

a = Bar.new
a.id # => 1
b = Bar.new
b.id # => 2

Since:

  • 2.7.0

Class Method Summary collapse

Class Method Details

.included(klass) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 2.7.0



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/mongo/id.rb', line 56

def self.included(klass)
  klass.class_variable_set(:@@id, 0)
  klass.class_variable_set(:@@id_lock, Mutex.new)

  klass.define_singleton_method(:next_id) do
    klass.class_variable_get(:@@id_lock).synchronize do
      id = class_variable_get(:@@id)
      klass.class_variable_set(:@@id, id + 1)
      klass.class_variable_get(:@@id)
    end
  end
end