lib/moped/protocol/update.rb
module Moped
module Protocol
# The Protocol class for updating documents in a collection.
#
# @example Rename a user
# Update.new "moped", "users", { _id: "123" }, { name: "Bob" }
#
# @example Rename all users named John
# Update.new "moped", "users", { name: "John" }, { name: "Bob" },
# flags: [:multi]
#
# @example Upsert
# Update.new "moped", "users", { name: "John" }, { name: "John" },
# flags: [:upsert]
#
# @example Setting the request id
# Update.new "moped", "users", {}, { name: "Bob" },
# request_id: 123
class Update
include Message
# @attribute
# @return [Number] the length of the message
int32 :length
# @attribute
# @return [Number] the request id of the message
int32 :request_id
int32 :response_to
# @attribute
# @return [Number] the operation code of this message
int32 :op_code
int32 :reserved # reserved for future use
# @attribute
# @return [String] the namespaced collection name
cstring :full_collection_name
# @attribute
# The flags for the update message. Supported flags are +:upsert+ and
# +:multi+.
# @param [Array] flags the flags for this message
# @return [Array] the flags for this message
flags :flags, upsert: 2 ** 0,
multi: 2 ** 1
# @attribute
# @return [Hash] the selector for the update
document :selector
# @attribute
# @return [Hash] the updates to apply
document :update
finalize
undef op_code
# @return [Number] OP_UPDATE operation code (2001)
def op_code
2001
end
# @return [String, Symbol] the database this insert targets
attr_reader :database
# @return [String, Symbol] the collection this insert targets
attr_reader :collection
# Create a new update command. The +database+ and +collection+ arguments
# are joined together to set the +full_collection_name+.
#
# @example
# Update.new "moped", "users", { name: "John" }, { name: "Bob" },
# flags: [:upsert],
# request_id: 123
#
# @param [String, Symbol] database the database to insert into
# @param [String, Symbol] collection the collection to insert into
# @param [Hash] selector the selector
# @param [Hash] update the update to perform
# @param [Hash] options additional options
# @option options [Number] :request_id the command's request id
# @option options [Array] :flags the flags for insertion. Supported
# flags: +:upsert+, +:multi+.
def initialize(database, collection, selector, update, options = {})
@database = database
@collection = collection
@full_collection_name = "#{database}.#{collection}"
@selector = selector
@update = update
@request_id = options[:request_id]
@flags = options[:flags]
end
def log_inspect
type = "UPDATE"
"%-12s database=%s collection=%s selector=%s update=%s flags=%s" % [type, database, collection,
selector.inspect,
update.inspect,
flags.inspect]
end
private
# Duplicate the attributes in the update that need to be.
#
# @api private
#
# @example Clone the update.
# update.clone
#
# @param [ Update ] The update that was cloned from.
#
# @since 2.0.0
def initialize_copy(_)
@selector = selector.dup
@update = update.dup
@flags = flags.dup
end
end
end
end