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_array(message, io, campo, options = {}) ➤ Mensagem
privado
Deserializa uma array de campos em uma mensagem.
-
.deserialize_field(message, io, campo, options = {}) ➤ Mensagem
privado
Deserializa um único campo em uma mensagem.
-
.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.
-
#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.
-
#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).
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 277 278 279 280 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 235 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 .enviar(:fields).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_array(message, io, campo, 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 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
382 383 384 385 386 387 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 382 def auto.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(message, io, campo, 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 um único campo em uma mensagem
401 402 403 404 405 406 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 401 def auto.deserialize_field(, io, Campo, = {}) .instance_variable_set( Campo[:name], Campo[:type].desserializar(io, ) ) 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
336 337 338 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 336 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
356 357 358 359 360 361 362 363 364 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 356 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
327 328 329 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 327 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.
287 288 289 290 291 292 293 294 295 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 287 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 |
#hash ➤ Fixnum
Cria um hash a partir dos valores dos campos de uma mensagem.
301 302 303 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 301 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.
175 176 177 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 175 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 153 154 155 156 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 150 def talvez_decrypt(_context) # TODO: determinar se devemos descriptografar dados provenientes da pré-4.2 # servidores, potencialmente usando protocolos de fio legados. Se sim, precisamos # para implementar descriptografia para esses protocolos de fio como nossos atuais # o código de criptografia/descriptografia é específico do OP_MSG. auto end |
#may_encrypt(_connection, _context) ➤ Mongo::Protocol::Msg
Possivelmente, criptografe esta mensagem com libmongocrypt.
166 167 168 169 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 166 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.
319 320 321 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 319 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
200 201 202 203 204 205 206 207 208 209 210 211 212 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 200 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 |
#set_request_id ⇒ Fixnum
Gera uma ID de solicitação para uma mensagem
310 311 312 |
# Arquivo 'lib/mongo/protocol/message.rb', linha 310 def set_request_id @request_id = auto.classe.Next_id end |