/** * Saves a logbook record * * @param Tinebase_Model_ModificationLog _modification * @return string id; * @throws Tinebase_Exception_Record_Validation */ public function setModification(Tinebase_Model_ModificationLog $_modification) { if ($_modification->isValid()) { $id = $_modification->generateUID(); $_modification->setId($id); $_modification->convertDates = true; $modificationArray = $_modification->toArray(); if (is_array($modificationArray['new_value'])) { throw new Tinebase_Exception_Record_Validation("New value is an array! \n" . print_r($modificationArray['new_value'], true)); } $this->_table->insert($modificationArray); } else { throw new Tinebase_Exception_Record_Validation("_modification data is not valid! \n" . print_r($_modification->getValidationErrors(), true)); } return $id; }
/** * record set diff resolving * * @param Tinebase_Record_Interface $newRecord * @param Tinebase_Model_ModificationLog $diff */ protected function _resolveRecordSetMergeUpdate(Tinebase_Record_Interface $newRecord, Tinebase_Model_ModificationLog $diff) { $attribute = $diff->modified_attribute; if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Try to merge record set changes of record attribute " . $attribute); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' New record: ' . print_r($newRecord->toArray(), TRUE)); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Mod log: ' . print_r($diff->toArray(), TRUE)); } $concurrentChangeDiff = new Tinebase_Record_RecordSetDiff(Zend_Json::decode($diff->new_value)); if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' RecordSet diff: ' . print_r($concurrentChangeDiff->toArray(), TRUE)); } foreach ($concurrentChangeDiff->added as $added) { $addedRecord = new $concurrentChangeDiff->model($added); if (!$newRecord->{$attribute}->getById($addedRecord->getId())) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Adding recently added record " . $addedRecord->getId()); } $newRecord->{$attribute}->addRecord($addedRecord); } } foreach ($concurrentChangeDiff->removed as $removed) { $removedRecord = new $concurrentChangeDiff->model($removed); $recordToRemove = $newRecord->{$attribute}->getById($removedRecord->getId()); if ($recordToRemove) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Removing record " . $recordToRemove->getId()); } $newRecord->{$attribute}->removeRecord($recordToRemove); } } foreach ($concurrentChangeDiff->modified as $modified) { if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' modified diff: ' . print_r($modified, TRUE)); } $modifiedRecord = new $concurrentChangeDiff->model(array_merge(array('id' => $modified['id']), $modified['diff']), TRUE); $newRecordsRecord = $newRecord->{$attribute}->getById($modifiedRecord->getId()); if ($newRecordsRecord && ($newRecordsRecord->has('seq') || $newRecordsRecord->has('last_modified_time'))) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Managing updates for ' . get_class($newRecordsRecord) . ' record ' . $newRecordsRecord->getId()); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' new record: ' . print_r($newRecordsRecord->toArray(), TRUE)); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' modified record: ' . print_r($modifiedRecord->toArray(), TRUE)); } if (null === $this->_applicationId) { throw new Tinebase_Exception_UnexpectedValue('application_id needs to be set here'); } $this->manageConcurrentUpdates($this->_applicationId, $newRecordsRecord, $modifiedRecord); } else { throw new Tinebase_Timemachine_Exception_ConcurrencyConflict('concurrency conflict - modified record changes could not be merged!'); } } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' New record after merge: ' . print_r($newRecord->toArray(), TRUE)); } }