You are here

function _field_encrypt_field_storage_pre_load in Field Encryption 7

Implements hook_field_storage_pre_load().

1 call to _field_encrypt_field_storage_pre_load()
field_encrypt_field_storage_pre_load in ./field_encrypt.module
Implements hook_field_storage_pre_load().

File

./field_encrypt.inc, line 235
Encryption functionality for the Field encrypt module.

Code

function _field_encrypt_field_storage_pre_load($entity_type, $queried_entities, $age, &$skip_fields, $options) {
  static $field_info = NULL;
  if ($field_info === NULL) {
    $field_info = field_info_field_by_ids();
  }
  foreach ($queried_entities as $entity) {
    list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
    if (is_null($vid)) {
      $vid = $id;
    }
    $default_options = array(
      'default' => FALSE,
      'deleted' => FALSE,
      'language' => NULL,
    );
    $instances = _field_invoke_get_instances($entity_type, $bundle, $default_options);
    foreach ($instances as $instance) {

      // Get the field data.
      $field_id = $instance['field_id'];
      $current_field_info = $field_info[$field_id];

      // Are we encrypting this field?
      if (!isset($current_field_info['settings']['field_encrypt']['encrypt']) || !$current_field_info['settings']['field_encrypt']['encrypt']) {
        continue;
      }
      $field_name = $instance['field_name'];

      // Get the CURRENT or REVISION field table.
      $table = key($current_field_info['storage']['details']['sql'][$age]);

      // We're bypassing usual storage, mark field for skipping.
      $skip_fields[$field_id] = $current_field_info;

      // Now we need to fetch the encrypted data.
      $results = db_select($table, 'r')
        ->fields('r')
        ->condition('r.entity_type', $entity_type)
        ->condition('r.entity_id', $id)
        ->condition('r.revision_id', $vid)
        ->orderBy('r.language', 'ASC')
        ->orderBy('r.delta', 'ASC')
        ->execute()
        ->fetchAll();
      $field_data = array();
      foreach ($results as $result) {
        foreach ($current_field_info['storage']['details']['sql'][$age][$table] as $column => $field) {
          if (isset($result->{$field}) && !empty($result->{$field})) {
            $field_data[$result->language][$result->delta][$column] = !isset($current_field_info['indexes'][$column]) ? field_encrypt_decrypt($result->{$field}) : $result->{$field};
          }
        }
      }
      $entity->{$field_name} = $field_data;
    }
  }
}