Beispiel #1
0
 /**
  * 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));
     }
 }