CRM-18193 create all new log tables with log_conn_id = varchar(17)
authoreileen <emcnaughton@wikimedia.org>
Tue, 15 Mar 2016 22:57:23 +0000 (11:57 +1300)
committerEileen <eileen@fuzion.co.nz>
Sat, 23 Apr 2016 03:51:09 +0000 (03:51 +0000)
This provides support for the unique id rather than the non-unique connection id

Change-Id: Ia2ce2f1854d1f6f90095585dbb3924f704be38b5

CRM/Logging/Schema.php
settings/Core.setting.php
tests/phpunit/api/v3/LoggingTest.php

index b64452a270aab7678a6613507b93010adaa440ee..47c761392a86fd582a0bc5d399366831bac4d5a7 100644 (file)
@@ -597,7 +597,7 @@ WHERE  table_schema IN ('{$this->db}', '{$civiDB}')";
     $cols = <<<COLS
             ,
             log_date    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-            log_conn_id INTEGER,
+            log_conn_id VARCHAR(17),
             log_user_id INTEGER,
             log_action  ENUM('Initialization', 'Insert', 'Update', 'Delete')
 COLS;
@@ -631,9 +631,13 @@ COLS;
     CRM_Core_DAO::executeQuery($query, CRM_Core_DAO::$_nullArray, TRUE, NULL, FALSE, FALSE);
 
     $columns = implode(', ', $this->columnsOf($table));
-    CRM_Core_DAO::executeQuery("INSERT INTO `{$this->db}`.log_$table ($columns, log_conn_id, log_user_id, log_action) SELECT $columns, CONNECTION_ID(), @civicrm_user_id, 'Initialization' FROM {$table}", CRM_Core_DAO::$_nullArray, TRUE, NULL, FALSE, FALSE);
+    CRM_Core_DAO::executeQuery("INSERT INTO `{$this->db}`.log_$table ($columns, log_conn_id, log_user_id, log_action) SELECT $columns, @uniqueID, @civicrm_user_id, 'Initialization' FROM {$table}", CRM_Core_DAO::$_nullArray, TRUE, NULL, FALSE, FALSE);
 
     $this->tables[] = $table;
+    if(empty($this->logs)) {
+      civicrm_api3('Setting', 'create', array('logging_uniqueid_date' => 'now'));
+      civicrm_api3('Setting', 'create', array('logging_all_tables_uniquid' => 1));
+    }
     $this->logs[$table] = "log_$table";
   }
 
@@ -776,8 +780,16 @@ COLS;
         $sqlStmt .= "NEW.$column, ";
         $deleteSQL .= "OLD.$column, ";
       }
-      $sqlStmt .= "CONNECTION_ID(), @civicrm_user_id, '{eventName}');";
-      $deleteSQL .= "CONNECTION_ID(), @civicrm_user_id, '{eventName}');";
+      if (civicrm_api3('Setting', 'getvalue', array('name' => 'logging_uniqueid_date', 'group' => 'core'))) {
+        $sqlStmt .= "@uniqueID, @civicrm_user_id, '{eventName}');";
+        $deleteSQL .= "@uniqueID, @civicrm_user_id, '{eventName}');";
+      }
+      else {
+        // The log tables have not yet been converted to have varchar(17) fields for log_conn_id.
+        // Continue to use the less reliable connection_id for al tables for now.
+        $sqlStmt .= "CONNECTION_ID(), @civicrm_user_id, '{eventName}');";
+        $deleteSQL .= "@uniqueID, @civicrm_user_id, '{eventName}');";
+      }
 
       $sqlStmt .= "END IF;";
       $deleteSQL .= "END IF;";
index 89dd7d150c454205b0343ab9f76cf08e617bd688..ce2c88fa9b58a4d7bb9ca45a3180343938f15830 100644 (file)
@@ -733,6 +733,36 @@ return array(
       'CRM_Logging_Schema::onToggle',
     ),
   ),
+  'logging_uniqueid_date' => array(
+    'add' => '4.7',
+    'help_text' => ts('This is the date when CRM-18193 was implemented'),
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'group_name' => 'CiviCRM Preferences',
+    'group' => 'core',
+    'name' => 'logging_uniqueid_date',
+    'type' => 'Date',
+    'quick_form_type' => 'DateTime',
+    'html_type' => '',
+    'default' => NULL,
+    'title' => 'Logging Unique ID not recorded before',
+    'description' => 'This is the date when CRM-18193 was implemented',
+  ),
+  'logging_all_tables_uniquid' => array(
+    'add' => '4.7',
+    'help_text' => ts('This indicates there are no tables holdng pre-uniqid log_conn_id values (CRM-18193)'),
+    'is_domain' => 1,
+    'is_contact' => 0,
+    'group_name' => 'CiviCRM Preferences',
+    'group' => 'core',
+    'name' => 'logging_all_tables_uniquid',
+    'type' => 'Boolean',
+    'quick_form_type' => 'YesNo',
+    'html_type' => '',
+    'default' => 0,
+    'title' => 'All tables use Unique Connection ID',
+    'description' => 'Do some tables pre-date CRM-18193?',
+  ),
   'userFrameworkUsersTableName' => array(
     'add' => '4.7',
     'help_text' => NULL,
index 7e885b0cceac3c7bd7125986be2ca41a04fca734..24bd12d5c6a85526f1a579e81a959f1192cd7c99 100644 (file)
@@ -111,6 +111,7 @@ class api_v3_LoggingTest extends CiviUnitTestCase {
     $this->assertEquals('log_civicrm_contact', $dao->Table);
     $tableField = 'Create_Table';
     $this->assertContains('`log_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,', $dao->$tableField);
+    $this->assertContains('`log_conn_id` varchar(17) COLLATE utf8_unicode_ci DEFAULT NULL,', $dao->$tableField);
     return $dao->$tableField;
   }