function migrate_content_process_clear in Migrate 6
Clear migrated objects from the specified content set
Parameters
$mcsid: ID of the content set to clear
$options: Keyed array of optional options: itemlimit - Maximum number of items to process timelimit - Unix timestamp after which to stop processing idlist - Comma-separated list of source IDs to process, instead of proceeding through all unmigrated rows feedback - Keyed array controlling status feedback to the caller function - PHP function to call, passing a message to be displayed frequency - How often to call the function frequency_unit - How to interpret frequency (items or seconds)
Return value
Status of the migration process:
2 calls to migrate_content_process_clear()
- migrate_content_process_batch in ./
migrate.module - Process all enabled migration processes in a browser, using the Batch API to break it into manageable chunks.
- _drush_migrate_do_clear in ./
migrate.drush.inc
File
- ./
migrate.module, line 401 - This module provides tools at "administer >> content >> migrate" for analyzing data from various sources and importing them into Drupal tables.
Code
function migrate_content_process_clear($mcsid, &$options = array()) {
$itemlimit = isset($options['itemlimit']) ? $options['itemlimit'] : NULL;
$timelimit = isset($options['timelimit']) ? $options['timelimit'] : NULL;
$idlist = isset($options['idlist']) ? $options['idlist'] : NULL;
$lastfeedback = time();
if (isset($options['feedback'])) {
$feedback = $options['feedback']['function'];
$frequency = isset($options['feedback']['frequency']) ? $options['feedback']['frequency'] : NULL;
$frequency_unit = isset($options['feedback']['frequency_unit']) ? $options['feedback']['frequency_unit'] : NULL;
}
$result = db_query("SELECT *\n FROM {migrate_content_sets}\n WHERE mcsid=%d", $mcsid);
$tblinfo = db_fetch_object($result);
$tblinfo->maptable = $maptable;
$description = $tblinfo->description;
if ($tblinfo->status != MIGRATE_STATUS_IDLE) {
return MIGRATE_RESULT_IN_PROGRESS;
}
else {
db_query("UPDATE {migrate_content_sets} SET status=%d WHERE mcsid=%d", MIGRATE_STATUS_CLEARING, $mcsid);
}
$desttype = $tblinfo->desttype;
$contenttype = $tblinfo->contenttype;
$sourcekey = $tblinfo->sourcekey;
$maptable = migrate_map_table_name($mcsid);
$msgtablename = migrate_message_table_name($mcsid);
$processstart = microtime(TRUE);
$memory_limit = _migrate_memory_limit();
// If this content set is set up to update existing content, we don't
// want to delete the content on clear, just the map/message tables
$sql = "SELECT srcfield FROM {migrate_content_mappings}\n WHERE mcsid=%d AND primary_key=1";
$srcfield = db_result(db_query($sql, $mcsid));
if ($srcfield) {
$full_clear = FALSE;
}
else {
$full_clear = TRUE;
}
// Assume success until proven otherwise
$return = MIGRATE_RESULT_COMPLETED;
$deleted = 0;
$args = array();
if ($idlist) {
$args = array_map('trim', explode(',', $idlist));
if (is_numeric($args[0])) {
$placeholders = db_placeholders($args, 'int');
}
else {
$placeholders = db_placeholders($args, 'varchar');
}
$sql = "SELECT sourceid,destid FROM {" . $maptable . "} WHERE sourceid IN ({$placeholders})";
}
else {
$sql = "SELECT sourceid,destid FROM {" . $maptable . "}";
}
timer_start('delete query');
if ($itemlimit) {
$deletelist = db_query_range($sql, $args, 0, $itemlimit);
}
else {
$deletelist = db_query($sql, $args);
}
timer_stop('delete query');
while ($row = db_fetch_object($deletelist)) {
// Recheck status - permits dynamic interruption of jobs
$sql = "SELECT status FROM {migrate_content_sets} WHERE mcsid=%d";
$status = db_result(db_query($sql, $mcsid));
if ($status != MIGRATE_STATUS_CLEARING) {
$return = MIGRATE_RESULT_STOPPED;
break;
}
// Check for time out if there is time info present
if (isset($timelimit) && time() >= $timelimit) {
$return = MIGRATE_RESULT_INCOMPLETE;
break;
}
// Check for closeness to memory limit
$usage = memory_get_usage();
$pct_memory = $usage / $memory_limit;
if ($pct_memory > MIGRATE_MEMORY_THRESHOLD) {
if (isset($feedback)) {
$feedback(t('Memory usage is !usage (!pct% of limit !limit), starting new batch', array(
'!pct' => round($pct_memory * 100),
'!usage' => $usage,
'!limit' => $memory_limit,
)));
}
$return = MIGRATE_RESULT_INCOMPLETE;
break;
}
if (isset($feedback)) {
if ($frequency_unit == 'seconds' && time() - $lastfeedback >= $frequency || $frequency_unit == 'items' && $deleted >= $frequency) {
$message = _migrate_progress_message($lastfeedback, $deleted, $description, FALSE, MIGRATE_RESULT_INCOMPLETE);
$feedback($message);
$lastfeedback = time();
$deleted = 0;
}
}
// @TODO: Should return success/failure. Problem: node_delete doesn't return anything...
if ($full_clear) {
timer_start('delete hooks');
migrate_invoke_all("delete_{$contenttype}", $tblinfo, $row->destid);
timer_stop('delete hooks');
}
timer_start('clear map/msg');
db_query("DELETE FROM {" . $maptable . "} WHERE sourceid='%s'", $row->sourceid);
db_query("DELETE FROM {" . $msgtablename . "} WHERE sourceid='%s' AND level=%d", $row->sourceid, MIGRATE_MESSAGE_INFORMATIONAL);
timer_stop('clear map/msg');
$deleted++;
}
// Mark that we're done
$sql = "UPDATE {migrate_content_sets} SET status=%d WHERE mcsid=%d";
db_query($sql, MIGRATE_STATUS_IDLE, $mcsid);
// If we've completed a total clear, make sure all messages are gone
if ($return == MIGRATE_RESULT_COMPLETED && !$idlist && !$itemlimit) {
db_query('TRUNCATE TABLE {' . $msgtablename . '}');
}
else {
if ($return != MIGRATE_RESULT_INCOMPLETE) {
// Remove old messages before beginning new import process
db_query("DELETE FROM {" . $msgtablename . "} WHERE level <> %d", MIGRATE_MESSAGE_INFORMATIONAL);
}
}
$message = _migrate_progress_message($lastfeedback, $deleted, $description, FALSE, $return);
if (isset($feedback)) {
$feedback($message);
}
return $return;
}