You are here

function drush_salesforce_mapping_sf_purge_salesforce in Salesforce Suite 5.0.x

Same name and namespace in other branches
  1. 8.4 modules/salesforce_mapping/salesforce_mapping.drush.inc \drush_salesforce_mapping_sf_purge_salesforce()
  2. 8.3 modules/salesforce_mapping/salesforce_mapping.drush.inc \drush_salesforce_mapping_sf_purge_salesforce()

Support for drush 8 is deprecated and will be removed in a future release.

1 call to drush_salesforce_mapping_sf_purge_salesforce()
drush_salesforce_mapping_sf_purge_all in modules/salesforce_mapping/salesforce_mapping.drush.inc
Support for drush 8 is deprecated and will be removed in a future release.

File

modules/salesforce_mapping/salesforce_mapping.drush.inc, line 152
Drush integration for Salesforce.

Code

function drush_salesforce_mapping_sf_purge_salesforce() {
  _drush_salesforce_deprecated();
  $etm = \Drupal::service('entity_type.manager');
  $client = \Drupal::service('salesforce.client');
  $object_types = _drush_salesforce_mapping_object_types_by_prefix($client);
  $mapped_obj_storage = $etm
    ->getStorage('salesforce_mapped_object');
  $mapped_obj_table = $etm
    ->getDefinition('salesforce_mapped_object')
    ->getBaseTable();
  $query = \Drupal::service('database')
    ->select($mapped_obj_table, 'm');
  $query
    ->addExpression('distinct substr(salesforce_id, 1, 3)');
  $mapping_id = FALSE;
  if ($mapping_id = drush_get_option('mapping')) {
    $query
      ->condition('salesforce_mapping', $mapping_id);
  }
  $sfid_prefixes = $query
    ->execute()
    ->fetchCol();
  foreach ($sfid_prefixes as $prefix) {
    if (empty($object_types[$prefix]['name'])) {
      $mapped_obj_ids = \Drupal::service('database')
        ->select($mapped_obj_table, 'm')
        ->fields('m', [
        'salesforce_id',
        'id',
      ])
        ->condition('salesforce_id', $prefix . '%', 'LIKE')
        ->execute()
        ->fetchAllKeyed();
      if (empty($mapped_obj_ids)) {
        continue;
      }
      drush_log('Unknown object type for Salesforce ID prefix ' . $prefix);
      _drush_salesforce_mapping_confirm_and_delete($mapped_obj_ids, $mapped_obj_storage, 'prefix ' . $prefix);
      continue;
    }
    $query = \Drupal::service('database')
      ->select($mapped_obj_table, 'm')
      ->fields('m', [
      'salesforce_id',
      'id',
    ]);
    if ($mapping_id) {
      $query
        ->condition('salesforce_mapping', $mapping_id);
    }
    else {
      $query
        ->condition('salesforce_id', $prefix . '%', 'LIKE');
    }
    $sfids = $query
      ->execute()
      ->fetchAllKeyed();
    $to_delete = $sfids;

    // SOQL queries are limited to 4000-characters in where statements.
    // Chunkify in case we have more than ~200 sfids.
    foreach (array_chunk($sfids, 200, TRUE) as $chunk) {
      $soql_query = new SelectQuery($object_types[$prefix]['name']);
      $soql_query->fields[] = 'Id';
      $soql_query
        ->addCondition('Id', array_keys($chunk));
      $results = $client
        ->query($soql_query);
      foreach ($results
        ->records() as $record) {
        unset($to_delete[(string) $record
          ->id()]);
      }
    }
    if (empty($to_delete)) {
      drush_log('No orphaned mapped objects found for SObject type ' . $object_types[$prefix]['name'], 'ok');
      continue;
    }
    _drush_salesforce_mapping_confirm_and_delete(array_values($to_delete), $mapped_obj_storage, 'SObject type *' . $object_types[$prefix]['name'] . '*');
  }
}