/** * Implements Drupal\Core\Cache\CacheBackendInterface::getMultiple(). */ public function getMultiple(&$cids, $allow_invalid = FALSE) { $cid_mapping = array(); foreach ($cids as $cid) { $cid_mapping[$this->normalizeCid($cid)] = $cid; } // When serving cached pages, the overhead of using ::select() was found // to add around 30% overhead to the request. Since $this->bin is a // variable, this means the call to ::query() here uses a concatenated // string. This is highly discouraged under any other circumstances, and // is used here only due to the performance overhead we would incur // otherwise. When serving an uncached page, the overhead of using // ::select() is a much smaller proportion of the request. $result = array(); try { $result = $this->connection->query('SELECT cid, data, created, expire, serialized, tags, checksum_invalidations, checksum_deletions FROM {' . $this->connection->escapeTable($this->bin) . '} WHERE cid IN (:cids)', array(':cids' => array_keys($cid_mapping))); } catch (\Exception $e) { // Nothing to do. } $cache = array(); foreach ($result as $item) { // Map the cache ID back to the original. $item->cid = $cid_mapping[$item->cid]; $item = $this->prepareItem($item, $allow_invalid); if ($item) { $cache[$item->cid] = $item; } } $cids = array_diff($cids, array_keys($cache)); return $cache; }
/** * {@inheritdoc} */ public function getAllCollectionNames() { try { return $this->connection->query('SELECT DISTINCT collection FROM {' . $this->connection->escapeTable($this->table) . '} WHERE collection <> :collection ORDER by collection', array(':collection' => StorageInterface::DEFAULT_COLLECTION))->fetchCol(); } catch (\Exception $e) { return array(); } }
/** * Implements Drupal\Core\KeyValueStore\KeyValueStoreInterface::getAll(). */ 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; }
/** * Get all routes which match a certain pattern. * * @param string $path * The route pattern to search for (contains % as placeholders). * * @return \Symfony\Component\Routing\RouteCollection * Returns a route collection of matching routes. */ protected function getRoutesByPath($path) { // Filter out each empty value, though allow '0' and 0, which would be // filtered out by empty(). $parts = array_values(array_filter(explode('/', $path), function ($value) { return $value !== NULL && $value !== ''; })); $collection = new RouteCollection(); $ancestors = $this->getCandidateOutlines($parts); if (empty($ancestors)) { return $collection; } $routes = $this->connection->query("SELECT name, route FROM {" . $this->connection->escapeTable($this->tableName) . "} WHERE pattern_outline IN (:patterns) ORDER BY fit DESC, name ASC", array(':patterns' => $ancestors))->fetchAllKeyed(); foreach ($routes as $name => $route) { $route = unserialize($route); if (preg_match($route->compile()->getRegex(), $path, $matches)) { $collection->add($name, $route); } } return $collection; }
/** * {@inheritdoc} */ public function getRoutesCount() { return $this->connection->query("SELECT COUNT(*) FROM {" . $this->connection->escapeTable($this->tableName) . "}")->fetchField(); }
/** * {@inheritdoc} */ public function escapeTable($table) { $escaped = parent::escapeTable($table); // Quote identifier to make it case-sensitive. if (preg_match('/[A-Z]/', $escaped)) { $escaped = '"' . $escaped . '"'; } return $escaped; }
/** * {@inheritdoc} */ public function escapeTable($table) { $escaped = parent::escapeTable($table); // Quote identifier to make it case-sensitive. if (preg_match('/[A-Z]/', $escaped)) { $escaped = '"' . $escaped . '"'; } elseif (in_array(strtolower($escaped), $this->postgresqlReservedKeyWords)) { // Quote the table name for PostgreSQL reserved key words. $escaped = '"' . $escaped . '"'; } return $escaped; }
/** * Constructs a Subscription object. * * @param \Drupal\Core\Database\Connection $connection * The database connection object. * @param string $table * The database table to perform queries on. */ public function __construct(Connection $connection, $table) { $this->connection = $connection; $this->table = $table; $this->tableEscaped = $connection->escapeTable($this->table); }
/** * {@inheritdoc} */ public function escapeTable($table) { $escaped = parent::escapeTable($table); // Ensure that each part (database, schema and table) of the table name is // properly and independently escaped. $parts = explode('.', $escaped); $parts = array_map([$this, 'doEscape'], $parts); $escaped = implode('.', $parts); return $escaped; }