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 de protocolo Wire de MongoDB (OP_MSG), un código de operación de protocolo Wire bidireccional.
OP_MSG solo está disponible en MongoDB 3.6 (maxWireVersion >= 6) y versiones posteriores.
Definido bajo Namespace
Clases: Sección1
Colapso delresumen constante
- DATABASE_IDENTIFIER =
Esta constante forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse en el futuro.
El identificador para el nombre de la base de datos en la que se ejecutará el comando.
'$db'.freeze
- CLAVES_INTERNAS =
Esta constante forma parte de una API privada. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse 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 desde Monitoring::Event::Secure
Monitoreo::Evento::Seguro::COMANDOS REDACTADOS
Constantes heredadas de Message
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
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.
-
#inicializar(banderas, opciones, documento_principal, *secuencias) ⇒ Msg
constructor
privado
Crea un nuevo mensaje de protocolo OP_MSG.
- #perhaps_add_server_api(servidor_api) ⇒ Objeto privado
-
#perhaps_compress(compresor, zlib_compression_level = nil) ⇒ Mensaje
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 cifre 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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Crea un nuevo mensaje de protocolo OP_MSG
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 94 95 96 97 98 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 66 def inicializar(flags, , main_document, *secuencias) si flags flags.cada hacer |flag| a menos que KNOWN_FLAGS.key?(flag) propagar ArgumentError, "Bandera desconocida: #{flag.inspect}" end end end @flags = flags || [] @options = a menos que main_document.is_a?(Picadillo) propagar ArgumentError, "Eldocumento principal debe ser un Hash, dado: #{main_document.class}" end @main_document = main_document secuencias.cada_con_índice 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| Hash de almacenamiento en caché.Nuevo(doc) end, }} end @request_id = nulo super end |
Detalles del método de instancia
#escritura masiva? ⇒ Booleano
Este método forma parte de una API privada. Debe evitarlo 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.
272 273 274 275 276 277 278 279 280 281 282 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 272 def ¿escritura masiva? 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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
196 197 198 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 196 def Documentos [@main_document] end |
#fix_after_deserialization ⇒ Object
Este método forma parte de una API privada. Debe evitarlo 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.
184 185 186 187 188 189 190 191 192 193 194 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 184 def corrección después de la deserialización si @sections.nil? propagar NotImplementedError, "Despuésde las deserializaciones, @sections debería haberseinicializado" end 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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 284 def maybe_add_server_api(server_api) conflictos = {} %i(apiVersion apiStrict apiDeprecationErrors).cada hacer |llave| si @main_document.key?(llave) conflictos[llave] = @main_document[llave] end si @main_document.key?(llave.to_s) conflictos[llave] = @main_document[llave.to_s] end 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 forma parte de una API privada. Debe evitarlo 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.
174 175 176 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 174 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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Posiblemente descifre este mensaje con libmongocrypt. El mensaje solo se descifrará si el cliente especificado existe, si se le han asignado opciones de cifrado automático y si el mensaje es apto para el descifrado. Un mensaje es apto para el descifrado si representa uno de los tipos de comando permitidos por libmongocrypt y contiene datos que deben cifrarse mediante un esquema JSON local o remoto.
251 252 253 254 255 256 257 258 259 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 251 def maybe_decrypt(context) si context.¿descifrar? cmd = fusionar_secciones 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 forma parte de una API privada. Debe evitarlo 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.
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 214 def maybe_encrypt(Conexión, context) # Revisar que la compresión ocurra posteriormente, es decir, cuando se ejecute este método # el mensaje no está comprimido. si context.cifrado? si Conexión.Descripción.max_wire_version < 8 propagar Error::CryptError.Nuevo( "No se puede realizar el cifrado con un servidor MongoDB anterior a " + "4.2 (versión por cable menor que 8). Actualmente conectado al servidor " + "con versión máxima de transmisión #{connection.description.max_wire_version}} " + "(El cifrado automático requiere una versión mínima de MongoDB de 4.2)" ) end db_name = @main_document[DATABASE_IDENTIFIER] cmd = fusionar_secciones enc_cmd = context.cifrado(db_name, cmd) si cmd.key?('$db') && !enc_cmd.key?('$db') enc_cmd['$db'] = cmd['$db'] end Msg.Nuevo(@flags, @options, enc_cmd) else sí mismo end end |
#número_devuelto ⇒ Entero
Este método forma parte de una API privada. Debe evitarlo 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).
311 312 313 314 315 316 317 318 319 320 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 311 def number_returned si doc = Documentos.primero si cursor = doc['cursor'] si lote = cursor['primer lote '] || cursor['nextBatch'] return lote.longitud end end end propagar NotImplementedError, "number_returnedsolo se define para las respuestas delcursor" end |
#carga útil ⇒ BSON::Document
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Devuelve la carga útil del evento para su supervisión.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 120 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 LLAVES INTERNAS.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: id de solicitud, responder: @main_document, ) end |
#¿se puede responder? ⇒ verdadero, falso
Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.
Si el mensaje espera una respuesta de la base de datos.
108 109 110 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 108 def ¿respondible? @replyable ||= !flags.incluir?(:más por venir) end |
#serializa(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ BSON::ByteBuffer
Este método forma parte de una API privada. Debe evitarlo 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.
155 156 157 158 159 160 161 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 155 def serializar(buffer = BSON::ByteBuffer.Nuevo, tamaño máximo de bson = nulo, bson_overhead = nulo) validate_document_size! (validate_document_size!)(tamaño máximo de bson) super add_check_sum(buffer) buffer end |