Browse Source

Merge pull request #42707 from nextcloud/enh/noid/store-file-etag-at-metadata-creation

enh(metadata): store current file etag
tags/v29.0.0beta2
Maxence Lange 3 months ago
parent
commit
f4beb95cdc
No account linked to committer's email address

+ 2
- 6
apps/dav/lib/Connector/Sabre/FilesPlugin.php View File

@@ -611,14 +611,10 @@ class FilesPlugin extends ServerPlugin {
$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;
}


+ 8
- 2
lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php View File

@@ -72,6 +72,12 @@ class GenerateBlurhashMetadata implements IEventListener {
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();
@@ -95,8 +101,8 @@ class GenerateBlurhashMetadata implements IEventListener {
return;
}

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

/**

+ 17
- 0
lib/private/FilesMetadata/Model/FilesMetadata.php View File

@@ -156,6 +156,23 @@ class FilesMetadata implements IFilesMetadata {
$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
*

+ 24
- 0
lib/private/FilesMetadata/Model/MetadataValueWrapper.php View File

@@ -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;

@@ -350,6 +351,27 @@ class MetadataValueWrapper implements IMetadataValueWrapper {
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
*
@@ -405,6 +427,7 @@ class MetadataValueWrapper implements IMetadataValueWrapper {
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;
@@ -414,6 +437,7 @@ class MetadataValueWrapper implements IMetadataValueWrapper {
return [
'value' => ($emptyValues) ? null : $this->value,
'type' => $this->getType(),
'etag' => $this->getEtag(),
'indexed' => $this->isIndexed(),
'editPermission' => $this->getEditPermission()
];

+ 3
- 11
lib/private/FilesMetadata/Service/MetadataRequestService.php View File

@@ -74,16 +74,12 @@ class MetadataRequestService {
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();
}

@@ -100,8 +96,6 @@ class MetadataRequestService {
/**
* 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
@@ -110,9 +104,7 @@ class MetadataRequestService {
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();

+ 19
- 0
lib/public/FilesMetadata/Model/IFilesMetadata.php View File

@@ -37,12 +37,14 @@ use OCP\FilesMetadata\Exceptions\FilesMetadataTypeException;
* "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
* }
@@ -112,6 +114,23 @@ interface IFilesMetadata extends JsonSerializable {
*/
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)

+ 18
- 0
lib/public/FilesMetadata/Model/IMetadataValueWrapper.php View File

@@ -285,6 +285,24 @@ interface IMetadataValueWrapper extends JsonSerializable {
*/
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
*

Loading…
Cancel
Save