Class: Mongo::Protocol::Message Abstract
- 继承:
-
对象
- 对象
- Mongo::Protocol::Message
- 定义于:
- build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb
Overview
提供MongoDB传输协议中所有消息所需功能的基类。 它提供了用于定义类型化字段的最小 DSL,以启用通过网络进行序列化和反序列化。
直接已知子类
Compressed 、 GetMore 、 KillCursors 、 Msg 、 Query 、 Reply
常量摘要折叠
- BATCH_SIZE =
批处理大小常量。
' batchSize '.冻结
- 集合 =
集合常量。
' collection '.冻结
- LIMIT =
极限常量。
'limit'.冻结
- ORDERED =
有序常量。
' ordered '.冻结
- Q =
q 常量。
'q'.冻结
- MAX_MESSAGE_SIZE =
默认最大消息大小为48 MB。
50331648.冻结
实例属性摘要折叠
-
#request_id ⇒ Fixnum
只读
返回消息的请求 ID。
类方法摘要折叠
-
。 deserialize (io, max_message_size = MAX_MESSAGE_SIZE,expected_response_to = nil, options = {}) ⇒ 消息
private
反序列化来自 IO 流的消息。
实例方法摘要折叠
-
# == (other) ⇒ true, false (又名:#eql?)
通过比较类和字段值来测试两个传输协议消息之间的相等性。
-
#hash ⇒ Fixnum
根据消息字段的值创建哈希。
-
#initialize (*args) ⇒ 消息
构造函数
:nodoc:.
- #也许_add_server_api (server_api) ⇒ 对象
-
#maybe_compress (compressor, zlib_compression_level = nil) ⇒ self
private
如果所使用的传输协议支持并且发送的命令允许压缩,则压缩消息。
-
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
可能使用 libmongocrypt 解密此消息。
-
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
可以使用 libmongocrypt 加密此消息。
-
#maybe_inflate ⇒ Protocol::Message
private
如果消息被压缩,则对消息进行扩充。
-
# number_returned ⇒ 0
协议消息的默认返回值。
-
#可回复? ⇒ false
消息默认不要求在向服务器发送消息后进行回复。
-
#序列化(缓冲区= BSON::ByteBuffer.new,max_bson_size = nil,bson_overhead = nil)→ string (也:#to_s)
将消息序列化为可以在线发送的字节。
-
#set_request_id ⇒ Fixnum
生成消息的请求ID。
ID中包含的方法
构造函数详情
#initialize (*args) ⇒消息
:nodoc:
79 80 81 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第79行 def 初始化(*args) # :nodoc: set_request_id end |
实例属性详细信息
# request_id =" Fixnum " (只读)
返回消息的请求 ID
86 87 88 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第86行 def request_id @request_id end |
类方法详细信息
。 deserialize (io, max_message_size = MAX_MESSAGE_SIZE,expected_response_to = nil, options = {}) ⇒消息
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
反序列化来自 IO 流的消息。
该方法返回解压缩的消息(即,如果传输的消息是 OP_COMPRESSED,则该方法通常会返回作为解压缩结果的 OP_MSG 消息)。
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第238行 def self.反序列化(io, = MAX_MESSAGE_SIZE, expired_response_to = nil, = {} ) # io 通常是一个 Mongo::Socket实例,它支持 # 超时选项。 为了与可能调用此 # 具有其他类似 IO对象的方法,仅当它们 # 不为空。 = {} if 超时 = [:socket_timeout] [:timeout] = 超时 end if .空? 数据段 = io.读(16) else 数据段 = io.读(16, **) end buf = BSON::ByteBuffer.new(数据段) 长度, _request_id, response_to, _op_code = deserialize_header(buf) # 防止潜在的 DOS 中间人攻击。 请参阅 # DRIVERS- 276 。 if 长度 > ( || MAX_MESSAGE_SIZE) 提高 错误::MaxMessageSize.new() end # 防止返回对先前请求的响应。 请参阅 # RUBY- 1117 if expired_response_to && response_to != expired_response_to 提高 错误::UnexpectedResponse.new(expired_response_to, response_to) end if .空? 数据段 = io.读(长度 - 16) else 数据段 = io.读(长度 - 16, **) end buf = BSON::ByteBuffer.new(数据段) = 注册表.获取(_op_code).分配 .发送(:fields).每 do |字段| if 字段[:multi] deserialize_array(, buf, 字段, ) else deserialize_field(, buf, 字段, ) end end if .is_a?(消息) .fix_after_deserialization end .也许_inflate end |
实例方法详细信息
# == (other) ⇒ true , false也称为: eql?
通过比较类和字段值来测试两个传输协议消息之间的相等性。
298 299 300 301 302 303 304 305 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第298行 def ==(其他) return false if self.class != 其他.class 字段.全部? do |字段| 名称 = 字段[:name] instance_variable_get(名称) == 其他.instance_variable_get(名称) end end |
# hash =" Fixnum "
根据消息字段的值创建哈希。
311 312 313 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第311行 def 哈希 字段.map { |字段| instance_variable_get(字段[:name]) }.哈希 end |
#也许_add_server_api (server_api) ⇒对象
173 174 175 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第173行 def 也许_add_server_api(server_api) 提高 错误::ServerApiNotSupported, "服务器API参数无法发送到3.6之前版本的MongoDB服务器。请从客户端选项删除:server_api 参数,或者使用MongoDB 3.6或更高版本" end |
#maybe_compress (compressor, zlib_compression_level = nil) ⇒ self
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
如果所使用的传输协议支持并且发送的命令允许压缩,则压缩消息。 否则返回 self。
112 113 114 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第112行 def 也许_压缩(压缩器, zlib_compression_level = nil) self end |
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
可能使用 libmongocrypt 解密此消息。
152 153 154 155 156 157 158 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第152行 def Maybe_decrypt(上下文) # TODO 确定我们是否应该解密来自4.2之前版本的数据。 # 个服务器,可能使用传统传输协议。 如果是这样,我们需要 # 对这些传输协议实现解密,因为我们当前 # 加密/解密代码特定于 OP_MSG。 self end |
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
可以使用 libmongocrypt 加密此消息。
168 169 170 171 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第168行 def 也许_加密(连接, 上下文) # 如果 Message 子类未实现此方法,则不执行任何操作 self end |
#也许_inflate ⇒ Protocol::Message
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
如果消息被压缩,则对消息进行扩充。
142 143 144 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第142行 def 也许_inflate self end |
# number_returned ⇒ 0
协议消息的默认返回值。
329 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第329行 def number_returned; 0; end |
#可回复? ⇒ false
消息默认不要求在向服务器发送消息后进行回复。
97 98 99 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第97行 def 可回复? false end |
# Serialize (buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ string也称为: to_s
将消息序列化为可通过网络发送的字节
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第201行 def 序列化(缓冲 = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) max_size = if max_bson_size && bson_overhead max_bson_size + bson_overhead elsif max_bson_size max_bson_size else nil end 开始 = 缓冲.长度 Serialize_header(缓冲) Serialize_fields(缓冲, max_size) 缓冲.replace_int 32(开始, 缓冲.长度 - 开始) end |
#set_request_id ⇒ Fixnum
生成消息的请求ID
320 321 322 |
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/message.rb', 第320行 def set_request_id @request_id = self.class.next_id end |