/** * computes changes of records and writes them to the logbook * * NOTE: expects last_modified_by and last_modified_time to be set * properly in the $_newRecord * * @param Tinebase_Record_Abstract $_newRecord record from user data * @param Tinebase_Record_Abstract $_curRecord record from storage * @param string $_model * @param string $_backend * @param string $_id * @return Tinebase_Record_RecordSet RecordSet of Tinebase_Model_ModificationLog */ public function writeModLog($_newRecord, $_curRecord, $_model, $_backend, $_id) { $commonModLog = $this->_getCommonModlog($_model, $_backend, array('last_modified_time' => $_newRecord->last_modified_time, 'last_modified_by' => $_newRecord->last_modified_by), $_id); $diffs = $_curRecord->diff($_newRecord); if (!empty($diffs) && Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' diffs: ' . print_r($diffs, TRUE)); } if (!empty($diffs) && Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' curRecord: ' . print_r($_curRecord->toArray(), TRUE)); } $modifications = new Tinebase_Record_RecordSet('Tinebase_Model_ModificationLog'); $this->_loopModifications($diffs, $commonModLog, $modifications, $_curRecord->toArray(), $_curRecord->getModlogOmitFields()); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Logged ' . count($modifications) . ' modifications.'); } return $modifications; }
/** * (non-PHPdoc) * @see Tinebase_Record_Abstract::diff() */ public function diff($record, $omitFields = array()) { $checkRrule = false; if (!in_array('rrule', $omitFields)) { $omitFields[] = 'rrule'; $checkRrule = true; } $diff = parent::diff($record, $omitFields); if ($checkRrule) { $ownRrule = !$this->rrule instanceof Calendar_Model_Rrule ? Calendar_Model_Rrule::getRruleFromString((string) $this->rrule) : $this->rrule; $recordRrule = !$record->rrule instanceof Calendar_Model_Rrule ? Calendar_Model_Rrule::getRruleFromString($record->rrule) : $record->rrule; $rruleDiff = $ownRrule->diff($recordRrule); // don't take small ( < one day) rrule_until changes as diff if ($ownRrule->until instanceof Tinebase_DateTime && (isset($rruleDiff->diff['until']) || array_key_exists('until', $rruleDiff->diff)) && $rruleDiff->diff['until'] instanceof Tinebase_DateTime && abs($rruleDiff->diff['until']->getTimestamp() - $ownRrule->until->getTimestamp()) < 86400) { $rruleDiffArray = $rruleDiff->diff; unset($rruleDiffArray['until']); $rruleDiff->diff = $rruleDiffArray; } if (!empty($rruleDiff->diff)) { $diffArray = $diff->diff; $diffArray['rrule'] = $rruleDiff; $diff->diff = $diffArray; } } return $diff; }
/** * merge record / skip if no diff * * @param Tinebase_Record_Abstract $updateRecord * @param Tinebase_Record_Abstract $mergeRecord * @return Tinebase_Record_Abstract */ protected function _mergeRecord($updateRecord, $mergeRecord) { $omitFields = array('creation_time', 'created_by', 'last_modified_time', 'last_modified_by', 'seq', 'id'); $diff = $updateRecord->diff($mergeRecord, $omitFields); if (!$diff || $diff->isEmpty()) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Records are identical, no need to update'); } return null; } else { if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Got diff: ' . print_r($diff->diff, TRUE)); } } return $updateRecord->merge($mergeRecord, $diff); }