module Mongo::Operation::UsesCommandOpMsg

A command that uses OP_MSG, with the document as payload type 0.

@since 2.5.0

Constants

READ_PREFERENCE
ZERO_TIMESTAMP

Private Instance Methods

apply_causal_consistency!(selector, server) click to toggle source
# File lib/mongo/operation/uses_command_op_msg.rb, line 29
def apply_causal_consistency!(selector, server); end
apply_cluster_time!(selector, server) click to toggle source
# File lib/mongo/operation/uses_command_op_msg.rb, line 31
def apply_cluster_time!(selector, server)
  if !server.standalone?
    cluster_time = [ server.cluster_time, (session && session.cluster_time) ].max_by do |doc|
                      (doc && doc[Cluster::CLUSTER_TIME]) || ZERO_TIMESTAMP
                    end

    if cluster_time && (cluster_time[Cluster::CLUSTER_TIME] > ZERO_TIMESTAMP)
      selector[CLUSTER_TIME] = cluster_time
    end
  end
end
apply_session_id!(selector) click to toggle source
# File lib/mongo/operation/uses_command_op_msg.rb, line 43
def apply_session_id!(selector)
  session.add_id!(selector) if session && !unacknowledged_write?
end
command_op_msg(server, selector, options) click to toggle source
# File lib/mongo/operation/uses_command_op_msg.rb, line 69
def command_op_msg(server, selector, options)
  update_selector_for_session!(selector, server)
  selector[Protocol::Msg::DATABASE_IDENTIFIER] = db_name
  selector[READ_PREFERENCE] = read.to_doc if read
  flags = unacknowledged_write? ? [:more_to_come] : [:none]
  Protocol::Msg.new(flags, options, selector)
end
unacknowledged_write?() click to toggle source
# File lib/mongo/operation/uses_command_op_msg.rb, line 47
def unacknowledged_write?
  write_concern && write_concern.get_last_error.nil?
end
update_selector_for_session!(selector, server) click to toggle source
# File lib/mongo/operation/uses_command_op_msg.rb, line 51
def update_selector_for_session!(selector, server)
  # the driver MUST ignore any implicit session if at the point it is sending a command
  # to a specific server it turns out that that particular server doesn't support sessions after all
  if server.features.sessions_enabled?
    apply_cluster_time!(selector, server)
    selector[:txnNumber] = BSON::Int64.new(txn_num) if txn_num
    if session
      apply_session_id!(selector)
      apply_causal_consistency!(selector, server)
    end
  elsif session && !session.implicit?
    apply_cluster_time!(selector, server)
    apply_session_id!(selector)
    apply_causal_consistency!(selector, server)
    selector[:txnNumber] = BSON::Int64.new(txn_num) if txn_num
  end
end