Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 9 |
CRAP | |
0.00% |
0 / 68 |
| DatabaseStorage | |
0.00% |
0 / 1 |
|
0.00% |
0 / 9 |
240 | |
0.00% |
0 / 68 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
| has | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
| getMultiple | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 13 |
|||
| getAll | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 9 |
|||
| set | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 8 |
|||
| setIfNotExists | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 11 |
|||
| rename | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 6 |
|||
| deleteMultiple | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 7 |
|||
| deleteAll | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\KeyValueStore\DatabaseStorage. | |
| */ | |
| namespace Drupal\Core\KeyValueStore; | |
| use Drupal\Component\Serialization\SerializationInterface; | |
| use Drupal\Core\Database\Query\Merge; | |
| use Drupal\Core\Database\Connection; | |
| use Drupal\Core\DependencyInjection\DependencySerializationTrait; | |
| /** | |
| * Defines a default key/value store implementation. | |
| * | |
| * This is Drupal's default key/value store implementation. It uses the database | |
| * to store key/value data. | |
| */ | |
| class DatabaseStorage extends StorageBase { | |
| use DependencySerializationTrait; | |
| /** | |
| * The serialization class to use. | |
| * | |
| * @var \Drupal\Component\Serialization\SerializationInterface | |
| */ | |
| protected $serializer; | |
| /** | |
| * The database connection. | |
| * | |
| * @var \Drupal\Core\Database\Connection | |
| */ | |
| protected $connection; | |
| /** | |
| * The name of the SQL table to use. | |
| * | |
| * @var string | |
| */ | |
| protected $table; | |
| /** | |
| * Overrides Drupal\Core\KeyValueStore\StorageBase::__construct(). | |
| * | |
| * @param string $collection | |
| * The name of the collection holding key and value pairs. | |
| * @param \Drupal\Component\Serialization\SerializationInterface $serializer | |
| * The serialization class to use. | |
| * @param \Drupal\Core\Database\Connection $connection | |
| * The database connection to use. | |
| * @param string $table | |
| * The name of the SQL table to use, defaults to key_value. | |
| */ | |
| public function __construct($collection, SerializationInterface $serializer, Connection $connection, $table = 'key_value') { | |
| parent::__construct($collection); | |
| $this->serializer = $serializer; | |
| $this->connection = $connection; | |
| $this->table = $table; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function has($key) { | |
| return (bool) $this->connection->query('SELECT 1 FROM {' . $this->connection->escapeTable($this->table) . '} WHERE collection = :collection AND name = :key', array( | |
| ':collection' => $this->collection, | |
| ':key' => $key, | |
| ))->fetchField(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getMultiple(array $keys) { | |
| $values = array(); | |
| try { | |
| $result = $this->connection->query('SELECT name, value FROM {' . $this->connection->escapeTable($this->table) . '} WHERE name IN ( :keys[] ) AND collection = :collection', array(':keys[]' => $keys, ':collection' => $this->collection))->fetchAllAssoc('name'); | |
| foreach ($keys as $key) { | |
| if (isset($result[$key])) { | |
| $values[$key] = $this->serializer->decode($result[$key]->value); | |
| } | |
| } | |
| } | |
| catch (\Exception $e) { | |
| // @todo: Perhaps if the database is never going to be available, | |
| // key/value requests should return FALSE in order to allow exception | |
| // handling to occur but for now, keep it an array, always. | |
| } | |
| return $values; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getAll() { | |
| $result = $this->connection->query('SELECT name, value FROM {' . $this->connection->escapeTable($this->table) . '} WHERE collection = :collection', array(':collection' => $this->collection)); | |
| $values = array(); | |
| foreach ($result as $item) { | |
| if ($item) { | |
| $values[$item->name] = $this->serializer->decode($item->value); | |
| } | |
| } | |
| return $values; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function set($key, $value) { | |
| $this->connection->merge($this->table) | |
| ->keys(array( | |
| 'name' => $key, | |
| 'collection' => $this->collection, | |
| )) | |
| ->fields(array('value' => $this->serializer->encode($value))) | |
| ->execute(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function setIfNotExists($key, $value) { | |
| $result = $this->connection->merge($this->table) | |
| ->insertFields(array( | |
| 'collection' => $this->collection, | |
| 'name' => $key, | |
| 'value' => $this->serializer->encode($value), | |
| )) | |
| ->condition('collection', $this->collection) | |
| ->condition('name', $key) | |
| ->execute(); | |
| return $result == Merge::STATUS_INSERT; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function rename($key, $new_key) { | |
| $this->connection->update($this->table) | |
| ->fields(array('name' => $new_key)) | |
| ->condition('collection', $this->collection) | |
| ->condition('name', $key) | |
| ->execute(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function deleteMultiple(array $keys) { | |
| // Delete in chunks when a large array is passed. | |
| while ($keys) { | |
| $this->connection->delete($this->table) | |
| ->condition('name', array_splice($keys, 0, 1000), 'IN') | |
| ->condition('collection', $this->collection) | |
| ->execute(); | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function deleteAll() { | |
| $this->connection->delete($this->table) | |
| ->condition('collection', $this->collection) | |
| ->execute(); | |
| } | |
| } |