Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions apps/dav/lib/Connector/Sabre/FilesPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -611,14 +611,10 @@ function (mixed $value) use ($accessRight, $knownMetadata, $node, $mutation, $fi
$metadata->setArray($metadataKey, $value);
break;
case IMetadataValueWrapper::TYPE_STRING_LIST:
$metadata->setStringList(
$metadataKey, $value, $knownMetadata->isIndex($metadataKey)
);
$metadata->setStringList($metadataKey, $value, $knownMetadata->isIndex($metadataKey));
break;
case IMetadataValueWrapper::TYPE_INT_LIST:
$metadata->setIntList(
$metadataKey, $value, $knownMetadata->isIndex($metadataKey)
);
$metadata->setIntList($metadataKey, $value, $knownMetadata->isIndex($metadataKey));
break;
}

Expand Down
10 changes: 8 additions & 2 deletions lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ public function handle(Event $event): void {
return;
}

$currentEtag = $file->getEtag();
$metadata = $event->getMetadata();
if ($metadata->getEtag('blurhash') === $currentEtag) {
return;
}

// too heavy to run on the live thread, request a rerun as a background job
if ($event instanceof MetadataLiveEvent) {
$event->requestBackgroundJob();
Expand All @@ -95,8 +101,8 @@ public function handle(Event $event): void {
return;
}

$metadata = $event->getMetadata();
$metadata->setString('blurhash', $this->generateBlurHash($image));
$metadata->setString('blurhash', $this->generateBlurHash($image))
->setEtag('blurhash', $currentEtag);
}

/**
Expand Down
17 changes: 17 additions & 0 deletions lib/private/FilesMetadata/Model/FilesMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,23 @@ public function setEditPermission(string $key, int $permission): void {
$this->metadata[$key]->setEditPermission($permission);
}


public function getEtag(string $key): string {
if (!array_key_exists($key, $this->metadata)) {
throw new FilesMetadataNotFoundException();
}

return $this->metadata[$key]->getEtag();
}

public function setEtag(string $key, string $etag): void {
if (!array_key_exists($key, $this->metadata)) {
throw new FilesMetadataNotFoundException();
}

$this->metadata[$key]->setEtag($etag);
}

/**
* @param string $key metadata key
*
Expand Down
24 changes: 24 additions & 0 deletions lib/private/FilesMetadata/Model/MetadataValueWrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class MetadataValueWrapper implements IMetadataValueWrapper {
private string $type;
/** @var string|int|float|bool|array|string[]|int[] */
private mixed $value = null;
private string $etag = '';
private bool $indexed = false;
private int $editPermission = self::EDIT_FORBIDDEN;

Expand Down Expand Up @@ -350,6 +351,27 @@ public function getValueAny(): mixed {
return $this->value;
}

/**
* @inheritDoc
* @return string stored etag
* @since 29.0.0
*/
public function getEtag(): string {
return $this->etag;
}

/**
* @param string $etag etag value
*
* @inheritDoc
* @return self
* @since 29.0.0
*/
public function setEtag(string $etag): self {
$this->etag = $etag;
return $this;
}

/**
* @param bool $indexed TRUE to set the stored value as an indexed value
*
Expand Down Expand Up @@ -405,6 +427,7 @@ public function getEditPermission(): int {
public function import(array $data): self {
$this->value = $data['value'] ?? null;
$this->type = $data['type'] ?? '';
$this->setEtag($data['etag'] ?? '');
$this->setIndexed($data['indexed'] ?? false);
$this->setEditPermission($data['editPermission'] ?? self::EDIT_FORBIDDEN);
return $this;
Expand All @@ -414,6 +437,7 @@ public function jsonSerialize(bool $emptyValues = false): array {
return [
'value' => ($emptyValues) ? null : $this->value,
'type' => $this->getType(),
'etag' => $this->getEtag(),
'indexed' => $this->isIndexed(),
'editPermission' => $this->getEditPermission()
];
Expand Down
14 changes: 3 additions & 11 deletions lib/private/FilesMetadata/Service/MetadataRequestService.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,12 @@ public function getMetadataFromFileId(int $fileId): IFilesMetadata {
try {
$qb = $this->dbConnection->getQueryBuilder();
$qb->select('json', 'sync_token')->from(self::TABLE_METADATA);
$qb->where(
$qb->expr()->eq('file_id', $qb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT))
);
$qb->where($qb->expr()->eq('file_id', $qb->createNamedParameter($fileId, IQueryBuilder::PARAM_INT)));
$result = $qb->executeQuery();
$data = $result->fetch();
$result->closeCursor();
} catch (Exception $e) {
$this->logger->warning(
'exception while getMetadataFromDatabase()', ['exception' => $e, 'fileId' => $fileId]
);
$this->logger->warning('exception while getMetadataFromDatabase()', ['exception' => $e, 'fileId' => $fileId]);
throw new FilesMetadataNotFoundException();
}

Expand All @@ -100,8 +96,6 @@ public function getMetadataFromFileId(int $fileId): IFilesMetadata {
/**
* returns metadata for multiple file ids
*
* If
*
* @param array $fileIds file ids
*
* @return array File ID is the array key, files without metadata are not returned in the array
Expand All @@ -110,9 +104,7 @@ public function getMetadataFromFileId(int $fileId): IFilesMetadata {
public function getMetadataFromFileIds(array $fileIds): array {
$qb = $this->dbConnection->getQueryBuilder();
$qb->select('file_id', 'json', 'sync_token')->from(self::TABLE_METADATA);
$qb->where(
$qb->expr()->in('file_id', $qb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY))
);
$qb->where($qb->expr()->in('file_id', $qb->createNamedParameter($fileIds, IQueryBuilder::PARAM_INT_ARRAY)));

$list = [];
$result = $qb->executeQuery();
Expand Down
19 changes: 19 additions & 0 deletions lib/public/FilesMetadata/Model/IFilesMetadata.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,14 @@
* "mymeta": {
* "value": "this is a test",
* "type": "string",
* "etag": "abcd1234",
* "indexed": false,
* "editPermission": 1
* },
* "myapp-anothermeta": {
* "value": 42,
* "type": "int",
* "etag": "0987zyxw",
* "indexed": true,
* "editPermission": 0
* }
Expand Down Expand Up @@ -112,6 +114,23 @@ public function getIndexes(): array;
*/
public function isIndex(string $key): bool;

/**
* returns file etag stored during the last update of the metadata key
*
* @param string $key metadata key
* @return string
* @since 29.0.0
*/
public function getEtag(string $key): string;

/**
* set file etag
*
* @param string $key metadata key
* @since 29.0.0
*/
public function setEtag(string $key, string $etag): void;

/**
* set remote edit permission
* (Webdav PROPPATCH)
Expand Down
18 changes: 18 additions & 0 deletions lib/public/FilesMetadata/Model/IMetadataValueWrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,24 @@ public function getValueIntList(): array;
*/
public function getValueAny(): mixed;

/**
* get stored etag value
*
* @return string stored etag
* @since 29.0.0
*/
public function getEtag(): string;

/**
* set etag value
*
* @param string $etag etag value
*
* @return self
* @since 29.0.0
*/
public function setEtag(string $etag): self;

/**
* @param bool $indexed TRUE to set the stored value as an indexed value
*
Expand Down