X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FLogging%2FSchema.php;h=b67d3af955ba03b2bdf276171bd3d4ad5b9d997e;hb=39373d13920ecfec6cb8025a3c2c98fa9bd4b3ff;hp=9abdd925b6075a153af94e909c1ec5f3c145cdcc;hpb=ec9bb041d5407d659b30d3ecd00b5db60d71ad52;p=civicrm-core.git diff --git a/CRM/Logging/Schema.php b/CRM/Logging/Schema.php index 9abdd925b6..b67d3af955 100644 --- a/CRM/Logging/Schema.php +++ b/CRM/Logging/Schema.php @@ -1,9 +1,9 @@ tables[] = $dao->TABLE_NAME; } - // do not log temp import, cache and log tables + // do not log temp import, cache, menu and log tables $this->tables = preg_grep('/^civicrm_import_job_/', $this->tables, PREG_GREP_INVERT); $this->tables = preg_grep('/_cache$/', $this->tables, PREG_GREP_INVERT); $this->tables = preg_grep('/_log/', $this->tables, PREG_GREP_INVERT); - $this->tables = preg_grep('/^civicrm_task_action_temp_/', $this->tables, PREG_GREP_INVERT); - $this->tables = preg_grep('/^civicrm_export_temp_/', $this->tables, PREG_GREP_INVERT); $this->tables = preg_grep('/^civicrm_queue_/', $this->tables, PREG_GREP_INVERT); + $this->tables = preg_grep('/^civicrm_menu/', $this->tables, PREG_GREP_INVERT); //CRM-14672 + $this->tables = preg_grep('/_temp_/', $this->tables, PREG_GREP_INVERT); // do not log civicrm_mailing_event* tables, CRM-12300 $this->tables = preg_grep('/^civicrm_mailing_event_/', $this->tables, PREG_GREP_INVERT); @@ -260,6 +260,11 @@ AND TABLE_NAME LIKE 'log_civicrm_%' return TRUE; } + /** + * @param $table + * + * @return array + */ private function _getCreateQuery($table) { $dao = CRM_Core_DAO::executeQuery("SHOW CREATE TABLE {$table}"); $dao->fetch(); @@ -267,6 +272,12 @@ AND TABLE_NAME LIKE 'log_civicrm_%' return $create; } + /** + * @param $col + * @param $createQuery + * + * @return array|mixed|string + */ private function _getColumnQuery($col, $createQuery) { $line = preg_grep("/^ `$col` /", $createQuery); $line = rtrim(array_pop($line), ','); @@ -275,6 +286,9 @@ AND TABLE_NAME LIKE 'log_civicrm_%' return $line; } + /** + * @param bool $rebuildTrigger + */ function fixSchemaDifferencesForAll($rebuildTrigger = FALSE) { $diffs = array(); foreach ($this->tables as $table) { @@ -301,6 +315,11 @@ AND TABLE_NAME LIKE 'log_civicrm_%' * so there's no need for a default timestamp and therefore we remove such default timestamps * also eliminate the NOT NULL constraint, since we always copy and schema can change down the road) */ + /** + * @param $query + * + * @return mixed + */ function fixTimeStampAndNotNullSQL($query) { $query = str_ireplace("TIMESTAMP NOT NULL", "TIMESTAMP NULL", $query); $query = str_ireplace("DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP", '', $query); @@ -346,9 +365,8 @@ AND TABLE_NAME LIKE 'log_civicrm_%' $from = (substr($table, 0, 4) == 'log_') ? "`{$this->db}`.$table" : $table; if (!isset($columnsOf[$table]) || $force) { - CRM_Core_Error::ignoreException(); + $errorScope = CRM_Core_TemporaryErrorScope::ignoreException(); $dao = CRM_Core_DAO::executeQuery("SHOW COLUMNS FROM $from"); - CRM_Core_Error::setCallback(); if (is_a($dao, 'DB_Error')) { return array(); } @@ -372,7 +390,7 @@ AND TABLE_NAME LIKE 'log_civicrm_%' $dao = new CRM_Contact_DAO_Contact(); $civiDB = $dao->_database; } - CRM_Core_Error::ignoreException(); + $errorScope = CRM_Core_TemporaryErrorScope::ignoreException(); // NOTE: W.r.t Performance using one query to find all details and storing in static array is much faster // than firing query for every given table. $query = " @@ -380,7 +398,6 @@ SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEF FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema IN ('{$this->db}', '{$civiDB}')"; $dao = CRM_Core_DAO::executeQuery($query); - CRM_Core_Error::setCallback(); if (is_a($dao, 'DB_Error')) { return array(); } @@ -400,6 +417,12 @@ WHERE table_schema IN ('{$this->db}', '{$civiDB}')"; return $columnSpecs[$table]; } + /** + * @param $civiTable + * @param $logTable + * + * @return array + */ function columnsWithDiffSpecs($civiTable, $logTable) { $civiTableSpecs = $this->columnSpecsOf($civiTable); $logTableSpecs = $this->columnSpecsOf($logTable); @@ -413,21 +436,21 @@ WHERE table_schema IN ('{$this->db}', '{$civiDB}')"; // NOTE: we consider only those columns for modifications where there is a spec change, and that the column definition // wasn't deliberately modified by fixTimeStampAndNotNullSQL() method. foreach ($civiTableSpecs as $col => $colSpecs) { - if ( !is_array($logTableSpecs[$col]) ) { + if (!isset($logTableSpecs[$col]) || !is_array($logTableSpecs[$col]) ) { $logTableSpecs[$col] = array(); } $specDiff = array_diff($civiTableSpecs[$col], $logTableSpecs[$col]); if (!empty($specDiff) && $col != 'id' && !array_key_exists($col, $diff['ADD'])) { // ignore 'id' column for any spec changes, to avoid any auto-increment mysql errors - if ($civiTableSpecs[$col]['DATA_TYPE'] != $logTableSpecs[$col]['DATA_TYPE']) { + if ($civiTableSpecs[$col]['DATA_TYPE'] != CRM_Utils_Array::value('DATA_TYPE', $logTableSpecs[$col])) { // if data-type is different, surely consider the column $diff['MODIFY'][] = $col; - } else if ($civiTableSpecs[$col]['IS_NULLABLE'] != $logTableSpecs[$col]['IS_NULLABLE'] && + } else if ($civiTableSpecs[$col]['IS_NULLABLE'] != CRM_Utils_Array::value('IS_NULLABLE', $logTableSpecs[$col]) && $logTableSpecs[$col]['IS_NULLABLE'] == 'NO') { // if is-null property is different, and log table's column is NOT-NULL, surely consider the column $diff['MODIFY'][] = $col; - } else if ($civiTableSpecs[$col]['COLUMN_DEFAULT'] != $logTableSpecs[$col]['COLUMN_DEFAULT'] && + } else if ($civiTableSpecs[$col]['COLUMN_DEFAULT'] != CRM_Utils_Array::value('COLUMN_DEFAULT', $logTableSpecs[$col]) && !strstr($civiTableSpecs[$col]['COLUMN_DEFAULT'], 'TIMESTAMP')) { // if default property is different, and its not about a timestamp column, consider it $diff['MODIFY'][] = $col; @@ -535,6 +558,11 @@ COLS; return (bool) CRM_Core_DAO::singleValueQuery("SHOW TRIGGERS LIKE 'civicrm_contact'"); } + /** + * @param $info + * @param null $tableName + * @param bool $force + */ function triggerInfo(&$info, $tableName = NULL, $force = FALSE) { // check if we have logging enabled $config =& CRM_Core_Config::singleton();