Class: Mongo::Protocol::Message Abstract
- Hereda:
-
Objeto
- Objeto
- Mongo::Protocol::Message
- Incluye:
- Id, Serializadores
- Definido en:
- lib/mongo/protocolo/message.rb
Overview
Una clase base que proporciona la funcionalidad requerida por todos los mensajes en el protocolo de conexión de MongoDB. Proporciona un DSL mínimo para definir campos tipados que permitan la serialización y deserialización a través del canal de comunicación.
Subclases conocidas directas
Resumen de constantes colapsar
- BATCH_SIZE =
La constante de tamaño de lote.
'batchSize'- colección =
La constante de colección.
'Colección'- LIMIT =
La constante límite.
'limit'- ORDENADO =
La constante ordenada.
'ordenado'- Q =
La constante q.
'q'- TAMAÑO_MÁXIMO_MENSAJE =
Tamaño máximo de mensaje por defecto de 48MB.
50_331_648
Constantes incluidas de Serializadores
Serializers::HEADER_PACK, Serializers::INT32_PACK, Serializers::INT64_PACK, Serializers::NULL, Serializers::ZERO
Resumen de atributos de la instancia colapsar
-
#request_id ⇒ Fixnum
Solo lectura
Devuelve el ID de la solicitud para el mensaje.
Resumen del método de clase colapsar
-
.deserialize(io, max_message_size = MAX_MESSAGE_SIZE, expected_response_to = nil, options = {}) ⇒ Message
privado
Desserializa mensagens de um fluxo de E/S.
-
.deserialize_array(mensaje, io, campo, opciones = {}) ⇒ Mensaje
privado
Deserializa un arreglo de campos en un mensaje.
-
.deserialize_campo(message, io, campo, options = {}) ⇒ Message
privado
Deserializa un solo campo en un mensaje.
-
.deserialize_header(io) ⇒ Array<Fixnum>
privado
Deserializa la cabecera del mensaje.
-
.campo(name, type, multi = false) ⇒ NilClass
privado
Un método para declarar un campo de mensaje.
-
.campos ⇒ Entero
privado
Un método de clase para obtener los campos de una clase de mensaje.
Resumen del método de instancia colapsar
-
#==(otro) ⇒ true, false (también: #eql?)
Pruebas de igualdad entre dos mensajes de protocolo de conexión comparando valores de clase y campos.
-
#hash ⇒ Fixnum
Crea un hash a partir de los valores de los campos de un mensaje.
-
#inicializar(*_args) ⇒ Mensaje
constructor
:nodoc:.
-
#maybe_add_server_api(server_api) ⇒ Objeto
Las subclases de mensajes de protocolo que admiten la opción de API de servidor deben sobrescribir este método para añadir el documento de API de servidor al mensaje.
-
#quizás_comprimir(_compresor, _nivel_compresión_zlib = nil) ⇒ self
privado
Comprime el mensaje, si es compatible con el protocolo de conexión utilizado y si el comando enviado permite la compresión.
-
#maybe_decrypt(_context) ⇒ Mongo::Protocol::Msg
Posiblemente descifre este mensaje con libmongocrypt.
-
#maybe_encrypt(_connection, _context) ⇒ Mongo::Protocol::Msg
Posiblemente cifrar este mensaje con libmongocrypt.
-
#maybe_inflate ⇒ Protocol::Message
privado
Expande un mensaje si está comprimido.
-
#número_devuelto ⇒ 0
Valor de retorno por defecto para mensajes de protocolo.
-
#¿sePuedeResponder? ⇒ falso
La opción por defecto para los mensajes es no requerir una respuesta después de enviar un mensaje al servidor.
-
#serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ String (también: #to_s)
Serializa el mensaje en bytes que pueden ser enviados a través del cable.
-
#set_request_id ⇒ Fixnum
Genera un id de solicitud para un mensaje.
Métodos incluidos de Id
Detalles del Constructor
#initialize(*_args) ⇒ Mensaje
:nodoc:
77 78 79 |
# Archivo 'lib/mongo/protocol/message.rb', línea 77 def inicializar(*_args) # :nodoc: set_request_id end |
Detalles de atributo de instancias
#request_id ⇒ Fixnum (solo lectura)
Retorna el ID de solicitud para el mensaje
84 85 86 |
# Archivo 'lib/mongo/protocol/message.rb', línea 84 def request_id @request_id end |
Detalles del método de clase
.deserialize(io, max_message_size = MAX_MESSAGE_SIZE, expected_response_to = nil, options = {}) ⇒ Mensaje
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Desserializa mensagens de um fluxo de E/S.
Este método devuelve mensajes descomprimidos (por ejemplo, si el mensaje en la red fue OP_COMPRESSED, este método normalmente devolvería el mensaje OP_MSG que es el resultado de la descompresión).
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 |
# Archivo 'lib/mongo/protocol/message.rb', línea 235 def sí mismo.deserializar(io, = MAX_MESSAGE_SIZE, expected_response_to = nulo, = {}) # io suele ser una instancia de Mongo::Socket, que es compatible con la # opción de tiempo de espera. Por compatibilidad con cualquiera que pueda llamar a esto # método con algún otro objeto similar a IO, pasa opciones solo cuando ellos # no están vacíos. = .rebanada(:timeout, timeout_del_socket) fragmento = si .¿vacío? io.Lea(16) else io.Lea(16, **) end buffer = BSON::ByteBuffer.Nuevo(fragmento) longitud, _request_id, respuesta_a, _op_code = deserialize_header(buffer) # Protección contra posibles ataques de intermediario (MITM) de denegación de servicio (DOS). Ver # DRIVERS-276. propagar Error::MaxMessageSize.Nuevo() si longitud > ( || MAX_MESSAGE_SIZE) # Protección contra devolver la respuesta a una solicitud anterior. Consultá # RUBY-1117 si expected_response_to && respuesta_a != expected_response_to propagar Error::UnexpectedResponse.Nuevo(expected_response_to, respuesta_a) end fragmento = si .¿vacío? io.Lea(longitud - 16) else io.Lea(longitud - 16, **) end buffer = BSON::ByteBuffer.Nuevo(fragmento) = Registro.Obtener(_op_code).asignar .enviar(campo).cada hacer |Campo| si Campo[:multi] deserializar_array(, buffer, Campo, ) else deserialize_field(, buffer, Campo, ) end end .arreglar_después_de_deserialización si .is_a?(Msg) .tal_vez_inflar end |
.deserialize_array(message, io, field, options = {}) ⇒ Mensaje
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Deserializa un arreglo de campos en un mensaje
El número de elementos en el arreglo debe ser descrito por un campo previamente deserializado especificado en la clase mediante el dsl de campo bajo la clave :multi
382 383 384 385 386 387 |
# Archivo 'lib/mongo/protocol/message.rb', línea 382 def sí mismo.deserializar_array(, io, Campo, = {}) elementos = [] count = .instance_variable_get(Campo[:multi]) count.veces { elementos << Campo[Tipo].deserializar(io, ) } .instance_variable_set(Campo[nombre], elementos) end |
.deserialize_field(mensaje, io, campo, opciones = {}) ⇒ Mensaje
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Deserializa una sola campo en un mensaje
401 402 403 404 405 406 |
# Archivo 'lib/mongo/protocol/message.rb', línea 401 def sí mismo.deserialize_field(, io, Campo, = {}) .instance_variable_set( Campo[nombre], Campo[Tipo].deserializar(io, ) ) end |
.deserialize_header(io) ⇒ Array<Fixnum>
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Deserializa el encabezado del mensaje
336 337 338 |
# Archivo 'lib/mongo/protocol/message.rb', línea 336 def sí mismo.deserialize_header(io) Encabezado.deserializar(io) end |
.campo(name, type, multi = false) ⇒ NilClass
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Un método para declarar un campo de mensaje
356 357 358 359 360 361 362 363 364 |
# Archivo 'lib/mongo/protocol/message.rb', línea 356 def sí mismo.Campo(Nombre, tipo, multi = false) Campos << { nombre: :”@#{Nombre}", tipo: tipo, multi: multi } attr_reader Nombre end |
.campos ⇒ entero
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Un método de clase para obtener los campos de una clase de mensaje
327 328 329 |
# Archivo 'lib/mongo/protocol/message.rb', línea 327 def sí mismo.Campos @fields ||= [] end |
Detalles del método de instancia
#==(other) ⇒ verdadero, falso También conocido como: eql?
Pruebas de igualdad entre dos mensajes de protocolo de conexión comparando valores de clase y campos.
287 288 289 290 291 292 293 294 295 |
# Archivo 'lib/mongo/protocol/message.rb', línea 287 def ==(Otros) return false si sí mismo.clase != Otros.clase Campos.¿todos? hacer |Campo| Nombre = Campo[nombre] instance_variable_get(Nombre) == Otros.instance_variable_get(Nombre) end end |
#hash ⇒ Fixnum
Crea un hash a partir de los valores de los campos de un mensaje.
301 302 303 |
# Archivo 'lib/mongo/protocol/message.rb', línea 301 def hash Campos.map { |Campo| instance_variable_get(Campo[nombre]) }.hash end |
#maybe_add_server_api(server_api) ⇒ objeto
Las subclases de mensajes de protocolo que admiten la opción de API de servidor deben sobrescribir este método para añadir el documento de API de servidor al mensaje.
175 176 177 |
# Archivo 'lib/mongo/protocol/message.rb', línea 175 def maybe_add_server_api(server_api) propagar NotImplementedError end |
#maybe_compress(_compressor, _zlib_compression_level = nil) ⇒ self
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Comprime el mensaje, si es compatible con el protocolo de conexión utilizado y si el comando que se envía permite la compresión. En caso contrario, devuelve uno mismo.
110 111 112 |
# Archivo 'lib/mongo/protocol/message.rb', línea 110 def maybe_compress(_compressor, compresión = nulo) sí mismo end |
#maybe_decrypt(_context) ⇒ Mongo::protocolo::Msg
Posiblemente descifre este mensaje con libmongocrypt.
150 151 152 153 154 155 156 |
# Archivo 'lib/mongo/protocol/message.rb', línea 150 def maybe_decrypt(_contexto) # POR HACER: determinar si deberíamos descifrar datos provenientes de antes del4.2 # servidores, potencialmente utilizando protocolos de conexión heredados. Si es así, necesitamos # para implementar descifrado para esos protocolos de conexión como nuestros actuales # El código de cifrado/desencriptación es específico de OP_MSG. sí mismo end |
#maybe_encrypt(_connection, _context) ⇒ Mongo::Protocol::Msg
Posiblemente cifrar este mensaje con libmongocrypt.
166 167 168 169 |
# Archivo 'lib/mongo/protocol/message.rb', línea 166 def maybe_encrypt(_connection, _contexto) # No hacer nada si la subclase Message no ha implementado este método sí mismo end |
#maybe_inflate ⇒ Protocolo::Mensaje
Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.
Expande un mensaje si está comprimido.
140 141 142 |
# Archivo 'lib/mongo/protocol/message.rb', línea 140 def tal_vez_inflar sí mismo end |
#number_returned ⇒ 0
Valor de retorno por defecto para mensajes de protocolo.
319 320 321 |
# Archivo 'lib/mongo/protocol/message.rb', línea 319 def number_returned 0 end |
#replyable? ⇒ false
La opción por defecto para los mensajes es no requerir una respuesta después de enviar un mensaje al servidor.
95 96 97 |
# Archivo 'lib/mongo/protocol/message.rb', línea 95 def ¿respondible? false end |
#serializa(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ String También conocido como: to_s
serializa el mensaje en bytes que pueden enviarse a través de la red
200 201 202 203 204 205 206 207 208 209 210 211 212 |
# Archivo 'lib/mongo/protocol/message.rb', línea 200 def serializar(buffer = BSON::ByteBuffer.Nuevo, tamaño_máximo_bson = nulo, bson_overhead = nulo) max_size = si tamaño_máximo_bson && bson_overhead tamaño_máximo_bson + bson_overhead elsif tamaño_máximo_bson tamaño_máximo_bson end Inicio = buffer.longitud serialize_header(buffer) serializar_campos(buffer, max_size) buffer.reemplazar_int32(Inicio, buffer.longitud - Inicio) end |
#set_request_id ⇒ Fixnum
Genera un id de solicitud para un mensaje
310 311 312 |
# Archivo 'lib/mongo/protocol/message.rb', línea 310 def set_request_id @request_id = sí mismo.clase.next_id end |