View source
<?php
namespace Drupal\file\FileUsage;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
use Drupal\file\FileInterface;
class DatabaseFileUsageBackend extends FileUsageBase {
protected $connection;
protected $tableName;
public function __construct(ConfigFactoryInterface $config_factory, Connection $connection, $table = 'file_usage') {
parent::__construct($config_factory);
$this->connection = $connection;
$this->tableName = $table;
}
public function add(FileInterface $file, $module, $type, $id, $count = 1) {
$this->connection
->merge($this->tableName)
->keys([
'fid' => $file
->id(),
'module' => $module,
'type' => $type,
'id' => $id,
])
->fields([
'count' => $count,
])
->expression('count', '[count] + :count', [
':count' => $count,
])
->execute();
parent::add($file, $module, $type, $id, $count);
}
public function delete(FileInterface $file, $module, $type = NULL, $id = NULL, $count = 1) {
$query = $this->connection
->delete($this->tableName)
->condition('module', $module)
->condition('fid', $file
->id());
if ($type && $id) {
$query
->condition('type', $type)
->condition('id', $id);
}
if ($count) {
$query
->condition('count', $count, '<=');
}
$result = $query
->execute();
if (!$result && $count > 0) {
$query = $this->connection
->update($this->tableName)
->condition('module', $module)
->condition('fid', $file
->id());
if ($type && $id) {
$query
->condition('type', $type)
->condition('id', $id);
}
$query
->expression('count', '[count] - :count', [
':count' => $count,
]);
$query
->execute();
}
parent::delete($file, $module, $type, $id, $count);
}
public function listUsage(FileInterface $file) {
$result = $this->connection
->select($this->tableName, 'f')
->fields('f', [
'module',
'type',
'id',
'count',
])
->condition('fid', $file
->id())
->condition('count', 0, '>')
->execute();
$references = [];
foreach ($result as $usage) {
$references[$usage->module][$usage->type][$usage->id] = $usage->count;
}
return $references;
}
}