From e28bf654ec76cfc205e0ef5a7a5093959893361c Mon Sep 17 00:00:00 2001
From: Tim Otten <totten@civicrm.org>
Date: Tue, 14 Aug 2018 16:08:16 -0700
Subject: [PATCH] (dev/core#217) PrevNext - Add settings for admin to choose
 backend

The auto-detection is a good default policy.  However, this is new
functionality.  If some bug gets through the review/RC cycles, then this
option provides an escape path.
---
 CRM/Admin/Form/Setting/Miscellaneous.php |  2 ++
 CRM/Core/BAO/PrevNextCache.php           | 14 ++++++++++++++
 Civi/Core/Container.php                  | 16 +++++++++++-----
 settings/Search.setting.php              | 21 +++++++++++++++++++++
 4 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/CRM/Admin/Form/Setting/Miscellaneous.php b/CRM/Admin/Form/Setting/Miscellaneous.php
index 31ef53a873..f741af3802 100644
--- a/CRM/Admin/Form/Setting/Miscellaneous.php
+++ b/CRM/Admin/Form/Setting/Miscellaneous.php
@@ -56,6 +56,7 @@ class CRM_Admin_Form_Setting_Miscellaneous extends CRM_Admin_Form_Setting {
     'dedupe_default_limit' => CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
     'remote_profile_submissions' => CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
     'allow_alert_autodismissal' => CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
+    'prevNextBackend' => CRM_Core_BAO_Setting::SEARCH_PREFERENCES_NAME,
   );
 
   public $_uploadMaxSize;
@@ -77,6 +78,7 @@ class CRM_Admin_Form_Setting_Miscellaneous extends CRM_Admin_Form_Setting {
       'recentItemsMaxCount',
       'recentItemsProviders',
       'dedupe_default_limit',
+      'prevNextBackend',
     ));
   }
 
diff --git a/CRM/Core/BAO/PrevNextCache.php b/CRM/Core/BAO/PrevNextCache.php
index c3078140ac..8a902d01c9 100644
--- a/CRM/Core/BAO/PrevNextCache.php
+++ b/CRM/Core/BAO/PrevNextCache.php
@@ -483,4 +483,18 @@ AND        c.created_date < date_sub( NOW( ), INTERVAL %2 day )
     }
   }
 
+  /**
+   * Get a list of available backend services.
+   *
+   * @return array
+   *   Array(string $id => string $label).
+   */
+  public static function getPrevNextBackends() {
+    return [
+      'default' => ts('Default (Auto-detect)'),
+      'sql' => ts('SQL'),
+      'redis' => ts('Redis'),
+    ];
+  }
+
 }
diff --git a/Civi/Core/Container.php b/Civi/Core/Container.php
index 059be408b6..d75a9a13dd 100644
--- a/Civi/Core/Container.php
+++ b/Civi/Core/Container.php
@@ -441,11 +441,17 @@ class Container {
    * @return \CRM_Core_PrevNextCache_Interface
    */
   public static function createPrevNextCache($container) {
-    $cacheDriver = \CRM_Utils_Cache::getCacheDriver();
-    $service = 'prevnext.driver.' . strtolower($cacheDriver);
-    return $container->has($service)
-      ? $container->get($service)
-      : $container->get('prevnext.driver.sql');
+    $setting = \Civi::settings()->get('prevNextBackend');
+    if ($setting === 'default') {
+      $cacheDriver = \CRM_Utils_Cache::getCacheDriver();
+      $service = 'prevnext.driver.' . strtolower($cacheDriver);
+      return $container->has($service)
+        ? $container->get($service)
+        : $container->get('prevnext.driver.sql');
+    }
+    else {
+      return $container->get('prevnext.driver.' . $setting);
+    }
   }
 
   public static function createCacheConfig() {
diff --git a/settings/Search.setting.php b/settings/Search.setting.php
index ab784705b9..6ab72238ca 100644
--- a/settings/Search.setting.php
+++ b/settings/Search.setting.php
@@ -197,6 +197,27 @@ return array(
     'description' => 'If set, this will be the default profile used for contact search.',
     'help_text' => NULL,
   ),
+  'prevNextBackend' => array(
+    'group_name' => 'Search Preferences',
+    'group' => 'Search Preferences',
+    'name' => 'prevNextBackend',
+    'type' => 'String',
+    'quick_form_type' => 'Select',
+    'html_type' => 'Select',
+    'html_attributes' => array(
+      //'class' => 'crm-select2',
+    ),
+    'default' => 'default',
+    'add' => '5.6',
+    'title' => 'PrevNext Cache',
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'pseudoconstant' => array(
+      'callback' => 'CRM_Core_BAO_PrevNextCache::getPrevNextBackends',
+    ),
+    'description' => 'When performing a search, how should the search-results be cached?',
+    'help_text' => '',
+  ),
   'searchPrimaryDetailsOnly' => array(
     'group_name' => 'Search Preferences',
     'group' => 'Search Preferences',
-- 
2.25.1