}
// copy files attached to old activity if any, to new one,
// as long as users have not selected the 'delete attachment' option.
- if (empty($newActParams['is_delete_attachment'])) {
+ if (empty($newActParams['is_delete_attachment']) && ($this->_activityId != $activity->id)) {
CRM_Core_BAO_File::copyEntityFile('civicrm_activity', $this->_activityId,
'civicrm_activity', $activity->id
);
CRM_Core_DAO::executeQuery($sql);
}
+ /**
+ * @param string $tableName
+ * @param array $fields
+ * @param string $prefix
+ */
+ public static function createUniqueIndex($tableName, $fields, $prefix = 'UI') {
+ $uniqueIndexName = sprintf('%s_%s', $prefix, implode('_', $fields));
+ $sql = sprintf(" ALTER TABLE %s ADD UNIQUE INDEX `%s` (%s)", $tableName, $uniqueIndexName, implode(', ', $fields));
+ CRM_Core_DAO::executeQuery($sql);
+ }
+
/**
* Create indexes.
*
*
* Generated from xml/schema/CRM/Core/EntityFile.xml
* DO NOT EDIT. Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:354c22131251fde259f5b796e102fccf)
+ * (GenCodeChecksum:d2d6205c8973c5ad7a989ecb674b9f94)
*/
/**
'localizable' => FALSE,
'sig' => 'civicrm_entity_file::0::entity_table::entity_id',
],
- 'index_entity_file_id' => [
- 'name' => 'index_entity_file_id',
+ 'UI_entity_table_entity_id_file_id' => [
+ 'name' => 'UI_entity_table_entity_id_file_id',
'field' => [
0 => 'entity_table',
1 => 'entity_id',
2 => 'file_id',
],
'localizable' => FALSE,
- 'sig' => 'civicrm_entity_file::0::entity_table::entity_id::file_id',
+ 'unique' => TRUE,
+ 'sig' => 'civicrm_entity_file::1::entity_table::entity_id::file_id',
],
];
return ($localize && !empty($indices)) ? CRM_Core_DAO_AllCoreTables::multilingualize(__CLASS__, $indices) : $indices;
// }
}
+ /**
+ * Upgrade function.
+ *
+ * @param string $rev
+ */
+ public function upgrade_5_5_alpha1($rev) {
+ $this->addTask(ts('Upgrade DB to %1: SQL', array(1 => $rev)), 'runSql', $rev);
+ $this->addTask('Entity File schema updates', 'entityFileSchemaUpdate');
+ }
+
+ /**
+ * dev/core#321 - Prevent duplicate entries in civicrm_entity_file
+ *
+ * @param \CRM_Queue_TaskContext $ctx
+ *
+ * @return bool
+ */
+ public static function entityFileSchemaUpdate(CRM_Queue_TaskContext $ctx) {
+ if (CRM_Core_BAO_SchemaHandler::checkIfIndexExists('civicrm_entity_file', 'index_entity_file_id')) {
+ // Delete any stray duplicate rows and add unique index to prevent new dupes and enable INSERT/UPDATE combo query
+ CRM_Core_DAO::executeQuery('
+ DELETE ef1 FROM civicrm_entity_file ef1, civicrm_entity_file ef2
+ WHERE ef1.entity_table = ef2.entity_table AND
+ ef1.entity_id = ef2.entity_id AND
+ ef1.file_id = ef2.file_id AND
+ ef1.id > ef2.id
+ ');
+ CRM_Core_DAO::executeQuery('ALTER TABLE civicrm_entity_file DROP INDEX `index_entity_file_id`');
+ CRM_Core_BAO_SchemaHandler::createUniqueIndex('civicrm_entity_file', ['entity_table', 'entity_id', 'file_id']);
+ }
+
+ return TRUE;
+ }
+
/**
* Compute any messages which should be displayed after upgrade.
*
<add>1.5</add>
</foreignKey>
<index>
- <name>index_entity_file_id</name>
+ <name>UI_entity_table_entity_id_file_id</name>
<fieldName>entity_table</fieldName>
<fieldName>entity_id</fieldName>
<fieldName>file_id</fieldName>
+ <unique>true</unique>
<add>1.1</add>
</index>
</table>