1<?php
2
3namespace Drupal\locale;
4
5use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
6
7/**
8 * Provides the locale project storage system using a key value store.
9 */
10class LocaleProjectStorage implements LocaleProjectStorageInterface {
11
12  /**
13   * The key value store to use.
14   *
15   * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
16   */
17  protected $keyValueStore;
18
19  /**
20   * Static state cache.
21   *
22   * @var array
23   */
24  protected $cache = [];
25
26  /**
27   * Cache status flag.
28   *
29   * @var bool
30   */
31  protected static $all = FALSE;
32
33  /**
34   * Constructs a State object.
35   *
36   * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory
37   *   The key value store to use.
38   */
39  public function __construct(KeyValueFactoryInterface $key_value_factory) {
40    $this->keyValueStore = $key_value_factory->get('locale.project');
41  }
42
43  /**
44   * {@inheritdoc}
45   */
46  public function get($key, $default = NULL) {
47    $values = $this->getMultiple([$key]);
48    return isset($values[$key]) ? $values[$key] : $default;
49  }
50
51  /**
52   * {@inheritdoc}
53   */
54  public function getMultiple(array $keys) {
55    $values = [];
56    $load = [];
57    foreach ($keys as $key) {
58      // Check if we have a value in the cache.
59      if (isset($this->cache[$key])) {
60        $values[$key] = $this->cache[$key];
61      }
62      // Load the value if we don't have an explicit NULL value.
63      elseif (!array_key_exists($key, $this->cache)) {
64        $load[] = $key;
65      }
66    }
67
68    if ($load) {
69      $loaded_values = $this->keyValueStore->getMultiple($load);
70      foreach ($load as $key) {
71        // If we find a value, even one that is NULL, add it to the cache and
72        // return it.
73        if (isset($loaded_values[$key])) {
74          $values[$key] = $loaded_values[$key];
75          $this->cache[$key] = $loaded_values[$key];
76        }
77        else {
78          $this->cache[$key] = NULL;
79        }
80      }
81    }
82
83    return $values;
84  }
85
86  /**
87   * {@inheritdoc}
88   */
89  public function set($key, $value) {
90    $this->setMultiple([$key => $value]);
91  }
92
93  /**
94   * {@inheritdoc}
95   */
96  public function setMultiple(array $data) {
97    foreach ($data as $key => $value) {
98      $this->cache[$key] = $value;
99    }
100    $this->keyValueStore->setMultiple($data);
101  }
102
103  /**
104   * {@inheritdoc}
105   */
106  public function delete($key) {
107    $this->deleteMultiple([$key]);
108  }
109
110  /**
111   * {@inheritdoc}
112   */
113  public function deleteMultiple(array $keys) {
114    foreach ($keys as $key) {
115      $this->cache[$key] = NULL;
116    }
117    $this->keyValueStore->deleteMultiple($keys);
118  }
119
120  /**
121   * {@inheritdoc}
122   */
123  public function resetCache() {
124    $this->cache = [];
125    static::$all = FALSE;
126  }
127
128  /**
129   * {@inheritdoc}
130   */
131  public function deleteAll() {
132    $this->keyValueStore->deleteAll();
133    $this->resetCache();
134  }
135
136  /**
137   * {@inheritdoc}
138   */
139  public function disableAll() {
140    $projects = $this->keyValueStore->getAll();
141    foreach (array_keys($projects) as $key) {
142      $projects[$key]['status'] = 0;
143      if (isset($cache[$key])) {
144        $cache[$key] = $projects[$key];
145      }
146    }
147    $this->keyValueStore->setMultiple($projects);
148
149  }
150
151  /**
152   * {@inheritdoc}
153   */
154  public function countProjects() {
155    return count($this->getAll());
156  }
157
158  /**
159   * {@inheritdoc}
160   */
161  public function getAll() {
162    if (!static::$all) {
163      $this->cache = $this->keyValueStore->getAll();
164      static::$all = TRUE;
165    }
166    return $this->cache;
167  }
168
169}
170