ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
RevisionDBRepository.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
35 
42 {
43  public const TABLE_NAME = 'il_resource_revision';
44  public const IDENTIFICATION = 'rid';
48  protected array $cache = [];
49  protected \ilDBInterface $db;
50 
51  public function __construct(\ilDBInterface $db)
52  {
53  $this->db = $db;
54  }
55 
59  public function getNamesForLocking(): array
60  {
61  return [self::TABLE_NAME];
62  }
63 
64  public function blankFromUpload(
65  InfoResolver $info_resolver,
66  StorableResource $resource,
67  UploadResult $result,
68  RevisionStatus $status
70  $new_version_number = $info_resolver->getNextVersionNumber();
71  $revision = new UploadedFileRevision($resource->getIdentification(), $result);
72  $revision->setStorageID($resource->getStorageID());
73  $revision->setVersionNumber($new_version_number);
74  $revision->setStatus($status);
75 
76  return $revision;
77  }
78 
79  public function blankFromStream(
80  InfoResolver $info_resolver,
81  StorableResource $resource,
82  FileStream $stream,
83  RevisionStatus $status,
84  bool $keep_original = false
86  $new_version_number = $info_resolver->getNextVersionNumber();
87  $revision = new FileStreamRevision($resource->getIdentification(), $stream, $keep_original);
88  $revision->setStorageID($resource->getStorageID());
89  $revision->setVersionNumber($new_version_number);
90  $revision->setStatus($status);
91 
92  return $revision;
93  }
94 
95  public function blankFromClone(
96  InfoResolver $info_resolver,
97  StorableResource $resource,
98  FileRevision $revision_to_clone
99  ): CloneRevision {
100  $new_version_number = $info_resolver->getNextVersionNumber();
101  $revision = new CloneRevision($resource->getIdentification(), $revision_to_clone);
102  $revision->setStorageID($revision_to_clone->getStorageID());
103  $revision->setVersionNumber($new_version_number);
104  $revision->setStatus(RevisionStatus::PUBLISHED);
105 
106  return $revision;
107  }
108 
109  public function store(Revision $revision): void
110  {
111  $rid = $revision->getIdentification()->serialize();
112  $version = $revision->getVersionNumber();
113 
114  $this->db->replace(
115  self::TABLE_NAME,
116  [
117  self::IDENTIFICATION => ['text', $rid],
118  'version_number' => ['integer', $version],
119  ],
120  [
121  'available' => ['integer', 1],
122  'owner_id' => ['integer', $revision->getOwnerId()],
123  'title' => ['text', $revision->getTitle()],
124  'status' => ['text', $revision->getStatus()->value],
125  ]
126  );
127 
128  $this->cache[$rid][$version] = $revision;
129  }
130 
134  public function get(StorableResource $resource): RevisionCollection
135  {
136  $collection = new RevisionCollection($resource->getIdentification());
137 
138  $rid = $resource->getIdentification()->serialize();
139  if (isset($this->cache[$rid]) && \is_array($this->cache[$rid])) {
140  foreach ($this->cache[$rid] as $rev) {
141  $collection->add($rev);
142  }
143  return $collection;
144  }
145  $r = $this->db->queryF(
146  "SELECT * FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s",
147  ['text'],
148  [$rid]
149  );
150  while ($d = $this->db->fetchObject($r)) {
151  $revision = new FileRevision(new ResourceIdentification($d->rid));
152  $revision->setVersionNumber((int) $d->version_number);
153  $revision->setOwnerId((int) $d->owner_id);
154  $revision->setTitle((string) $d->title);
155  $revision->setStatus(RevisionStatus::from((int) $d->status));
156  $collection->add($revision);
157  $this->cache[$d->rid][(int) $d->version_number] = $revision;
158  }
159 
160  return $collection;
161  }
162 
166  public function delete(Revision $revision): void
167  {
168  $rid = $revision->getIdentification()->serialize();
169  $this->db->manipulateF(
170  "DELETE FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s AND version_number = %s",
171  ['text', 'integer'],
172  [$rid, $revision->getVersionNumber()]
173  );
174  unset($this->cache[$rid][$revision->getVersionNumber()]);
175  }
176 
177  public function preload(array $identification_strings): void
178  {
179  $r = $this->db->query(
180  "SELECT * FROM " . self::TABLE_NAME . " WHERE " . $this->db->in(
181  self::IDENTIFICATION,
182  $identification_strings,
183  false,
184  'text'
185  )
186  );
187  while ($d = $this->db->fetchAssoc($r)) {
188  $this->populateFromArray($d);
189  }
190  }
191 
192  public function populateFromArray(array $data): void
193  {
194  $revision = new FileRevision(new ResourceIdentification($data['rid']));
195  $revision->setVersionNumber((int) $data['version_number']);
196  $revision->setOwnerId((int) $data['owner_id']);
197  $revision->setTitle((string) $data['revision_title']);
198  $revision->setStatus(RevisionStatus::from((int) $data['status']));
199  $this->cache[$data['rid']][(int) $data['version_number']] = $revision;
200  }
201 }
$version
Definition: plugin.php:25
blankFromStream(InfoResolver $info_resolver, StorableResource $resource, FileStream $stream, RevisionStatus $status, bool $keep_original=false)
blankFromUpload(InfoResolver $info_resolver, StorableResource $resource, UploadResult $result, RevisionStatus $status)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
The base interface for all filesystem streams.
Definition: FileStream.php:31
blankFromClone(InfoResolver $info_resolver, StorableResource $resource, FileRevision $revision_to_clone)
$r