类:Mongo::Protocol::Msg Private
- 定义于:
- 构建/ruby-driver-v2.19/lib/ mongo / 协议/msg.rb
Overview
此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。
MongoDB协议消息 (OP_MSG),双向传输协议操作码。
OP_MSG 仅适用于MongoDB 3.6 (maxWireVersion >= 6 ) 及更高版本。
在命名空间下定义
类: Section1
常量摘要折叠
- DATABASE_IDENTIFIER =
此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。
要对其执行命令的数据库名称的标识符。
' $db '.冻结
- INTERNAL_KEYS =
此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。
驱动程序添加到命令中的键。 这些将被移动到哈希的末尾,以便更好地记录日志。
集.new(%w($clusterTime $db lsid 签名 txnNumber)).冻结
Monitoring::Event::Secure中包含的常量
Monitoring::Event::Secure::REDACTED_COMMANDS
从Message继承的常量
Mongo::Protocol::Message::BATCH_SIZE 、 Mongo::Protocol::Message::COLLECTION 、 Mongo::Protocol::Message::LIMIT 、 Mongo::Protocol::Message::MAX_MESSAGE_SIZE 、 Mongo::Protocol:: Message::ORDERED 、 Mongo::Protocol::Message::Q
实例属性摘要
从Message继承的属性
实例方法摘要折叠
-
# bulk_write? ⇒ 布尔
private
此消息是否表示批量写入。
- # 个文档⇒ 对象 private
-
#fix_after_deserialization ⇒ 对象
private
反序列化将 @sections 实例变量设置为文档列表后,反向填充实例变量。
-
#initialize (flags, options, main_document, *sequences) ="Msg"
构造函数
private
创建新的 OP_MSG协议消息。
- #也许_add_server_api (server_api) ⇒ 对象 private
-
#maybe_compress (compressor, zlib_compression_level = nil) ⇒ 消息
private
如果发送的命令允许压缩,则压缩消息。
-
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
private
可能使用 libmongocrypt 解密此消息。
-
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
private
可以使用 libmongocrypt 加密此消息。
-
# number_returned ⇒ 整数
private
返回从服务器返回的文档数。
-
#有效负载⇒ BSON::Document
private
返回用于监控的事件负载。
-
#可回复? ⇒ true, false
private
该消息是否期望从数据库得到回复。
-
#序列化(缓冲区= BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ BSON::ByteBuffer
private
将消息序列化为可以在线发送的字节。
Monitoring::Event::Secure中包含的方法
#compression_allowed? 、 #redacted 、 #sensitive?
从Message继承的方法
#== 、 deserialize 、 #hash 、 #maybe_inflate 、 #set_request_id
ID中包含的方法
构造函数详情
#initialize (flags, options, main_document, *sequences) =" Msg "
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
创建新的 OP_MSG协议消息
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第66行 def 初始化(flags, , main_document, *序列) if flags flags.每 do |flag| 除非 KNOWN_FLAGS.键?(flag) 提高 ArgumentError, " Unknown flag: #{ flag .inspect } } " end end end @flags = flags || [] @options = 除非 main_document.is_a?(哈希) 提高 ArgumentError, "主文档必须是哈希,给定: #{ main_document . class } " end @main_document = main_document 序列.each_with_index do |部分, 索引(index)| 除非 部分.is_a?(Section1) 提高 ArgumentError, "所有序列必须是部分1实例,得到: #{ section } at index #{ index } " end end @sequences = 序列 @sections = [ {类型: 0, 有效负载: @main_document} ] + @sequences.map do |部分| {类型: 1, 有效负载: { identifier: 部分.标识符, 序列: 部分.文档.map do |doc| CachingHash.new(doc) end, }} end @request_id = nil 超 end |
实例方法详细信息
# bulk_write? ⇒布尔
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
编写此方法是为了支持客户端加密功能。 不建议将此方法用于任何其他功能或行为。
此消息是否表示批量写入。 批量写入是包含多个相同类型操作的插入、更新或删除操作。
272 273 274 275 276 277 278 279 280 281 282 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第272行 def bulk_write? inserts = @main_document['documents'] 更新 = @main_document['updates'] 删除 = @main_document['deletes'] num_inserts = inserts && inserts.长度 || 0 num_updates = 更新 && 更新.长度 || 0 num_deletes = 删除 && 删除.长度 || 0 num_inserts > 1 || num_updates > 1 || num_deletes > 1 end |
# 个文档⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
196 197 198 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第196行 def 文档 [@main_document] end |
#fix_after_deserialization ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
反序列化将 @sections 实例变量设置为文档列表后,反向填充实例变量。
TODO 修复反序列化,以便不需要此方法。
184 185 186 187 188 189 190 191 192 193 194 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第184行 def fix_after_deserialization if @sections.nil? 提高 NotImplementedError, "反序列化后,@sections 应该已初始化" end if @sections.长度 != 1 提高 NotImplementedError, "反序列化必须恰好生成一个节,但它生成了#{ section . length }个节" end @main_document = @sections.first @sequences = [] @sections = [{类型: 0, 有效负载: @main_document}] end |
#也许_add_server_api (server_api) ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第284行 def 也许_add_server_api(server_api) 冲突 = {} %i(apiVersion apiStrict apiDeprecationErrors).每 do |key| if @main_document.键?(key) 冲突[key] = @main_document[key] end if @main_document.键?(key.to_s) 冲突[key] = @main_document[key.to_s] end end 除非 冲突.空? 提高 错误::ServerApiConflict, "客户端配置了 :server_api 选项,但操作提供了以下冲突的参数: #{冲突。检查} " end main_document = @main_document.合并(merge)( Utils.transform_server_api(server_api) ) 消息.new(@flags, @options, main_document, *@sequences) end |
#maybe_compress (compressor, zlib_compression_level = nil) ⇒消息
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
如果发送的命令允许压缩,则压缩消息。 否则返回 self。
174 175 176 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第174行 def 也许_压缩(压缩器, zlib_compression_level = nil) compress_if_possible(命令.密钥.first, 压缩器, zlib_compression_level) end |
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
可能使用 libmongocrypt 解密此消息。 仅当指定的客户端存在、已为该客户端提供自动加密选项并且此消息符合解密条件时,才会解密消息。 如果一条消息代表 libmongocrypt 允许列出的命令类型之一并且包含需要由本地或远程JSON schema加密的数据,则该消息有资格解密。
251 252 253 254 255 256 257 258 259 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第251行 def Maybe_decrypt(上下文) if 上下文.解密? cmd = merge_sections enc_cmd = 上下文.加密器.解密(cmd) 消息.new(@flags, @options, enc_cmd) else self end end |
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
可以使用 libmongocrypt 加密此消息。 仅当指定的客户端存在、已为该客户端提供自动加密选项、未指示客户端绕过自动加密并且 mongocryptd 确定此消息符合加密条件时,才会加密消息。 如果一条消息代表 libmongocrypt 允许列出的命令类型之一,并且包含需要由本地或远程JSON schema加密的数据,则该消息符合加密条件。
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第214行 def 也许_加密(连接, 上下文) # TODO 稍后验证压缩,即当此方法运行时 # 消息未压缩。 if 上下文.加密? if 连接.描述.max_wire_version < 8 提高 错误::CryptError.new( “无法对早于以下版本的MongoDB服务器执行加密” + " 4.2 (传输版本低于8 )。当前已连接到服务器" + " with max line version #{ connection . description . max_wire_version } } " + " (自动加密要求 MongoDB 版本最低为4.2 ) " ) end db_name = @main_document[DATABASE_IDENTIFIER] cmd = merge_sections enc_cmd = 上下文.加密器.加密(db_name, cmd) if cmd.键?(' $db ') && !enc_cmd.键?(' $db ') enc_cmd[' $db '] = cmd[' $db '] end 消息.new(@flags, @options, enc_cmd) else self end end |
# number_returned ⇒整数
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回从服务器返回的文档数。
该 msg实例必须用于服务器回复,并且该回复必须返回一个活动游标(新创建的游标或其迭代通过 getMore 继续的游标)。
311 312 313 314 315 316 317 318 319 320 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第311行 def number_returned if doc = 文档.first if cursor = doc[' cursor '] if 批处理 = cursor[' firstBatch '] || cursor[' nextBatch '] return 批处理.长度 end end end 提高 NotImplementedError, “ number_returned 仅为游标回复定义” end |
#有效负载⇒ BSON::Document
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回用于监控的事件负载。
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第120行 def 有效负载 # 对 main_document 中的键重新排序,以便更好地进行日志记录 — 请参阅 # https://jira.mongodb.org/browse/RUBY-{0 1591 . # 请注意,即使没有重新排序,有效负载也不是精确的 # 与通过网络发送的内容匹配,因为该命令用于 # 已发布的事件结合了来自多个部分的密钥 # 通过网络发送的有效负载。 orders_command = {} skipped_command = {} 命令.每 do |k, v| if INTERNAL_KEYS.成员?(k.to_s) skipped_command[k] = v else orders_command[k] = v end end orders_command.update(skipped_command) BSON::文档.new( command_name: orders_command.密钥.first.to_s, database_name: @main_document[DATABASE_IDENTIFIER], 命令: orders_command, request_id: request_id, 回复: @main_document, ) end |
#可回复? ⇒ true , false
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
该消息是否期望从数据库得到回复。
108 109 110 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第108行 def 可回复? @replyable ||= !flags.包括?(:more_to_come) end |
# Serialize (buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ BSON::ByteBuffer
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
将消息序列化为可以在线发送的字节。
155 156 157 158 159 160 161 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第155行 def 序列化(缓冲 = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) validate_document_size!(max_bson_size) 超 add_check_sum(缓冲) 缓冲 end |