Class: Mongo::Protocol::Message Abstract
- Herda:
-
Objeto
- Objeto
- Mongo::Protocol::Message
- Inclui:
- ID, Serializadores
- Definido em:
- lib/mongo/protocol/message.rb
Visão geral
Uma classe de base que fornece a funcionalidade exigida por todas as mensagens no protocolo de conexão do MongoDB . Ele fornece um DSL mínimo para definir campos digitados para permitir a serialização e a desserialização pela rede.
Subclasses conhecidas diretas
Colapsode resumo constante
- BATCH_SIZE =
A constante de tamanho do lote .
'batchSize'- collection =
A constante da collection.
'collection'- LIMIT =
O limite constante.
'limit'- ORDENADO =
A constante ordenada.
'encomendado'- Q =
A constante q.
'q'- MAX_MSSAGE_SIZE =
Tamanho máximo padrão da mensagem de 48MB.
50_331_648
Constantes incluídas dos serializadores
Serializadores::HEADER_PACK, Serializadores::INT32_PACK, Serializadores::INT64_PACK, Serializadores::NULL, Serializadores::Zero
Recolhimento do Resumo do atributo de instância
-
#request_id ⇒ Fixnum
Somente leitura
Retorna a ID de solicitação da mensagem.
Recolhimento do Resumo do método de classe
-
.deserialize(io, max_message_size = MAX_message_SIZE, expected_response_to = nil, options = {}) ➤ Mensagem
privado
Deserializa mensagens de um fluxo IO.
-
.deserialize_header(io) ➤ Array<Fixnum>
privado
Deserializa o cabeçalho da mensagem.
-
.campo(name, type, multi = false) ➤NilClass
privado
Um método para declarar um campo de mensagem.
-
.campos ➤ Inteiro
privado
Um método de classe para obter os campos para uma classe de mensagem.
Recolhimento do Resumo do método de instância
-
#==(outros) ➤ verdadeiro, falso (também: #eql?)
Testa a igualdade entre duas mensagens de protocolo de fio comparando valores de classe e campo.
-
#deserialize_array(io, campo, options = {}) ⇒ Array
privado
Deserializa uma array de campos em uma mensagem.
-
#deserialize_field(io, campo, options = {}) ⇒ Objeto
privado
Deserializa um único campo nesta mensagem.
-
#campo ⇒ Array<Hash>
privado
Um método para obter os campos para uma classe de mensagem.
-
#hash ⇒ Fixnum
Cria um hash a partir dos valores dos campos de uma mensagem.
-
#initialize(*_args) ➤ Mensagem
construtor
:nodoc:.
-
#may_add_server_api(server_api) ➤ Objeto
As subclasses de mensagens de protocolo que suportam a opção api do servidor devem substituir esse método para adicionar o documento da api do servidor à mensagem.
-
#may_compress(_compressor, _zlib_compression_level = nil) ➤ self
privado
Compacte a mensagem, se suportado pelo protocolo de fio usado e se o comando que está sendo enviado permitir a compactação.
-
#may_decrypt(_context) ➤ Mongo::Protocol::Msg
Possivelmente descriptografe esta mensagem com libmongocrypt.
-
#may_encrypt(_connection, _context) ➤ Mongo::Protocol::Msg
Possivelmente, criptografe esta mensagem com libmongocrypt.
-
#maybe_inflate ⇒ Protocol::Message
privado
Infle uma mensagem se ela for comprimida.
-
#number_returned ⇒ 0
Valor retornado número padrão para mensagens de protocolo.
-
#respondível? ➤ false
O padrão para mensagens não é exigir uma resposta após enviar uma mensagem para o servidor.
-
#serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ➤ string (também: #to_s)
Serializa a mensagem em bytes que podem ser enviados na transferência.
-
#serialize_fields(buffer, max_bson_size = nil) ⇒ String
privado
Serializa campos de mensagem em um buffer.
-
#set_request_id ⇒ Fixnum
Gera um ID de solicitação para uma mensagem.
Métodos incluídos do ID
Detalhes do construtor
#initialize(*_args) ➤ Mensagem
:nodoc:
77 78 79 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 77 def inicializar(*_args) # :nodoc: set_request_id end |
Detalhes do atributo da instância
#request_id ➤ Fixnum (somente leitura)
Retorna a ID de solicitação da mensagem
84 85 86 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 84 def request_id @request_id end |
Detalhes do método de classe
.deserialize(io, max_message_size = MAX_message_SIZE, expected_response_to = nil, options = {}) ➤ Mensagem
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Deserializa mensagens de um fluxo IO.
Esse método retorna mensagens descompactadas (ou seja, se a mensagem no fio fosse OP_COMPRESSED, esse método normalmente retornaria a mensagem OP_MSG que é o resultado da descompactação).
231 232 233 234 235 236 237 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 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 231 def auto.desserializar(io, = MAX_message_SIZE, expected_response_to = nada, = {}) # io geralmente é uma instância Mongo::Socket, que suporta o # opção de tempo limite. Para compatibilidade com quem pode chamar isso método # com algum outro objeto semelhante a IO , passe opções somente quando elas # não estão vazios. = .fatia(:timeout, :socket_timeout) chunk = se .vazio? io.ler(16) mais io.ler(16, **) end buffer = BSON::ByteBuffer.Novo(chunk) Tamanho, _request_id, response_to, _op_code = deserialize_header(buffer) # Proteção contra possíveis ataques do tipo man-in-the-middle do OS. Ver # DRIVER-276. aumentar Erro::MaxMessageSize.Novo() se Tamanho > ( || MAX_message_SIZE) # Proteção contra o retorno da resposta a uma solicitação anterior. Ver # RUBI-1117 se expected_response_to && response_to != expected_response_to aumentar Erro::Resposta inesperada.Novo(expected_response_to, response_to) end chunk = se .vazio? io.ler(Tamanho - 16) mais io.ler(Tamanho - 16, **) end buffer = BSON::ByteBuffer.Novo(chunk) = Registro.obter(_op_code).alocar .Campos.cada fazer |Campo| se Campo[:multi] .deserialize_array(buffer, Campo, ) mais .deserialize_field(buffer, Campo, ) end end .Fix_after_deserialization se .is_a?(Msg) .talvez_inflate end |
.deserialize_header(io) ➤ Array<Fixnum>
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Deserializa o cabeçalho da mensagem
332 333 334 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 332 def auto.deserialize_header(io) Cabeçalho.desserializar(io) end |
.campo(name, type, multi = false) ➤ NilClass
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Um método para declarar um campo de mensagem
352 353 354 355 356 357 358 359 360 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 352 def auto.Campo(name, type, multi = false) Campos << { nome: :"@#{name}", tipo: type, multi: multi } attr_reader name end |
.campos ➤ Inteiro
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Um método de classe para obter os campos para uma classe de mensagem
323 324 325 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 323 def auto.Campos @fields ||= [] end |
Detalhes do método de instância
#==(outro) ➤ true, false Também conhecido como: eql?
Testa a igualdade entre duas mensagens de protocolo de fio comparando valores de classe e campo.
283 284 285 286 287 288 289 290 291 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 283 def ==(Outro) Método false se auto.classe != Outro.classe Campos.todos? fazer |Campo| name = Campo[:name] instance_variable_get(name) == Outro.instance_variable_get(name) end end |
#deserialize_array(io, campo, options = {}) ⇒ Array
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Deserializa uma array de campos em uma mensagem
O número de itens na array deve ser descrito por um campo desserializado anteriormente especificado na classe pelo campo dsl na chave :multi
377 378 379 380 381 382 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 377 def deserialize_array(io, Campo, = {}) Elementos = [] contar = instance_variable_get(Campo[:multi]) contar.vezes { Elementos << Campo[:type].desserializar(io, ) } instance_variable_set(Campo[:name], Elementos) end |
#deserialize_field(io, campo, options = {}) ⇒ Objeto
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Deserializa um único campo nesta mensagem.
395 396 397 398 399 400 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 395 def deserialize_field(io, Campo, = {}) instance_variable_set( Campo[:name], Campo[:type].desserializar(io, ) ) end |
#campo ⇒ Array<Hash>
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Um método para obter os campos para uma classe de mensagem
406 407 408 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 406 def Campos auto.classe.Campos end |
#hash ➤ Fixnum
Cria um hash a partir dos valores dos campos de uma mensagem.
297 298 299 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 297 def hash Campos.map { |Campo| instance_variable_get(Campo[:name]) }.hash end |
#may_add_server_api(server_api) ➤ Objeto
As subclasses de mensagens de protocolo que suportam a opção api do servidor devem substituir esse método para adicionar o documento da api do servidor à mensagem.
171 172 173 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 171 def talvez_add_server_api(server_api) aumentar NotImplementedError end |
#may_compress(_compressor, _zlib_compression_level = nil) ➤ self
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Compacte a mensagem, se suportado pelo protocolo de conexão usado e se o comando que está sendo enviado permitir a compactação. Caso contrário, retorna auto.
110 111 112 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 110 def talvez_compress(_compressor, compactação = nada) auto end |
#may_decrypt(_context) ➤ Mongo::Protocol::Msg
Possivelmente descriptografe esta mensagem com libmongocrypt.
150 151 152 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 150 def talvez_decrypt(_context) auto end |
#may_encrypt(_connection, _context) ➤ Mongo::Protocol::Msg
Possivelmente, criptografe esta mensagem com libmongocrypt.
162 163 164 165 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 162 def talvez_encrypt(_connection, _context) # Não faça nada se a subclasse Mensagem não tiver implementado este método auto end |
#may_inflate ➤ Protocol::Message
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Infle uma mensagem se ela for comprimida.
140 141 142 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 140 def talvez_inflate auto end |
#number_returned ⇒ 0
Valor retornado número padrão para mensagens de protocolo.
315 316 317 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 315 def number_returned 0 end |
#respondível? ➤ false
O padrão para mensagens não é exigir uma resposta após enviar uma mensagem para o servidor.
95 96 97 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 95 def respondível? false end |
#serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ➤ string Também conhecido como: to_s
Serializa mensagem em bytes que podem ser enviados no fio
196 197 198 199 200 201 202 203 204 205 206 207 208 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 196 def serializar(buffer = BSON::ByteBuffer.Novo, max_bson_size = nada, bson_overhead = nada) max_size = se max_bson_size && bson_overhead max_bson_size + bson_overhead elsif max_bson_size max_bson_size end iniciar = buffer.Tamanho serialize_header(buffer) serialize_fields(buffer, max_size) buffer.replace_int32(iniciar, buffer.Tamanho - iniciar) end |
#serialize_fields(buffer, max_bson_size = nil) ⇒ String
Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.
Serializa os campos de mensagem em um buffer
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 415 def serialize_fields(buffer, max_bson_size = nada) Campos.cada fazer |Campo| valor = instance_variable_get(Campo[:name]) se Campo[:multi] valor.cada fazer |item| se Campo[:type].respond_to?(:size_limited?) Campo[:type].serializar(buffer, item, max_bson_size) mais Campo[:type].serializar(buffer, item) end end elsif Campo[:type].respond_to?(:size_limited?) Campo[:type].serializar(buffer, valor, max_bson_size) mais Campo[:type].serializar(buffer, valor) end end end |
#set_request_id ⇒ Fixnum
Gera uma ID de solicitação para uma mensagem
306 307 308 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 306 def set_request_id @request_id = auto.classe.Next_id end |