ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
RevisionDBRepository.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
34 
41 {
42  public const TABLE_NAME = 'il_resource_revision';
43  public const IDENTIFICATION = 'rid';
47  protected array $cache = [];
48  protected \ilDBInterface $db;
49 
50  public function __construct(\ilDBInterface $db)
51  {
52  $this->db = $db;
53  }
54 
58  public function getNamesForLocking(): array
59  {
60  return [self::TABLE_NAME];
61  }
62 
63  public function blankFromUpload(
64  InfoResolver $info_resolver,
65  StorableResource $resource,
66  UploadResult $result
68  $new_version_number = $info_resolver->getNextVersionNumber();
69  $revision = new UploadedFileRevision($resource->getIdentification(), $result);
70  $revision->setStorageID($resource->getStorageID());
71  $revision->setVersionNumber($new_version_number);
72 
73  return $revision;
74  }
75 
76  public function blankFromStream(
77  InfoResolver $info_resolver,
78  StorableResource $resource,
79  FileStream $stream,
80  bool $keep_original = false
82  $new_version_number = $info_resolver->getNextVersionNumber();
83  $revision = new FileStreamRevision($resource->getIdentification(), $stream, $keep_original);
84  $revision->setStorageID($resource->getStorageID());
85  $revision->setVersionNumber($new_version_number);
86 
87  return $revision;
88  }
89 
90  public function blankFromClone(
91  InfoResolver $info_resolver,
92  StorableResource $resource,
93  FileRevision $revision_to_clone
94  ): CloneRevision {
95  $new_version_number = $info_resolver->getNextVersionNumber();
96  $revision = new CloneRevision($resource->getIdentification(), $revision_to_clone);
97  $revision->setStorageID($revision_to_clone->getStorageID());
98  $revision->setVersionNumber($new_version_number);
99 
100  return $revision;
101  }
102 
103  public function store(Revision $revision): void
104  {
105  $rid = $revision->getIdentification()->serialize();
106  $r = $this->db->queryF(
107  "SELECT " . self::IDENTIFICATION . " FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s AND version_number = %s",
108  ['text', 'integer'],
109  [$rid, $revision->getVersionNumber()]
110  );
111 
112  if ($r->numRows() > 0) {
113  // UPDATE
114  $this->db->update(
115  self::TABLE_NAME,
116  [
117  'available' => ['integer', true],
118  'owner_id' => ['integer', $revision->getOwnerId()],
119  'title' => ['text', $revision->getTitle()]
120  ],
121  [
122  self::IDENTIFICATION => ['text', $rid],
123  'version_number' => ['integer', $revision->getVersionNumber()],
124  ]
125  );
126  } else {
127  // CREATE
128  $this->db->insert(
129  self::TABLE_NAME,
130  [
131  self::IDENTIFICATION => ['text', $rid],
132  'version_number' => ['integer', $revision->getVersionNumber()],
133  'available' => ['integer', true],
134  'owner_id' => ['integer', $revision->getOwnerId()],
135  'title' => ['text', $revision->getTitle()]
136  ]
137  );
138  }
139  $this->cache[$rid][$revision->getVersionNumber()] = $revision;
140  }
141 
145  public function get(StorableResource $resource): RevisionCollection
146  {
147  $collection = new RevisionCollection($resource->getIdentification());
148 
149  $rid = $resource->getIdentification()->serialize();
150  if (isset($this->cache[$rid]) && is_array($this->cache[$rid])) {
151  foreach ($this->cache[$rid] as $rev) {
152  $collection->add($rev);
153  }
154  return $collection;
155  }
156  $r = $this->db->queryF(
157  "SELECT * FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s",
158  ['text'],
159  [$rid]
160  );
161  while ($d = $this->db->fetchObject($r)) {
162  $revision = new FileRevision(new ResourceIdentification($d->rid));
163  $revision->setVersionNumber((int)$d->version_number);
164  $revision->setOwnerId((int)$d->owner_id);
165  $revision->setTitle((string)$d->title);
166  $collection->add($revision);
167  $this->cache[$d->rid][(int)$d->version_number] = $revision;
168  }
169 
170  return $collection;
171  }
172 
176  public function delete(Revision $revision): void
177  {
178  $rid = $revision->getIdentification()->serialize();
179  $this->db->manipulateF(
180  "DELETE FROM " . self::TABLE_NAME . " WHERE " . self::IDENTIFICATION . " = %s AND version_number = %s",
181  ['text', 'integer'],
182  [$rid, $revision->getVersionNumber()]
183  );
184  unset($this->cache[$rid][$revision->getVersionNumber()]);
185  }
186 
187  public function preload(array $identification_strings): void
188  {
189  $r = $this->db->query(
190  "SELECT * FROM " . self::TABLE_NAME . " WHERE " . $this->db->in(
191  self::IDENTIFICATION,
192  $identification_strings,
193  false,
194  'text'
195  )
196  );
197  while ($d = $this->db->fetchAssoc($r)) {
198  $this->populateFromArray($d);
199  }
200  }
201 
202  public function populateFromArray(array $data): void
203  {
204  $revision = new FileRevision(new ResourceIdentification($data['rid']));
205  $revision->setVersionNumber((int)$data['version_number']);
206  $revision->setOwnerId((int)$data['owner_id']);
207  $revision->setTitle((string)$data['revision_title']);
208  $this->cache[$data['rid']][(int)$data['version_number']] = $revision;
209  }
210 }
blankFromUpload(InfoResolver $info_resolver, StorableResource $resource, UploadResult $result)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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, bool $keep_original=false)
Interface FileStream.
Definition: FileStream.php:33
for($i=6; $i< 13; $i++) for($i=1; $i< 13; $i++) $d
Definition: date.php:296
blankFromClone(InfoResolver $info_resolver, StorableResource $resource, FileRevision $revision_to_clone)