class Mongo::Operation::Context

Context for operations.

Holds various objects needed to make decisions about operation execution in a single container, and provides facade methods for the contained objects.

The context contains parameters for operations, and as such while an operation is being prepared nothing in the context should change. When the result of the operation is being processed, the data returned by the context may change (for example, because a transaction is aborted), but at that point the operation should no longer read anything from the context. Because context data may change during operation execution, context objects should not be reused for multiple operations.

@api private

Attributes

client[R]
options[R]
session[R]

Public Class Methods

new(client: nil, session: nil, service_id: nil, options: nil) click to toggle source
# File lib/mongo/operation/context.rb, line 38
def initialize(client: nil, session: nil, service_id: nil, options: nil)
  if options
    if client
      raise ArgumentError, 'Client and options cannot both be specified'
    end

    if session
      raise ArgumentError, 'Session and options cannot both be specified'
    end
  end

  if service_id && session&.pinned_service_id
    raise ArgumentError, 'Trying to pin context to a service when the session is already pinned to a service'
  end

  @client = client
  @session = session
  @service_id = service_id
  @options = options
end

Public Instance Methods

aborting_transaction?() click to toggle source
# File lib/mongo/operation/context.rb, line 79
def aborting_transaction?
  in_transaction? && session.aborting_transaction?
end
any_retry_writes?() click to toggle source
# File lib/mongo/operation/context.rb, line 91
def any_retry_writes?
  modern_retry_writes? || legacy_retry_writes?
end
committing_transaction?() click to toggle source
# File lib/mongo/operation/context.rb, line 75
def committing_transaction?
  in_transaction? && session.committing_transaction?
end
decrypt?() click to toggle source
# File lib/mongo/operation/context.rb, line 107
def decrypt?
  !!client&.encrypter
end
encrypt?() click to toggle source
# File lib/mongo/operation/context.rb, line 103
def encrypt?
  client&.encrypter&.encrypt? || false
end
encrypter() click to toggle source
# File lib/mongo/operation/context.rb, line 111
def encrypter
  if client&.encrypter
    client.encrypter
  else
    raise Error::InternalDriverError, 'Encrypter should only be accessed when encryption is to be performed'
  end
end
in_transaction?() click to toggle source
# File lib/mongo/operation/context.rb, line 67
def in_transaction?
  session&.in_transaction? || false
end
legacy_retry_writes?() click to toggle source
# File lib/mongo/operation/context.rb, line 87
def legacy_retry_writes?
  client && !client.options[:retry_writes] && client.max_write_retries > 0
end
modern_retry_writes?() click to toggle source
# File lib/mongo/operation/context.rb, line 83
def modern_retry_writes?
  client && client.options[:retry_writes]
end
server_api() click to toggle source
# File lib/mongo/operation/context.rb, line 95
def server_api
  if client
    client.options[:server_api]
  elsif options
    options[:server_api]
  end
end
service_id() click to toggle source
# File lib/mongo/operation/context.rb, line 63
def service_id
  @service_id || session&.pinned_service_id
end
starting_transaction?() click to toggle source
# File lib/mongo/operation/context.rb, line 71
def starting_transaction?
  session&.starting_transaction? || false
end