protected function CRMCoreMigrateSQLMap::ensureTables in CRM Core 7
Create the map and message tables if they don't already exist.
Overrides MigrateSQLMap::ensureTables
File
- modules/
crm_core_data_import/ includes/ controllers/ CRMCoreMigrateSQLMap.inc, line 24 - Defines a CRMCore extention of MigrateSQLMap
Class
- CRMCoreMigrateSQLMap
- @file Defines a CRMCore extention of MigrateSQLMap
Code
protected function ensureTables() {
if (!$this->ensured) {
if (!$this->connection
->schema()
->tableExists($this->mapTable)) {
// Generate appropriate schema info for the map and message tables,
// and map from the source field names to the map/msg field names
$count = 1;
$source_key_schema = array();
$pks = array();
foreach ($this->sourceKey as $field_schema) {
$mapkey = 'sourceid' . $count++;
// Make source key case sensitive
$field_schema['binary'] = TRUE;
$source_key_schema[$mapkey] = $field_schema;
$pks[] = $mapkey;
}
$fields = $source_key_schema;
// Add destination keys to map table
// TODO: How do we discover the destination schema?
$count = 1;
foreach ($this->destinationKey as $field_schema) {
// Allow dest key fields to be NULL (for IGNORED/FAILED cases)
$field_schema['not null'] = FALSE;
$mapkey = 'destid' . $count++;
$fields[$mapkey] = $field_schema;
}
$fields['needs_update'] = array(
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => MigrateMap::STATUS_IMPORTED,
'description' => 'Indicates current status of the source row',
);
$fields['rollback_action'] = array(
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => MigrateMap::ROLLBACK_DELETE,
'description' => 'Flag indicating what to do for this item on rollback',
);
$fields['last_imported'] = array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'description' => 'UNIX timestamp of the last time this row was imported',
);
$fields['hash'] = array(
'type' => 'varchar',
'length' => '32',
'not null' => FALSE,
'description' => 'Hash of source row data, for detecting changes',
);
// Find out if we need to add relation ids to schema.
// Add source id for relations that we import.
// We need source id only for one endpoint of relationship.
// Let it be source endpoint.
$destinations = $this->importer
->getRelationDestinationEndPoints(implode(':', array(
$this->options['entity_type'],
$this->options['entity_bundle'],
$this->options['delta'],
)));
foreach ($destinations as $key => $destination) {
$fields['relation_id' . ($key + 1)] = array(
'type' => 'varchar',
'length' => '32',
'binary' => TRUE,
'not null' => FALSE,
'description' => 'ID of relation endpoint entity',
);
}
$schema = array(
'description' => t('Mappings from source key to destination key'),
'fields' => $fields,
'primary key' => $pks,
);
$this->connection
->schema()
->createTable($this->mapTable, $schema);
// Now for the message table
$fields = array();
$fields['msgid'] = array(
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
);
$fields += $source_key_schema;
$fields['level'] = array(
'type' => 'int',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 1,
);
$fields['message'] = array(
'type' => 'text',
'size' => 'medium',
'not null' => TRUE,
);
$schema = array(
'description' => t('Messages generated during a migration process'),
'fields' => $fields,
'primary key' => array(
'msgid',
),
'indexes' => array(
'sourcekey' => $pks,
),
);
$this->connection
->schema()
->createTable($this->messageTable, $schema);
}
else {
// Add any missing columns to the map table
if (!$this->connection
->schema()
->fieldExists($this->mapTable, 'rollback_action')) {
$this->connection
->schema()
->addField($this->mapTable, 'rollback_action', array(
'type' => 'int',
'size' => 'tiny',
'unsigned' => TRUE,
'not null' => TRUE,
'default' => 0,
'description' => 'Flag indicating what to do for this item on rollback',
));
}
if (!$this->connection
->schema()
->fieldExists($this->mapTable, 'hash')) {
$this->connection
->schema()
->addField($this->mapTable, 'hash', array(
'type' => 'varchar',
'length' => '32',
'not null' => FALSE,
'description' => 'Hash of source row data, for detecting changes',
));
}
}
$this->ensured = TRUE;
}
}