X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FUtils%2FSQL.php;h=1ca298e96ad37d881c25c64cde4aeed53709bb33;hb=41d9d3cf16473f590b572f4c9851e180b4b0ff0c;hp=1cd1dc02b6e70e3c8139fcbf5696da1e5576553b;hpb=d2fadae5f8610032e672f7c566269abb2d49bd05;p=civicrm-core.git diff --git a/CRM/Utils/SQL.php b/CRM/Utils/SQL.php index 1cd1dc02b6..1ca298e96a 100644 --- a/CRM/Utils/SQL.php +++ b/CRM/Utils/SQL.php @@ -185,4 +185,48 @@ class CRM_Utils_SQL { return (bool) preg_match('/[\?&](key|cert|ca|capath|cipher|ssl)=/', $dsn); } + /** + * If DB_DSN_MODE is auto then we should replace mysql with mysqli if mysqli is available or the other way around as appropriate + * @param string $dsn + * + * @return string + */ + public static function autoSwitchDSN($dsn) { + if (defined('DB_DSN_MODE') && DB_DSN_MODE === 'auto') { + if (extension_loaded('mysqli')) { + $dsn = preg_replace('/^mysql:/', 'mysqli:', $dsn); + } + else { + $dsn = preg_replace('/^mysqli:/', 'mysql:', $dsn); + } + } + return $dsn; + } + + /** + * Filter out Emojis in where clause if the database (determined by checking the create table for civicrm_contact) + * cannot support emojis + * @param mixed $criteria - filter criteria to check + * + * @return bool|string + */ + public static function handleEmojiInQuery($criteria) { + if (!CRM_Core_BAO_SchemaHandler::databaseSupportsUTF8MB4()) { + foreach ((array) $criteria as $criterion) { + if (!empty($criterion) && !is_numeric($criterion) + // The first 2 criteria are redundant but are added as they + // seem like they would + // be quicker than this 3rd check. + && max(array_map('ord', str_split($criterion))) >= 240) { + // String contains unsupported emojis. + // We return a clause that resolves to false as an emoji string by definition cannot be saved. + // note that if we return just 0 for false if gets lost in empty checks. + // https://stackoverflow.com/questions/16496554/can-php-detect-4-byte-encoded-utf8-chars + return '0 = 1'; + } + } + return TRUE; + } + } + }