Clase: Mongo::Protocol::Msg Privado

Hereda:
Mensaje
  • Objeto
Mostrar todo
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.

Desde:

  • 2.5.0

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.

Desde:

  • 2.5.0

'$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.

Desde:

  • 2.5.0

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

#request_id

Resumen del método de instancia colapsar

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

incluido

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

Ejemplos:

Crea un mensaje del protocolo de conexión OP_MSG

Msg.new([:more_to_come], {}, { hello: 1 },
        { type: 1, payload: { identifier: 'documents', sequence: [..] } })

Parámetros:

  • flags (arreglo<Symbol>)

    Los bits de bandera. Los valores admitidos actualmente son :more_to_come y :checksum_present.

  • opciones (encriptada)

    Las opciones.

  • main_document (BSON::Documento, Hash)

    El documento que se convertirá en la sección de tipo de carga útil 0. Puede contener argumentos globales tal como se definen en la especificación OP_MSG.

  • secuencias (Protocol::Msg::Section1)

    Cero o más secciones de tipo de carga útil 1.

Opciones Hash (options):

  • validating_keys (verdadero, falso)

    Si las claves deben ser validadas para ser claves de documento válidas (es decir, no comience con $ y no contenga puntos). Esta opción está obsoleta y no se utilizará. Se eliminará en la versión 3.0.

Desde:

  • 2.5.0



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, opciones, 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 = opciones
  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.

Nota:

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.

Devuelve:

  • (booleano)

    Si este mensaje representa un guardado masivo.

Desde:

  • 2.5.0



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

#documentosObjeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Desde:

  • 2.5.0



196
197
198
# Archivo 'lib/mongo/protocol/msg.rb', línea 196

def Documentos
  [@main_document]
end

#fix_after_deserializationObject

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.

Desde:

  • 2.5.0



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.

Desde:

  • 2.5.0



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.

Parámetros:

  • compresor (Cadena,Símbolo)

    El compresor a utilizar.

  • zlib_compression_level (Entero) (predeterminado: nulo)

    El nivel de compresión zlib a utilizar.

Devuelve:

  • (Mensaje)

    Un mensaje de Protocolo::Comprimido o propio, dependiendo de si este mensaje se puede comprimir.

Desde:

  • 2.5.0



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.

Parámetros:

Devuelve:

  • (Mongo::Protocol::Msg)

    El mensaje descifrado, o el mensaje original si el descifrado no fue posible o necesario.

Desde:

  • 2.5.0



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.

Parámetros:

Devuelve:

  • (Mongo::Protocol::Msg)

    El mensaje cifrado, o el mensaje original si no fue posible o necesario el cifrado.

Desde:

  • 2.5.0



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_devueltoEntero

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).

Devuelve:

  • (Número entero)

    Número de documentos devueltos.

Aumenta:

  • (NotImplementedError)

Desde:

  • 2.5.0



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 útilBSON::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.

Ejemplos:

Devuelve la carga útil del evento.

message.payload

Devuelve:

  • (BSON::Document)

    La carga útil del evento.

Desde:

  • 2.5.0



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.

Ejemplos:

¿El mensaje requiere una respuesta?

message.replyable?

Devuelve:

  • (verdadero,falso)

    Si el mensaje espera una respuesta.

Desde:

  • 2.5.0



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.

Parámetros:

  • buffer (BSON::ByteBuffer) (por defecto: BSON::ByteBuffer.new)

    donde se debe insertar el mensaje.

  • tamaño máximo de bson (Entero) (predeterminado: nulo)

    El tamaño máximo del objeto bson.

Devuelve:

  • (BSON::ByteBuffer)

    buffer que contiene el mensaje serializado.

Desde:

  • 2.5.0



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