Commit 38e5457e authored by totten's avatar totten

CRM-21568 - Move emptiness judgments from SettingsBag::setDb to InnoDBIndexer

The `SettingsBag::setDb()` function calls any `on_change` listeners.  It
originally used "dumb on change" behavior (where it calls the listeners
without comparing values).  CRM-19610 had an issue where the `InnoDBIndexer`
was running a bit too often, so they tried to resolve it by
making the `SettingsBag::setDb()` more clever.

Unfortunately, that's been a bit bouncy, and the cleverness depends on one's
particular interpretation of 0 vs '0' vs '' vs NULL vs FALSE.

All on-change listeners may be skipped if there's particular mix of emptiness
in the old/new values.

The on-change listeners always fire. However, the specific listener
involved with CRM-19610 will now ignore some insignificant changes.

Related discussion:

* CRM-21568:
* CRM-19610:
parent 07cd5d66
......@@ -91,6 +91,10 @@ class CRM_Core_InnoDBIndexer {
* Specification of the setting (per *.settings.php).
public static function onToggleFts($oldValue, $newValue, $metadata) {
if (empty($oldValue) && empty($newValue)) {
$indexer = CRM_Core_InnoDBIndexer::singleton();
......@@ -352,9 +352,11 @@ class SettingsBag {
// string comparison with 0 always return true, so to be ensure the type use ===
// ref -
if (isset($metadata['on_change']) && !($value === 0 && ($dao->value === NULL || unserialize($dao->value) == 0))) {
// Call 'on_change' listeners. It would be nice to only fire when there's
// a genuine change in the data. However, PHP developers have mixed
// expectations about whether 0, '0', '', NULL, and FALSE represent the same
// value, so there's no universal way to determine if a change is genuine.
if (isset($metadata['on_change'])) {
foreach ($metadata['on_change'] as $callback) {
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment