phpmyadmin/libraries/classes/Query/Cache.php
Kamil Tekiela 2b35303aae
Remove redundant code (#18063)
PHPStorm has been a little annoying with showing all these code issues. I took some time to analyse most of them and fix whichever were easy to fix. This kind of change should improve future maintenance as developers do not need to wonder what a line of code does. Code that has no impact on functionality should be removed.

* Remove redundant variables
* Invert condition for better clarity
* Remove some of the redundant casts
* Replace switch with an if
* Fix foreach variable
* Remove redundant variable concat
* Remove redundant concats
* Replace for loop with str_repeat
* Remove always true param
* Turn property $position into local var
* Turn Pdf properties into local vars
* Remove unused properties in Pdf
* Change ternary into condition
* Remove redundant assignments
   They are immediately overwritten with a different value.
* Redundant array append
* Collapse if statements into assignments
* Use boolean constants instead of variables
* Remove unneeded parameter
* Remove null-coalesce
* Unnecessary assignment
* Remove redundant isset
* Remove readOnly flag for InsertEdit fields
* Remove function_exists and $mode var
* Remove duplicate condition
* Remove redundant elseif
* Remove redundant isset
* Use hasBodyParam()
* Simplify isRoutesCacheFileValid()
   Psalm complains but is wrong.

https://github.com/phpmyadmin/phpmyadmin/pull/18063

---------

Signed-off-by: Kamil Tekiela <tekiela246@gmail.com>
2023-02-15 09:11:05 -03:00

108 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace PhpMyAdmin\Query;
use PhpMyAdmin\Util;
use function array_shift;
use function count;
use function is_array;
/**
* Handles caching results
*/
class Cache
{
/** @var array Table data cache */
private $tableCache = [];
/**
* Caches table data so Table does not require to issue
* SHOW TABLE STATUS again
*
* @param array $tables information for tables of some databases
* @param string|bool $table table name
*/
public function cacheTableData(array $tables, $table): void
{
// Note: I don't see why we would need array_merge_recursive() here,
// as it creates double entries for the same table (for example a double
// entry for Comment when changing the storage engine in Operations)
// Note 2: Instead of array_merge(), simply use the + operator because
// array_merge() renumbers numeric keys starting with 0, therefore
// we would lose a db name that consists only of numbers
foreach ($tables as $one_database => $tablesInDatabase) {
if (isset($this->tableCache[$one_database])) {
// the + operator does not do the intended effect
// when the cache for one table already exists
if ($table && isset($this->tableCache[$one_database][$table])) {
unset($this->tableCache[$one_database][$table]);
}
$this->tableCache[$one_database] += $tablesInDatabase;
} else {
$this->tableCache[$one_database] = $tablesInDatabase;
}
}
}
/**
* Set an item in table cache using dot notation.
*
* @param array|null $contentPath Array with the target path
* @param mixed $value Target value
*/
public function cacheTableContent(?array $contentPath, $value): void
{
$loc = &$this->tableCache;
if (! isset($contentPath)) {
$loc = $value;
return;
}
while (count($contentPath) > 1) {
$key = array_shift($contentPath);
// If the key doesn't exist at this depth, we will just create an empty
// array to hold the next value, allowing us to create the arrays to hold
// final values at the correct depth. Then we'll keep digging into the
// array.
if (! isset($loc[$key]) || ! is_array($loc[$key])) {
$loc[$key] = [];
}
$loc = &$loc[$key];
}
$loc[array_shift($contentPath)] = $value;
}
/**
* Get a cached value from table cache.
*
* @param array $contentPath Array of the name of the target value
* @param mixed $default Return value on cache miss
*
* @return mixed cached value or default
*/
public function getCachedTableContent(array $contentPath, $default = null)
{
return Util::getValueByKey($this->tableCache, $contentPath, $default);
}
public function getCache(): array
{
return $this->tableCache;
}
public function clearTableCache(): void
{
$this->tableCache = [];
}
}