Skip to content

Commit

Permalink
dev/core#1383: Fix Re-Installation of Extensions With Logging Enabled
Browse files Browse the repository at this point in the history
When uninstalling an extension, logging tables associated to custom groups and
fields will not be deleted. On re-installation, addition of custom fields will
cause DB errors to be thrown, as columns existing on logging tables are tried
to be created again (they already exist on logging tables).

Fixed by checking if the column exists on log table before trying to create
it, treating it as a modification of the schema if it exists.
  • Loading branch information
MiyaNoctem committed Nov 21, 2019
1 parent 448b2c0 commit 363c450
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions CRM/Logging/Schema.php
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,17 @@ public function fixSchemaDifferencesFor($table, $cols = []) {
$cols = $this->columnsWithDiffSpecs($table, "log_$table");
}

// If a column that already exists on logging table is being added, we
// should treat it as a modification.
$this->resetSchemaCacheForTable("log_$table");
$logTableSchema = $this->columnSpecsOf("log_$table");
foreach ($cols['ADD'] as $colKey => $col) {
if (array_key_exists($col, $logTableSchema)) {
$cols['MODIFY'][] = $col;
unset($cols['ADD'][$colKey]);
}
}

// use the relevant lines from CREATE TABLE to add colums to the log table
$create = $this->_getCreateQuery($table);
foreach ((['ADD', 'MODIFY']) as $alterType) {
Expand All @@ -467,9 +478,21 @@ public function fixSchemaDifferencesFor($table, $cols = []) {
}
}

$this->resetSchemaCacheForTable("log_$table");

return TRUE;
}

/**
* Resets schema cache for the given table.
*
* @param string $table
* Name of the table.
*/
private function resetSchemaCacheForTable($table) {
unset(\Civi::$statics[__CLASS__]['columnSpecs'][$table]);
}

/**
* Get query table.
*
Expand Down

0 comments on commit 363c450

Please sign in to comment.