123456789_123456789_123456789_123456789_123456789_

Module: Mongo::Collection::QueryableEncryption Private

Do not use. This module is for internal use only.
Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Defined in: lib/mongo/collection/queryable_encryption.rb

Overview

This module contains methods for creating and dropping auxiliary collections for queryable encryption.

Since:

  • 2.0.0

Constant Summary

Instance Method Summary

Instance Method Details

#check_wire_version!(connection) (private)

Creating encrypted collections is only supported on 7.0.0 and later (wire version 21+).

Parameters:

  • connection (Mongo::Connection)

    The connection to check the wire version of.

Raises:

  • (Mongo::Error)

    if the wire version is not recent enough

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/collection/queryable_encryption.rb', line 109

def check_wire_version!(connection)
  return unless connection.description.max_wire_version < QE2_MIN_WIRE_VERSION

  raise Mongo::Error,
        'Driver support of Queryable Encryption is incompatible with server. ' \
        'Upgrade server to use Queryable Encryption.'
end

#create_operation_for(coll) ⇒ Operation::Create (private)

Returns a new create operation for the given collection.

Parameters:

  • coll (String)

    the name of the collection to create.

Returns:

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/collection/queryable_encryption.rb', line 148

def create_operation_for(coll)
  Operation::Create.new(
    selector: {
      create: coll,
      clusteredIndex: {
        key: { _id: 1 },
        unique: true
      }
    },
    db_name: database.name
  )
end

#emm_collections(encrypted_fields) ⇒ Array <String> (private)

Checks if names for auxiliary collections are set and returns them, otherwise returns default names.

Parameters:

  • encrypted_fields (Hash)

    Encrypted fields hash.

Returns:

  • (Array <String>)

    Array of auxiliary collections names.

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/collection/queryable_encryption.rb', line 94

def emm_collections(encrypted_fields)
  [
    encrypted_fields['escCollection'] || "enxcol_.#{name}.esc",
    encrypted_fields['ecocCollection'] || "enxcol_.#{name}.ecoc",
  ]
end

#encrypted_fields_for_drop_from_mapHash | nil (private)

Tries to return the encrypted fields from the {encrypted_fields_map} value, for the current namespace.

Returns:

  • (Hash | nil)

    the encrypted fields, if found

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/collection/queryable_encryption.rb', line 134

def encrypted_fields_for_drop_from_map
  encrypted_fields_map[namespace] ||
    database.list_collections(filter: { name: name })
            .first
            &.fetch(:options, {})
            &.fetch(:encryptedFields, {}) ||
    {}
end

#encrypted_fields_from(fields) ⇒ Hash (private)

Tries to return the encrypted fields from the argument. If the argument is nil, tries to find the encrypted fields from the encrypted_fields_map.

Parameters:

  • fields (Hash | nil)

    the encrypted fields

Returns:

  • (Hash)

    the encrypted fields

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/collection/queryable_encryption.rb', line 124

def encrypted_fields_from(fields)
  fields ||
    (encrypted_fields_map && encrypted_fields_map[namespace]) ||
    {}
end

#maybe_create_qe_collections(encrypted_fields, client, session) ⇒ Result

Creates auxiliary collections and indices for queryable encryption if necessary.

Parameters:

Returns:

  • (Result)

    The result of provided block.

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/collection/queryable_encryption.rb', line 35

def maybe_create_qe_collections(encrypted_fields, client, session)
  encrypted_fields = encrypted_fields_from(encrypted_fields)
  return yield if encrypted_fields.empty?

  server = next_primary(nil, session)
  context = Operation::Context.new(client: client, session: session)
  server.with_connection do |connection|
    check_wire_version!(connection)
    emm_collections(encrypted_fields).each do |coll|
      create_operation_for(coll)
        .execute_with_connection(connection, context: context)
    end
  end

  yield(encrypted_fields).tap do |result|
    indexes.create_one(__safeContent__: 1) if result
  end
end

#maybe_drop_emm_collections(encrypted_fields, client, session) ⇒ Result

Drops auxiliary collections and indices for queryable encryption if necessary.

Parameters:

Returns:

  • (Result)

    The result of provided block.

Since:

  • 2.0.0

[ GitHub ]

  
# File 'lib/mongo/collection/queryable_encryption.rb', line 62

def maybe_drop_emm_collections(encrypted_fields, client, session)
  encrypted_fields = if encrypted_fields
                       encrypted_fields
                     elsif encrypted_fields_map
                       encrypted_fields_for_drop_from_map
                     else
                       {}
                     end

  return yield if encrypted_fields.empty?

  emm_collections(encrypted_fields).each do |coll|
    context = Operation::Context.new(client: client, session: session)
    operation = Operation::Drop.new(
      selector: { drop: coll },
      db_name: database.name,
      session: session
    )
    do_drop(operation, session, context)
  end

  yield
end