diff --git a/core/includes/schema.inc b/core/includes/schema.inc index 47e7836efed53027..a386e62d1c163e2a 100644 --- a/core/includes/schema.inc +++ b/core/includes/schema.inc @@ -7,7 +7,6 @@ use Drupal\Core\Cache\Cache; use Drupal\Core\Database\Database; -use Drupal\Core\Utility\SchemaCache; /** * @addtogroup schemaapi @@ -33,12 +32,9 @@ const SCHEMA_UNINSTALLED = -1; function drupal_get_schema($table = NULL, $rebuild = FALSE) { static $schema; - if ($rebuild || !isset($table)) { + if ($rebuild || !isset($schema)) { $schema = drupal_get_complete_schema($rebuild); } - elseif (!isset($schema)) { - $schema = new SchemaCache(); - } if (!isset($table)) { return $schema; @@ -88,13 +84,10 @@ function drupal_get_complete_schema($rebuild = FALSE) { } \Drupal::moduleHandler()->alter('schema', $schema); - if ($rebuild) { - Cache::deleteTags(array('schema' => TRUE)); - } // If the schema is empty, avoid saving it: some database engines require // the schema to perform queries, and this could lead to infinite loops. if (!empty($schema) && (drupal_get_bootstrap_phase() == DRUPAL_BOOTSTRAP_FULL)) { - \Drupal::cache()->set('schema', $schema, Cache::PERMANENT, array('schema' => TRUE)); + \Drupal::cache()->set('schema', $schema, Cache::PERMANENT); } } } diff --git a/core/lib/Drupal/Core/Path/AliasWhitelist.php b/core/lib/Drupal/Core/Path/AliasWhitelist.php index b990c3bfb80622be..643fea4ae344062e 100644 --- a/core/lib/Drupal/Core/Path/AliasWhitelist.php +++ b/core/lib/Drupal/Core/Path/AliasWhitelist.php @@ -14,7 +14,7 @@ use Drupal\Core\KeyValueStore\StateInterface; use Drupal\Core\Lock\LockBackendInterface; /** - * Extends CacheArray to build the path alias whitelist over time. + * Extends CacheCollector to build the path alias whitelist over time. */ class AliasWhitelist extends CacheCollector implements AliasWhitelistInterface { diff --git a/core/lib/Drupal/Core/Utility/CacheArray.php b/core/lib/Drupal/Core/Utility/CacheArray.php deleted file mode 100644 index 43bef93dfbe4de0d..0000000000000000 --- a/core/lib/Drupal/Core/Utility/CacheArray.php +++ /dev/null @@ -1,239 +0,0 @@ - 'baz'), but later - * want to change the value of 'bar' from 'baz' to 'foobar', you cannot do so - * a targeted write like $object['foo']['bar'] = 'foobar'. Instead, you must - * overwrite the entire top-level 'foo' array with the entire set of new - * values: $object['foo'] = array(1, 2, 'bar' => 'foobar'). Due to this same - * limitation, attempts to create references to any contained data, nested or - * otherwise, will fail silently. So $var = &$object['foo'] will not throw an - * error, and $var will be populated with the contents of $object['foo'], but - * that data will be passed by value, not reference. For more information on - * the PHP limitation, see the note in the official PHP documentation at - * http://php.net/manual/arrayaccess.offsetget.php on ArrayAccess::offsetGet(). - * - * By default, the class accounts for caches where calling functions might - * request keys in the array that won't exist even after a cache rebuild. This - * prevents situations where a cache rebuild would be triggered over and over - * due to a 'missing' item. These cases are stored internally as a value of - * NULL. This means that the offsetGet() and offsetExists() methods - * must be overridden if caching an array where the top level values can - * legitimately be NULL, and where $object->offsetExists() needs to correctly - * return (equivalent to array_key_exists() vs. isset()). This should not - * be necessary in the majority of cases. - * - * Classes extending this class must override at least the - * resolveCacheMiss() method to have a working implementation. - * - * offsetSet() is not overridden by this class by default. In practice this - * means that assigning an offset via arrayAccess will only apply while the - * object is in scope and will not be written back to the persistent cache. - * This follows a similar pattern to static vs. persistent caching in - * procedural code. Extending classes may wish to alter this behavior, for - * example by overriding offsetSet() and adding an automatic call to persist(). - * - * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0. - * Use \Drupal\Core\Cache\CacheCollector. - * - * @see SchemaCache - */ -abstract class CacheArray implements \ArrayAccess { - - /** - * A cid to pass to \Drupal::cache()->set() and \Drupal::cache()->get(). - * - * @var string - */ - protected $cid; - - /** - * A tags array to pass to \Drupal::cache()->set(). - * - * @var array - */ - protected $tags; - - /** - * A bin to pass to \Drupal::cache()->set() and \Drupal::cache()->get(). - * - * @var string - */ - protected $bin; - - /** - * An array of keys to add to the cache at the end of the request. - * - * @var array - */ - protected $keysToPersist = array(); - - /** - * Storage for the data itself. - * - * @var array - */ - protected $storage = array(); - - /** - * Constructs a CacheArray object. - * - * @param string $cid - * The cid for the array being cached. - * @param string $bin - * The bin to cache the array. - * @param array $tags - * (optional) The tags to specify for the cache item. - */ - public function __construct($cid, $bin, $tags = array()) { - $this->cid = $cid; - $this->bin = $bin; - $this->tags = $tags; - - if ($cached = \Drupal::cache($bin)->get($this->cid)) { - $this->storage = $cached->data; - } - } - - /** - * Implements ArrayAccess::offsetExists(). - */ - public function offsetExists($offset) { - return $this->offsetGet($offset) !== NULL; - } - - /** - * Implements ArrayAccess::offsetGet(). - */ - public function offsetGet($offset) { - if (isset($this->storage[$offset]) || array_key_exists($offset, $this->storage)) { - return $this->storage[$offset]; - } - else { - return $this->resolveCacheMiss($offset); - } - } - - /** - * Implements ArrayAccess::offsetSet(). - */ - public function offsetSet($offset, $value) { - $this->storage[$offset] = $value; - } - - /** - * Implements ArrayAccess::offsetUnset(). - */ - public function offsetUnset($offset) { - unset($this->storage[$offset]); - } - - /** - * Flags an offset value to be written to the persistent cache. - * - * If a value is assigned to a cache object with offsetSet(), by default it - * will not be written to the persistent cache unless it is flagged with this - * method. This allows items to be cached for the duration of a request, - * without necessarily writing back to the persistent cache at the end. - * - * @param $offset - * The array offset that was requested. - * @param $persist - * Optional boolean to specify whether the offset should be persisted or - * not, defaults to TRUE. When called with $persist = FALSE the offset will - * be unflagged so that it will not be written at the end of the request. - */ - protected function persist($offset, $persist = TRUE) { - $this->keysToPersist[$offset] = $persist; - } - - /** - * Resolves a cache miss. - * - * When an offset is not found in the object, this is treated as a cache - * miss. This method allows classes implementing the interface to look up - * the actual value and allow it to be cached. - * - * @param $offset - * The offset that was requested. - * - * @return - * The value of the offset, or NULL if no value was found. - */ - abstract protected function resolveCacheMiss($offset); - - /** - * Writes a value to the persistent cache immediately. - * - * @param $data - * The data to write to the persistent cache. - * @param $lock - * Whether to acquire a lock before writing to cache. - */ - protected function set($data, $lock = TRUE) { - // Lock cache writes to help avoid stampedes. - // To implement locking for cache misses, override __construct(). - $lock_name = $this->cid . ':' . $this->bin; - if (!$lock || \Drupal::lock()->acquire($lock_name)) { - if ($cached = \Drupal::cache($this->bin)->get($this->cid)) { - $data = $cached->data + $data; - } - \Drupal::cache($this->bin)->set($this->cid, $data, Cache::PERMANENT, $this->tags); - if ($lock) { - \Drupal::lock()->release($lock_name); - } - } - } - - /** - * Clear the cache. - */ - public function clear() { - $this->storage = array(); - $this->keysToPersist = array(); - \Drupal::cache($this->bin)->delete($this->cid); - } - - /** - * Destructs the CacheArray object. - */ - public function __destruct() { - $data = array(); - foreach ($this->keysToPersist as $offset => $persist) { - if ($persist) { - $data[$offset] = $this->storage[$offset]; - } - } - if (!empty($data)) { - $this->set($data); - } - } -} diff --git a/core/lib/Drupal/Core/Utility/SchemaCache.php b/core/lib/Drupal/Core/Utility/SchemaCache.php deleted file mode 100644 index 4e3bdd492eb66bc2..0000000000000000 --- a/core/lib/Drupal/Core/Utility/SchemaCache.php +++ /dev/null @@ -1,36 +0,0 @@ -isMethod('GET')), 'cache', array('schema' => TRUE)); - } - - /** - * Implements CacheArray::resolveCacheMiss(). - */ - protected function resolveCacheMiss($offset) { - $complete_schema = drupal_get_complete_schema(); - $value = isset($complete_schema[$offset]) ? $complete_schema[$offset] : NULL; - $this->storage[$offset] = $value; - $this->persist($offset); - return $value; - } -} diff --git a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php index e1bcc90234f119da..c082a56089888dfb 100644 --- a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php +++ b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php @@ -1042,12 +1042,7 @@ abstract class TestBase { stream_wrapper_unregister($scheme); } - // Reset statics before the old container is replaced so that objects with a - // __destruct() method still have access to it. - // All static variables need to be reset before the database prefix is - // changed, since \Drupal\Core\Utility\CacheArray implementations attempt to - // write back to persistent caches when they are destructed. - // @todo: Remove once they have been converted to services. + // Reset statics. drupal_static_reset(); // Reset and create a new service container. @@ -1081,9 +1076,6 @@ abstract class TestBase { ini_set('error_log', DRUPAL_ROOT . '/' . $this->siteDirectory . '/error.log'); // Change the database prefix. - // All static variables need to be reset before the database prefix is - // changed, since \Drupal\Core\Utility\CacheArray implementations attempt to - // write back to persistent caches when they are destructed. $this->changeDatabasePrefix(); // Remove all configuration overrides.