Clase: Mongo::Protocolo::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. Debe evitar usarla siempre que sea posible, ya que podría eliminarse o modificarse 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 en el espacio de nombres
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 del nombre de la base de datos donde 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 añade a los comandos. Se moverán al final del hash para un mejor registro.
Configura.Nuevo(%w($tiempo de clúster $db lsid firma número de transacción)).freeze
Constantes incluidas desde Monitoring::Event::Secure
Monitoreo::Evento::Seguro::COMANDOS REDACTADOS
Constantes heredadas de Message
Mongo::Protocolo::Mensaje::TAMAÑO_DE_LOTE, Mongo::Protocolo::Mensaje::RECOLECCIÓN, Mongo::Protocolo::Mensaje::LÍMITE, Mongo::Protocolo::Mensaje::TAMAÑO_MÁXIMO_DE_MENSAJE, Mongo::Protocolo::Mensaje::ORDENADO, Mongo::Protocolo::Mensaje::Q
Resumen de atributos de instancia
Atributos heredados de Message
Colapso del resumen del método de instancia
-
#escritura masiva? ⇒ Booleano
privada
Si este mensaje representa una escritura masiva.
- #documentos ⇒ Objeto privada
-
#fix_after_deserialization ⇒ Objeto
privada
Rellena de forma inversa las variables de instancia después de que la deserialización establece la variable de instancia @sections en la lista de documentos.
-
#inicializar(banderas, opciones, documento_principal, *secuencias) ⇒ Msg
constructor
privada
Crea un nuevo mensaje de protocolo OP_MSG.
- #perhaps_add_server_api(servidor_api) ⇒ Objeto privada
-
#perhaps_compress(compresor, zlib_compression_level = nil) ⇒ Mensaje
privada
Comprima el mensaje, si el comando que se envía permite la compresión.
-
#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg
privada
Posiblemente descifre este mensaje con libmongocrypt.
-
#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg
privada
Posiblemente cifre este mensaje con libmongocrypt.
-
#número_devuelto ⇒ Entero
privada
Devuelve el número de documentos devueltos desde el servidor.
-
#carga útil ⇒ BSON::Documento
privada
Devuelve la carga útil del evento para su monitoreo.
-
#¿replyable? ⇒ cierto, falso
privada
Si el mensaje espera una respuesta de la base de datos.
-
#serializar(buffer = BSON::ByteBuffer.new, tamaño máximo de bson = nulo, sobrecarga de bson = nulo) ⇒ BSON::ByteBuffer
privada
Serializa el mensaje en bytes que pueden enviarse por cable.
Métodos incluidos en Monitoring::Event::Secure
#compression_allowed?, #redacted, #sensitive?
Métodos heredados de Message
#==, deserializar, deserializar_matriz, deserializar_campo, deserializar_encabezado, campo, campos, #hash, #tal vez_inflar, #establecer_id_de_solicitud
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, , documento principal, *secuencias) Si flags flags.cada hacer |flag| a no ser que BANDERAS CONOCIDAS.key?(flag) propagar ArgumentError, "Banderadesconocida: #{flag.inspect}" end end end @flags = flags || [] @opciones = a no ser que documento principal.is_a?(Picadillo) propagar ArgumentError, "Eldocumento principal debe ser un Hash, dado: #{main_document.class}" end @documento_principal = documento principal secuencias.cada_con_índice hacer |sección, index| a no ser que sección.is_a?(Sección1) propagar ArgumentError, "Todaslas secuencias deben ser instancias de la1 Sección, obtenidas: #{section} en el índice #{index }" end end @secuencias = secuencias @secciones = [ {tipo: 0, carga útil: @documento_principal} ] + @secuencias.map hacer |sección| {tipo: 1, carga útil: { 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 se desarrolló para admitir la funcionalidad de cifrado del lado del cliente. No se recomienda utilizarlo para ninguna otra función o comportamiento.
Si este mensaje representa una escritura masiva. Una escritura masiva es una operación de inserción, actualización o eliminación que abarca varias 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 = @documento_principal['documents'] updates = @documento_principal['updates'] elimina = @documento_principal['deletes'] num_inserts = inserts && inserts.longitud || 0 num_updates = updates && updates.longitud || 0 num_eliminaciones = elimina && elimina.longitud || 0 num_inserts > 1 || num_updates > 1 || num_eliminaciones > 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 [@documento_principal] end |
#fix_after_deserialization ⇒ 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.
Rellena de forma inversa las variables de instancia después de que la deserialización establece la variable de instancia @sections en la lista de documentos.
TODO arreglar 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 @secciones.nil? propagar NotImplementedError, "Despuésde las deserializaciones, @sections debería haberseinicializado" end Si @secciones.longitud != 1 propagar NotImplementedError, "Ladeserialización debe haber producido exactamente una sección, pero produjo #{sections.length} secciones" end @documento_principal = @secciones.primera @secuencias = [] @secciones = [{tipo: 0, carga útil: @documento_principal}] end |
#perhaps_add_server_api(servidor_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 tal vez_agregar_api_del_servidor(API del servidor) conflictos = {} %i(apiVersion API estricta Errores de desuso de API).cada hacer |clave| Si @documento_principal.key?(clave) conflictos[clave] = @documento_principal[clave] end Si @documento_principal.key?(clave.a_s) conflictos[clave] = @documento_principal[clave.a_s] end end a no ser que conflictos.¿vacío? propagar Error::Conflicto de API del servidor, "Elcliente está configurado con la opción: server_api pero la operación proporcionó los siguientes parámetros conflictivos: #{conflicts.inspect }" end documento principal = @documento_principal.unir( Utils.API del servidor de transformación(API del servidor) ) Msg.Nuevo(@flags, @opciones, documento principal, *@secuencias) end |
#perhaps_compress(compresor, 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.
Comprime el mensaje si el comando enviado lo permite. De lo contrario, devuelve "self".
174 175 176 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 174 def tal vez_comprimir(compresor, zlib_compression_level = nulo) comprimir_si_es_posible(Comando.claves.primera, 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 tal vez_descifrar(context) Si context.¿descifrar? cmd = fusionar_secciones enc_cmd = context.desencriptar(cmd) Msg.Nuevo(@flags, @opciones, enc_cmd) else yo 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 cifre este mensaje con libmongocrypt. El mensaje solo se cifrará si el cliente especificado existe, si se le han proporcionado opciones de cifrado automático, si no se le ha indicado que omita el cifrado automático y si mongocryptd determina que este mensaje es apto para cifrado. Un mensaje es apto para cifrado si representa uno de los tipos de comando permitidos por libmongocrypt y contiene datos que deben cifrarse mediante un esquema JSON 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 tal vez_encriptar(conexión, context) # TODO verificar que la compresión ocurra más tarde, es decir, cuando se ejecuta este método # el mensaje no está comprimido. Si context.¿cifrar? Si conexión.Descripción.versión máxima del cable < 8 propagar Error::CryptError.Nuevo( "Nose puede realizar el cifrado contra un servidor MongoDB anterior a" + "4.2 (versión de cable inferior 8 a). 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 4.2 de)" ) end nombre_base_datos = @documento_principal[DATABASE_IDENTIFIER] cmd = fusionar_secciones enc_cmd = context.cifrar(nombre_base_datos, cmd) Si cmd.key?('$db') && !enc_cmd.key?('$db') enc_cmd['$db'] = cmd['$db'] end Msg.Nuevo(@flags, @opciones, enc_cmd) else yo 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 desde el servidor.
La instancia de Msg debe ser para una respuesta del servidor y la respuesta debe devolver un cursor activo (uno recién creado o uno cuya iteración continúa a través de getMore).
311 312 313 314 315 316 317 318 319 320 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 311 def número_devuelto Si doc = Documentos.primera 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::Documento
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 monitoreo.
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 carga útil # Reordenar las claves en main_document para un mejor registro - ver # https://jira.mongodb.org/browse/RUBY-1591. # Tenga en cuenta que incluso sin el reordenamiento, la carga útil no es exacta. # coincide con lo que se envía a través del cable porque el comando se usa en # el evento publicado combina claves de varias secciones del # carga útil enviada a través del cable. ordered_command = {} comando omitido = {} Comando.cada hacer |k, v| Si LLAVES INTERNAS.¿miembro?(k.a_s) comando omitido[k] = v else ordered_command[k] = v end end ordered_command.update(comando omitido) BSON::Documento.Nuevo( nombre_del_comando: ordered_command.claves.primera.a_s, nombre_de_la_base_de_datos: @documento_principal[DATABASE_IDENTIFIER], dominio: ordered_command, id_de_solicitud: id de solicitud, responder: @documento_principal, ) end |
#¿respondible? ⇒ 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? @respondible ||= !flags.¿incluir?(:más por venir) end |
#serializar(buffer = BSON::ByteBuffer.new, tamaño máximo de bson = nulo, sobrecarga de bson = nulo) ⇒ 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 enviarse por cable.
155 156 157 158 159 160 161 |
# Archivo 'lib/mongo/protocol/msg.rb', línea 155 def fabricar en serie(buffer = BSON::Búfer de bytes.Nuevo, tamaño máximo de bson = nulo, bson_overhead = nulo) ¡validar_tamaño_del_documento!(tamaño máximo de bson) Super agregar suma de comprobación(buffer) buffer end |