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 Msg del protocolo de conexión de MongoDB (OP_MSG), un código de operación del protocolo de conexión bidireccional.

Desde:

  • 2.5.0

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.

Desde:

  • 2.5.0

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

Desde:

  • 2.5.0

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

#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 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

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 la bandera. Los valores actualmente compatibles 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



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

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



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

#documentosObjeto

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.

Desde:

  • 2.5.0



192
193
194
# Archivo 'lib/mongo/protocol/msg.rb', línea 192

def Documentos
  [ @main_document ]
end

#fix_after_deserializationObject

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.

Aumenta:

  • (NotImplementedError)

Desde:

  • 2.5.0



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.

Desde:

  • 2.5.0



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.

Parámetros:

  • compresor (String, Símbolo)

    El compresor a utilizar.

  • zlib_compression_level (Integer) (valor por defecto: nil)

    El nivel de compresión de zlib que se debe usar.

Devuelve:

  • (Mensaje)

    Un mensaje Protocol::Compressed o self, dependiendo de si este mensaje puede comprimirse.

Desde:

  • 2.5.0



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.

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



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.

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



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_returnedEntero

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

Devuelve:

  • (Número entero)

    Número de documentos devueltos.

Aumenta:

  • (NotImplementedError)

Desde:

  • 2.5.0



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

Ejemplos:

Devuelve la carga útil del evento.

message.payload

Devuelve:

  • (BSON::Document)

    La carga útil del evento.

Desde:

  • 2.5.0



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.

Ejemplos:

¿El mensaje requiere una respuesta?

message.replyable?

Devuelve:

  • (true, false)

    Si el mensaje espera una respuesta.

Desde:

  • 2.5.0



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.

Parámetros:

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

    donde se debe insertar el mensaje.

  • tamaño_máximo_bson (Integer) (valor por defecto: nil)

    El tamaño máximo del objeto BSON.

Devuelve:

  • (BSON::ByteBuffer)

    buffer que contiene el mensaje serializado.

Desde:

  • 2.5.0



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