Clase: Mongo::Protocolo::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. 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.

Desde:

  • 2.5.0

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.

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 añade a los comandos. Se moverán al final del hash para un mejor registro.

Desde:

  • 2.5.0

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

#id_de_solicitud

Colapso del resumen del método de instancia

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

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:

Crear un mensaje de protocolo de cable 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 (Hash)

    Las opciones.

  • documento principal (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(opciones):

  • validando_claves (verdadero,falso)

    Si las claves deben validarse para que sean claves de documento válidas (es decir, que no comiencen con $ ni contengan 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, 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 = 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.

Nota:

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.

Devuelve:

  • (Booleano)

    Si este mensaje representa una escritura masiva.

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 = @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

#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
  [@documento_principal]
end

#fix_after_deserializationObjeto

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.

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

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

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

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

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

Devuelve:

  • (Entero)

    Número de documentos devueltos.

Aumentos:

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

Ejemplos:

Devuelve la carga útil del evento.

message.payload

Devuelve:

  • (BSON::Documento)

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

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?
  @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.

Parámetros:

  • buffer (BSON::Búfer de bytes) (predeterminado: BSON::ByteBuffer.new)

    donde debe insertarse 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 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