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