X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FUtils%2FSQL.php;h=8c7f4c6938545c431fc53fe83670e22084e654c4;hb=67dd8c7cb0c00d3775de0d8a356b8f1d9cb63cb0;hp=a20dc3800bd485108b9533bbde83aa29f2ec1b6e;hpb=6b83d5bdd0f2ca546924feae6aa42aeddb1d40cf;p=civicrm-core.git diff --git a/CRM/Utils/SQL.php b/CRM/Utils/SQL.php index a20dc3800b..8c7f4c6938 100644 --- a/CRM/Utils/SQL.php +++ b/CRM/Utils/SQL.php @@ -44,7 +44,7 @@ class CRM_Utils_SQL { require_once 'api/v3/utils.php'; $baoName = _civicrm_api3_get_BAO($entity); $bao = new $baoName(); - $clauses = $subclauses = array(); + $clauses = $subclauses = []; foreach ((array) $bao->addSelectWhereClause() as $field => $vals) { if ($vals && $field == $joinColumn) { $clauses = array_merge($clauses, (array) $vals); @@ -78,7 +78,7 @@ class CRM_Utils_SQL { */ public static function supportsFullGroupBy() { // CRM-21455 MariaDB 10.2 does not support ANY_VALUE - $version = CRM_Core_DAO::singleValueQuery('SELECT VERSION()'); + $version = self::getDatabaseVersion(); if (stripos($version, 'mariadb') !== FALSE) { return FALSE; @@ -134,4 +134,42 @@ class CRM_Utils_SQL { return FALSE; } + /** + * Does the DB version support mutliple locks per + * + * https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock + * + * As an interim measure we ALSO require CIVICRM_SUPPORT_MULTIPLE_LOCKS to be defined. + * + * This is a conservative measure to introduce the change which we expect to deprecate later. + * + * @todo we only check mariadb & mysql right now but maybe can add percona. + */ + public static function supportsMultipleLocks() { + if (!defined('CIVICRM_SUPPORT_MULTIPLE_LOCKS')) { + return FALSE; + } + static $isSupportLocks = NULL; + if (!isset($isSupportLocks)) { + $version = self::getDatabaseVersion(); + if (stripos($version, 'mariadb') !== FALSE) { + $isSupportLocks = version_compare($version, '10.0.2', '>='); + } + else { + $isSupportLocks = version_compare($version, '5.7.5', '>='); + } + } + + return $isSupportLocks; + } + + /** + * Get the version string for the database. + * + * @return string + */ + public static function getDatabaseVersion() { + return CRM_Core_DAO::singleValueQuery('SELECT VERSION()'); + } + }