public function saveRecord(Record $record, DataDimensions $dataDimensions = null)
 {
     if (!$dataDimensions) {
         $dataDimensions = $this->getCurrentDataDimensions();
     }
     if ($record->getID() == '') {
         $record->setId($this->getNextId($record->getContentTypeName(), $dataDimensions));
         $record->setRevision(1);
         $toBeSavedRecord = $record;
     } else {
         $mergedRecord = $this->mergeExistingRecord($record, $dataDimensions);
         $mergedRecord->setRevision($mergedRecord->getRevision() + 1);
         $record->setRevision($mergedRecord->getRevision());
         $toBeSavedRecord = $mergedRecord;
     }
     $toBeSavedRecord->setLastChangeUserInfo($this->userInfo);
     $record->setLastChangeUserInfo($this->userInfo);
     $filename = $this->getConfiguration()->getFolderNameRecords($toBeSavedRecord->getContentTypeName(), $dataDimensions);
     $filename .= '/' . $toBeSavedRecord->getID() . '.json';
     $data = json_encode($toBeSavedRecord, JSON_PRETTY_PRINT);
     $this->stashRecord($toBeSavedRecord, $dataDimensions);
     if (!$this->writeData($filename, $data)) {
         throw new AnyContentClientException('Error when saving record of content type ' . $record->getContentTypeName());
     }
     return $toBeSavedRecord->getID();
 }
 public function saveRecord(Record $record, DataDimensions $dataDimensions = null)
 {
     if (!$dataDimensions) {
         $dataDimensions = $this->getCurrentDataDimensions();
     }
     unset($this->repositoryInfo[(string) $dataDimensions]);
     $url = 'content/' . $record->getContentTypeName() . '/records/' . $dataDimensions->getWorkspace() . '?language=' . $dataDimensions->getLanguage() . '&view=' . $dataDimensions->getViewName() . '&timeshift=' . $dataDimensions->getTimeShift();
     $response = $this->getClient()->post($url, ['body' => ['record' => json_encode($record)]]);
     $id = $response->json();
     $record->setId($id);
     $this->stashRecord($record, $dataDimensions);
     return $response->json();
 }
 public function saveRecord(Record $record, DataDimensions $dataDimensions = null)
 {
     if (!$dataDimensions) {
         $dataDimensions = $this->getCurrentDataDimensions();
     }
     unset($this->repositoryInfo[(string) $dataDimensions]);
     $url = 'content/' . $record->getContentTypeName() . '/records/' . $dataDimensions->getWorkspace() . '/' . $dataDimensions->getViewName();
     $record = $record->setLastChangeUserInfo($this->userInfo);
     $this->getClient()->setDefaultOption('query', ['userinfo' => ['username' => $this->userInfo->getUsername(), 'firstname' => $this->userInfo->getFirstname(), 'lastname' => $this->userInfo->getLastname()]]);
     $response = $this->getClient()->post($url, ['body' => ['record' => json_encode($record), 'language' => $dataDimensions->getLanguage()]]);
     $id = $response->json();
     $record->setId($id);
     $this->stashRecord($record, $dataDimensions);
     return $response->json();
 }
 public function saveRecord(Record $record, DataDimensions $dataDimensions = null)
 {
     if ($dataDimensions == null) {
         $dataDimensions = $this->getCurrentDataDimensions();
     }
     $tableName = $this->getContentTypeTableName($record->getContentTypeName());
     $repositoryName = $this->getRepository()->getName();
     $contentTypeName = $record->getContentTypeName();
     $record = $this->finalizeRecord($record, $dataDimensions);
     $definition = $record->getContentTypeDefinition();
     $mode = 'insert';
     $record->setRevision(1);
     $values = [];
     $values['revision'] = 1;
     $values['workspace'] = $dataDimensions->getWorkspace();
     $values['language'] = $dataDimensions->getLanguage();
     $values['deleted'] = 0;
     if ($record->getId() != '') {
         $sql = 'SELECT * FROM ' . $tableName . ' WHERE id = ? AND workspace = ? AND language = ? AND deleted = 0 AND validfrom_timestamp <= ? AND validuntil_timestamp > ?';
         $timestamp = TimeShifter::getTimeshiftTimestamp($dataDimensions->getTimeShift());
         $rows = $this->getDatabase()->fetchAllSQL($sql, [$record->getId(), $dataDimensions->getWorkspace(), $dataDimensions->getLanguage(), $timestamp, $timestamp]);
         if (count($rows) == 1) {
             $values = reset($rows);
             $values['revision'] = $values['revision'] + 1;
             $record->setRevision($values['revision']);
             $mode = 'update';
         }
     }
     if ($mode == 'insert' and $record->getId() == '') {
         // update counter for new record
         $sql = 'INSERT INTO _counter_ (repository,content_type,counter) VALUES (? , ? ,1) ON DUPLICATE KEY UPDATE counter=counter+1;';
         $this->getDatabase()->execute($sql, [$repositoryName, $contentTypeName]);
         $sql = 'SELECT counter FROM _counter_ WHERE repository = ? AND content_type = ?';
         $nextId = $this->getDatabase()->fetchColumnSQL($sql, 0, [$repositoryName, $contentTypeName]);
         $record->setId($nextId);
         // make sure counter is always at least greater than the largest id, e.g. if the counter row got deleted
         $sql = 'SELECT MAX(id)+1 FROM ' . $tableName;
         $nextId = $this->getDatabase()->fetchColumnSQL($sql, 0);
         if ($nextId > $record->getId()) {
             $record->setId($nextId);
             $sql = 'INSERT INTO _counter_ (repository,content_type,counter) VALUES (? , ? ,?) ON DUPLICATE KEY UPDATE counter=?;';
             $this->getDatabase()->execute($sql, [$repositoryName, $contentTypeName, $nextId, $nextId]);
         }
     }
     $values['id'] = $record->getId();
     $timeshiftTimestamp = TimeShifter::getTimeshiftTimestamp();
     if ($mode == 'update') {
         // invalidate current revision
         $sql = 'UPDATE ' . $tableName . ' SET validuntil_timestamp = ? WHERE id = ? AND workspace = ? AND language = ? AND deleted = 0 AND validfrom_timestamp <=? AND validuntil_timestamp >?';
         $params = array();
         $params[] = $timeshiftTimestamp;
         $params[] = $record->getId();
         $params[] = $dataDimensions->getWorkspace();
         $params[] = $dataDimensions->getLanguage();
         $params[] = $timeshiftTimestamp;
         $params[] = $timeshiftTimestamp;
         $this->getDatabase()->execute($sql, $params);
     }
     if ($mode == 'insert') {
         $values['creation_timestamp'] = $timeshiftTimestamp;
         $values['creation_username'] = $this->userInfo->getUsername();
         $values['creation_firstname'] = $this->userInfo->getFirstname();
         $values['creation_lastname'] = $this->userInfo->getLastname();
     }
     $values['lastchange_timestamp'] = $timeshiftTimestamp;
     $values['lastchange_username'] = $this->userInfo->getUsername();
     $values['lastchange_firstname'] = $this->userInfo->getFirstname();
     $values['lastchange_lastname'] = $this->userInfo->getLastname();
     $values['validfrom_timestamp'] = $timeshiftTimestamp;
     $values['validuntil_timestamp'] = TimeShifter::getMaxTimestamp();
     foreach ($definition->getViewDefinition($dataDimensions->getViewName())->getProperties() as $property) {
         $values['property_' . $property] = $record->getProperty($property);
     }
     $values['parent_id'] = $record->getParent();
     $values['position'] = $record->getPosition();
     // TODO: Rebuild Nested Set On Change, but only if not within saveRecords
     //        if ($mode == 'update')
     //        {
     //
     //            $values['parent_id']      = $row['parent_id'];
     //            $values['position']       = $row['position'];
     //            $values['position_left']  = $row['position_left'];
     //            $values['position_right'] = $row['position_right'];
     //            $values['position_level'] = $row['position_level'];
     //
     //        }
     $this->getDatabase()->insert($tableName, $values);
     return $record->getId();
 }
 protected function mergeExistingRecord(Record $record, DataDimensions $dataDimensions)
 {
     if ($record->getID() != '') {
         $existingRecord = $this->getMultiViewRecord($record->getId(), $record->getContentTypeName(), $dataDimensions);
         if ($existingRecord) {
             $record->setRevision($existingRecord->getRevision());
             $existingProperties = $existingRecord->getProperties();
             $mergedProperties = array_merge($existingProperties, $record->getProperties());
             $mergedRecord = clone $record;
             $mergedRecord->setProperties($mergedProperties);
             return $mergedRecord;
         }
     }
     return $record;
 }
 protected function stashRecord(Record $record, DataDimensions $dataDimensions)
 {
     if (!$dataDimensions->hasRelativeTimeShift()) {
         $hash = md5($record->getContentTypeName() . $dataDimensions . get_class($record));
         $this->recordsStash[$hash][$record->getID()] = $record;
     }
 }