popsu-d7/sites/all/modules/migrate/migrate.install
Bachir Soussi Chiadmi 1bc61b12ad first import
2015-04-08 11:40:19 +02:00

364 lines
11 KiB
Plaintext

<?php
/**
* @file
* Migrate module installation
*/
function migrate_schema() {
$schema = array();
$schema['migrate_status'] = migrate_schema_status();
$schema['migrate_log'] = migrate_schema_log();
return $schema;
}
function migrate_schema_status() {
return array(
'description' => 'Status information for migrations',
'fields' => array(
'machine_name' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'Unique machine name for migration',
),
'class_name' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'Name of class to instantiate for this migration',
),
'status' => array(
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'description' => 'Current status of migration',
),
'highwater' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Highwater mark for detecting updated content',
),
'arguments' => array(
'type' => 'blob',
'not null' => FALSE,
'size' => 'big',
'serialize' => TRUE,
'description' => 'A serialized array of arguments to the migration constructor',
),
),
'primary key' => array('machine_name'),
);
}
function migrate_schema_log() {
return array(
'description' => 'History of migration processes',
'fields' => array(
'mlid' => array(
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Primary key for migrate_log table',
),
'machine_name' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'Unique machine name for migration',
),
'process_type' => array(
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Type of migration process - 1 for import, 2 for rollback',
),
'starttime' => array(
'type' => 'int',
'size' => 'big',
'unsigned' => TRUE,
'not null' => TRUE,
'description' => 'Begin time of a migration process, times 1000',
),
'endtime' => array(
'type' => 'int',
'size' => 'big',
'unsigned' => TRUE,
'not null' => FALSE,
'description' => 'End time of a migration process, times 1000',
),
'initialhighwater' => array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'description' => 'Initial highwater mark',
),
'finalhighwater' => array(
'type' => 'varchar',
'length' => 255,
'not null' => FALSE,
'description' => 'Final highwater mark',
),
'numprocessed' => array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => FALSE,
'description' => 'Number of items processed',
),
),
'primary key' => array('mlid'),
);
}
/**
* Implements hook_uninstall().
* Drop map/message tables, in case implementing classes did not.
*/
function migrate_uninstall() {
// Note: If a derived Migration class defined its own map or message
// table name not fitting this pattern, that class is solely responsible for
// cleaning up
// TODO: Prefix table names (db_find_tables does not do it)
foreach (db_find_tables('migrate_map_%') as $tablename) {
db_drop_table($tablename);
}
foreach (db_find_tables('migrate_message_%') as $tablename) {
db_drop_table($tablename);
}
// Remove any file_usage entries we've written
if (db_table_exists('file_usage')) {
db_delete('file_usage')
->condition('module', 'migrate')
->execute();
}
}
/**
* Add highwater mark
*/
function migrate_update_7001() {
$ret = array();
if (!db_field_exists('migrate_status', 'highwater')) {
db_add_field('migrate_status', 'highwater', array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Highwater mark for detecting updated content',
)
);
}
$ret[] = t('Added highwater column to migrate_status table');
return $ret;
}
/**
* Add last_imported field to all map tables
*/
function migrate_update_7002() {
$ret = array();
foreach (db_find_tables('migrate_map_%') as $tablename) {
if (!db_field_exists($tablename, 'last_imported')) {
db_add_field($tablename, 'last_imported', array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'description' => 'UNIX timestamp of the last time this row was imported',
));
}
}
$ret[] = t('Added last_imported column to all map tables');
return $ret;
}
/**
* Add lastthroughput column to migrate_status
*/
function migrate_update_7003() {
$ret = array();
if (!db_field_exists('migrate_status', 'lastthroughput')) {
db_add_field('migrate_status', 'lastthroughput', array(
'type' => 'int',
'length' => 11,
'not null' => FALSE,
'description' => 'Rate of success during most recent completed import (# per minute)',
)
);
}
$ret[] = t('Added lastthroughput column to migrate_status table');
return $ret;
}
/**
* Convert lastimported datetime field to lastimportedtime int field.
*/
function migrate_update_7004() {
$ret = array();
if (!db_field_exists('migrate_status', 'lastimportedtime')) {
db_add_field('migrate_status', 'lastimportedtime', array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => FALSE,
'description' => 'Date and time of last completed import',
)
);
if (!db_field_exists('migrate_status', 'lastimported')) {
$result = db_select('migrate_status', 'ms')
->fields('ms', array('machine_name', 'lastimported'))
->execute();
foreach ($result as $row) {
$lastimportedtime = strtotime($row->lastimported);
db_update('migrate_status')
->fields(array('lastimportedtime' => $lastimportedtime))
->condition('machine_name', $row->machine_name)
->execute();
}
db_drop_field('migrate_status', 'lastimported');
$ret[] = t('Converted lastimported datetime field to lastimportedtime int field');
}
}
return $ret;
}
/**
* Add support for history logging
*/
function migrate_update_7005() {
$ret = array();
if (!db_table_exists('migrate_log')) {
$ret[] = t('Create migrate_log table');
db_create_table('migrate_log', migrate_schema_log());
$ret[] = t('Remove historic columns from migrate_status table');
db_drop_field('migrate_status', 'lastthroughput');
db_drop_field('migrate_status', 'lastimportedtime');
}
return $ret;
}
/**
* Add and populate class_name field. Any existing migration code using
* dependencies or sourceMigration() must be changed! See CHANGELOG.txt.
*/
function migrate_update_7006() {
$ret = array();
if (!db_field_exists('migrate_status', 'class_name')) {
db_add_field('migrate_status', 'class_name', array(
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Name of class to instantiate for this migration',
)
);
db_query("UPDATE {migrate_status}
SET class_name = CONCAT(machine_name, 'Migration')
");
$ret[] = t('Added class_name column to migrate_status table');
}
return $ret;
}
/**
* Add arguments field to migrate_status table.
*/
function migrate_update_7007() {
$ret = array();
if (!db_field_exists('migrate_status', 'arguments')) {
db_add_field('migrate_status', 'arguments', array(
'type' => 'blob',
'not null' => FALSE,
'size' => 'big',
'serialize' => TRUE,
'description' => 'A serialized array of arguments to the migration constructor',
)
);
$ret[] = t('Added arguments column to migrate_status table');
}
return $ret;
}
/**
* Update map tables to reflect change of needs_update to a status column.
*/
function migrate_update_7008() {
// Updates can be run when the module is disabled, which would mean the
// call to migrate_migrations() will fail. Just bail in that case...
if (!module_exists('migrate')) {
throw new DrupalUpdateException(t('This update cannot be run while the Migrate ' .
'module is disabled - you must enable Migrate to run this update.'));
}
$ret = array();
foreach (migrate_migrations() as $migration) {
if (is_a($migration, 'Migration')) {
// Since we're now tracking failed/ignored rows in the map table,
// destination keys need to be nullable
$map = $migration->getMap();
$map_connection = $map->getConnection();
$map_table = $map->getMapTable();
$destination = $migration->getDestination();
$key_schema = $destination->getKeySchema();
$index = 1;
foreach ($key_schema as $field_schema) {
$field = 'destid' . $index++;
$field_schema['not null'] = FALSE;
$map_connection->schema()->changeField($map_table, $field, $field,
$field_schema);
$ret[] = t('Changed !table.!field to be non-null',
array('!table' => $map_table, '!field' => $field));
}
// Add any existing failures to the map table
$msg_table = $map->getMessageTable();
$msg_marked = FALSE;
$result = $map_connection->select($msg_table, 'msg')
->fields('msg')
->condition('level', Migration::MESSAGE_INFORMATIONAL, '<>')
->execute();
foreach ($result as $row) {
$keys = array();
$index = 1;
foreach ($row as $field => $value) {
if (drupal_substr($field, 0, 8) == 'sourceid') {
$keys['sourceid' . $index++] = $value;
}
}
$map_connection->merge($map_table)
->key($keys)
->fields(array('needs_update' => MigrateMap::STATUS_FAILED))
->execute();
$msg_marked = TRUE;
}
if ($msg_marked) {
$ret[] = t('Marked failures in !table', array('!table' => $map_table));
}
}
}
return $ret;
}
/**
* Warn that there have been incompatible changes to file handling.
*/
function migrate_update_7201() {
return t('File field and destination handling has been completely refactored
- if you are migrating files, you will need to change your migration
implementation to reflect these changes. Please see
<a href="@doc">Handling files in Drupal 7</a> for more information',
array('@doc' => 'http://drupal.org/node/1540106'));
}