Clase: Mongo::Protocol::Msg Privado
- Hereda:
-
Mensaje
- Objeto
- Mensaje
- Mongo::Protocol::Msg
- Incluye:
- supervisión::evento::Secure
- Definido en:
- lib/mongo/protocol/msg.rb
Overview
Esta clase forma parte de una API privada. Evita usar esta clase si es posible, ya que puede ser eliminada o modificada en el futuro.
Mensaje Msg del protocolo de conexión de MongoDB (OP_MSG), un código de operación del protocolo de conexión bidireccional.
Definido bajo Namespace
clase: Sección1
Resumen de constantes colapsar
- DATABASE_IDENTIFIER =
Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.
El identificador para el nombre de la base de datos en la que se ejecutará el comando.
'$db'- CLAVES INTERNAS =
Esta constante es parte de una API privada. Deberías evitar usar esta constante si es posible, ya que podría ser retirada o cambiada en el futuro.
Claves que el controlador agrega a los comandos. Estos van a ser movidos al final del hash para mejorar el registro de logs.
Configura.Nuevo(%w[$clusterTime $db lsid firma txnNumber]).freeze
Constantes incluidas de supervisión::evento::Secure
Supervisión::Evento::Seguro::COMANDOS_REDACTADOS
Constantes heredadas de Mensaje
Mongo::Protocolo::Message::BATCH_SIZE, Mongo::Protocolo::Message::COLLECTION, Mongo::Protocolo::Message::LIMIT, Mongo::Protocolo::Message::MAX_MESSAGE_SIZE, Mongo::Protocolo::Message::ORDERED, Mongo::Protocolo::Message::Q
Constantes incluidas de Serializadores
Serializers::HEADER_PACK, Serializers::INT32_PACK, Serializers::INT64_PACK, Serializers::NULL, Serializers::ZERO
Resumen del atributo de la instancia
Atributos heredados de Mensaje
Resumen del método de instancia colapsar
-
#bulk_write? ⇒ booleano
privado
Si este mensaje representa un guardado masivo.
- #documentos ⇒ Object privado
-
#fix_after_deserialization ⇒ Objeto
privado
Rellenar de forma inversa las variables de instancia después de que la deserialización haya establecido la variable de instancia @sections en la lista de documentos.
-
#initialize(flags, options, main_document, *sequences) ⇒ Msg
constructor
privado
Crea un nuevo mensaje de protocolo OP_MSG.
- #maybe_add_server_api(server_api) ⇒ Object privado
-
#maybe_compress(compressor, zlib_compression_level = nil) ⇒ Message
privado
Comprime el mensaje, si el comando que se envía permite la compresión.
-
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
privado
Posiblemente descifre este mensaje con libmongocrypt.
-
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
privado
Posiblemente cifrar este mensaje con libmongocrypt.
-
#número_devuelto ⇒ Entero
privado
Devuelve el número de documentos devueltos por el servidor.
-
#payload ⇒ BSON::Document
privado
Devuelve la carga útil del evento para su supervisión.
-
#¿replyable? ⇒ cierto, falso
privado
Si el mensaje espera una respuesta de la base de datos.
-
#serializa(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ BSON::ByteBuffer
privado
Serializa el mensaje en bytes que pueden ser enviados a través del cable.
Métodos incluidos de supervisión::evento::Secure
#compression_allowed?, #redacted, #sensitive?
Métodos heredados de Mensaje
#==, deserialize, deserialize_array, deserialize_field, deserialize_header, campo, fields, #hash, #maybe_inflate, #set_request_id
Métodos incluidos de Id
Detalles del Constructor
#inicializar(flags, opciones, main_document, *sequences) ⇒ Msg
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.
Crea un nuevo mensaje de protocolo OP_MSG
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 62 def inicializar(flags, , main_document, *secuencias) si flags flags.cada hacer |flag| propagar ArgumentError, "Bandera desconocida: #{flag.inspect}" a menos que KNOWN_FLAGS.key?(flag) end end @flags = flags || [] @options = a menos que main_document.is_a?(encriptada) propagar ArgumentError, "El documento principal debe ser un Hash, dado: #{main_document.class}" end @main_document = main_document secuencias.each_with_index hacer |sección, index| a menos que sección.is_a?(Sección1) propagar ArgumentError, "Todas las secuencias deben ser instancias de Section1, obtenido: #{section} en el índice #{index}" end end @sequences = secuencias @sections = [ { tipo: 0, contenido: @main_document } ] + @sequences.map hacer |sección| { tipo: 1, contenido: { identifier: sección.identifier, secuencia: sección.Documentos.map hacer |doc| CachingHash.Nuevo(doc) end, } } end @request_id = nulo super end |
Detalles del método de instancia
#bulk_write? ⇒ booleano
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.
Este método fue escrito para admitir la funcionalidad de cifrado del lado del cliente. No se recomienda que este método se utilice para ninguna otra funcionalidad o comportamiento.
Si este mensaje representa un guardado masivo. Un guardado masivo es una operación de inserción, actualización o eliminación que abarca múltiples operaciones del mismo tipo.
264 265 266 267 268 269 270 271 272 273 274 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 264 def bulk_write? inserts = @main_document['documents'] updates = @main_document['updates'] borrar = @main_document['deletes'] num_inserts = (inserts && inserts.longitud) || 0 num_updates = (updates && updates.longitud) || 0 num_borrados = (borrar && borrar.longitud) || 0 num_inserts > 1 || num_updates > 1 || num_borrados > 1 end |
#documentos ⇒ Objeto
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.
192 193 194 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 192 def Documentos [ @main_document ] end |
#fix_after_deserialization ⇒ Object
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.
Rellenar de forma inversa las variables de instancia después de que la deserialización haya establecido la variable de instancia @sections en la lista de documentos.
AÚN POR HACER: corregir la deserialización para que este método no sea necesario.
179 180 181 182 183 184 185 186 187 188 189 190 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 179 def arreglar_después_de_deserialización propagar NotImplementedError, 'Después de las deserializaciones, @sections debería haberse inicializado' si @sections.nil? si @sections.longitud != 1 propagar NotImplementedError, "La deserialización debe haber producido exactamente una sección, pero produjo #{sections.length} secciones" end @main_document = @sections.primero @sequences = [] @sections = [ { tipo: 0, contenido: @main_document } ] end |
#maybe_add_server_api(server_api) ⇒ objeto
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.
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 276 def maybe_add_server_api(server_api) conflictos = {} %i[apiVersion apiStrict apiDeprecationErrors].cada hacer |llave| conflictos[llave] = @main_document[llave] si @main_document.key?(llave) conflictos[llave] = @main_document[llave.to_s] si @main_document.key?(llave.to_s) end a menos que conflictos.¿vacío? propagar Error::ServerApiConflict, "El Cliente está configurado con la opción :server_api, pero la operación proporcionó los siguientes parámetros conflictivos: #{conflictos.inspeccionar}" end main_document = @main_document.fusionar( Utils.transform_server_api(server_api) ) Msg.Nuevo(@flags, @options, main_document, *@sequences) end |
#maybe_compress(compressor, zlib_compression_level = nil) ⇒ 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.
Comprima el mensaje si el comando que se envía permite la compresión. En caso contrario, devuelve uno mismo.
169 170 171 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 169 def maybe_compress(compresor, zlib_compression_level = nulo) compress_if_possible(Comando.claves.primero, compresor, zlib_compression_level) end |
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
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.
Posiblemente descifre este mensaje con libmongocrypt. El mensaje sólo se descifrará si el cliente especificado existe, se le han dado opciones de cifrado automático y este mensaje es elegible para ser descifrado. Un mensaje es elegible para descifrado si representa uno de los tipos de comando permitidos por libmongocrypt y contiene datos que deben cifrarse según un JSON schema local o remoto.
243 244 245 246 247 248 249 250 251 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 243 def maybe_decrypt(context) si context.¿descifrar? cmd = merge_sections enc_cmd = context.descifrar(cmd) Msg.Nuevo(@flags, @options, enc_cmd) else sí mismo end end |
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
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.
Posiblemente encriptar este mensaje con libmongocrypt. El mensaje solo se cifrará si existe el cliente especificado, ese cliente ha recibido opciones de cifrado automático, no se ha indicado al cliente que omita el cifrado automático y mongocryptd determina que este mensaje es elegible para el cifrado. Un mensaje es elegible para cifrado si representa uno de los tipos de comandos permitidos por libmongocrypt y contiene datos que deben ser cifrados por un JSON schema local o remoto.
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 210 def maybe_encrypt(Conexión, context) si context.cifrado? si Conexión.Descripción.max_wire_version < 8 propagar Error::CryptError.Nuevo( 'No se puede realizar cifrado contra un servidor de MongoDB anterior a ' + '4.2 (versión cableada inferior a 8). Actualmente conectado al servidor ' + "con versión máxima de transmisión #{connection.description.max_wire_version}} " + '(El cifrado automático requiere la versión mínima de MongoDB 4.2)' ) end db_name = @main_document[DATABASE_IDENTIFIER] cmd = merge_sections enc_cmd = context.cifrado(db_name, cmd) enc_cmd['$db'] = cmd['$db'] si cmd.key?('$db') && !enc_cmd.key?('$db') Msg.Nuevo(@flags, @options, enc_cmd) else sí mismo end end |
#number_returned ⇒ 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.
Devuelve el número de documentos devueltos por el servidor.
La instancia de Msg debe ser para una respuesta del servidor y esta debe devolver un cursor activo (ya sea uno recién creado o uno cuya iteración continúa mediante getMore).
300 301 302 303 304 305 306 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 300 def number_returned si (doc = Documentos.primero) && (cursor = doc['cursor']) && (agrupar = cursor['firstBatch'] || cursor['nextBatch']) return agrupar.longitud end propagar NotImplementedError, 'number_returned solo está definido para respuestas de cursor' end |
#carga útil ⇒ BSON::Document
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.
Devuelve la carga útil del evento para su supervisión.
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 115 def payload # Reordenar las claves en main_document para mejorar el registro: consulta # https://jira.mongodb.org/browse/RUBY-1591. # Tenga en cuenta que incluso sin el reordenamiento, la carga útil no es una exacta # coincida con lo que se envía por cable porque el comando tal como se utiliza en # el evento publicado combina claves de varias secciones del # carga útil enviada a través de la red. ordered_command = {} comando_omitido = {} Comando.cada hacer |k, v| si INTERNAL_KEYS.nodo?(k.to_s) comando_omitido[k] = v else ordered_command[k] = v end end ordered_command.update(comando_omitido) BSON::Documento.Nuevo( command_name: ordered_command.claves.primero.to_s, base_de_datos_nombre: @main_document[DATABASE_IDENTIFIER], comando: ordered_command, request_id: request_id, responder: @main_document ) end |
#¿se puede responder? ⇒ verdadero, falso
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.
Si el mensaje espera una respuesta de la base de datos.
103 104 105 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 103 def ¿respondible? @replyable ||= !flags.incluir?(…y más por venir) end |
#serializa(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ BSON::ByteBuffer
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.
Serializa el mensaje en bytes que pueden ser enviados a través del cable.
150 151 152 153 154 155 156 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 150 def serializar(buffer = BSON::ByteBuffer.Nuevo, tamaño_máximo_bson = nulo, bson_overhead = nulo) validate_document_size! (validate_document_size!)(tamaño_máximo_bson) super add_check_sum(buffer) buffer end |