diff --git a/plugins/FeedsNodeProcessor.inc b/plugins/FeedsNodeProcessor.inc index 45eda88c74790c90e8d69bcf5a39908bb1e1175b..13679736f609086683000285ea238d97f578c44e 100644 --- a/plugins/FeedsNodeProcessor.inc +++ b/plugins/FeedsNodeProcessor.inc @@ -82,33 +82,48 @@ class FeedsNodeProcessor extends FeedsProcessor { */ public function clear(FeedsSource $source) { $state = $source->state(FEEDS_PROCESS_CLEAR); - if (empty($state->total)) { - $state->total = db_query("SELECT COUNT(n.nid) FROM {node} n JOIN {feeds_item} fi ON fi.entity_type = 'node' AND n.nid = fi.entity_id WHERE fi.id = :id AND fi.feed_nid = :nid", array(':id' => $source->id, ':nid' => $source->feed_nid))->fetchField(); + + // Build base select statement. + $select = db_select('node', 'n'); + $select->addField('n', 'nid'); + $select->join('feeds_item', 'fi', "n.nid = fi.entity_id AND fi.entity_type = 'node'"); + $select->condition('fi.id', $this->id); + $select->condition('fi.feed_nid', $source->feed_nid); + + // If there is no total, query it. + if (!$state->total) { + $state->total = $select->countQuery() + ->execute() + ->fetchField(); } - $count = $this->getLimit(); + + // Delete a batch of items. + $nodes = $select->range(0, $this->getLimit())->execute(); $nids = array(); - $nodes = db_query_range("SELECT n.nid FROM {node} n JOIN {feeds_item} fi ON fi.entity_type = 'node' AND n.nid = fi.entity_id WHERE fi.id = :id AND fi.feed_nid = :nid", 0, $count, array(':id' => $source->id, ':nid' => $source->feed_nid)); foreach ($nodes as $node) { $nids[$node->nid] = $node->nid; - $state->deleted++; } node_delete_multiple($nids); - if (db_query_range("SELECT 1 FROM {node} n JOIN {feeds_item} fi ON fi.entity_type = 'node' AND n.nid = fi.entity_id WHERE fi.id = :id AND fi.feed_nid = :nid", 0, 1, array(':id' => $source->id, ':nid' => $source->feed_nid))->fetchField()) { - $state->progress($state->total, $state->deleted); - return; - } - // Set message. - drupal_get_messages('status'); - if ($state->deleted) { - drupal_set_message(format_plural($state->deleted, 'Deleted @number node.', 'Deleted @number nodes.', array('@number' => $state->deleted))); + // Report progress, take into account that we may not have deleted as + // many items as we have counted at first. + if (count($nids)) { + $state->deleted += count($nids); + $state->progress($state->total, $state->deleted); } else { - drupal_set_message(t('There is no content to be deleted.')); + $state->progress($state->total, $state->total); + } + + // Report results when done. + if ($source->progressClearing() == FEEDS_BATCH_COMPLETE) { + if ($state->deleted) { + drupal_set_message(format_plural($state->deleted, 'Deleted @number node.', 'Deleted @number nodes.', array('@number' => $state->deleted))); + } + else { + drupal_set_message(t('There is no content to be deleted.')); + } } - // Make sure we are finished, there may be a discrepancy between total and - // deleted if other processes have deleted nodes in the meantime. - $state->progress = FEEDS_BATCH_COMPLETE; } /**