CRM-18193 make unique ID for request available to php & mysql
authoreileen <emcnaughton@wikimedia.org>
Fri, 11 Mar 2016 00:49:24 +0000 (13:49 +1300)
committereileen <emcnaughton@wikimedia.org>
Fri, 11 Mar 2016 00:52:46 +0000 (13:52 +1300)
CRM/Core/DAO.php
CRM/Utils/Request.php

index 189b6c8d59a626440de68f4d23b33d6c1fdba50d..c7a401353365b322cbe408d2db153f66cd417456 100644 (file)
@@ -112,6 +112,7 @@ class CRM_Core_DAO extends DB_DataObject {
       CRM_Core_DAO::executeQuery('SET SESSION sql_mode = STRICT_TRANS_TABLES');
     }
     CRM_Core_DAO::executeQuery('SET NAMES utf8');
+    CRM_Core_DAO::executeQuery('SET @uniqueID = %1', array(1 => array(CRM_Utils_Request::id(), 'String')));
   }
 
   /**
index fd0c8fe0e9bb38c86a4cf8e91a06a3a1bb3b7030..3d546bac7cecb69d46690aed294846b627c022af 100644 (file)
  */
 class CRM_Utils_Request {
 
+  /**
+   * Get a unique ID for the request.
+   *
+   * This unique ID is assigned to mysql when the connection is opened and is
+   * available in PHP.
+   *
+   * The intent is that it is available for logging purposes and for triggers.
+   *
+   * The resulting string is 17 characters long. This consists of 13 characters of uniqid
+   * and 4 more random characters.
+   *
+   * Uniqid is unique to the microsecond - to make it more unique we add 4 more characters
+   * but stop short of the full 23 character string that a prefix would generate.
+   *
+   * It is intended that this string will be saved to log tables so striking a balance between
+   * uniqueness and length is important. Note that I did check & lining up with byte values
+   * (e.g 16 characters) does not confer any benefits. Using a CHAR field rather than VARCHAR
+   * may improve speed, if indexed.
+   *
+   * @return string
+   */
+  public static function id() {
+    if (!isset(\Civi::$statics[__CLASS__]['id'])) {
+      \Civi::$statics[__CLASS__]['id'] = uniqid() . CRM_Utils_String::createRandom(CRM_Utils_String::ALPHANUMERIC, 4);
+    }
+    return \Civi::$statics[__CLASS__]['id'];
+  }
+
   /**
    * Retrieve a value from the request (GET/POST/REQUEST)
    *