ENH store tableList in cache
This commit is contained in:
parent
8aab888d50
commit
0dff1634b1
|
@ -4,12 +4,14 @@ namespace SilverStripe\Core;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
use ReflectionClass;
|
use ReflectionClass;
|
||||||
use SilverStripe\CMS\Model\SiteTree;
|
|
||||||
use SilverStripe\Control\Director;
|
|
||||||
use SilverStripe\Core\Manifest\ClassLoader;
|
|
||||||
use SilverStripe\ORM\DataObject;
|
|
||||||
use SilverStripe\ORM\DB;
|
use SilverStripe\ORM\DB;
|
||||||
|
use SilverStripe\ORM\DataObject;
|
||||||
|
use SilverStripe\Control\Director;
|
||||||
|
use Psr\SimpleCache\CacheInterface;
|
||||||
use SilverStripe\View\ViewableData;
|
use SilverStripe\View\ViewableData;
|
||||||
|
use SilverStripe\CMS\Model\SiteTree;
|
||||||
|
use SilverStripe\Core\Injector\Injector;
|
||||||
|
use SilverStripe\Core\Manifest\ClassLoader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides introspection information about the class tree.
|
* Provides introspection information about the class tree.
|
||||||
|
@ -20,14 +22,6 @@ use SilverStripe\View\ViewableData;
|
||||||
*/
|
*/
|
||||||
class ClassInfo
|
class ClassInfo
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Cache for {@link hasTable()}
|
|
||||||
*
|
|
||||||
* @internal
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private static $_cache_all_tables = [];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
* @var array Cache for {@link ancestry()}.
|
* @var array Cache for {@link ancestry()}.
|
||||||
|
@ -87,16 +81,25 @@ class ClassInfo
|
||||||
*/
|
*/
|
||||||
public static function hasTable($tableName)
|
public static function hasTable($tableName)
|
||||||
{
|
{
|
||||||
// Cache the list of all table names to reduce on DB traffic
|
$cache = self::getCache();
|
||||||
if (empty(self::$_cache_all_tables) && DB::is_active()) {
|
$cacheKey = 'tableList';
|
||||||
self::$_cache_all_tables = DB::get_schema()->tableList();
|
$tableList = $cache->get($cacheKey) ?? [];
|
||||||
|
if (empty($tableList) && DB::is_active()) {
|
||||||
|
$tableList = DB::get_schema()->tableList();
|
||||||
|
// Cache the list of all table names to reduce on DB traffic
|
||||||
|
$cache->set($cacheKey, $tableList);
|
||||||
}
|
}
|
||||||
return !empty(self::$_cache_all_tables[strtolower($tableName)]);
|
return !empty($tableList[strtolower($tableName)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getCache(): CacheInterface
|
||||||
|
{
|
||||||
|
return Injector::inst()->get(CacheInterface::class . '.ClassInfo');
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function reset_db_cache()
|
public static function reset_db_cache()
|
||||||
{
|
{
|
||||||
self::$_cache_all_tables = null;
|
self::getCache()->clear();
|
||||||
self::$_cache_ancestry = [];
|
self::$_cache_ancestry = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,7 +418,8 @@ class ClassInfo
|
||||||
$tokenName = is_array($token) ? $token[0] : $token;
|
$tokenName = is_array($token) ? $token[0] : $token;
|
||||||
|
|
||||||
// Get the class name
|
// Get the class name
|
||||||
if (\defined('T_NAME_QUALIFIED') && is_array($token) &&
|
if (
|
||||||
|
\defined('T_NAME_QUALIFIED') && is_array($token) &&
|
||||||
($token[0] === T_NAME_QUALIFIED || $token[0] === T_NAME_FULLY_QUALIFIED)
|
($token[0] === T_NAME_QUALIFIED || $token[0] === T_NAME_FULLY_QUALIFIED)
|
||||||
) {
|
) {
|
||||||
// PHP 8 exposes the FQCN as a single T_NAME_QUALIFIED or T_NAME_FULLY_QUALIFIED token
|
// PHP 8 exposes the FQCN as a single T_NAME_QUALIFIED or T_NAME_FULLY_QUALIFIED token
|
||||||
|
@ -433,7 +437,7 @@ class ClassInfo
|
||||||
// Found another section of a namespaced class
|
// Found another section of a namespaced class
|
||||||
$class .= $token[1];
|
$class .= $token[1];
|
||||||
$lastTokenWasNSSeparator = false;
|
$lastTokenWasNSSeparator = false;
|
||||||
// Get arguments
|
// Get arguments
|
||||||
} elseif (is_array($token)) {
|
} elseif (is_array($token)) {
|
||||||
switch ($token[0]) {
|
switch ($token[0]) {
|
||||||
case T_CONSTANT_ENCAPSED_STRING:
|
case T_CONSTANT_ENCAPSED_STRING:
|
||||||
|
@ -456,7 +460,7 @@ class ClassInfo
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_DNUMBER:
|
case T_DNUMBER:
|
||||||
$result = (double)$token[1];
|
$result = (float)$token[1];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_LNUMBER:
|
case T_LNUMBER:
|
||||||
|
|
Loading…
Reference in New Issue