ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
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  $r = $this->db->queryF(
113  "SELECT " . self::IDENTIFICATION . " FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s AND version_number = %s",
114  ['text', 'integer'],
115  [$rid, $revision->getVersionNumber()]
116  );
117 
118  if ($r->numRows() > 0) {
119  // UPDATE
120  $this->db->update(
121  self::TABLE_NAME,
122  [
123  'available' => ['integer', true],
124  'owner_id' => ['integer', $revision->getOwnerId()],
125  'title' => ['text', $revision->getTitle()],
126  'status' => ['text', $revision->getStatus()->value],
127  ],
128  [
129  self::IDENTIFICATION => ['text', $rid],
130  'version_number' => ['integer', $revision->getVersionNumber()],
131  ]
132  );
133  } else {
134  // CREATE
135  $this->db->insert(
136  self::TABLE_NAME,
137  [
138  self::IDENTIFICATION => ['text', $rid],
139  'version_number' => ['integer', $revision->getVersionNumber()],
140  'available' => ['integer', true],
141  'owner_id' => ['integer', $revision->getOwnerId()],
142  'title' => ['text', $revision->getTitle()],
143  'status' => ['text', $revision->getStatus()->value],
144  ]
145  );
146  }
147  $this->cache[$rid][$revision->getVersionNumber()] = $revision;
148  }
149 
153  public function get(StorableResource $resource): RevisionCollection
154  {
155  $collection = new RevisionCollection($resource->getIdentification());
156 
157  $rid = $resource->getIdentification()->serialize();
158  if (isset($this->cache[$rid]) && is_array($this->cache[$rid])) {
159  foreach ($this->cache[$rid] as $rev) {
160  $collection->add($rev);
161  }
162  return $collection;
163  }
164  $r = $this->db->queryF(
165  "SELECT * FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s",
166  ['text'],
167  [$rid]
168  );
169  while ($d = $this->db->fetchObject($r)) {
170  $revision = new FileRevision(new ResourceIdentification($d->rid));
171  $revision->setVersionNumber((int)$d->version_number);
172  $revision->setOwnerId((int)$d->owner_id);
173  $revision->setTitle((string)$d->title);
174  $revision->setStatus(RevisionStatus::from((int)$d->status));
175  $collection->add($revision);
176  $this->cache[$d->rid][(int)$d->version_number] = $revision;
177  }
178 
179  return $collection;
180  }
181 
185  public function delete(Revision $revision): void
186  {
187  $rid = $revision->getIdentification()->serialize();
188  $this->db->manipulateF(
189  "DELETE FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s AND version_number = %s",
190  ['text', 'integer'],
191  [$rid, $revision->getVersionNumber()]
192  );
193  unset($this->cache[$rid][$revision->getVersionNumber()]);
194  }
195 
196  public function preload(array $identification_strings): void
197  {
198  $r = $this->db->query(
199  "SELECT * FROM " . self::TABLE_NAME . " WHERE " . $this->db->in(
200  self::IDENTIFICATION,
201  $identification_strings,
202  false,
203  'text'
204  )
205  );
206  while ($d = $this->db->fetchAssoc($r)) {
207  $this->populateFromArray($d);
208  }
209  }
210 
211  public function populateFromArray(array $data): void
212  {
213  $revision = new FileRevision(new ResourceIdentification($data['rid']));
214  $revision->setVersionNumber((int)$data['version_number']);
215  $revision->setOwnerId((int)$data['owner_id']);
216  $revision->setTitle((string)$data['revision_title']);
217  $revision->setStatus(RevisionStatus::from((int)$data['status']));
218  $this->cache[$data['rid']][(int)$data['version_number']] = $revision;
219  }
220 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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