function migrate_save_content_set in Migrate 6
Save a new or updated content set
Parameters
$content_set: An array or object representing the content set. This is passed by reference (so when adding a new content set the ID can be set)
$options: Array of additional options for saving the content set. Currently: base_table: The base table of the view - if provided, we don't need to load the view. base_database: The database of the base table - if base_table is present and base_database omitted, it defaults to 'default'
Return value
The ID of the content set that was saved, or NULL if nothing was saved
7 calls to migrate_save_content_set()
- MigrateCommentTest::testComment in tests/
modules/ core/ migrate_comment.test - Test comment migration
- MigrateNodeTest::testNodeProcessing in tests/
modules/ core/ migrate_node.test - Test UI for processing
- MigrateUnitTest::testCRUD in tests/
migrate_api.test - Test API for managing content sets
- MigrateUserTest::testUserProcessing in tests/
modules/ core/ migrate_user.test - Test user migration
- migrate_content_set_mappings_submit in ./
migrate_pages.inc - Implementation of hook_submit().
File
- ./
migrate.module, line 121 - This module provides tools at "administer >> content >> migrate" for analyzing data from various sources and importing them into Drupal tables.
Code
function migrate_save_content_set(&$content_set, $options = array()) {
// Deal with objects internally (but remember if we need to put the parameter
// back to an array)
if (is_array($content_set)) {
$was_array = TRUE;
$content_set = (object) $content_set;
}
else {
$was_array = FALSE;
}
$schema_change = FALSE;
// Update or insert the content set record as appropriate
if (isset($content_set->mcsid)) {
// If machine_name changes, need to rename the map/message tables
$old_machine_name = db_query("SELECT machine_name FROM {migrate_content_sets}\n WHERE mcsid=%d", $content_set->mcsid);
if ($old_machine_name != $content_set->machine_name) {
$old_maptablename = migrate_map_table_name($content_set->mcsid);
$old_msgtablename = migrate_message_table_name($content_set->mcsid);
}
drupal_write_record('migrate_content_sets', $content_set, 'mcsid');
if (isset($old_maptablename) && db_table_exists($old_maptablename)) {
$ret = array();
$new_maptablename = migrate_map_table_name($content_set->mcsid);
db_rename_table($ret, $old_maptablename, $new_maptablename);
$schema_change = TRUE;
}
if (isset($old_msgtablename) && db_table_exists($old_msgtablename)) {
$ret = array();
$new_msgtablename = migrate_message_table_name($content_set->mcsid);
db_rename_table($ret, $old_msgtablename, $new_msgtablename);
$schema_change = TRUE;
}
}
else {
drupal_write_record('migrate_content_sets', $content_set);
}
// Create or modify map and message tables
$maptablename = migrate_map_table_name($content_set->mcsid);
$msgtablename = migrate_message_table_name($content_set->mcsid);
// TODO: For now, PK must be in base_table
// If the caller tells us the base table of the view, we don't need
// to load the view (which would not work when called from hook_install())
if (isset($options['base_table'])) {
$tablename = $options['base_table'];
if (isset($options['base_database'])) {
$tabledb = $options['base_database'];
}
else {
$tabledb = 'default';
}
}
else {
// Get the proper field definition for the sourcekey
$view = views_get_view($content_set->view_name);
if (!$view) {
drupal_set_message(t('View !view does not exist - either (re)create this view, or
remove the content set using it.', array(
'!view' => $content_set->view_name,
)));
return NULL;
}
// Must do this to load the database
$views_version = (string) views_api_version();
if (views_api_version() >= '3') {
$view
->init_display('default');
}
$view
->init_query();
if (isset($view->base_database)) {
$tabledb = $view->base_database;
}
else {
$tabledb = 'default';
}
$tablename = $view->base_table;
}
$sourceschema = _migrate_inspect_schema($tablename, $tabledb);
// If the PK of the content set is defined, make sure we have a mapping table
if (isset($content_set->sourcekey) && $content_set->sourcekey) {
$sourcefield = $sourceschema['fields'][$content_set->sourcekey];
// The field name might be <table>_<column>...
if (!$sourcefield) {
$sourcekey = drupal_substr($content_set->sourcekey, drupal_strlen($tablename) + 1);
$sourcefield = $sourceschema['fields'][$sourcekey];
}
// But - we don't want serial fields to behave serially, so change to int
if ($sourcefield['type'] == 'serial') {
$sourcefield['type'] = 'int';
}
if (!db_table_exists($maptablename)) {
$schema = _migrate_map_table_schema($sourcefield);
db_create_table($ret, $maptablename, $schema);
// Expose map table to views
if (module_exists('tw')) {
tw_add_tables(array(
$maptablename,
));
tw_add_fk($maptablename, 'destid');
}
$schema = _migrate_message_table_schema($sourcefield);
db_create_table($ret, $msgtablename, $schema);
// Expose messages table to views
if (module_exists('tw')) {
tw_add_tables(array(
$msgtablename,
));
tw_add_fk($msgtablename, 'sourceid');
}
$schema_change = TRUE;
}
else {
// TODO: Deal with varchar->int case where there is existing non-int data
$desired_schema = _migrate_map_table_schema($sourcefield);
$actual_schema = _migrate_inspect_schema($maptablename);
if ($desired_schema['fields']['sourceid'] != $actual_schema['fields']['sourceid']) {
$ret = array();
db_drop_primary_key($ret, $maptablename);
db_change_field($ret, $maptablename, 'sourceid', 'sourceid', $sourcefield, array(
'primary key' => array(
'sourceid',
),
));
if (module_exists('tw')) {
tw_perform_analysis($maptablename);
}
$schema_change = TRUE;
}
$desired_schema = _migrate_message_table_schema($sourcefield);
$actual_schema = _migrate_inspect_schema($msgtablename);
if ($desired_schema['fields']['sourceid'] != $actual_schema['fields']['sourceid']) {
$ret = array();
db_drop_index($ret, $msgtablename, 'sourceid');
db_change_field($ret, $msgtablename, 'sourceid', 'sourceid', $sourcefield, array(
'indexes' => array(
'sourceid' => array(
'sourceid',
),
),
));
if (module_exists('tw')) {
tw_perform_analysis($maptablename);
}
$schema_change = TRUE;
}
}
// Make sure the schema gets updated to reflect changes
if ($schema_change) {
cache_clear_all('schema', 'cache');
}
}
if ($was_array) {
$content_set = (array) $content_set;
return $content_set['mcsid'];
}
else {
return $content_set->mcsid;
}
}