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
Colapso delresumen constante
- BATCH_SIZE =
La constante de tamaño de lote.
'batchSize'.freeze
- colección =
La constante de colección.
'recopilación '.freeze
- LIMIT =
La constante límite.
'limit'.freeze
- ORDENADO =
La constante ordenada.
'ordenado'.freeze
- Q =
La constante q.
'q'.freeze
- TAMAÑO_MÁXIMO_MENSAJE =
Tamaño máximo de mensaje predeterminado de 48MB.
50331648.freeze
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
-
.deserializar(io, tamaño máximo del mensaje = TAMAÑO MÁXIMO DEL MENSAJE, respuesta esperada a = nula, opciones = {}) ⇒ Mensaje
privado
Desserializa mensagens de um fluxo de E/S.
-
.deserialize_array(message, io, campo, options = {}) ⇒ Mensaje
Deserializa un arreglo de campos en un mensaje.
-
.deserialize_field(mensaje, io, campo, opciones = {}) ⇒ Mensaje
Deserializa un solo campo en un mensaje.
-
.deserialize_header(io) ⇒ arreglo<Fixnum>
Deserializa la cabecera del mensaje.
-
.campo(nombre, tipo, multi = false) ⇒ NilClass
Un método para declarar un campo de mensaje.
-
.campos ⇒ Entero
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.
-
#initialize(*args) ⇒ Message
constructor
:nodoc:.
- #maybe_add_server_api(server_api) ⇒ Objeto
-
#perhaps_compress(compresor, zlib_compression_level = 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 cifre este mensaje con libmongocrypt.
-
#maybe_inflate ⇒ Protocol::Message
privado
Expande un mensaje si está comprimido.
-
#número_devuelto ⇒ 0
Valor devuelto por número predeterminado para los 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
#inicializar(*args) ⇒ Mensaje
:nodoc:
79 80 81 |
# Archivo 'lib/mongo/protocol/message.rb', línea 79 def inicializar(*args) # :nodoc: set_request_id end |
Detalles de los atributos de instancia
#request_id ⇒ Fixnum (solo lectura)
Retorna el ID de solicitud para el mensaje
86 87 88 |
# Archivo 'lib/mongo/protocol/message.rb', línea 86 def id de solicitud @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 forma parte de una API privada. Debe evitarlo 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 (es decir, si el mensaje en el cable era OP_COMPRESSED, este método normalmente devolvería el mensaje OP_MSG que es el resultado de la descompresión).
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 |
# Archivo 'lib/mongo/protocol/message.rb', línea 238 def sí mismo.deserializar(io, = TAMAÑO MÁXIMO DEL MENSAJE, expected_response_to = nulo, = {} ) # io suele ser una instancia de Mongo::Socket, que es compatible con la Opción de tiempo de espera. Para compatibilidad con quienquiera que llame a esto # método con algún otro objeto similar a IO, pasa opciones solo cuando ellos # no están vacíos. = .rebanada(:timeout, :tiempo de espera del socket) si .¿vacío? fragmento = io.Lea(16) else fragmento = io.Lea(16, **) end buf = BSON::ByteBuffer.Nuevo(fragmento) longitud, _request_id, respuesta_a, _op_code = deserialize_header(buf) # Protección contra posibles ataques de intermediario (MITM) de denegación de servicio (DOS). Ver # DRIVERS-276. si longitud > ( || TAMAÑO MÁXIMO DEL MENSAJE) propagar Error::MaxMessageSize.Nuevo() end # 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 si .¿vacío? fragmento = io.Lea(longitud - 16) else fragmento = io.Lea(longitud - 16, **) end buf = BSON::ByteBuffer.Nuevo(fragmento) = Registro.Obtener(_op_code).asignar .enviar(campo).cada hacer |Campo| si Campo[:multi] deserializar_array(, buf, Campo, ) else deserializar_campo(, buf, Campo, ) end end si .is_a?(Msg) .corrección después de la deserialización end .tal_vez_inflar end |
.deserialize_array(message, io, field, options = {}) ⇒ Mensaje
Deserializa un arreglo de campos en un mensaje
El número de elementos en la matriz debe estar descrito por un campo previamente deserializado especificado en la clase por el campo dsl bajo la clave :multi
432 433 434 435 436 437 |
# Archivo 'lib/mongo/protocol/message.rb', línea 432 def sí mismo.deserializar_array(, io, Campo, = {}) elementos = [] count = .obtención de variable de instancia(Campo[:multi]) count.veces { elementos << Campo[Tipo].deserializar(io, ) } .conjunto_de_variables_de_instancia(Campo[nombre], elementos) end |
.deserialize_field(mensaje, io, campo, opciones = {}) ⇒ Mensaje
Deserializa una sola campo en un mensaje
450 451 452 453 454 455 |
# Archivo 'lib/mongo/protocol/message.rb', línea 450 def sí mismo.deserializar_campo(, io, Campo, = {}) .conjunto_de_variables_de_instancia( Campo[nombre], Campo[Tipo].deserializar(io, ) ) end |
.deserialize_header(io) ⇒ Array<Fixnum>
Deserializa el encabezado del mensaje
388 389 390 |
# Archivo 'lib/mongo/protocol/message.rb', línea 388 def sí mismo.deserialize_header(io) Encabezado.deserializar(io) end |
.campo(nombre, tipo, multi = falso) ⇒ NilClass
Un método para declarar un campo de mensaje
407 408 409 410 411 412 413 414 415 |
# Archivo 'lib/mongo/protocol/message.rb', línea 407 def sí mismo.Campo(Nombre, tipo, multi = false) campos << { nombre => "@#{name}".interno, Tipo => tipo, :multi => multi } attr_reader Nombre end |
.campos ⇒ entero
Un método de clase para obtener los campos de una clase de mensaje
340 341 342 |
# Archivo 'lib/mongo/protocol/message.rb', línea 340 def sí mismo.campos @campos ||= [] end |
Detalles del método de instancia
#==(otro) ⇒ verdadero, falso También conocido como: eql?
Pruebas de igualdad entre dos mensajes de protocolo de conexión comparando valores de clase y campos.
295 296 297 298 299 300 301 302 |
# Archivo 'lib/mongo/protocol/message.rb', línea 295 def ==(Otros) return false si sí mismo.clase != Otros.clase campos.¿todos? hacer |Campo| Nombre = Campo[nombre] obtención de variable de instancia(Nombre) == Otros.obtención de variable de instancia(Nombre) end end |
#hash ⇒ Fixnum
Crea un hash a partir de los valores de los campos de un mensaje.
308 309 310 |
# Archivo 'lib/mongo/protocol/message.rb', línea 308 def hash campos.map { |Campo| obtención de variable de instancia(Campo[nombre]) }.hash end |
#maybe_add_server_api(server_api) ⇒ objeto
173 174 175 |
# Archivo 'lib/mongo/protocol/message.rb', línea 173 def maybe_add_server_api(server_api) propagar Error::ServerApiNotSupported, Los parámetros de la API del servidor no se pueden enviar a3.6 servidores MongoDB anteriores a. Elimine el parámetro :server_api de las opciones del cliente o utilice MongoDB 3.6 o una versión posterior. end |
#maybe_compress(compressor, zlib_compression_level = nil) ⇒ self
Este método forma parte de una API privada. Debe evitarlo 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.
112 113 114 |
# Archivo 'lib/mongo/protocol/message.rb', línea 112 def maybe_compress(compresor, zlib_compression_level = nulo) sí mismo end |
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
Posiblemente descifre este mensaje con libmongocrypt.
152 153 154 155 156 157 158 |
# Archivo 'lib/mongo/protocol/message.rb', línea 152 def maybe_decrypt(context) # TODO determinar si deberíamos estar desencriptando datos provenientes de pre-4.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 cifre este mensaje con libmongocrypt.
168 169 170 171 |
# Archivo 'lib/mongo/protocol/message.rb', línea 168 def maybe_encrypt(Conexión, context) # No hacer nada si la subclase Message no ha implementado este método sí mismo end |
#maybe_inflate ⇒ Protocolo::Mensaje
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Expande un mensaje si está comprimido.
142 143 144 |
# Archivo 'lib/mongo/protocol/message.rb', línea 142 def tal_vez_inflar sí mismo end |
#número_devuelto ⇒ 0
Valor devuelto por número predeterminado para los mensajes de protocolo.
326 |
# Archivo 'lib/mongo/protocol/message.rb', línea 326 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.
97 98 99 |
# Archivo 'lib/mongo/protocol/message.rb', línea 97 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
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
# Archivo 'lib/mongo/protocol/message.rb', línea 201 def serializar(buffer = BSON::ByteBuffer.Nuevo, tamaño máximo de bson = nulo, bson_overhead = nulo) tamaño máximo = si tamaño máximo de bson && bson_overhead tamaño máximo de bson + bson_overhead elsif tamaño máximo de bson tamaño máximo de bson else nulo end Inicio = buffer.longitud serializar_encabezado(buffer) campos_serializados(buffer, tamaño máximo) buffer.reemplazar_int32(Inicio, buffer.longitud - Inicio) end |
#set_request_id ⇒ Fixnum
Genera un id de solicitud para un mensaje
317 318 319 |
# Archivo 'lib/mongo/protocol/message.rb', línea 317 def set_request_id @request_id = sí mismo.clase.siguiente_id end |